ZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfc2RrLmZlYXR1cmUvLmN2c2lnbm9yZSBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfc2RrLmZlYXR1cmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmViMDk3MS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3Nkay5mZWF0dXJlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLWZlYXR1cmVzCi1wbHVnaW5zCi1idWlsZC54bWwKLW9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfc2RrLmZlYXR1cmVfMS4wLjAuYmluLmRpc3QuemlwCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3Nkay5mZWF0dXJlLy5wcm9qZWN0IGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9zZGsuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFiMWYxNi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3Nkay5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LnNlcnZlcl9zZGsuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfc2RrLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfc2RrLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThkNmY0Mi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3Nkay5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMKLQotZ2VuZXJhdGUuZmVhdHVyZUBvcmcuZWNsaXBzZS5qc3Quc2VydmVyX2FkYXB0ZXJzLmZlYXR1cmUuc291cmNlPW9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZQotc3JjLmluY2x1ZGVzID0gYnVpbGQucHJvcGVydGllcwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfc2RrLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfc2RrLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3Nkay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3Nkay5mZWF0dXJlL2VwbC12MTAuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfc2RrLmZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfc2RrLmZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+Ci0KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Ci08bWV0YSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+Ci08bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxtZXRhIG5hbWU9T3JpZ2luYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxsaW5rIHJlbD1GaWxlLUxpc3QKLWhyZWY9Ii4vRWNsaXBzZSUyMEVQTCUyMDIwMDNfMTFfMTAlMjBGaW5hbF9maWxlcy9maWxlbGlzdC54bWwiPgotPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Ci08IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8bzpEb2N1bWVudFByb3BlcnRpZXM+Ci0gIDxvOlJldmlzaW9uPjI8L286UmV2aXNpb24+Ci0gIDxvOlRvdGFsVGltZT4zPC9vOlRvdGFsVGltZT4KLSAgPG86Q3JlYXRlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpDcmVhdGVkPgotICA8bzpMYXN0U2F2ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286TGFzdFNhdmVkPgotICA8bzpQYWdlcz40PC9vOlBhZ2VzPgotICA8bzpXb3Jkcz4xNjI2PC9vOldvcmRzPgotICA8bzpDaGFyYWN0ZXJzPjkyNzA8L286Q2hhcmFjdGVycz4KLSAgIDxvOkxpbmVzPjc3PC9vOkxpbmVzPgotICA8bzpQYXJhZ3JhcGhzPjE4PC9vOlBhcmFncmFwaHM+Ci0gIDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjExMzg0PC9vOkNoYXJhY3RlcnNXaXRoU3BhY2VzPgotICA8bzpWZXJzaW9uPjkuNDQwMjwvbzpWZXJzaW9uPgotIDwvbzpEb2N1bWVudFByb3BlcnRpZXM+Ci08L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8dzpXb3JkRG9jdW1lbnQ+Ci0gIDx3OlRyYWNrUmV2aXNpb25zLz4KLSA8L3c6V29yZERvY3VtZW50PgotPC94bWw+PCFbZW5kaWZdLS0+Ci08c3R5bGU+Ci08IS0tCi0gLyogRm9udCBEZWZpbml0aW9ucyAqLwotQGZvbnQtZmFjZQotCXtmb250LWZhbWlseTpUYWhvbWE7Ci0JcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7Ci0JbXNvLWZvbnQtY2hhcnNldDowOwotCW1zby1nZW5lcmljLWZvbnQtZmFtaWx5OnN3aXNzOwotCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOwotCW1zby1mb250LXNpZ25hdHVyZTo1NTM2Nzk0OTUgLTIxNDc0ODM2NDggOCAwIDY2MDQ3IDA7fQotIC8qIFN0eWxlIERlZmluaXRpb25zICovCi1wLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCi0Je21zby1zdHlsZS1wYXJlbnQ6IiI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcAotCXttYXJnaW4tcmlnaHQ6MGluOwotCW1zby1tYXJnaW4tdG9wLWFsdDphdXRvOwotCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotCW1hcmdpbi1sZWZ0OjBpbjsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wLkJhbGxvb25UZXh0LCBsaS5CYWxsb29uVGV4dCwgZGl2LkJhbGxvb25UZXh0Ci0Je21zby1zdHlsZS1uYW1lOiJCYWxsb29uIFRleHQiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6OC4wcHQ7Ci0JZm9udC1mYW1pbHk6VGFob21hOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLUBwYWdlIFNlY3Rpb24xCi0Je3NpemU6OC41aW4gMTEuMGluOwotCW1hcmdpbjoxLjBpbiAxLjI1aW4gMS4waW4gMS4yNWluOwotCW1zby1oZWFkZXItbWFyZ2luOi41aW47Ci0JbXNvLWZvb3Rlci1tYXJnaW46LjVpbjsKLQltc28tcGFwZXItc291cmNlOjA7fQotZGl2LlNlY3Rpb24xCi0Je3BhZ2U6U2VjdGlvbjE7fQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPUVOLVVTIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+Ci0KLTxkaXYgY2xhc3M9U2VjdGlvbjE+Ci0KLTxwIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvYj4KLTwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUgotVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoJnF1b3Q7QUdSRUVNRU5UJnF1b3Q7KS4gQU5ZIFVTRSwKLVJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRQotT0YgVEhJUyBBR1JFRU1FTlQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4xLiBERUZJTklUSU9OUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBtZWFuczo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCi1kaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPWxlZnQ+Ci1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPndoZXJlCi1zdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkCi1ieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IKLWlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uCi1zdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKLVByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbgotd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQotd29ya3Mgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yCi1lbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMgJnF1b3Q7IG1lYW4gcGF0ZW50Ci1jbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZQotb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMKLWRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvCi1yZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4yLiBHUkFOVCBPRiBSSUdIVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudAotYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzxzcGFuCi1zdHlsZT0nY29sb3I6cmVkJz4gPC9zcGFuPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseQotZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKLUNvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQotZm9ybS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cwotUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+IDwvc3Bhbj5yb3lhbHR5LWZyZWUKLXBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQKLWFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZQotY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24KLW9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkCi1ieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbgotdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bwotYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcwotbGljZW5zZWQgaGVyZXVuZGVyLiA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5jKQotUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cwotQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IKLXRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLXJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudAotZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAotcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAotbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkKLXRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsCi1pZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlCi10aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlCi1kaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+ZCkKLUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0Ci1yaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCi10aGlzIEFncmVlbWVudC4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjMuIFJFUVVJUkVNRU5UUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZQotUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9zcGFuPgotPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1pdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQKLWNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUKLWFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5Ci1hbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywKLWluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2gKLWFzIGxvc3QgcHJvZml0czsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWlpKQotc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdAotQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPml2KQotc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZAotaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQotbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjxzcGFuIHN0eWxlPSdjb2xvcjpibHVlJz4gPC9zcGFuPjwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZQotY29kZSBmb3JtOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpIGEKLWNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkKLWNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZQotb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKLXN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkKLWFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMKLWFuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlCi1vZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKLXByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKLWxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmcXVvdDtDb21tZXJjaWFsCi1Db250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlcgotQ29udHJpYnV0b3IgKCZxdW90O0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnF1b3Q7KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kCi1jb3N0cyAoY29sbGVjdGl2ZWx5ICZxdW90O0xvc3NlcyZxdW90OykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCi1sZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0bwotdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbgotY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKLW9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcwotcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyCi10byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCi10byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZAotYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUKLWluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQotY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAotd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMKLXNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQotb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYQotY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz41LiBOTyBXQVJSQU5UWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsIFdJVEhPVVQKLVdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCi1XSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCi1NRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQotcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUKLVByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMKLUFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywKLWNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yCi1lcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SCi1BTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLShJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi1PRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORwotTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YKLVRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YKLVRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz43LiBHRU5FUkFMPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkCi1vciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgotZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0Ci1mdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZQotbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24KLWFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKLWFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGgKLW90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAotUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZQotc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAotc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKLWNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZQotcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKLXJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAotZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKLVJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQotUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUKLWNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcwotY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50Ci1TdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YKLXRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzCi10aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsCi1BZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0bwotc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uCi1vZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KLShpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAotaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwotdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKLWV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QKLWV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQotU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZgotQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzCi1pdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvcD4KLQotPC9kaXY+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfc2RrLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9zZGsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0ODkzZjcuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9zZGsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1FY2xpcHNlLm9yZyB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLU1hcmNoIDE3LCAyMDA1XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfc2RrLmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4M2FmMDYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl9zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfc2RrLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iSlNUIFNlcnZlciBGZWF0dXJlIFNESyIKLSAgICAgIHZlcnNpb249IjEuMC4xMDAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iRWNsaXBzZS5vcmciPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxsaWNlbnNlIHVybD0ibGljZW5zZS5odG1sIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSJXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgVXBkYXRlcyIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvd2VidG9vbHMvdXBkYXRlcy8iLz4KLSAgIDwvdXJsPgotCi0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfYWRhcHRlcnMuZmVhdHVyZS5zb3VyY2UiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3Nkay5mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfc2RrLmZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzQ3MDYwLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfc2RrLmZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzNjLm9yZy9UUi8xOTk5L1JFQy1odG1sNDAxLTE5OTkxMjI0L2xvb3NlLmR0ZCI+Ci08IS0tIHNhdmVkIGZyb20gdXJsPSgwMDQ0KWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsL25vdGljZS5odG1sIC0tPgotPEhUTUw+PEhFQUQ+PFRJVExFPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9USVRMRT4KLTxNRVRBIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxNRVRBIGNvbnRlbnQ9Ik1TSFRNTCA2LjAwLjI4MDAuMTQ3OSIgbmFtZT1HRU5FUkFUT1I+PC9IRUFEPgotPEJPRFkgbGFuZz1FTi1VUyB2TGluaz1wdXJwbGUgbGluaz1ibHVlPgotPEgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvSDI+Ci08UD5KYW51YXJ5IDI4LCAyMDA1PC9QPgotPEgzPlVzYWdlIE9mIENvbnRlbnQ8L0gzPgotPFA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIAotQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLiBVU0UgT0YgCi1USEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSAKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIAotQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCAKLUJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSAKLUFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSAKLUFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIAotTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9QPgotPEgzPkFwcGxpY2FibGUgTGljZW5zZXM8L0gzPgotPFA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIAotRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIAotUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPEEgCi1ocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLTxQPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCAKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5IAotKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSAKLWFyY2hpdmVzICgiRG93bmxvYWRzIikuPC9QPgotPFA+Q29udGVudCBtYXkgYmUgYXBwb3J0aW9uZWQgaW50byBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzIAotKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS4gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIAotUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgCi1jb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyAKLWFzc29jaWF0ZWQgd2l0aCBhIEZlYXR1cmUuIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgCi1uYW1lZCAicGx1Z2lucyIgYW5kIEZlYXR1cmVzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIG5hbWVkICJmZWF0dXJlcyIuPC9QPgotPFA+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkIAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgCi1GZWF0dXJlcy48L1A+Ci08UD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCAKLWluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIAotRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgCi0oIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSAKLWRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZSBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIAotbG9jYXRpb25zOjwvUD4KLTxVTD4KLSAgPExJPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeSAKLSAgPExJPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzIAotICA8TEk+U3ViZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zIAotICA8TEk+RmVhdHVyZSBkaXJlY3RvcmllcyA8L0xJPjwvVUw+Ci08UD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgCi11c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGUgCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgCi1GZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyAKLWFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIAotbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIAotZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIAotVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgCi1hbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IAotZGlyZWN0b3J5LjwvUD4KLTxQPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIAotT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiBTT01FIE9GIFRIRVNFIAotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L1A+Ci08VUw+Ci0gIDxMST5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L0E+KSAKLQotICA8TEk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9BPikgCi0KLSAgPExJPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9BPikgCi0KLSAgPExJPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L0E+KSAKLQotICA8TEk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvQT4pIAotICA8L0xJPjwvVUw+Ci08UD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgCi1wcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgCi1jb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L1A+Ci08SDM+Q3J5cHRvZ3JhcGh5PC9IMz4KLTxQPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSAKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIAotcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSAKLWVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyAKLWNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIAotdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvUD48L0JPRFk+PC9IVE1MPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl90ZXN0cy5mZWF0dXJlLy5jdnNpZ25vcmUgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3Rlc3RzLmZlYXR1cmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE0NDg3Yy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3Rlc3RzLmZlYXR1cmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJ1aWxkLnhtbApkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl90ZXN0cy5mZWF0dXJlLy5wcm9qZWN0IGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl90ZXN0cy5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGQzNmYxLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdGVzdHMuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdGVzdHMuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdGVzdHMuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl90ZXN0cy5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyYTFmY2YuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl90ZXN0cy5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbAotc3JjLmluY2x1ZGVzID0gYnVpbGQucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl90ZXN0cy5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3Rlc3RzLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3Rlc3RzLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdGVzdHMuZmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3Rlc3RzLmZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdGVzdHMuZmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KLTxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KLTxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPGxpbmsgcmVsPUZpbGUtTGlzdAotaHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Ci08dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KLTwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDxvOkRvY3VtZW50UHJvcGVydGllcz4KLSAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KLSAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgotICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+Ci0gIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+Ci0gIDxvOlBhZ2VzPjQ8L286UGFnZXM+Ci0gIDxvOldvcmRzPjE2MjY8L286V29yZHM+Ci0gIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgotICAgPG86TGluZXM+Nzc8L286TGluZXM+Ci0gIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KLSAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+Ci0gIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+Ci0gPC9vOkRvY3VtZW50UHJvcGVydGllcz4KLTwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDx3OldvcmREb2N1bWVudD4KLSAgPHc6VHJhY2tSZXZpc2lvbnMvPgotIDwvdzpXb3JkRG9jdW1lbnQ+Ci08L3htbD48IVtlbmRpZl0tLT4KLTxzdHlsZT4KLTwhLS0KLSAvKiBGb250IERlZmluaXRpb25zICovCi1AZm9udC1mYWNlCi0Je2ZvbnQtZmFtaWx5OlRhaG9tYTsKLQlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKLQltc28tZm9udC1jaGFyc2V0OjA7Ci0JbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7Ci0JbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7Ci0JbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9Ci0gLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KLXAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKLQl7bXNvLXN0eWxlLXBhcmVudDoiIjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wCi0Je21hcmdpbi1yaWdodDowaW47Ci0JbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87Ci0JbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0JbWFyZ2luLWxlZnQ6MGluOwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKLQl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZTo4LjBwdDsKLQlmb250LWZhbWlseTpUYWhvbWE7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotQHBhZ2UgU2VjdGlvbjEKLQl7c2l6ZTo4LjVpbiAxMS4waW47Ci0JbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47Ci0JbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKLQltc28tZm9vdGVyLW1hcmdpbjouNWluOwotCW1zby1wYXBlci1zb3VyY2U6MDt9Ci1kaXYuU2VjdGlvbjEKLQl7cGFnZTpTZWN0aW9uMTt9Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KLQotPGRpdiBjbGFzcz1TZWN0aW9uMT4KLQotPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgotPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCi1USEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAotUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCi1PRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1hZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKLXN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKLWJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgotaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KLXN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQotUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCi13aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCi13b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKLWVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKLWNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCi1vciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucwotZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KLXJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50Ci1hIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KLXN0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5Ci1kaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCi1mb3JtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCi1SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQotcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAotYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCi1jb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgotb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKLWJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCi10byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCi1hbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCi1SZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCi1Db250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgotdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Ci1mb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCi1saWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQotdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKLWlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKLXRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQotRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKLXJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KLXRoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Ci08L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAotY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQotYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKLWFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1lZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAotaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAotYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCi1zdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0Ci1Db250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCi1zdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCi1pbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCi1jb2RlIGZvcm06PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQotY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQotY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCi1vcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cwotc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQotYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycwotYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKLW9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAotbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCi1Db250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKLWNvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKLWxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCi10aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCi1jb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAotb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKLXRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKLXRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCi1hbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQotaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCi1jbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCi13YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcwotc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCi1vdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCi1jb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAotV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKLVdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKLU1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5Ci1yZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQotUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcwotQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAotY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKLWVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKLUFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLU9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgotVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgotVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKLW9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCi1lbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKLWZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCi1taW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgotYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQotYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAotb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCi1zdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1zaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgotY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCi1wZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncwotcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAotUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5Ci1SZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQotY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKLVN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgotdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKLXRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKLUFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCi1zZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KLW9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQotKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCi1pbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgotZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAotZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCi1TdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCi1BbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKLUFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKLWl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgotCi08L2Rpdj4KLQotPC9ib2R5PgotCi08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl90ZXN0cy5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl90ZXN0cy5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTg2YTJlLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdGVzdHMuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdGVzdHMuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSJKU1QgU2VydmVyIEZlYXR1cmUgSlVuaXQgVGVzdHMiCi0gICAgICB2ZXJzaW9uPSIxLjAuMS5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSJFY2xpcHNlLm9yZyI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGxpY2Vuc2UgdXJsPSJsaWNlbnNlLmh0bWwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLSAKLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSJXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgVXBkYXRlcyIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvd2VidG9vbHMvdXBkYXRlcy8iLz4KLSAgIDwvdXJsPgotCi0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUudGVzdHMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy50ZXN0cyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS50ZXN0cyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudGVzdHMucGVyZm9ybWFuY2UiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLnRlc3RzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpLnRlc3RzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdGVzdHMuZmVhdHVyZS9saWNlbnNlLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3Rlc3RzLmZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzQ3MDYwLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdGVzdHMuZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53M2Mub3JnL1RSLzE5OTkvUkVDLWh0bWw0MDEtMTk5OTEyMjQvbG9vc2UuZHRkIj4KLTwhLS0gc2F2ZWQgZnJvbSB1cmw9KDAwNDQpaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwvbm90aWNlLmh0bWwgLS0+Ci08SFRNTD48SEVBRD48VElUTEU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L1RJVExFPgotPE1FVEEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPE1FVEEgY29udGVudD0iTVNIVE1MIDYuMDAuMjgwMC4xNDc5IiBuYW1lPUdFTkVSQVRPUj48L0hFQUQ+Ci08Qk9EWSBsYW5nPUVOLVVTIHZMaW5rPXB1cnBsZSBsaW5rPWJsdWU+Ci08SDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9IMj4KLTxQPkphbnVhcnkgMjgsIDIwMDU8L1A+Ci08SDM+VXNhZ2UgT2YgQ29udGVudDwvSDM+Ci08UD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gCi1BTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuIFVTRSBPRiAKLVRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgCi1CRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIAotQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIAotQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSAKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIAotQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgCi1NQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L1A+Ci08SDM+QXBwbGljYWJsZSBMaWNlbnNlczwvSDM+Ci08UD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgCi1Gb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgCi1QdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8QSAKLWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotPFA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgCi0oIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIAotYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS48L1A+Ci08UD5Db250ZW50IG1heSBiZSBhcHBvcnRpb25lZCBpbnRvIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHMgCi0oIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLiBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgCi1QbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiBGaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSAKLWNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIAotYXNzb2NpYXRlZCB3aXRoIGEgRmVhdHVyZS4gUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyAKLW5hbWVkICJwbHVnaW5zIiBhbmQgRmVhdHVyZXMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgbmFtZWQgImZlYXR1cmVzIi48L1A+Ci08UD5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWQgCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCAKLUZlYXR1cmVzLjwvUD4KLTxQPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIAotaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgCi1GZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAKLSgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IAotZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgCi1sb2NhdGlvbnM6PC9QPgotPFVMPgotICA8TEk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5IAotICA8TEk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXMgCi0gIDxMST5TdWJkaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnMgCi0gIDxMST5GZWF0dXJlIGRpcmVjdG9yaWVzIDwvTEk+PC9VTD4KLTxQPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCAKLXVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZSAKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCAKLUZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gCi1sb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgCi1maWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgCi1VcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyAKLWFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgCi1kaXJlY3RvcnkuPC9QPgotPFA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgCi1PUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuIFNPTUUgT0YgVEhFU0UgCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvUD4KLTxVTD4KLSAgPExJPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L0E+KSAKLQotICA8TEk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L0E+KSAKLQotICA8TEk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L0E+KSAKLQotICA8TEk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvQT4pIAotCi0gIDxMST5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9BPikgCi0gIDwvTEk+PC9VTD4KLTxQPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyAKLXByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCAKLWNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvUD4KLTxIMz5DcnlwdG9ncmFwaHk8L0gzPgotPFA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgCi1yZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IAotZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIAotY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgCi10byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9QPjwvQk9EWT48L0hUTUw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VzZXJkb2MuZmVhdHVyZS8uY3ZzaWdub3JlIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl91c2VyZG9jLmZlYXR1cmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2QyZDQ3Ny4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VzZXJkb2MuZmVhdHVyZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1idWlsZC54bWwKLW9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdXNlcmRvYy5mZWF0dXJlXzEuMC4wLmphcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl91c2VyZG9jLmZlYXR1cmUvLnByb2plY3QgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VzZXJkb2MuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc3MTk2My4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VzZXJkb2MuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdXNlcmRvYy5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl91c2VyZG9jLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdXNlcmRvYy5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkYjdiMDMuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl91c2VyZG9jLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcwotc3JjLmluY2x1ZGVzID0gYnVpbGQucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl91c2VyZG9jLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdXNlcmRvYy5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl91c2VyZG9jLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdXNlcmRvYy5mZWF0dXJlL2VwbC12MTAuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdXNlcmRvYy5mZWF0dXJlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0YjE5Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VzZXJkb2MuZmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KLTxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KLTxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPGxpbmsgcmVsPUZpbGUtTGlzdAotaHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Ci08dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KLTwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDxvOkRvY3VtZW50UHJvcGVydGllcz4KLSAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KLSAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgotICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+Ci0gIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+Ci0gIDxvOlBhZ2VzPjQ8L286UGFnZXM+Ci0gIDxvOldvcmRzPjE2MjY8L286V29yZHM+Ci0gIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgotICAgPG86TGluZXM+Nzc8L286TGluZXM+Ci0gIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KLSAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+Ci0gIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+Ci0gPC9vOkRvY3VtZW50UHJvcGVydGllcz4KLTwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDx3OldvcmREb2N1bWVudD4KLSAgPHc6VHJhY2tSZXZpc2lvbnMvPgotIDwvdzpXb3JkRG9jdW1lbnQ+Ci08L3htbD48IVtlbmRpZl0tLT4KLTxzdHlsZT4KLTwhLS0KLSAvKiBGb250IERlZmluaXRpb25zICovCi1AZm9udC1mYWNlCi0Je2ZvbnQtZmFtaWx5OlRhaG9tYTsKLQlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKLQltc28tZm9udC1jaGFyc2V0OjA7Ci0JbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7Ci0JbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7Ci0JbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9Ci0gLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KLXAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKLQl7bXNvLXN0eWxlLXBhcmVudDoiIjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wCi0Je21hcmdpbi1yaWdodDowaW47Ci0JbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87Ci0JbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0JbWFyZ2luLWxlZnQ6MGluOwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKLQl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZTo4LjBwdDsKLQlmb250LWZhbWlseTpUYWhvbWE7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotQHBhZ2UgU2VjdGlvbjEKLQl7c2l6ZTo4LjVpbiAxMS4waW47Ci0JbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47Ci0JbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKLQltc28tZm9vdGVyLW1hcmdpbjouNWluOwotCW1zby1wYXBlci1zb3VyY2U6MDt9Ci1kaXYuU2VjdGlvbjEKLQl7cGFnZTpTZWN0aW9uMTt9Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KLQotPGRpdiBjbGFzcz1TZWN0aW9uMT4KLQotPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgotPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCi1USEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAotUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCi1PRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1hZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKLXN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKLWJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgotaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KLXN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQotUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCi13aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCi13b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKLWVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKLWNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCi1vciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucwotZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KLXJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50Ci1hIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KLXN0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5Ci1kaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCi1mb3JtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCi1SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQotcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAotYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCi1jb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgotb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKLWJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCi10byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCi1hbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCi1SZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCi1Db250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgotdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Ci1mb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCi1saWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQotdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKLWlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKLXRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQotRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKLXJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KLXRoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Ci08L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAotY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQotYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKLWFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1lZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAotaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAotYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCi1zdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0Ci1Db250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCi1zdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCi1pbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCi1jb2RlIGZvcm06PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQotY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQotY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCi1vcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cwotc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQotYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycwotYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKLW9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAotbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCi1Db250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKLWNvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKLWxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCi10aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCi1jb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAotb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKLXRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKLXRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCi1hbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQotaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCi1jbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCi13YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcwotc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCi1vdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCi1jb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAotV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKLVdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKLU1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5Ci1yZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQotUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcwotQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAotY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKLWVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKLUFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLU9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgotVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgotVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKLW9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCi1lbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKLWZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCi1taW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgotYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQotYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAotb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCi1zdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1zaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgotY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCi1wZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncwotcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAotUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5Ci1SZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQotY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKLVN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgotdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKLXRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKLUFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCi1zZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KLW9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQotKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCi1pbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgotZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAotZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCi1TdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCi1BbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKLUFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKLWl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgotCi08L2Rpdj4KLQotPC9ib2R5PgotCi08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl91c2VyZG9jLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl91c2VyZG9jLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDg5M2Y3Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdXNlcmRvYy5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPUVjbGlwc2Uub3JnIHVwZGF0ZSBzaXRlCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotTWFyY2ggMTcsIDIwMDVcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VzZXJkb2MuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdXNlcmRvYy5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWIwYzJmLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXJfdXNlcmRvYy5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlcl91c2VyZG9jLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iSlNUIFNlcnZlciBGZWF0dXJlIFVzZXIgRG9jdW1lbnRhdGlvbiIKLSAgICAgIHZlcnNpb249IjEuMC4xMDAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iRWNsaXBzZS5vcmciPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxsaWNlbnNlIHVybD0ibGljZW5zZS5odG1sIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSJXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgVXBkYXRlcyIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvd2VidG9vbHMvdXBkYXRlcy8iLz4KLSAgIDwvdXJsPgotCi0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpLmRvYy51c2VyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VzZXJkb2MuZmVhdHVyZS9saWNlbnNlLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyX3VzZXJkb2MuZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzNDcwNjAuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LnNlcnZlcl91c2VyZG9jLmZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzNjLm9yZy9UUi8xOTk5L1JFQy1odG1sNDAxLTE5OTkxMjI0L2xvb3NlLmR0ZCI+Ci08IS0tIHNhdmVkIGZyb20gdXJsPSgwMDQ0KWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsL25vdGljZS5odG1sIC0tPgotPEhUTUw+PEhFQUQ+PFRJVExFPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9USVRMRT4KLTxNRVRBIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxNRVRBIGNvbnRlbnQ9Ik1TSFRNTCA2LjAwLjI4MDAuMTQ3OSIgbmFtZT1HRU5FUkFUT1I+PC9IRUFEPgotPEJPRFkgbGFuZz1FTi1VUyB2TGluaz1wdXJwbGUgbGluaz1ibHVlPgotPEgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvSDI+Ci08UD5KYW51YXJ5IDI4LCAyMDA1PC9QPgotPEgzPlVzYWdlIE9mIENvbnRlbnQ8L0gzPgotPFA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIAotQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLiBVU0UgT0YgCi1USEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSAKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIAotQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCAKLUJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSAKLUFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSAKLUFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIAotTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9QPgotPEgzPkFwcGxpY2FibGUgTGljZW5zZXM8L0gzPgotPFA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIAotRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIAotUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPEEgCi1ocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLTxQPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCAKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5IAotKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSAKLWFyY2hpdmVzICgiRG93bmxvYWRzIikuPC9QPgotPFA+Q29udGVudCBtYXkgYmUgYXBwb3J0aW9uZWQgaW50byBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzIAotKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS4gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIAotUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgCi1jb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyAKLWFzc29jaWF0ZWQgd2l0aCBhIEZlYXR1cmUuIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgCi1uYW1lZCAicGx1Z2lucyIgYW5kIEZlYXR1cmVzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIG5hbWVkICJmZWF0dXJlcyIuPC9QPgotPFA+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkIAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgCi1GZWF0dXJlcy48L1A+Ci08UD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCAKLWluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIAotRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgCi0oIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSAKLWRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZSBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIAotbG9jYXRpb25zOjwvUD4KLTxVTD4KLSAgPExJPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeSAKLSAgPExJPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzIAotICA8TEk+U3ViZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zIAotICA8TEk+RmVhdHVyZSBkaXJlY3RvcmllcyA8L0xJPjwvVUw+Ci08UD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgCi11c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGUgCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgCi1GZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyAKLWFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIAotbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIAotZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIAotVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgCi1hbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IAotZGlyZWN0b3J5LjwvUD4KLTxQPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIAotT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiBTT01FIE9GIFRIRVNFIAotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L1A+Ci08VUw+Ci0gIDxMST5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L0E+KSAKLQotICA8TEk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9BPikgCi0KLSAgPExJPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9BPikgCi0KLSAgPExJPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L0E+KSAKLQotICA8TEk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvQT4pIAotICA8L0xJPjwvVUw+Ci08UD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgCi1wcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgCi1jb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L1A+Ci08SDM+Q3J5cHRvZ3JhcGh5PC9IMz4KLTxQPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSAKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIAotcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSAKLWVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyAKLWNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIAotdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvUD48L0JPRFk+PC9IVE1MPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9zZGsuZmVhdHVyZS8uY3ZzaWdub3JlIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9zZGsuZmVhdHVyZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZThlM2Y5Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfc2RrLmZlYXR1cmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotZmVhdHVyZXMKLXBsdWdpbnMKLW9yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfc2RrLmZlYXR1cmVfMS4wLjAuYmluLmRpc3QuemlwCi1idWlsZC54bWwKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfc2RrLmZlYXR1cmUvLnByb2plY3QgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX3Nkay5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmYyMmM2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfc2RrLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3Quc2VydmVyX3Nkay5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9zZGsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9zZGsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWFlNjVkLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfc2RrLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcwotCi1nZW5lcmF0ZS5mZWF0dXJlQG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdWkuZmVhdHVyZS5zb3VyY2U9b3JnLmVjbGlwc2Uud3N0LnNlcnZlcl91aS5mZWF0dXJlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX3Nkay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX3Nkay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9zZGsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9zZGsuZmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX3Nkay5mZWF0dXJlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0YjE5Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX3Nkay5mZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bWV0YSBuYW1lPU9yaWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bGluayByZWw9RmlsZS1MaXN0Ci1ocmVmPSIuL0VjbGlwc2UlMjBFUEwlMjAyMDAzXzExXzEwJTIwRmluYWxfZmlsZXMvZmlsZWxpc3QueG1sIj4KLTx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgotPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPG86RG9jdW1lbnRQcm9wZXJ0aWVzPgotICA8bzpSZXZpc2lvbj4yPC9vOlJldmlzaW9uPgotICA8bzpUb3RhbFRpbWU+MzwvbzpUb3RhbFRpbWU+Ci0gIDxvOkNyZWF0ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286Q3JlYXRlZD4KLSAgPG86TGFzdFNhdmVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkxhc3RTYXZlZD4KLSAgPG86UGFnZXM+NDwvbzpQYWdlcz4KLSAgPG86V29yZHM+MTYyNjwvbzpXb3Jkcz4KLSAgPG86Q2hhcmFjdGVycz45MjcwPC9vOkNoYXJhY3RlcnM+Ci0gICA8bzpMaW5lcz43NzwvbzpMaW5lcz4KLSAgPG86UGFyYWdyYXBocz4xODwvbzpQYXJhZ3JhcGhzPgotICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMTM4NDwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4KLSAgPG86VmVyc2lvbj45LjQ0MDI8L286VmVyc2lvbj4KLSA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgotPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPHc6V29yZERvY3VtZW50PgotICA8dzpUcmFja1JldmlzaW9ucy8+Ci0gPC93OldvcmREb2N1bWVudD4KLTwveG1sPjwhW2VuZGlmXS0tPgotPHN0eWxlPgotPCEtLQotIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KLUBmb250LWZhY2UKLQl7Zm9udC1mYW1pbHk6VGFob21hOwotCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0OwotCW1zby1mb250LWNoYXJzZXQ6MDsKLQltc28tZ2VuZXJpYy1mb250LWZhbWlseTpzd2lzczsKLQltc28tZm9udC1waXRjaDp2YXJpYWJsZTsKLQltc28tZm9udC1zaWduYXR1cmU6NTUzNjc5NDk1IC0yMTQ3NDgzNjQ4IDggMCA2NjA0NyAwO30KLSAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLwotcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAotCXttc28tc3R5bGUtcGFyZW50OiIiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAKLQl7bWFyZ2luLXJpZ2h0OjBpbjsKLQltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKLQltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLQltYXJnaW4tbGVmdDowaW47Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcC5CYWxsb29uVGV4dCwgbGkuQmFsbG9vblRleHQsIGRpdi5CYWxsb29uVGV4dAotCXttc28tc3R5bGUtbmFtZToiQmFsbG9vbiBUZXh0IjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjguMHB0OwotCWZvbnQtZmFtaWx5OlRhaG9tYTsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1AcGFnZSBTZWN0aW9uMQotCXtzaXplOjguNWluIDExLjBpbjsKLQltYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjsKLQltc28taGVhZGVyLW1hcmdpbjouNWluOwotCW1zby1mb290ZXItbWFyZ2luOi41aW47Ci0JbXNvLXBhcGVyLXNvdXJjZTowO30KLWRpdi5TZWN0aW9uMQotCXtwYWdlOlNlY3Rpb24xO30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz1FTi1VUyBzdHlsZT0ndGFiLWludGVydmFsOi41aW4nPgotCi08ZGl2IGNsYXNzPVNlY3Rpb24xPgotCi08cCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+Ci08L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIKLVRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsCi1SRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UKLU9GIFRISVMgQUdSRUVNRU5ULjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+MS4gREVGSU5JVElPTlM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbgotZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj1sZWZ0PgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1jaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz53aGVyZQotc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZAotYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yCi1pZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbgotc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCi1Qcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24KLXdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKLXdvcmtzIG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgbWVhbnMgYW55IHBlcnNvbiBvcgotZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtMaWNlbnNlZCBQYXRlbnRzICZxdW90OyBtZWFuIHBhdGVudAotY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2UKLW9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtQcm9ncmFtJnF1b3Q7IG1lYW5zIHRoZSBDb250cmlidXRpb25zCi1kaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobwotcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Mi4gR1JBTlQgT0YgUklHSFRTPC9zcGFuPjwvYj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQKLWEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88c3Bhbgotc3R5bGU9J2NvbG9yOnJlZCc+IDwvc3Bhbj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkKLWRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCi1Db250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKLWZvcm0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKLVJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW4nPiA8L3NwYW4+cm95YWx0eS1mcmVlCi1wYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0Ci1hbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UKLWNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uCi1vZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZAotYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24KLXRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8KLWFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci4gPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YykKLVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMKLUNvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCi10aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQKLWZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKLWxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5Ci10byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLAotaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZQotdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZQotZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmQpCi1FYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodAotcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgotdGhpcyBBZ3JlZW1lbnQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4zLiBSRVFVSVJFTUVOVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUKLVByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0Ojwvc3Bhbj4KLTwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotaXRzIGxpY2Vuc2UgYWdyZWVtZW50Ojwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1lZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kCi1jb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlCi1hbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eQotYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsCi1pbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoCi1hcyBsb3N0IHByb2ZpdHM7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpaSkKLXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQKLUNvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pdikKLXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQKLWluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48c3BhbiBzdHlsZT0nY29sb3I6Ymx1ZSc+IDwvc3Bhbj48L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UKLWNvZGUgZm9ybTo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKSBhCi1jb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55Ci1jb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUKLW9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCi1zdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5Ci1hY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzCi1hbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZQotb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsCi1saWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJnF1b3Q7Q29tbWVyY2lhbAotQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIKLUNvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZAotY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgotbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8KLXRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KLWNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0Ci1vZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKLXJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcgotdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQKLWFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlCi1pbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQotQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKLXdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzCi1zZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKLW90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEKLWNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NS4gTk8gV0FSUkFOVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUCi1XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAotV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAotTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKLXJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlCi1Qcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsCi1jb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvcgotZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUgotQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GCi1USEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GCi1USEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ny4gR0VORVJBTDwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZAotb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dAotZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUKLW1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uCi1hZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoCi1vdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKLVJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUKLXN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKLXNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCi1jb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKLXBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzCi1yaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCi1SZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKLVJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlCi1jb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKLWNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudAotU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mCi10aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcwotdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbAotQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8KLXNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbgotb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLShpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKLWluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KLXRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCi1leHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90Ci1leHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUKLVN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YKLUFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcwotQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcwotaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3A+Ci0KLTwvZGl2PgotCi08L2JvZHk+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX3Nkay5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfc2RrLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDg5M2Y3Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfc2RrLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9RWNsaXBzZS5vcmcgdXBkYXRlIHNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1NYXJjaCAxNywgMjAwNVxuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfc2RrLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX3Nkay5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTJjMjEyLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfc2RrLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyX3Nkay5mZWF0dXJlIgotICAgICAgbGFiZWw9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfc2RrLmZlYXR1cmUiCi0gICAgICB2ZXJzaW9uPSIxLjAuMTAwLnF1YWxpZmllciI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGxpY2Vuc2UgdXJsPSJsaWNlbnNlLmh0bWwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgbGFiZWw9IldlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBVcGRhdGVzIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy93ZWJ0b29scy91cGRhdGVzLyIvPgotICAgPC91cmw+Ci0KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlcl91aS5mZWF0dXJlLnNvdXJjZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfc2RrLmZlYXR1cmUvbGljZW5zZS5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9zZGsuZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzNDcwNjAuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl9zZGsuZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53M2Mub3JnL1RSLzE5OTkvUkVDLWh0bWw0MDEtMTk5OTEyMjQvbG9vc2UuZHRkIj4KLTwhLS0gc2F2ZWQgZnJvbSB1cmw9KDAwNDQpaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwvbm90aWNlLmh0bWwgLS0+Ci08SFRNTD48SEVBRD48VElUTEU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L1RJVExFPgotPE1FVEEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPE1FVEEgY29udGVudD0iTVNIVE1MIDYuMDAuMjgwMC4xNDc5IiBuYW1lPUdFTkVSQVRPUj48L0hFQUQ+Ci08Qk9EWSBsYW5nPUVOLVVTIHZMaW5rPXB1cnBsZSBsaW5rPWJsdWU+Ci08SDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9IMj4KLTxQPkphbnVhcnkgMjgsIDIwMDU8L1A+Ci08SDM+VXNhZ2UgT2YgQ29udGVudDwvSDM+Ci08UD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gCi1BTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuIFVTRSBPRiAKLVRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgCi1CRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIAotQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIAotQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSAKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIAotQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgCi1NQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L1A+Ci08SDM+QXBwbGljYWJsZSBMaWNlbnNlczwvSDM+Ci08UD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgCi1Gb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgCi1QdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8QSAKLWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotPFA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgCi0oIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIAotYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS48L1A+Ci08UD5Db250ZW50IG1heSBiZSBhcHBvcnRpb25lZCBpbnRvIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHMgCi0oIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLiBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgCi1QbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiBGaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSAKLWNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIAotYXNzb2NpYXRlZCB3aXRoIGEgRmVhdHVyZS4gUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyAKLW5hbWVkICJwbHVnaW5zIiBhbmQgRmVhdHVyZXMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgbmFtZWQgImZlYXR1cmVzIi48L1A+Ci08UD5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWQgCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCAKLUZlYXR1cmVzLjwvUD4KLTxQPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIAotaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgCi1GZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAKLSgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IAotZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgCi1sb2NhdGlvbnM6PC9QPgotPFVMPgotICA8TEk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5IAotICA8TEk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXMgCi0gIDxMST5TdWJkaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnMgCi0gIDxMST5GZWF0dXJlIGRpcmVjdG9yaWVzIDwvTEk+PC9VTD4KLTxQPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCAKLXVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZSAKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCAKLUZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gCi1sb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgCi1maWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgCi1VcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyAKLWFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgCi1kaXJlY3RvcnkuPC9QPgotPFA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgCi1PUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuIFNPTUUgT0YgVEhFU0UgCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvUD4KLTxVTD4KLSAgPExJPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L0E+KSAKLQotICA8TEk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L0E+KSAKLQotICA8TEk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L0E+KSAKLQotICA8TEk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvQT4pIAotCi0gIDxMST5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9BPikgCi0gIDwvTEk+PC9VTD4KLTxQPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyAKLXByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCAKLWNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvUD4KLTxIMz5DcnlwdG9ncmFwaHk8L0gzPgotPFA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgCi1yZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IAotZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIAotY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgCi10byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9QPjwvQk9EWT48L0hUTUw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX3Rlc3RzLmZlYXR1cmUvLmN2c2lnbm9yZSBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdGVzdHMuZmVhdHVyZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDQ0NDU5Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdGVzdHMuZmVhdHVyZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1idWlsZC54bWwKLW9yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdGVzdHMuZmVhdHVyZV8wLjAuMC5iaW4uZGlzdC56aXAKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdGVzdHMuZmVhdHVyZS8ucHJvamVjdCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdGVzdHMuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGUyNTZjZS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX3Rlc3RzLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3Quc2VydmVyX3Rlc3RzLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX3Rlc3RzLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdGVzdHMuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDFjOTRlLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdGVzdHMuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwKLXNyYy5pbmNsdWRlcyA9IGxpY2Vuc2UuaHRtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBidWlsZC5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX3Rlc3RzLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdGVzdHMuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdGVzdHMuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl90ZXN0cy5mZWF0dXJlL2VwbC12MTAuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdGVzdHMuZmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGIxOTYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl90ZXN0cy5mZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bWV0YSBuYW1lPU9yaWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bGluayByZWw9RmlsZS1MaXN0Ci1ocmVmPSIuL0VjbGlwc2UlMjBFUEwlMjAyMDAzXzExXzEwJTIwRmluYWxfZmlsZXMvZmlsZWxpc3QueG1sIj4KLTx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgotPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPG86RG9jdW1lbnRQcm9wZXJ0aWVzPgotICA8bzpSZXZpc2lvbj4yPC9vOlJldmlzaW9uPgotICA8bzpUb3RhbFRpbWU+MzwvbzpUb3RhbFRpbWU+Ci0gIDxvOkNyZWF0ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286Q3JlYXRlZD4KLSAgPG86TGFzdFNhdmVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkxhc3RTYXZlZD4KLSAgPG86UGFnZXM+NDwvbzpQYWdlcz4KLSAgPG86V29yZHM+MTYyNjwvbzpXb3Jkcz4KLSAgPG86Q2hhcmFjdGVycz45MjcwPC9vOkNoYXJhY3RlcnM+Ci0gICA8bzpMaW5lcz43NzwvbzpMaW5lcz4KLSAgPG86UGFyYWdyYXBocz4xODwvbzpQYXJhZ3JhcGhzPgotICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMTM4NDwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4KLSAgPG86VmVyc2lvbj45LjQ0MDI8L286VmVyc2lvbj4KLSA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgotPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPHc6V29yZERvY3VtZW50PgotICA8dzpUcmFja1JldmlzaW9ucy8+Ci0gPC93OldvcmREb2N1bWVudD4KLTwveG1sPjwhW2VuZGlmXS0tPgotPHN0eWxlPgotPCEtLQotIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KLUBmb250LWZhY2UKLQl7Zm9udC1mYW1pbHk6VGFob21hOwotCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0OwotCW1zby1mb250LWNoYXJzZXQ6MDsKLQltc28tZ2VuZXJpYy1mb250LWZhbWlseTpzd2lzczsKLQltc28tZm9udC1waXRjaDp2YXJpYWJsZTsKLQltc28tZm9udC1zaWduYXR1cmU6NTUzNjc5NDk1IC0yMTQ3NDgzNjQ4IDggMCA2NjA0NyAwO30KLSAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLwotcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAotCXttc28tc3R5bGUtcGFyZW50OiIiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAKLQl7bWFyZ2luLXJpZ2h0OjBpbjsKLQltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKLQltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLQltYXJnaW4tbGVmdDowaW47Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcC5CYWxsb29uVGV4dCwgbGkuQmFsbG9vblRleHQsIGRpdi5CYWxsb29uVGV4dAotCXttc28tc3R5bGUtbmFtZToiQmFsbG9vbiBUZXh0IjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjguMHB0OwotCWZvbnQtZmFtaWx5OlRhaG9tYTsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1AcGFnZSBTZWN0aW9uMQotCXtzaXplOjguNWluIDExLjBpbjsKLQltYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjsKLQltc28taGVhZGVyLW1hcmdpbjouNWluOwotCW1zby1mb290ZXItbWFyZ2luOi41aW47Ci0JbXNvLXBhcGVyLXNvdXJjZTowO30KLWRpdi5TZWN0aW9uMQotCXtwYWdlOlNlY3Rpb24xO30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz1FTi1VUyBzdHlsZT0ndGFiLWludGVydmFsOi41aW4nPgotCi08ZGl2IGNsYXNzPVNlY3Rpb24xPgotCi08cCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+Ci08L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIKLVRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsCi1SRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UKLU9GIFRISVMgQUdSRUVNRU5ULjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+MS4gREVGSU5JVElPTlM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbgotZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj1sZWZ0PgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1jaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz53aGVyZQotc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZAotYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yCi1pZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbgotc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCi1Qcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24KLXdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKLXdvcmtzIG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgbWVhbnMgYW55IHBlcnNvbiBvcgotZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtMaWNlbnNlZCBQYXRlbnRzICZxdW90OyBtZWFuIHBhdGVudAotY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2UKLW9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtQcm9ncmFtJnF1b3Q7IG1lYW5zIHRoZSBDb250cmlidXRpb25zCi1kaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobwotcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Mi4gR1JBTlQgT0YgUklHSFRTPC9zcGFuPjwvYj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQKLWEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88c3Bhbgotc3R5bGU9J2NvbG9yOnJlZCc+IDwvc3Bhbj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkKLWRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCi1Db250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKLWZvcm0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKLVJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW4nPiA8L3NwYW4+cm95YWx0eS1mcmVlCi1wYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0Ci1hbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UKLWNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uCi1vZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZAotYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24KLXRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8KLWFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci4gPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YykKLVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMKLUNvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCi10aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQKLWZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKLWxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5Ci10byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLAotaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZQotdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZQotZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmQpCi1FYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodAotcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgotdGhpcyBBZ3JlZW1lbnQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4zLiBSRVFVSVJFTUVOVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUKLVByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0Ojwvc3Bhbj4KLTwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotaXRzIGxpY2Vuc2UgYWdyZWVtZW50Ojwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1lZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kCi1jb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlCi1hbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eQotYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsCi1pbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoCi1hcyBsb3N0IHByb2ZpdHM7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpaSkKLXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQKLUNvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pdikKLXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQKLWluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48c3BhbiBzdHlsZT0nY29sb3I6Ymx1ZSc+IDwvc3Bhbj48L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UKLWNvZGUgZm9ybTo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKSBhCi1jb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55Ci1jb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUKLW9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCi1zdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5Ci1hY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzCi1hbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZQotb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsCi1saWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJnF1b3Q7Q29tbWVyY2lhbAotQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIKLUNvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZAotY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgotbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8KLXRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KLWNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0Ci1vZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKLXJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcgotdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQKLWFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlCi1pbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQotQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKLXdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzCi1zZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKLW90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEKLWNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NS4gTk8gV0FSUkFOVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUCi1XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAotV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAotTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKLXJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlCi1Qcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsCi1jb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvcgotZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUgotQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GCi1USEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GCi1USEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ny4gR0VORVJBTDwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZAotb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dAotZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUKLW1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uCi1hZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoCi1vdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKLVJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUKLXN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKLXNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCi1jb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKLXBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzCi1yaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCi1SZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKLVJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlCi1jb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKLWNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudAotU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mCi10aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcwotdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbAotQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8KLXNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbgotb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLShpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKLWluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KLXRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCi1leHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90Ci1leHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUKLVN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YKLUFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcwotQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcwotaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3A+Ci0KLTwvZGl2PgotCi08L2JvZHk+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX3Rlc3RzLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX3Rlc3RzLmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzNGQ5MWQuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl90ZXN0cy5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlcl90ZXN0cy5mZWF0dXJlIgotICAgICAgbGFiZWw9IldTVCBTZXJ2ZXIgSlVuaXQgVGVzdHMiCi0gICAgICB2ZXJzaW9uPSIxLjAuMS5xdWFsaWZpZXIiPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLQotCi0gICA8bGljZW5zZSB1cmw9ImxpY2Vuc2UuaHRtbCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IGZlYXR1cmU9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlIi8+Ci0gICAgICA8aW1wb3J0IGZlYXR1cmU9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdWkuZmVhdHVyZSIvPgotICAgPC9yZXF1aXJlcz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUudGVzdHMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLnRlc3RzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudGVzdHMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudGVzdHMucGVyZm9ybWFuY2UiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkudGVzdHMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl90ZXN0cy5mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdGVzdHMuZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzNDcwNjAuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl90ZXN0cy5mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczYy5vcmcvVFIvMTk5OS9SRUMtaHRtbDQwMS0xOTk5MTIyNC9sb29zZS5kdGQiPgotPCEtLSBzYXZlZCBmcm9tIHVybD0oMDA0NClodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC9ub3RpY2UuaHRtbCAtLT4KLTxIVE1MPjxIRUFEPjxUSVRMRT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvVElUTEU+Ci08TUVUQSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08TUVUQSBjb250ZW50PSJNU0hUTUwgNi4wMC4yODAwLjE0NzkiIG5hbWU9R0VORVJBVE9SPjwvSEVBRD4KLTxCT0RZIGxhbmc9RU4tVVMgdkxpbms9cHVycGxlIGxpbms9Ymx1ZT4KLTxIMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L0gyPgotPFA+SmFudWFyeSAyOCwgMjAwNTwvUD4KLTxIMz5Vc2FnZSBPZiBDb250ZW50PC9IMz4KLTxQPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiAKLUFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gVVNFIE9GIAotVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCAKLUJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgCi1CWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgCi1BR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgCi1BUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSAKLU1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvUD4KLTxIMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9IMz4KLTxQPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSAKLUZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSAKLVB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyAKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxBIAotaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci08UD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAKLSgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgCi1hcmNoaXZlcyAoIkRvd25sb2FkcyIpLjwvUD4KLTxQPkNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAKLSgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSAKLVBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IAotY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgCi1hc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIAotbmFtZWQgInBsdWdpbnMiIGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAiZmVhdHVyZXMiLjwvUD4KLTxQPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZCAKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIAotRmVhdHVyZXMuPC9QPgotPFA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgCi1pbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyAKLUZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiIAotKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgCi1kaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyAKLWxvY2F0aW9uczo8L1A+Ci08VUw+Ci0gIDxMST5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnkgCi0gIDxMST5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllcyAKLSAgPExJPlN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWlucyAKLSAgPExJPkZlYXR1cmUgZGlyZWN0b3JpZXMgPC9MST48L1VMPgotPFA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIAotdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlIAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIAotRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgCi1hbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiAKLWxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiAKLWZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSAKLVVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCAKLWRpcmVjdG9yeS48L1A+Ci08UD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCAKLU9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRSAKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9QPgotPFVMPgotICA8TEk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvQT4pIAotCi0gIDxMST5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvQT4pIAotCi0gIDxMST5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9BPikgCi0KLSAgPExJPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L0E+KSAKLSAgPC9MST48L1VMPgotPFA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiAKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIAotcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIAotY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9QPgotPEgzPkNyeXB0b2dyYXBoeTwvSDM+Ci08UD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciAKLXJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgCi1lbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgCi1jb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCAKLXRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L1A+PC9CT0RZPjwvSFRNTD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdXNlcmRvYy5mZWF0dXJlLy5jdnNpZ25vcmUgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX3VzZXJkb2MuZmVhdHVyZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTA2ZDVkLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdXNlcmRvYy5mZWF0dXJlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWJ1aWxkLnhtbAotb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl91c2VyZG9jLmZlYXR1cmVfMS4wLjAuamFyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX3VzZXJkb2MuZmVhdHVyZS8ucHJvamVjdCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdXNlcmRvYy5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzRjZTQ0Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdXNlcmRvYy5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LnNlcnZlcl91c2VyZG9jLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX3VzZXJkb2MuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl91c2VyZG9jLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZhNGRjZS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX3VzZXJkb2MuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcwotc3JjLmluY2x1ZGVzID0gbGljZW5zZS5odG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGJ1aWxkLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdXNlcmRvYy5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX3VzZXJkb2MuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdXNlcmRvYy5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX3VzZXJkb2MuZmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX3VzZXJkb2MuZmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGIxOTYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl91c2VyZG9jLmZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+Ci0KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Ci08bWV0YSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+Ci08bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxtZXRhIG5hbWU9T3JpZ2luYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxsaW5rIHJlbD1GaWxlLUxpc3QKLWhyZWY9Ii4vRWNsaXBzZSUyMEVQTCUyMDIwMDNfMTFfMTAlMjBGaW5hbF9maWxlcy9maWxlbGlzdC54bWwiPgotPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Ci08IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8bzpEb2N1bWVudFByb3BlcnRpZXM+Ci0gIDxvOlJldmlzaW9uPjI8L286UmV2aXNpb24+Ci0gIDxvOlRvdGFsVGltZT4zPC9vOlRvdGFsVGltZT4KLSAgPG86Q3JlYXRlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpDcmVhdGVkPgotICA8bzpMYXN0U2F2ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286TGFzdFNhdmVkPgotICA8bzpQYWdlcz40PC9vOlBhZ2VzPgotICA8bzpXb3Jkcz4xNjI2PC9vOldvcmRzPgotICA8bzpDaGFyYWN0ZXJzPjkyNzA8L286Q2hhcmFjdGVycz4KLSAgIDxvOkxpbmVzPjc3PC9vOkxpbmVzPgotICA8bzpQYXJhZ3JhcGhzPjE4PC9vOlBhcmFncmFwaHM+Ci0gIDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjExMzg0PC9vOkNoYXJhY3RlcnNXaXRoU3BhY2VzPgotICA8bzpWZXJzaW9uPjkuNDQwMjwvbzpWZXJzaW9uPgotIDwvbzpEb2N1bWVudFByb3BlcnRpZXM+Ci08L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8dzpXb3JkRG9jdW1lbnQ+Ci0gIDx3OlRyYWNrUmV2aXNpb25zLz4KLSA8L3c6V29yZERvY3VtZW50PgotPC94bWw+PCFbZW5kaWZdLS0+Ci08c3R5bGU+Ci08IS0tCi0gLyogRm9udCBEZWZpbml0aW9ucyAqLwotQGZvbnQtZmFjZQotCXtmb250LWZhbWlseTpUYWhvbWE7Ci0JcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7Ci0JbXNvLWZvbnQtY2hhcnNldDowOwotCW1zby1nZW5lcmljLWZvbnQtZmFtaWx5OnN3aXNzOwotCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOwotCW1zby1mb250LXNpZ25hdHVyZTo1NTM2Nzk0OTUgLTIxNDc0ODM2NDggOCAwIDY2MDQ3IDA7fQotIC8qIFN0eWxlIERlZmluaXRpb25zICovCi1wLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCi0Je21zby1zdHlsZS1wYXJlbnQ6IiI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcAotCXttYXJnaW4tcmlnaHQ6MGluOwotCW1zby1tYXJnaW4tdG9wLWFsdDphdXRvOwotCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotCW1hcmdpbi1sZWZ0OjBpbjsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wLkJhbGxvb25UZXh0LCBsaS5CYWxsb29uVGV4dCwgZGl2LkJhbGxvb25UZXh0Ci0Je21zby1zdHlsZS1uYW1lOiJCYWxsb29uIFRleHQiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6OC4wcHQ7Ci0JZm9udC1mYW1pbHk6VGFob21hOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLUBwYWdlIFNlY3Rpb24xCi0Je3NpemU6OC41aW4gMTEuMGluOwotCW1hcmdpbjoxLjBpbiAxLjI1aW4gMS4waW4gMS4yNWluOwotCW1zby1oZWFkZXItbWFyZ2luOi41aW47Ci0JbXNvLWZvb3Rlci1tYXJnaW46LjVpbjsKLQltc28tcGFwZXItc291cmNlOjA7fQotZGl2LlNlY3Rpb24xCi0Je3BhZ2U6U2VjdGlvbjE7fQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPUVOLVVTIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+Ci0KLTxkaXYgY2xhc3M9U2VjdGlvbjE+Ci0KLTxwIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvYj4KLTwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUgotVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoJnF1b3Q7QUdSRUVNRU5UJnF1b3Q7KS4gQU5ZIFVTRSwKLVJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRQotT0YgVEhJUyBBR1JFRU1FTlQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4xLiBERUZJTklUSU9OUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBtZWFuczo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCi1kaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPWxlZnQ+Ci1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPndoZXJlCi1zdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkCi1ieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IKLWlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uCi1zdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKLVByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbgotd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQotd29ya3Mgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yCi1lbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMgJnF1b3Q7IG1lYW4gcGF0ZW50Ci1jbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZQotb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMKLWRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvCi1yZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4yLiBHUkFOVCBPRiBSSUdIVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudAotYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzxzcGFuCi1zdHlsZT0nY29sb3I6cmVkJz4gPC9zcGFuPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseQotZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKLUNvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQotZm9ybS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cwotUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+IDwvc3Bhbj5yb3lhbHR5LWZyZWUKLXBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQKLWFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZQotY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24KLW9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkCi1ieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbgotdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bwotYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcwotbGljZW5zZWQgaGVyZXVuZGVyLiA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5jKQotUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cwotQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IKLXRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLXJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudAotZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAotcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAotbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkKLXRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsCi1pZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlCi10aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlCi1kaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+ZCkKLUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0Ci1yaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCi10aGlzIEFncmVlbWVudC4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjMuIFJFUVVJUkVNRU5UUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZQotUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9zcGFuPgotPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1pdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQKLWNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUKLWFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5Ci1hbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywKLWluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2gKLWFzIGxvc3QgcHJvZml0czsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWlpKQotc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdAotQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPml2KQotc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZAotaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQotbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjxzcGFuIHN0eWxlPSdjb2xvcjpibHVlJz4gPC9zcGFuPjwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZQotY29kZSBmb3JtOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpIGEKLWNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkKLWNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZQotb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKLXN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkKLWFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMKLWFuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlCi1vZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKLXByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKLWxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmcXVvdDtDb21tZXJjaWFsCi1Db250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlcgotQ29udHJpYnV0b3IgKCZxdW90O0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnF1b3Q7KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kCi1jb3N0cyAoY29sbGVjdGl2ZWx5ICZxdW90O0xvc3NlcyZxdW90OykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCi1sZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0bwotdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbgotY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKLW9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcwotcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyCi10byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCi10byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZAotYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUKLWluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQotY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAotd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMKLXNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQotb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYQotY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz41LiBOTyBXQVJSQU5UWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsIFdJVEhPVVQKLVdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCi1XSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCi1NRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQotcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUKLVByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMKLUFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywKLWNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yCi1lcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SCi1BTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLShJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi1PRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORwotTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YKLVRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YKLVRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz43LiBHRU5FUkFMPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkCi1vciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgotZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0Ci1mdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZQotbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24KLWFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKLWFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGgKLW90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAotUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZQotc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAotc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKLWNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZQotcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKLXJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAotZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKLVJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQotUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUKLWNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcwotY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50Ci1TdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YKLXRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzCi10aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsCi1BZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0bwotc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uCi1vZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KLShpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAotaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwotdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKLWV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QKLWV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQotU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZgotQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzCi1pdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvcD4KLQotPC9kaXY+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdXNlcmRvYy5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdXNlcmRvYy5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQ4OTNmNy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX3VzZXJkb2MuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1FY2xpcHNlLm9yZyB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLU1hcmNoIDE3LCAyMDA1XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlcl91c2VyZG9jLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX3VzZXJkb2MuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWVkMjBkNi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX3VzZXJkb2MuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdXNlcmRvYy5mZWF0dXJlIgotICAgICAgbGFiZWw9IlVzZXIgRG9jdW1lbnRhdGlvbiBmb3IgV1NUIFNlcnZlciBGZWF0dXJlIgotICAgICAgdmVyc2lvbj0iMS4wLjEwMC5xdWFsaWZpZXIiPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxsaWNlbnNlIHVybD0ibGljZW5zZS5odG1sIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFVwZGF0ZXMiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3VwZGF0ZXMvIi8+Ci0gICA8L3VybD4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuZG9jLnVzZXIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdXNlcmRvYy5mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfdXNlcmRvYy5mZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM0NzA2MC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Quc2VydmVyX3VzZXJkb2MuZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53M2Mub3JnL1RSLzE5OTkvUkVDLWh0bWw0MDEtMTk5OTEyMjQvbG9vc2UuZHRkIj4KLTwhLS0gc2F2ZWQgZnJvbSB1cmw9KDAwNDQpaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwvbm90aWNlLmh0bWwgLS0+Ci08SFRNTD48SEVBRD48VElUTEU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L1RJVExFPgotPE1FVEEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPE1FVEEgY29udGVudD0iTVNIVE1MIDYuMDAuMjgwMC4xNDc5IiBuYW1lPUdFTkVSQVRPUj48L0hFQUQ+Ci08Qk9EWSBsYW5nPUVOLVVTIHZMaW5rPXB1cnBsZSBsaW5rPWJsdWU+Ci08SDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9IMj4KLTxQPkphbnVhcnkgMjgsIDIwMDU8L1A+Ci08SDM+VXNhZ2UgT2YgQ29udGVudDwvSDM+Ci08UD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gCi1BTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuIFVTRSBPRiAKLVRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgCi1CRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIAotQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIAotQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSAKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIAotQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgCi1NQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L1A+Ci08SDM+QXBwbGljYWJsZSBMaWNlbnNlczwvSDM+Ci08UD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgCi1Gb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgCi1QdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8QSAKLWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotPFA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgCi0oIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIAotYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS48L1A+Ci08UD5Db250ZW50IG1heSBiZSBhcHBvcnRpb25lZCBpbnRvIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHMgCi0oIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLiBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgCi1QbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiBGaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSAKLWNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIAotYXNzb2NpYXRlZCB3aXRoIGEgRmVhdHVyZS4gUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyAKLW5hbWVkICJwbHVnaW5zIiBhbmQgRmVhdHVyZXMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgbmFtZWQgImZlYXR1cmVzIi48L1A+Ci08UD5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWQgCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCAKLUZlYXR1cmVzLjwvUD4KLTxQPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIAotaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgCi1GZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAKLSgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IAotZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgCi1sb2NhdGlvbnM6PC9QPgotPFVMPgotICA8TEk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5IAotICA8TEk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXMgCi0gIDxMST5TdWJkaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnMgCi0gIDxMST5GZWF0dXJlIGRpcmVjdG9yaWVzIDwvTEk+PC9VTD4KLTxQPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCAKLXVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZSAKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCAKLUZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gCi1sb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgCi1maWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgCi1VcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyAKLWFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgCi1kaXJlY3RvcnkuPC9QPgotPFA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgCi1PUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuIFNPTUUgT0YgVEhFU0UgCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvUD4KLTxVTD4KLSAgPExJPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L0E+KSAKLQotICA8TEk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L0E+KSAKLQotICA8TEk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L0E+KSAKLQotICA8TEk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvQT4pIAotCi0gIDxMST5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9BPikgCi0gIDwvTEk+PC9VTD4KLTxQPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyAKLXByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCAKLWNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvUD4KLTxIMz5DcnlwdG9ncmFwaHk8L0gzPgotPFA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgCi1yZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IAotZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIAotY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgCi10byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9QPjwvQk9EWT48L0hUTUw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGVhZTU0Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzamF2YWNvcmUvIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjk3ZmExLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLWJpbgotYnVpbGQueG1sCi1vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmVfMy4wLjAuamFyCi1zamF2YWNvcmUuamFyCi10ZW1wLmZvbGRlcgotQGRvdAotc3JjLnppcApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvLm9wdGlvbnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RhMmI1NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotIyBEZWJ1Z2dpbmcgb3B0aW9ucyBmb3IgdGhlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZSBwbHVnaW4KLQotIyBUdXJuIG9uIGdlbmVyYWwgZGVidWdnaW5nCi1vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvZGVidWc9dHJ1ZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q1ZTE3ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2ZkNzA2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuSmF2YVNlcnZlclBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLAotIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpIiwKLSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuY2FjdHVzO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkiCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotIG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMsCi0gb3JnLmVjbGlwc2UuZGVidWcuY29yZSwKLSBvcmcuZWNsaXBzZS5qZHQuY29yZSwKLSBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLAotIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZSwKLSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZQotRWNsaXBzZS1BdXRvU3RhcnQ6IHRydWUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL2Fib3V0Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjZiOTZjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+RmVicnVhcnkgMjQsIDIwMDU8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmE0NDczLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCi1iaW4uZXhjbHVkZXMgPSBiaW4vKiosXAotICAgICAgICAgICAgICAgQGRvdC8qKixcCi0gICAgICAgICAgICAgICB0ZW1wLmZvbGRlci8qKgotc3JjLmluY2x1ZGVzID0gc2NoZW1hLyxcCi0gICAgICAgICAgICAgICBjb21wb25lbnQueG1sCi1zb3VyY2UuLiA9IHNqYXZhY29yZS8KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL2NvbXBvbmVudC54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9jb21wb25lbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDU4ZTNkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL2NvbXBvbmVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNvbXBvbmVudCB4bWxucz0iaHR0cDovL2VjbGlwc2Uub3JnL3d0cC9yZWxlbmcvdG9vbHMvY29tcG9uZW50LW1vZGVsIiBuYW1lPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyIj4KLTxjb21wb25lbnQtZGVwZW5kcyB1bnJlc3RyaWN0ZWQ9InRydWUiLz4KLSAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlIiBmcmFnbWVudD0iZmFsc2UiLz4KLTwhLS0gIDxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZSI+Ci0gICAgPHR5cGUgbmFtZT0iSUNvbm5lY3Rvck1vZHVsZSIvPgotICAgIDx0eXBlIG5hbWU9IklFSkJNb2R1bGUiLz4KLSAgICA8dHlwZSBuYW1lPSJJSjJFRU1vZHVsZSIvPgotICAgIDx0eXBlIG5hbWU9IlNlcnZsZXQiLz4KLSAgICA8dHlwZSBuYW1lPSJJV2ViTW9kdWxlIi8+Ci0gICAgPHR5cGUgbmFtZT0iSUVudGVycHJpc2VBcHBsaWNhdGlvbiIvPgotICAgIDx0eXBlIG5hbWU9IkpuZGlPYmplY3QiLz4KLSAgICA8dHlwZSBuYW1lPSJDbGFzc3BhdGhSdW50aW1lVGFyZ2V0SGFuZGxlciIvPgotICAgIDx0eXBlIG5hbWU9IklBcHBsaWNhdGlvbkNsaWVudE1vZHVsZSIvPgotICAgIDx0eXBlIG5hbWU9IkVKQkJlYW4iLz4KLSAgICA8dHlwZSBuYW1lPSJKbmRpTGF1bmNoYWJsZSIvPgotICAgIDx0eXBlIG5hbWU9IlB1Ymxpc2hVdGlsIi8+Ci0gICAgPHR5cGUgbmFtZT0iSUphdmFSdW50aW1lIi8+Ci0gIDwvcGFja2FnZT4tLT4KLQotICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpIiBmcmFnbWVudD0iZmFsc2UiLz4KLQotICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZSIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci0KLSAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcmRlZmluaXRpb25zIiBmcmFnbWVudD0iZmFsc2UiLz4KLQotICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkiIGZyYWdtZW50PSJmYWxzZSIvPgotCi0gIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUiIGZyYWdtZW50PSJmYWxzZSIvPgotCi0gIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpIiBmcmFnbWVudD0iZmFsc2UiLz4KLQotICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLndlYnNwaGVyZS5jb3JlIiBmcmFnbWVudD0iZmFsc2UiLz4KLTwvY29tcG9uZW50PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxNDY1YWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcGx1Z2luTmFtZT1KYXZhIFNlcnZlciBTdXBwb3J0Ci1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotZXh0ZW5zaW9uUG9pbnRSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJzPVJ1bnRpbWUgQ2xhc3NwYXRoIFByb3ZpZGVycwotZXh0ZW5zaW9uUG9pbnRSdW50aW1lRmFjZXRNYXBwaW5nPVJ1bnRpbWUgRmFjZXQgTWFwcGluZ3MKLQotcnVudGltZVR5cGVOYW1lPUoyRUUgUnVudGltZSBMaWJyYXJ5Ci1ydW50aW1lVHlwZURlc2NyaXB0aW9uPUEgcnVudGltZSB0aGF0IHJlcHJlc2VudHMgYSBzZXQgb2YgSjJFRSBydW50aW1lIGxpYnJhcmllcy4KLQotbW9kdWxlVHlwZUoyRUVXZWJOYW1lPUoyRUUgV2ViIG1vZHVsZQotbW9kdWxlVHlwZUoyRUVFSkJOYW1lPUoyRUUgRUpCIG1vZHVsZQotbW9kdWxlVHlwZUoyRUVSQVJOYW1lPUoyRUUgQ29ubmVjdG9yIG1vZHVsZQotbW9kdWxlVHlwZUoyRUVDbGllbnROYW1lPUoyRUUgQXBwbGljYXRpb24gQ2xpZW50IG1vZHVsZQotbW9kdWxlVHlwZUoyRUVFQVJOYW1lPUoyRUUgRW50ZXJwcmlzZSBhcHBsaWNhdGlvbgotbW9kdWxlVHlwZUoyRUVVdGlsaXR5TmFtZT1KMkVFIHV0aWxpdHkgamFyCi0KLWxhdW5jaGFibGVKbmRpPUpOREkgT2JqZWN0Ci1sYXVuY2hhYmxlSm5kaURlc2NyaXB0aW9uPVNpbGVudGx5IHN0YXJ0IGFuIG9iamVjdCBsb2NhdGFibGUgYnkgSk5ESS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9wbHVnaW4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJlZDY5Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTg1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci0KLTxwbHVnaW4+Ci0gIDxleHRlbnNpb24tcG9pbnQgaWQ9InJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcnMiIG5hbWU9IiVleHRlbnNpb25Qb2ludFJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcnMiIHNjaGVtYT0ic2NoZW1hL3J1bnRpbWVDbGFzc3BhdGhQcm92aWRlcnMuZXhzZCIvPgotICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJydW50aW1lRmFjZXRNYXBwaW5ncyIgbmFtZT0iJWV4dGVuc2lvblBvaW50UnVudGltZUZhY2V0TWFwcGluZ3MiIHNjaGVtYT0ic2NoZW1hL3J1bnRpbWVGYWNldE1hcHBpbmdzLmV4c2QiLz4KLQotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplciI+Ci0gICAgPGNsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLmNvbnRhaW5lciIKLSAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuUnVudGltZUNsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyIi8+Ci0gIDwvZXh0ZW5zaW9uPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2R1bGVUeXBlcyI+Ci0gICAgPG1vZHVsZVR5cGUKLSAgICAgICBpZD0ianN0LndlYiIKLSAgICAgICBuYW1lPSIlbW9kdWxlVHlwZUoyRUVXZWJOYW1lIi8+Ci0gICAgPG1vZHVsZVR5cGUKLSAgICAgICBpZD0ianN0LmVqYiIKLSAgICAgICBuYW1lPSIlbW9kdWxlVHlwZUoyRUVFSkJOYW1lIi8+Ci0gICAgPG1vZHVsZVR5cGUKLSAgICAgICBpZD0ianN0LmFwcGNsaWVudCIKLSAgICAgICBuYW1lPSIlbW9kdWxlVHlwZUoyRUVDbGllbnROYW1lIi8+Ci0gICAgPG1vZHVsZVR5cGUKLSAgICAgICBpZD0ianN0LmNvbm5lY3RvciIKLSAgICAgICBuYW1lPSIlbW9kdWxlVHlwZUoyRUVSQVJOYW1lIi8+Ci0gICAgPG1vZHVsZVR5cGUKLSAgICAgICBpZD0ianN0LmVhciIKLSAgICAgICBuYW1lPSIlbW9kdWxlVHlwZUoyRUVFQVJOYW1lIi8+Ci0gICAgPG1vZHVsZVR5cGUKLSAgICAgICBpZD0ianN0LnV0aWxpdHkiCi0gICAgICAgbmFtZT0iJW1vZHVsZVR5cGVKMkVFVXRpbGl0eU5hbWUiLz4KLSAgPC9leHRlbnNpb24+Ci0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnJ1bnRpbWVUeXBlcyI+Ci0gICAgPHJ1bnRpbWVUeXBlCi0gICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5ydW50aW1lVHlwZSIKLSAgICAgICBuYW1lPSIlcnVudGltZVR5cGVOYW1lIgotICAgICAgIGRlc2NyaXB0aW9uPSIlcnVudGltZVR5cGVEZXNjcmlwdGlvbiIKLSAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLmludGVybmFsLkdlbmVyaWNSdW50aW1lIj4KLSAgICAgICA8bW9kdWxlVHlwZQotICAgICAgICAgdHlwZXM9ImpzdC4qIgotICAgICAgICAgdmVyc2lvbnM9IioiLz4KLSAgICA8L3J1bnRpbWVUeXBlPgotICA8L2V4dGVuc2lvbj4KLQotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUucnVudGltZUNsYXNzcGF0aFByb3ZpZGVycyI+Ci0gICAgPHJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcgotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5ydW50aW1lVGFyZ2V0IgotICAgICAgcnVudGltZVR5cGVJZHM9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5ydW50aW1lVHlwZSIKLSAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuR2VuZXJpY1J1bnRpbWVDbGFzc3BhdGhQcm92aWRlciIvPgotICA8L2V4dGVuc2lvbj4KLQotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLnByb3BlcnR5VGVzdGVycyI+Ci0gICAgPHByb3BlcnR5VGVzdGVyCi0gICAgICBuYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmpzdC5jYWN0dXMuZXhwcmVzc2lvbnMiCi0gICAgICB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZSIKLSAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuY2FjdHVzLlNlcnZsZXRUZXN0Q2FzZVByb3BlcnR5VGVzdGVyIgotICAgICAgcHJvcGVydGllcz0iaXNTZXJ2bGV0VGVzdENhc2UiCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5jYWN0dXMuZXhwcmVzc2lvbiIvPgotICA8L2V4dGVuc2lvbj4KLQotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kdWxlQXJ0aWZhY3RBZGFwdGVycyI+Ci0gICAgPG1vZHVsZUFydGlmYWN0QWRhcHRlcgotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY2FjdHVzLm1vZHVsZUFydGlmYWN0QWRhcHRlciIKLSAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuY2FjdHVzLkNhY3R1c01vZHVsZUFydGlmYWN0QWRhcHRlckRlbGVnYXRlIgotICAgICAgcHJpb3JpdHk9IjEwIj4KLSAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgPG9yPgotICAgICAgICAgICAgPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2QiLz4KLSAgICAgICAgICAgIDxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0Ii8+Ci0gICAgICAgICAgICA8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGUiLz4KLSAgICAgICAgICAgIDxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIvPgotICAgICAgICAgPC9vcj4KLSAgICAgIDwvZW5hYmxlbWVudD4KLSAgICA8L21vZHVsZUFydGlmYWN0QWRhcHRlcj4KLSAgPC9leHRlbnNpb24+Ci0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmxhdW5jaGFibGVBZGFwdGVycyI+Ci0gICAgPGxhdW5jaGFibGVBZGFwdGVyCi0gICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY2FjdHVzLmxhdW5jaGFibGVBZGFwdGVyIgotICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuY2FjdHVzLkNhY3R1c0xhdW5jaGFibGVBZGFwdGVyRGVsZWdhdGUiLz4KLSAgPC9leHRlbnNpb24+Ci0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmNsaWVudHMiPgotICAgIDxjbGllbnQKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmpuZGkiCi0gICAgICBuYW1lPSIlbGF1bmNoYWJsZUpuZGkiCi0gICAgICBkZXNjcmlwdGlvbj0iJWxhdW5jaGFibGVKbmRpRGVzY3JpcHRpb24iCi0gICAgICBwcmlvcml0eT0iLTEwMCIKLSAgICAgIGxhdW5jaGFibGU9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5KbmRpTGF1bmNoYWJsZSIKLSAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuSjJFRUxhdW5jaGFibGVDbGllbnQiLz4KLSAgPC9leHRlbnNpb24+Ci0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZXMiPgotICAgIDxydW50aW1lLWNvbXBvbmVudC10eXBlIGlkPSJzdGFuZGFyZC5qcmUiLz4KLQotICAgIDxydW50aW1lLWNvbXBvbmVudC12ZXJzaW9uCi0gICAgICAgdHlwZT0ic3RhbmRhcmQuanJlIgotICAgICAgIHZlcnNpb249IjEuMyIvPgotICAgIDxydW50aW1lLWNvbXBvbmVudC12ZXJzaW9uCi0gICAgICAgdHlwZT0ic3RhbmRhcmQuanJlIgotICAgICAgIHZlcnNpb249IjEuNCIvPgotICAgIDxydW50aW1lLWNvbXBvbmVudC12ZXJzaW9uCi0gICAgICAgdHlwZT0ic3RhbmRhcmQuanJlIgotICAgICAgIHZlcnNpb249IjUuMCIvPgotCi0gICAgPGFkYXB0ZXI+Ci0gICAgICA8cnVudGltZS1jb21wb25lbnQgaWQ9InN0YW5kYXJkLmpyZSIvPgotICAgICAgPGZhY3RvcnkgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5TdGFuZGFyZEpyZUNsYXNzcGF0aFByb3ZpZGVyJEZhY3RvcnkiLz4KLSAgICAgIDx0eXBlIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JQ2xhc3NwYXRoUHJvdmlkZXIiLz4KLSAgICA8L2FkYXB0ZXI+Ci0KLSAgICA8c3VwcG9ydGVkPgotICAgICAgPGZhY2V0IGlkPSJqc3QuamF2YSIgdmVyc2lvbj0iMS4zIi8+Ci0gICAgICA8cnVudGltZS1jb21wb25lbnQgaWQ9InN0YW5kYXJkLmpyZSIgdmVyc2lvbj0iJmd0Oz0xLjMiLz4KLSAgICA8L3N1cHBvcnRlZD4KLQotICAgIDxzdXBwb3J0ZWQ+Ci0gICAgICA8ZmFjZXQgaWQ9ImpzdC5qYXZhIiB2ZXJzaW9uPSIxLjQiLz4KLSAgICAgIDxydW50aW1lLWNvbXBvbmVudCBpZD0ic3RhbmRhcmQuanJlIiB2ZXJzaW9uPSImZ3Q7PTEuNCIvPgotICAgIDwvc3VwcG9ydGVkPgotCi0gICAgPHN1cHBvcnRlZD4KLSAgICAgIDxmYWNldCBpZD0ianN0LmphdmEiIHZlcnNpb249IjUuMCIvPgotICAgICAgPHJ1bnRpbWUtY29tcG9uZW50IGlkPSJzdGFuZGFyZC5qcmUiIHZlcnNpb249IiZndDs9NS4wIi8+Ci0gICAgPC9zdXBwb3J0ZWQ+Ci0gIDwvZXh0ZW5zaW9uPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWVCcmlkZ2VzIj4KLSAgICA8YnJpZGdlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLmRlZmF1bHQiCi0gICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLmludGVybmFsLlJ1bnRpbWVCcmlkZ2UiLz4KLSAgPC9leHRlbnNpb24+Ci0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZXMiPgotICAgIDxydW50aW1lLWNvbXBvbmVudC10eXBlCi0gICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5ydW50aW1lVHlwZSIvPgotCi0gICAgPHJ1bnRpbWUtY29tcG9uZW50LXZlcnNpb24KLSAgICAgICB0eXBlPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUucnVudGltZVR5cGUiCi0gICAgICAgdmVyc2lvbj0iMS4wIi8+Ci0KLSAgICA8YWRhcHRlcj4KLSAgICAgIDxydW50aW1lLWNvbXBvbmVudAotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5ydW50aW1lVHlwZSIvPgotICAgICAgPGZhY3RvcnkKLSAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuUnVudGltZUNsYXNzcGF0aFByb3ZpZGVyJEZhY3RvcnkiLz4KLSAgICAgIDx0eXBlCi0gICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUNsYXNzcGF0aFByb3ZpZGVyIi8+Ci0gICAgPC9hZGFwdGVyPgotCi0gICAgPHN1cHBvcnRlZD4KLSAgICAgIDxydW50aW1lLWNvbXBvbmVudAotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5ydW50aW1lVHlwZSIKLSAgICAgICAgIHZlcnNpb249IjEuMCIvPgotICAgICAgPGZhY2V0Ci0gICAgICAgICBpZD0ianN0LndlYiIKLSAgICAgICAgIHZlcnNpb249IjIuMiwyLjMsMi40Ii8+Ci0gICAgICA8ZmFjZXQKLSAgICAgICAgIGlkPSJqc3QuZWpiIgotICAgICAgICAgdmVyc2lvbj0iMS4xLDIuMCwyLjEiLz4KLSAgICAgIDxmYWNldAotICAgICAgICAgaWQ9ImpzdC5lYXIiCi0gICAgICAgICB2ZXJzaW9uPSIxLjIsMS4zLDEuNCIvPgotICAgICAgPGZhY2V0Ci0gICAgICAgICBpZD0ianN0LmNvbm5lY3RvciIKLSAgICAgICAgIHZlcnNpb249IjEuMCwxLjUiLz4KLSAgICAgIDxmYWNldAotICAgICAgICAgaWQ9ImpzdC5hcHBjbGllbnQiCi0gICAgICAgICB2ZXJzaW9uPSIxLjIsMS4zLDEuNCIvPgotICAgICAgPGZhY2V0Ci0gICAgICAgICBpZD0ianN0LnV0aWxpdHkiCi0gICAgICAgICB2ZXJzaW9uPSIxLjAiLz4KLSAgICA8L3N1cHBvcnRlZD4KLSAgPC9leHRlbnNpb24+Ci0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLnJ1bnRpbWVGYWNldE1hcHBpbmdzIj4KLSAgICA8cnVudGltZUZhY2V0TWFwcGluZwotICAgICAgcnVudGltZVR5cGVJZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLnJ1bnRpbWVUeXBlIgotICAgICAgcnVudGltZS1jb21wb25lbnQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5ydW50aW1lVHlwZSIKLSAgICAgIHZlcnNpb249IjEuMCIvPgotICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc2NoZW1hL3J1bnRpbWVDbGFzc3BhdGhQcm92aWRlcnMuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NjaGVtYS9ydW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzYWU0ZDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc2NoZW1hL3J1bnRpbWVDbGFzc3BhdGhQcm92aWRlcnMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZSIgaWQ9InJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcnMiIG5hbWU9IlJ1bnRpbWUgQ2xhc3NwYXRoIFByb3ZpZGVycyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyB1c2VkIHRvIHByb3ZpZGUgYSBuZXcgcnVudGltZSBjbGFzc3BhdGggcHJvdmlkZXIuIFJ1bnRpbWUgY2xhc3NwYXRoIHByb3ZpZGVycyBwcm92aWRlIHRoZSBjbGFzc3BhdGggZm9yIEphdmEgc2VydmVyIHJ1bnRpbWVzLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJydW50aW1lQ2xhc3NwYXRoUHJvdmlkZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJydW50aW1lQ2xhc3NwYXRoUHJvdmlkZXIiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgbGFiZWxBdHRyaWJ1dGU9Im5hbWUiLz4KLSAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIHNwZWNpZmllcyBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIGV4dGVuc2lvbiBwb2ludAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InJ1bnRpbWVUeXBlSWRzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgcnVudGltZSB0eXBlIGlkcyB0aGF0IHRoaXMgcHJvdmlkZXIgbWF5IHN1cHBvcnQuIFVzZWQgZm9yIG1lbW9yeSAmYW1wOyBwZXJmb3JtYW5jZSByZWFzb25zCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgSmF2YSBjbGFzcyB0aGF0IGV4dGVuZHMgJmx0O3NhbXAmZ3Q7UnVudGltZUNsYXNzcGF0aFByb3ZpZGVyRGVsZWdhdGUmbHQ7L3NhbXAmZ3Q7LgotUnVudGltZSBjbGFzc3BhdGggcHJvdmlkZXIgaW5zdGFuY2VzIG9mIHRoaXMgdHlwZSB3aWxsIGRlbGVnYXRlIHRvIGluc3RhbmNlcyBvZiB0aGlzIGNsYXNzLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLlJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlckRlbGVnYXRlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIDEuMAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgYSBydW50aW1lIGNsYXNzcGF0aCBwcm92aWRlciBleHRlbnNpb24gcG9pbnQ6Ci0KLSZsdDtwcmUmZ3Q7Ci0gICZsdDtleHRlbnNpb24gcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLnJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcnMmcXVvdDsmZ3Q7Ci0gICAgICZsdDtydW50aW1lQ2xhc3NwYXRoUHJvdmlkZXIKLSAgICAgICAgaWQ9JnF1b3Q7Y29tLmV4YW1wbGUucnVudGltZUNsYXNzcGF0aFByb3ZpZGVyJnF1b3Q7Ci0gICAgICAgIHJ1bnRpbWVUeXBlSWRzPSZxdW90O2NvbS5leGFtcGxlLnJ1bnRpbWUsIGNvbS5leGFtcGxlMi4qJnF1b3Q7Ci0gICAgICAgIGNsYXNzPSZxdW90O2NvbS5leGFtcGxlLkV4YW1wbGVSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXImcXVvdDsvJmd0OwotICAgJmx0Oy9leHRlbnNpb24mZ3Q7Ci0mbHQ7L3ByZSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBWYWx1ZSBvZiB0aGUgYXR0cmlidXRlICZsdDtiJmd0O2NsYXNzJmx0Oy9iJmd0OyBtdXN0IGJlIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBKYXZhIGNsYXNzIHRoYXQgZXh0ZW5kcyAmbHQ7YiZndDtvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuUnVudGltZUNsYXNzcGF0aFByb3ZpZGVyRGVsZWdhdGUmbHQ7L2ImZ3Q7IGFuZCBjb250YWlucyBhIHB1YmxpYyAwLWFyZyBjb25zdHJ1Y3Rvci4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLSAgIAotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyAKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zY2hlbWEvcnVudGltZUZhY2V0TWFwcGluZ3MuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NjaGVtYS9ydW50aW1lRmFjZXRNYXBwaW5ncy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzY3NjYzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NjaGVtYS9ydW50aW1lRmFjZXRNYXBwaW5ncy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlIiBpZD0icnVudGltZUZhY2V0TWFwcGluZ3MiIG5hbWU9IlJ1bnRpbWUgRmFjZXQgTWFwcGluZ3MiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgaXMgdXNlZCB0byBtYXAgYmV0d2VlbiBhIGZhY2V0IHJ1bnRpbWUgY29tcG9uZW50IGFuZCBhIHNlcnZlciBydW50aW1lIHR5cGUuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InJ1bnRpbWVGYWNldE1hcHBpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJydW50aW1lRmFjZXRNYXBwaW5nIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IGxhYmVsQXR0cmlidXRlPSJuYW1lIi8+Ci0gICAgICAgICA8L2FwcEluZm8+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBleHRlbnNpb24gcG9pbnQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJydW50aW1lVHlwZUlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgcnVudGltZSB0eXBlIGlkCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icnVudGltZS1jb21wb25lbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgMS4wCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiBhIHJ1bnRpbWUgZmFjZXQgbWFwcGluZyBleHRlbnNpb24gcG9pbnQ6Ci0KLSZsdDtwcmUmZ3Q7Ci0gICZsdDtleHRlbnNpb24gcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLnJ1bnRpbWVGYWNldE1hcHBpbmdzJnF1b3Q7Jmd0OwotICAgICAmbHQ7cnVudGltZUZhY2V0TWFwcGluZwotICAgICAgICBpZD0mcXVvdDtjb20uZXhhbXBsZS5ydW50aW1lQ2xhc3NwYXRoUHJvdmlkZXImcXVvdDsKLSAgICAgICAgcnVudGltZVR5cGVJZD0mcXVvdDtjb20uZXhhbXBsZS5ydW50aW1lLjMyJnF1b3Q7Ci0gICAgICAgIHJ1bnRpbWUtY29tcG9uZW50PSZxdW90O2NvbS5leGFtcGxlLkV4YW1wbGVSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXImcXVvdDsKLSAgICAgICAgdmVyc2lvbj0mcXVvdDszLjImcXVvdDsvJmd0OwotICAmbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotICAgCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0mbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NqYXZhY29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvQ2xhc3NwYXRoUnVudGltZVRhcmdldEhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NqYXZhY29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvQ2xhc3NwYXRoUnVudGltZVRhcmdldEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFhNGRhMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zamF2YWNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL0NsYXNzcGF0aFJ1bnRpbWVUYXJnZXRIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmU7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuUnVudGltZVRhcmdldEhhbmRsZXJEZWxlZ2F0ZTsKLS8qKgotICogQSBydW50aW1lIHRhcmdldCBoYW5kbGVyIHRoYXQgc3VwcG9ydHMgY2hhbmdpbmcgdGhlIGNsYXNzcGF0aCBvZiB0aGUKLSAqIHByb2plY3QgYnkgYWRkaW5nIG9uZSBvciBtb3JlIGNsYXNzcGF0aCBjb250YWluZXJzLiBSdW50aW1lIHByb3ZpZGVycwotICogY2FuIGV4dGVuZCB0aGlzIGNsYXNzIGFuZCBpbXBsZW1lbnQgdGhlIGFic3RyYWN0IG1ldGhvZHMgdG8gcHJvdmlkZQotICogdGhlIGNvcnJlY3QgYnVpbGQgcGF0aCBmb3IgdGhlaXIgcnVudGltZSB0eXBlLgotICogCi0gKiBAZGVwcmVjYXRlZCBTaG91bGQgdXNlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5ydW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJzCi0gKiAgICBleHRlbnNpb24gcG9pbnQgaW5zdGVhZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ2xhc3NwYXRoUnVudGltZVRhcmdldEhhbmRsZXIgZXh0ZW5kcyBSdW50aW1lVGFyZ2V0SGFuZGxlckRlbGVnYXRlIHsKLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgUnVudGltZVRhcmdldEhhbmRsZXJEZWxlZ2F0ZSNzZXRSdW50aW1lVGFyZ2V0KElQcm9qZWN0LCBJUnVudGltZSwgSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSdW50aW1lVGFyZ2V0KElQcm9qZWN0IHByb2plY3QsIElSdW50aW1lIHJ1bnRpbWUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQXR0ZW1wdCB0byB1c2UgZGVwcmVjYXRlZCBjb2RlIik7Ci0JfQotCi0JLyoqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIFJ1bnRpbWVUYXJnZXRIYW5kbGVyRGVsZWdhdGUjcmVtb3ZlUnVudGltZVRhcmdldChJUHJvamVjdCwgSVJ1bnRpbWUsIElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlUnVudGltZVRhcmdldChJUHJvamVjdCBwcm9qZWN0LCBJUnVudGltZSBydW50aW1lLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkF0dGVtcHQgdG8gdXNlIGRlcHJlY2F0ZWQgY29kZSIpOwotCX0KLQotCS8qKgotCSAqIEFkZCBsaWJyYXJ5IGVudHJpZXMgdG8gdGhlIGdpdmVuIGxpc3QgZm9yIGV2ZXJ5IGphciBmaWxlIGZvdW5kIGluIHRoZQotCSAqIGdpdmVuIGRpcmVjdG9yeS4gT3B0aW9uYWxseSBzZWFyY2ggc3ViZGlyZWN0b3JpZXMgYXMgd2VsbC4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdCBhIGxpc3QKLQkgKiBAcGFyYW0gZGlyIGEgZGlyZWN0b3J5Ci0JICogQHBhcmFtIGluY2x1ZGVTdWJkaXJlY3RvcmllcyA8Y29kZT50cnVlPC9jb2RlPiB0byBpbmNsdWRlIHN1YmRpcmVjdG9yaWVzLCBhbmQKLQkgKiAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGFkZExpYnJhcnlFbnRyaWVzKExpc3QgbGlzdCwgRmlsZSBkaXIsIGJvb2xlYW4gaW5jbHVkZVN1YmRpcmVjdG9yaWVzKSB7Ci0JCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJBdHRlbXB0IHRvIHVzZSBkZXByZWNhdGVkIGNvZGUiKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjbGFzc3BhdGggZW50cmllcyB0aGF0IGNvcnJlc3BvbmQgdG8gdGhlIGdpdmVuIHJ1bnRpbWUuCi0JICogCi0JICogQHBhcmFtIHJ1bnRpbWUgYSBydW50aW1lCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgY2xhc3NwYXRoIGVudHJpZXMKLQkgKi8KLQlwdWJsaWMgSUNsYXNzcGF0aEVudHJ5W10gZ2V0RGVsZWdhdGVDbGFzc3BhdGhFbnRyaWVzKElSdW50aW1lIHJ1bnRpbWUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQXR0ZW1wdCB0byB1c2UgZGVwcmVjYXRlZCBjb2RlIik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY2xhc3NwYXRoIGVudHJ5IGlkcyBmb3IgdGhpcyBydW50aW1lIHRhcmdldCBoYW5kbGVyLiBUaGVzZQotCSAqIGlkcyB3aWxsIGJlIGFkZGVkIHRvIHRoZSBjbGFzc3BhdGggY29udGFpbmVyIGlkIHRvIGNyZWF0ZSBhIG5ldyBmdWxseQotCSAqIHF1YWxpZmllZCBjbGFzc3BhdGggY29udGFpbmVyIGlkLgotCSAqIDxwPgotCSAqIEJ5IGRlZmF1bHQsIHRoZXJlIGlzIGEgc2luZ2xlIGNsYXNzcGF0aCBlbnRyeSBmb3IgdGhlIHJ1bnRpbWUsIHdpdGggbm8KLQkgKiBleHRyYSBpZCAoPGNvZGU+bmV3IFN0cmluZ1sxXTwvY29kZT4pLiBUbyBjcmVhdGUgbXVsdGlwbGUgaWRzLCBqdXN0Ci0JICogcmV0dXJuIGEgc3RyaW5nIGFycmF5IGNvbnRhaW5pbmcgdGhlIGlkcy4gRm9yIGluc3RhbmNlLCB0byBoYXZlIHR3bwotCSAqIGNsYXNzcGF0aCBjb250YWluZXJzIHdpdGggaWRzICJpZDEiIGFuZCAiaWQyIiwgdXNlCi0JICogPGNvZGU+bmV3IFN0cmluZ1tdIHsgImlkMSIsICJpZDIiIH08L2NvZGU+Ci0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgY2xhc3NwYXRoIGVudHJ5IGlkcwotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRDbGFzc3BhdGhFbnRyeUlkcygpIHsKLQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkF0dGVtcHQgdG8gdXNlIGRlcHJlY2F0ZWQgY29kZSIpOwotCX0KLQotCS8qKgotCSAqIFJlcXVlc3QgdGhhdCB0aGUgY2xhc3NwYXRoIGNvbnRhaW5lciBmb3IgdGhlIGdpdmVuIHJ1bnRpbWUgYW5kIGlkIGJlIHVwZGF0ZWQKLQkgKiB3aXRoIHRoZSBnaXZlbiBjbGFzc3BhdGggY29udGFpbmVyIGVudHJpZXMuCi0JICogCi0JICogQHBhcmFtIHJ1bnRpbWUgYSBydW50aW1lCi0JICogQHBhcmFtIGlkIGFuIGlkCi0JICogQHBhcmFtIGVudHJpZXMgYW4gYXJyYXkgb2YgY2xhc3NwYXRoIGVudHJpZXMKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXF1ZXN0Q2xhc3NwYXRoQ29udGFpbmVyVXBkYXRlKElSdW50aW1lIHJ1bnRpbWUsIFN0cmluZyBpZCwgSUNsYXNzcGF0aEVudHJ5W10gZW50cmllcykgewotCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQXR0ZW1wdCB0byB1c2UgZGVwcmVjYXRlZCBjb2RlIik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY2xhc3NwYXRoIGNvbnRhaW5lciBsYWJlbCBmb3IgdGhlIGdpdmVuIHJ1bnRpbWUgYW5kIHRoZSBnaXZlbgotCSAqIGNsYXNzcGF0aCBjb250YWluZXIgaWQgKHJldHVybmVkIGZyb20gZ2V0Q2xhc3NwYXRoRW50cnlJZHMoKSkuIFRoaXMgbWV0aG9kCi0JICogbXVzdCBub3QgcmV0dXJuIG51bGwuCi0JICogCi0JICogQHBhcmFtIHJ1bnRpbWUgdGhlIHJ1bnRpbWUgdG8gcmVzb2x2ZSB0aGUgY29udGFpbmVyIGxhYmVsIGZvcgotCSAqIEBwYXJhbSBpZCB0aGUgY2xhc3NwYXRoIGVudHJ5IGlkCi0JICogQHJldHVybiBhIGNsYXNzcGF0aCBjb250YWluZXIgbGFiZWwKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldENsYXNzcGF0aENvbnRhaW5lckxhYmVsKElSdW50aW1lIHJ1bnRpbWUsIFN0cmluZyBpZCk7Ci0KLQkvKioKLQkgKiBSZXNvbHZlIHRoZSBjbGFzc3BhdGggY29udGFpbmVyLgotCSAqIAotCSAqIEBwYXJhbSBydW50aW1lIGEgcnVudGltZQotCSAqIEBwYXJhbSBpZCBhIGNvbnRhaW5lciBpZAotCSAqIEByZXR1cm4gYSBwb3NzaWJseSBlbXB0eSBhcnJheSBvZiBjbGFzc3BhdGggZW50cmllcwotCSAqLwotCXB1YmxpYyBJQ2xhc3NwYXRoRW50cnlbXSByZXNvbHZlQ2xhc3NwYXRoQ29udGFpbmVySW1wbChJUnVudGltZSBydW50aW1lLCBTdHJpbmcgaWQpIHsKLQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkF0dGVtcHQgdG8gdXNlIGRlcHJlY2F0ZWQgY29kZSIpOwotCX0KLQotCS8qKgotCSAqIFJlc29sdmVzIChjcmVhdGVzIHRoZSBjbGFzc3BhdGggZW50cmllcyBmb3IpIHRoZSBjbGFzc3BhdGggY29udGFpbmVyIHdpdGgKLQkgKiB0aGUgZ2l2ZW4gcnVudGltZSBhbmQgdGhlIGdpdmVuIGNsYXNzcGF0aCBjb250YWluZXIgaWQgKHJldHVybmVkIGZyb20KLQkgKiBnZXRDbGFzc3BhdGhFbnRyeUlkcygpKS4gSWYgdGhlIGNsYXNzcGF0aCBjb250YWluZXIgY2Fubm90IGJlIHJlc29sdmVkCi0JICogKGZvciBpbnN0YW5jZSwgaWYgdGhlIHJ1bnRpbWUgZG9lcyBub3QgZXhpc3QpLCByZXR1cm4gbnVsbC4KLQkgKiAKLQkgKiBAcGFyYW0gcnVudGltZSB0aGUgcnVudGltZSB0byByZXNvbHZlIHRoZSBjb250YWluZXIgZm9yCi0JICogQHBhcmFtIGlkIHRoZSBjbGFzc3BhdGggZW50cnkgaWQKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGNsYXNzcGF0aCBlbnRyaWVzIGZvciB0aGUgY29udGFpbmVyLCBvciBudWxsIGlmIHRoZQotCSAqICAgY29udGFpbmVyIGNvdWxkIG5vdCBiZSByZXNvbHZlZAotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBJQ2xhc3NwYXRoRW50cnlbXSByZXNvbHZlQ2xhc3NwYXRoQ29udGFpbmVyKElSdW50aW1lIHJ1bnRpbWUsIFN0cmluZyBpZCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc2phdmFjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9FSkJCZWFuLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zamF2YWNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL0VKQkJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjY5NDk2MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zamF2YWNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL0VKQkJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGVBcnRpZmFjdDsKLS8qKgotICogQW4gRUpCIGJlYW4uCi0gKiA8cD4KLSAqIDxiPlByb3Zpc2lvbmFsIEFQSTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAKLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKiBAcGxhbm5lZGZvciAxLjUKLSAqLwotcHVibGljIGNsYXNzIEVKQkJlYW4gaW1wbGVtZW50cyBJTW9kdWxlQXJ0aWZhY3QgewotCXByaXZhdGUgSU1vZHVsZSBtb2R1bGU7Ci0JcHJpdmF0ZSBTdHJpbmcgam5kaU5hbWU7Ci0JcHJpdmF0ZSBib29sZWFuIGxvY2FsOwotCXByaXZhdGUgYm9vbGVhbiByZW1vdGU7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgRUpCQmVhbi4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kdWxlIHRoZSBtb2R1bGUgdGhhdCB0aGUgRUpCIGlzIGNvbnRhaW5lZCBpbgotCSAqIEBwYXJhbSBqbmRpTmFtZSB0aGUgSk5ESSBuYW1lIG9mIHRoZSBFSkIKLQkgKiBAcGFyYW0gcmVtb3RlIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBFSkIgaGFzIGEgcmVtb3RlIGludGVyZmFjZSwgYW5kCi0JICogICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqIEBwYXJhbSBsb2NhbCA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgRUpCIGhhcyBhIGxvY2FsIGludGVyZmFjZSwgYW5kCi0JICogICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBFSkJCZWFuKElNb2R1bGUgbW9kdWxlLCBTdHJpbmcgam5kaU5hbWUsIGJvb2xlYW4gcmVtb3RlLCBib29sZWFuIGxvY2FsKSB7Ci0JCXRoaXMubW9kdWxlID0gbW9kdWxlOwotCQl0aGlzLmpuZGlOYW1lID0gam5kaU5hbWU7Ci0JCXRoaXMucmVtb3RlID0gcmVtb3RlOwotCQl0aGlzLmxvY2FsID0gbG9jYWw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJTW9kdWxlQXJ0aWZhY3QjZ2V0TW9kdWxlKCkKLQkgKi8KLQlwdWJsaWMgSU1vZHVsZSBnZXRNb2R1bGUoKSB7Ci0JCXJldHVybiBtb2R1bGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgSk5ESSBuYW1lIG9mIHRoZSBFSkIuCi0JICogCi0JICogQHJldHVybiB0aGUgSk5ESSBuYW1lIG9mIHRoZSBFSkIKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEpuZGlOYW1lKCkgewotCQlyZXR1cm4gam5kaU5hbWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBFSkIgaGFzIGEgcmVtb3RlIGludGVyZmFjZS4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBFSkIgaGFzIGEgcmVtb3RlIGludGVyZmFjZSwgYW5kCi0JICogICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc1JlbW90ZUludGVyZmFjZSgpIHsKLQkJcmV0dXJuIHJlbW90ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIEVKQiBoYXMgYSBsb2NhbCBpbnRlcmZhY2UuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgRUpCIGhhcyBhIGxvY2FsIGludGVyZmFjZSwgYW5kCi0JICogICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0xvY2FsSW50ZXJmYWNlKCkgewotCQlyZXR1cm4gbG9jYWw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NqYXZhY29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvRmFjZXRVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zamF2YWNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL0ZhY2V0VXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTM1MGE3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NqYXZhY29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvRmFjZXRVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5SdW50aW1lTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlckNvcmU7Ci0vKioKLSAqIFV0aWxpdHkgY2xhc3MgZm9yIGNvbnZlcnRpbmcgYmV0d2VlbiBmYWNldCBydW50aW1lcyBhbmQgc2VydmVyIHJ1bnRpbWVzLgotICogPHA+Ci0gKiA8Yj5Qcm92aXNpb25hbCBBUEk6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIAotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIAotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgRmFjZXRVdGlsIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZXJ2ZXIgcnVudGltZSB0aGF0IGNvcnJlc3BvbmRzIHRvIGEgZmFjZXQgcnVudGltZSwgb3IgbnVsbAotCSAqIGlmIG5vbmUgY291bGQgYmUgZm91bmQuCi0JICogCi0JICogQHBhcmFtIHJ1bnRpbWUgYSBmYWNldCBydW50aW1lCi0JICogQHJldHVybiB0aGUgc2VydmVyIHJ1bnRpbWUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgZmFjZXQgcnVudGltZSwgb3IKLQkgKiAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lIGNvdWxkIGJlIGZvdW5kLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVJ1bnRpbWUgZ2V0UnVudGltZShvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lIHJ1bnRpbWUpIHsKLQkJaWYgKHJ1bnRpbWUgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJCi0JCVN0cmluZyBpZCA9IHJ1bnRpbWUuZ2V0UHJvcGVydHkoImlkIik7Ci0JCQotCQlJUnVudGltZVtdIHJ1bnRpbWVzID0gU2VydmVyQ29yZS5nZXRSdW50aW1lcygpOwotCQlpbnQgc2l6ZSA9IHJ1bnRpbWVzLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCWlmIChpZC5lcXVhbHMocnVudGltZXNbaV0uZ2V0SWQoKSkpCi0JCQkJcmV0dXJuIHJ1bnRpbWVzW2ldOwotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmYWNldCBydW50aW1lIHRoYXQgY29ycmVzcG9uZHMgdG8gYSBzZXJ2ZXIgcnVudGltZSwgb3IgbnVsbAotCSAqIGlmIG5vbmUgY291bGQgYmUgZm91bmQuCi0JICogCi0JICogQHBhcmFtIHJ1bnRpbWUgYSBzZXJ2ZXIgcnVudGltZQotCSAqIEByZXR1cm4gdGhlIGZhY2V0IHJ1bnRpbWUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgc2VydmVyIHJ1bnRpbWUsIG9yCi0JICogICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZSBjb3VsZCBiZSBmb3VuZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuSVJ1bnRpbWUgZ2V0UnVudGltZShJUnVudGltZSBydW50aW1lKSB7Ci0JCWlmIChydW50aW1lID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCQotCQlTdHJpbmcgaWQgPSBydW50aW1lLmdldElkKCk7Ci0JCQotCQlTZXQgcnVudGltZXMgPSBSdW50aW1lTWFuYWdlci5nZXRSdW50aW1lcygpOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IHJ1bnRpbWVzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCW9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuSVJ1bnRpbWUgcnVudGltZTIgPSAob3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKGlkLmVxdWFscyhydW50aW1lMi5nZXRQcm9wZXJ0eSgiaWQiKSkpCi0JCQkJcmV0dXJuIHJ1bnRpbWUyOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zamF2YWNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL0lBcHBsaWNhdGlvbkNsaWVudE1vZHVsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc2phdmFjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9JQXBwbGljYXRpb25DbGllbnRNb2R1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRkMTBlMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zamF2YWNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL0lBcHBsaWNhdGlvbkNsaWVudE1vZHVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmU7Ci0vKioKLSAqIEEgSjJFRSBhcHBsaWNhdGlvbiBjbGllbnQgbW9kdWxlLgotICogPHA+Ci0gKiA8Yj5Qcm92aXNpb25hbCBBUEk6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIAotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIAotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICogQHBsYW5uZWRmb3IgMS41Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUFwcGxpY2F0aW9uQ2xpZW50TW9kdWxlIGV4dGVuZHMgSUoyRUVNb2R1bGUgewotCS8vIGludGVudGlvbmFsbHkgZW1wdHkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zamF2YWNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL0lDb25uZWN0b3JNb2R1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NqYXZhY29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvSUNvbm5lY3Rvck1vZHVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2IzYzlhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NqYXZhY29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvSUNvbm5lY3Rvck1vZHVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci0vKioKLSAqIEEgSjJFRSBjb25uZWN0b3IgbW9kdWxlLgotICogPHA+Ci0gKiA8Yj5Qcm92aXNpb25hbCBBUEk6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIAotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIAotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICogQHBsYW5uZWRmb3IgMS41Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbm5lY3Rvck1vZHVsZSBleHRlbmRzIElKMkVFTW9kdWxlIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjbGFzc3BhdGggYXMgYW4gYXJyYXkgb2YgYWJzb2x1dGUgSVBhdGhzLgotCSAqIAotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgY2xhc3NwYXRoIGVudHJpZXMKLQkgKi8KLQlwdWJsaWMgSVBhdGhbXSBnZXRDbGFzc3BhdGgoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zamF2YWNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL0lFSkJNb2R1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NqYXZhY29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvSUVKQk1vZHVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2RjYWM3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NqYXZhY29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvSUVKQk1vZHVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmU7Ci0vKioKLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgYSBKMkVFIEVKQiBtb2R1bGUuCi0gKiA8cD4KLSAqIDxiPlByb3Zpc2lvbmFsIEFQSTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAKLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKiBAcGxhbm5lZGZvciAxLjUKLSAqLwotcHVibGljIGludGVyZmFjZSBJRUpCTW9kdWxlIGV4dGVuZHMgSUoyRUVNb2R1bGUgewotCS8vIGludGVudGlvbmFsbHkgZW1wdHkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zamF2YWNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL0lFbnRlcnByaXNlQXBwbGljYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NqYXZhY29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvSUVudGVycHJpc2VBcHBsaWNhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjIzNzZkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NqYXZhY29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvSUVudGVycHJpc2VBcHBsaWNhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotLyoqCi0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIGEgSjJFRSBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIChFQVIgZmlsZSkuCi0gKiA8cD4KLSAqIDxiPlByb3Zpc2lvbmFsIEFQSTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAKLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKiBAcGxhbm5lZGZvciAxLjUKLSAqLwotcHVibGljIGludGVyZmFjZSBJRW50ZXJwcmlzZUFwcGxpY2F0aW9uIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtb2R1bGVzIGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBFQVIuIFRoZSByZXR1cm5lZCBtb2R1bGVzIHdpbGwKLQkgKiBlaXRoZXIgYmUgSjJFRSBtb2R1bGVzICh3aGljaCB3aWxsIGJlIGFkYXB0YWJsZSB0byBJSjJFRU1vZHVsZSkgb3IKLQkgKiB1dGlsaXR5IGphcnMgY29udGFpbmVkIGluIHRoZSBFQVIuCi0JICogCi0JICogQHJldHVybiBhIHBvc3NpYmx5IGVtcHR5IGFycmF5IG9mIG1vZHVsZXMgY29udGFpbmVkIHdpdGhpbiB0aGlzIGFwcGxpY2F0aW9uCi0JICovCi0JcHVibGljIElNb2R1bGVbXSBnZXRNb2R1bGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBVUkkgb2YgdGhlIGdpdmVuIG1vZHVsZSB3aXRoaW4gdGhpcyBlbnRlcnByaXNlIGFwcGxpY2F0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBtb2R1bGUgYSBtb2R1bGUgd2l0aGluIHRoaXMgYXBwbGljYXRpb24KLQkgKiBAcmV0dXJuIHRoZSBVUkkgb2YgdGhlIGdpdmVuIG1vZHVsZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIFVSSSBjb3VsZAotCSAqICAgIG5vdCBiZSBmb3VuZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VVJJKElNb2R1bGUgbW9kdWxlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJvb3QgZm9sZGVycyBmb3IgdGhlIHJlc291cmNlcyBpbiB0aGlzIG1vZHVsZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgcG9zc2libHktZW1wdHkgYXJyYXkgb2YgcmVzb3VyY2UgZm9sZGVycwotCSAqLwotCXB1YmxpYyBJQ29udGFpbmVyW10gZ2V0UmVzb3VyY2VGb2xkZXJzKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc2phdmFjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9JSjJFRU1vZHVsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc2phdmFjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9JSjJFRU1vZHVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTE2YTg3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NqYXZhY29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvSUoyRUVNb2R1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLS8qKgotICogQSBKMkVFIG1vZHVsZSB0aGF0IGNhbiBiZSBkZXBsb3llZCB0byBhIHNlcnZlci4KLSAqIAotICogPHA+Ci0gKiA8Yj5Qcm92aXNpb25hbCBBUEk6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIAotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIAotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICogQHBsYW5uZWRmb3IgMS41Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUoyRUVNb2R1bGUgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHJvb3QgZm9sZGVycyBmb3IgdGhlIHJlc291cmNlcyBpbiB0aGlzIG1vZHVsZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgcG9zc2libHktZW1wdHkgYXJyYXkgb2YgcmVzb3VyY2UgZm9sZGVycwotCSAqLwotCXB1YmxpYyBJQ29udGFpbmVyW10gZ2V0UmVzb3VyY2VGb2xkZXJzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByb290IGZvbGRlcnMgY29udGFpbmluZyBKYXZhIG91dHB1dCBpbiB0aGlzIG1vZHVsZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgcG9zc2libHktZW1wdHkgYXJyYXkgb2YgSmF2YSBvdXRwdXQgZm9sZGVycwotCSAqLwotCXB1YmxpYyBJQ29udGFpbmVyW10gZ2V0SmF2YU91dHB1dEZvbGRlcnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGlzIGEgYmluYXJ5ICh6aXBwZWQpIG1vZHVsZSwgYW5kCi0JICogZmFsc2UgaWYgaXQgaXMgZXhwYW5kZWQuCi0JICogCi0JICogPHA+SWYgdHJ1ZSwgbWVtYmVycygpIHNob3VsZCByZXR1cm4gb25seSBhIHNpbmdsZSBlbGVtZW50IC0KLQkgKiB0aGUgYmluYXJ5IChqYXIgb3IgemlwIGZpbGUpIHRoYXQgY29udGFpbnMgdGhlIGNvbnRlbnRzIG9mCi0JICogdGhpcyBtb2R1bGUuIChhIHNpbmdsZSBJTW9kdWxlUmVzb3VyY2UsIGUuZy4KLQkgKiBteWVqYi5qYXIpIEFsc28sIGdldExvY2F0aW9uKCkgc2hvdWxkIHJldHVybiB0aGUgZnVsbCBwYXRoCi0JICogdXAgdG8gYW5kIGluY2x1ZGluZyB0aGUgYmluYXJ5IGl0c2VsZi4gKGUuZy4KLQkgKiBjOlx0ZW1wXG15ZWpiLmphcik8L3A+Ci0JICogCi0JICogPHA+SWYgZmFsc2UsIG1lbWJlcnMoKSBzaG91bGQgcmV0dXJuIHRoZSBlbnRpcmUgY29udGVudHMKLQkgKiBvZiB0aGUgbW9kdWxlLCBzdGFydGluZyBhdCB0aGUgcm9vdC4gVGhlcmUgc2hvdWxkIGJlIG5vCi0JICogcHJlY2VlZGluZyBkaXJlY3Rvcnkgc3RydWN0dXJlLiAoYW4gYXJyYXkgb2YKLQkgKiBJTW9kdWxlUmVzb3VyY2VzLCBlLmcuIGluZGV4Lmh0bWwsIFdFQi1JTkYvd2ViLnhtbCwKLQkgKiAuLi4pIEluIHRoaXMgY2FzZSwgZ2V0TG9jYXRpb24oKSBzaG91bGQgcmV0dXJuIHRoZSBwYXRoIHRvCi0JICogdGhlIHJvb3QgZm9sZGVyIGNvbnRhaW5pbmcgdGhlc2UgcmVzb3VyY2VzLjwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0JpbmFyeSgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NqYXZhY29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvSUphdmFSdW50aW1lLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zamF2YWNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL0lKYXZhUnVudGltZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDgxODIxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NqYXZhY29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvSUphdmFSdW50aW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSVZNSW5zdGFsbDsKLS8qKgotICogQW4gaW50ZXJmYWNlIGZvciBhIHNlcnZlciB0aGF0IGNvbnRhaW5zIGEgSmF2YSBydW50aW1lLgotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqIEBzaW5jZSAxLjUKLSAqLwotcHVibGljIGludGVyZmFjZSBJSmF2YVJ1bnRpbWUgewotCS8qKgotCSAqIFJldHVybiB0aGUgVk0gaW5zdGFsbCAoaW5zdGFsbGVkIEpSRSkgdGhhdCB0aGlzIHJ1bnRpbWUgaXMgdXNpbmcuCi0JICogCi0JICogQHJldHVybiB0aGUgY3VycmVudCBWTSBpbnN0YWxsCi0JICovCi0JcHVibGljIElWTUluc3RhbGwgZ2V0Vk1JbnN0YWxsKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc2phdmFjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9JVXRpbGl0eU1vZHVsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc2phdmFjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9JVXRpbGl0eU1vZHVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjQyZmQ4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NqYXZhY29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvSVV0aWxpdHlNb2R1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLS8qKgotICogQSBKMkVFIHV0aWxpdHkgbW9kdWxlIHRoYXQgY2FuIGJlIGRlcGxveWVkIHRvIGEgc2VydmVyLgotICogCi0gKiA8cD4KLSAqIDxiPlByb3Zpc2lvbmFsIEFQSTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAKLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKiBAcGxhbm5lZGZvciAxLjUKLSAqLwotcHVibGljIGludGVyZmFjZSBJVXRpbGl0eU1vZHVsZSB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgcm9vdCBmb2xkZXJzIGZvciB0aGUgcmVzb3VyY2VzIGluIHRoaXMgbW9kdWxlLgotCSAqIAotCSAqIEByZXR1cm4gYSBwb3NzaWJseS1lbXB0eSBhcnJheSBvZiByZXNvdXJjZSBmb2xkZXJzCi0JICovCi0JcHVibGljIElDb250YWluZXJbXSBnZXRSZXNvdXJjZUZvbGRlcnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJvb3QgZm9sZGVycyBjb250YWluaW5nIEphdmEgb3V0cHV0IGluIHRoaXMgbW9kdWxlLgotCSAqIAotCSAqIEByZXR1cm4gYSBwb3NzaWJseS1lbXB0eSBhcnJheSBvZiBKYXZhIG91dHB1dCBmb2xkZXJzCi0JICovCi0JcHVibGljIElDb250YWluZXJbXSBnZXRKYXZhT3V0cHV0Rm9sZGVycygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoaXMgaXMgYSBiaW5hcnkgKHppcHBlZCkgbW9kdWxlLCBhbmQKLQkgKiBmYWxzZSBpZiBpdCBpcyBleHBhbmRlZC4KLQkgKiAKLQkgKiA8cD5JZiB0cnVlLCBtZW1iZXJzKCkgc2hvdWxkIHJldHVybiBvbmx5IGEgc2luZ2xlIGVsZW1lbnQgLQotCSAqIHRoZSBiaW5hcnkgKGphciBvciB6aXAgZmlsZSkgdGhhdCBjb250YWlucyB0aGUgY29udGVudHMgb2YKLQkgKiB0aGlzIG1vZHVsZS4gKGEgc2luZ2xlIElNb2R1bGVSZXNvdXJjZSwgZS5nLgotCSAqIG15ZWpiLmphcikgQWxzbywgZ2V0TG9jYXRpb24oKSBzaG91bGQgcmV0dXJuIHRoZSBmdWxsIHBhdGgKLQkgKiB1cCB0byBhbmQgaW5jbHVkaW5nIHRoZSBiaW5hcnkgaXRzZWxmLiAoZS5nLgotCSAqIGM6XHRlbXBcbXllamIuamFyKTwvcD4KLQkgKiAKLQkgKiA8cD5JZiBmYWxzZSwgbWVtYmVycygpIHNob3VsZCByZXR1cm4gdGhlIGVudGlyZSBjb250ZW50cwotCSAqIG9mIHRoZSBtb2R1bGUsIHN0YXJ0aW5nIGF0IHRoZSByb290LiBUaGVyZSBzaG91bGQgYmUgbm8KLQkgKiBwcmVjZWVkaW5nIGRpcmVjdG9yeSBzdHJ1Y3R1cmUuIChhbiBhcnJheSBvZgotCSAqIElNb2R1bGVSZXNvdXJjZXMsIGUuZy4gaW5kZXguaHRtbCwgV0VCLUlORi93ZWIueG1sLAotCSAqIC4uLikgSW4gdGhpcyBjYXNlLCBnZXRMb2NhdGlvbigpIHNob3VsZCByZXR1cm4gdGhlIHBhdGggdG8KLQkgKiB0aGUgcm9vdCBmb2xkZXIgY29udGFpbmluZyB0aGVzZSByZXNvdXJjZXMuPC9wPgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQmluYXJ5KCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc2phdmFjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9JV2ViTW9kdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zamF2YWNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL0lXZWJNb2R1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJjMGIxNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zamF2YWNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL0lXZWJNb2R1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7Ci0vKioKLSAqIEEgSjJFRSB3ZWIgbW9kdWxlLgotICogPHA+Ci0gKiA8Yj5Qcm92aXNpb25hbCBBUEk6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIAotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIAotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICogQHBsYW5uZWRmb3IgMS41Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVdlYk1vZHVsZSBleHRlbmRzIElKMkVFTW9kdWxlIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb250ZXh0IHJvb3Qgb2YgdGhlIG1vZHVsZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbnRleHRSb290KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB1dGlsaXR5IG1vZHVsZXMgY29udGFpbmVkIHdpdGhpbiB0aGlzIFdBUi4KLQkgKgotCSAqIEByZXR1cm4gYSBwb3NzaWJseSBlbXB0eSBhcnJheSBvZiBtb2R1bGVzIGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBhcHBsaWNhdGlvbgotCSAqLwotCXB1YmxpYyBJTW9kdWxlW10gZ2V0TW9kdWxlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgVVJJIG9mIHRoZSBnaXZlbiBjb250YWluZWQgbW9kdWxlLgotCSAqCi0JICogQHBhcmFtIG1vZHVsZSBhIG1vZHVsZQotCSAqIEByZXR1cm4gdGhlIFVSSSBvZiB0aGUgZ2l2ZW4gbW9kdWxlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgVVJJIGNvdWxkCi0JICogICAgbm90IGJlIGZvdW5kCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRVUkkoSU1vZHVsZSBtb2R1bGUpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NqYXZhY29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvSm5kaUxhdW5jaGFibGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NqYXZhY29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvSm5kaUxhdW5jaGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQyZWZiZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zamF2YWNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL0puZGlMYXVuY2hhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotLyoqCi0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIGFuIG9iamVjdCBpbiBKTkRJIHRoYXQgY2FuIGJlIHRlc3RlZCBvbiBhIHNlcnZlci4KLSAqIDxwPgotICogPGI+UHJvdmlzaW9uYWwgQVBJOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byAKLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayAKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIAotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqIEBwbGFubmVkZm9yIDEuNQotICovCi1wdWJsaWMgY2xhc3MgSm5kaUxhdW5jaGFibGUgewotCXByaXZhdGUgUHJvcGVydGllcyBwcm9wczsKLQlwcml2YXRlIFN0cmluZyBqbmRpTmFtZTsKLQotCS8qKgotCSAqIENyZWF0ZSBhIHJlZmVyZW5jZSB0byBhbiBvYmplY3QgdGhhdCBpcyBsYXVuY2hhYmxlIHZpYSBKTkRJLgotCSAqIAotCSAqIEBwYXJhbSBwcm9wcyB0aGUgSk5ESSBwcm9wZXJ0aWVzIHJlcXVpcmVkIHRvIGNvbm5lY3QgdG8gdGhlIG9iamVjdAotCSAqIEBwYXJhbSBqbmRpTmFtZSB0aGUgSk5ESSBuYW1lIG9mIHRoZSBvYmplY3QKLQkgKi8KLQlwdWJsaWMgSm5kaUxhdW5jaGFibGUoUHJvcGVydGllcyBwcm9wcywgU3RyaW5nIGpuZGlOYW1lKSB7Ci0JCXRoaXMuam5kaU5hbWUgPSBqbmRpTmFtZTsKLQkJdGhpcy5wcm9wcyA9IHByb3BzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIEpOREkgcHJvcGVydGllcyByZXF1aXJlZCB0byBjb25uZWN0IHRvIHRoZSBvYmplY3QuCi0JICogCi0JICogQHJldHVybiB0aGUgSk5ESSBwcm9wZXJ0aWVzIHJlcXVpcmVkIHRvIGNvbm5lY3QgdG8gdGhlIG9iamVjdAotCSAqLwotCXB1YmxpYyBQcm9wZXJ0aWVzIGdldFByb3BlcnRpZXMoKSB7Ci0JCXJldHVybiBwcm9wczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBKTkRJIG5hbWUgb2YgdGhlIG9iamVjdC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBKTkRJIG5hbWUgb2YgdGhlIG9iamVjdAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Sk5ESU5hbWUoKSB7Ci0JCXJldHVybiBqbmRpTmFtZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc2phdmFjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9KbmRpT2JqZWN0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zamF2YWNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL0puZGlPYmplY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFlNDQxMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zamF2YWNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL0puZGlPYmplY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGVBcnRpZmFjdDsKLS8qKgotICogQSByZXByZXNlbnRhdGlvbiBvZiBhbiBvYmplY3QgaW4gSk5ESSB0aGF0IGNhbiBiZSB0ZXN0ZWQgb24gYSBzZXJ2ZXIuCi0gKiA8cD4KLSAqIDxiPlByb3Zpc2lvbmFsIEFQSTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAKLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKiBAcGxhbm5lZGZvciAxLjUKLSAqLwotcHVibGljIGNsYXNzIEpuZGlPYmplY3QgaW1wbGVtZW50cyBJTW9kdWxlQXJ0aWZhY3QgewotCXByaXZhdGUgSU1vZHVsZSBtb2R1bGU7Ci0JcHJpdmF0ZSBTdHJpbmcgam5kaU5hbWU7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSByZWZlcmVuY2UgdG8gYW4gb2JqZWN0IGluIEpOREkuCi0JICogCi0JICogQHBhcmFtIG1vZHVsZSB0aGUgbW9kdWxlIHRoYXQgdGhlIG9iamVjdCBpcyBjb250YWluZWQgaW4KLQkgKiBAcGFyYW0gam5kaU5hbWUgdGhlIEpOREkgbmFtZSBvZiB0aGUgb2JqZWN0Ci0JICovCi0JcHVibGljIEpuZGlPYmplY3QoSU1vZHVsZSBtb2R1bGUsIFN0cmluZyBqbmRpTmFtZSkgewotCQl0aGlzLm1vZHVsZSA9IG1vZHVsZTsKLQkJdGhpcy5qbmRpTmFtZSA9IGpuZGlOYW1lOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSU1vZHVsZUFydGlmYWN0I2dldE1vZHVsZSgpCi0JICovCi0JcHVibGljIElNb2R1bGUgZ2V0TW9kdWxlKCkgewotCQlyZXR1cm4gbW9kdWxlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgSk5ESSBuYW1lIG9mIHRoZSBvYmplY3QuCi0JICogCi0JICogQHJldHVybiB0aGUgSk5ESSBuYW1lIG9mIHRoZSBvYmplY3QKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEpuZGlOYW1lKCkgewotCQlyZXR1cm4gam5kaU5hbWU7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NqYXZhY29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvUHVibGlzaFV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NqYXZhY29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvUHVibGlzaFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjAzNmM0OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zamF2YWNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL1B1Ymxpc2hVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmU7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcE91dHB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuSmF2YVNlcnZlclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLmludGVybmFsLlByb2dyZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuVHJhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSU1vZHVsZUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklNb2R1bGVGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklNb2R1bGVSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSU1vZHVsZVJlc291cmNlRGVsdGE7Ci0vKioKLSAqIFV0aWxpdHkgY2xhc3Mgd2l0aCBhbiBhc3NvcnRtZW50IG9mIHVzZWZ1bCBmaWxlIG1ldGhvZHMuCi0gKiAKLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKiBAcGxhbm5lZGZvciAxLjUKLSAqLwotcHVibGljIGNsYXNzIFB1Ymxpc2hVdGlsIHsKLQkvLyBzaXplIG9mIHRoZSBidWZmZXIKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQlVGRkVSID0gMTAyNDA7Ci0KLQkvLyB0aGUgYnVmZmVyCi0JcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlW0JVRkZFUl07Ci0KLQkvKioKLQkgKiBGaWxlVXRpbCBjYW5ub3QgYmUgY3JlYXRlZC4gVXNlIHN0YXRpYyBtZXRob2RzLgotCSAqLwotCXByaXZhdGUgUHVibGlzaFV0aWwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ29weSBhIGZpbGUgZnJvbSBhIHRvIGIuIENsb3NlcyB0aGUgaW5wdXQgc3RyZWFtIGFmdGVyIHVzZS4KLQkgKgotCSAqIEBwYXJhbSBpbiBqYXZhLmlvLklucHV0U3RyZWFtCi0JICogQHBhcmFtIHRvIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcmV0dXJuIGEgc3RhdHVzCi0JICovCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIGNvcHlGaWxlKElucHV0U3RyZWFtIGluLCBTdHJpbmcgdG8pIHsKLQkJT3V0cHV0U3RyZWFtIG91dCA9IG51bGw7Ci0JCQotCQl0cnkgewotCQkJb3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0odG8pOwotCQotCQkJaW50IGF2YWlsID0gaW4ucmVhZChidWYpOwotCQkJd2hpbGUgKGF2YWlsID4gMCkgewotCQkJCW91dC53cml0ZShidWYsIDAsIGF2YWlsKTsKLQkJCQlhdmFpbCA9IGluLnJlYWQoYnVmKTsKLQkJCX0KLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgY29weWluZyBmaWxlIiwgZSk7Ci0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKYXZhU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JDb3B5aW5nRmlsZSwgbmV3IFN0cmluZ1tdIHt0bywgZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCl9KSwgZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCWlmIChpbiAhPSBudWxsKQotCQkJCQlpbi5jbG9zZSgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCQl0cnkgewotCQkJCWlmIChvdXQgIT0gbnVsbCkKLQkJCQkJb3V0LmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkvLyBpZ25vcmUKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENvcHkgYSBmaWxlIGZyb20gYSB0byBiLiBDbG9zZXMgdGhlIGlucHV0IHN0cmVhbSBhZnRlciB1c2UuCi0JICoKLQkgKiBAcGFyYW0gaW4gYW4gaW5wdXQgc3RyZWFtCi0JICogQHBhcmFtIHRvIGEgcGF0aCB0byBjb3B5IHRvLiB0aGUgZGlyZWN0b3J5IG11c3QgYWxyZWFkeSBleGlzdAotCSAqIEBwYXJhbSB0cyB0aW1lc3RhbXAKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gaWYgYW55dGhpbmcgZ29lcyB3cm9uZwotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgY29weUZpbGUoSW5wdXRTdHJlYW0gaW4sIElQYXRoIHRvLCBsb25nIHRzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCU91dHB1dFN0cmVhbSBvdXQgPSBudWxsOwotCQkKLQkJRmlsZSB0ZW1wRmlsZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlGaWxlIGZpbGUgPSB0by50b0ZpbGUoKTsKLQkJCUZpbGUgdGVtcERpciA9IEphdmFTZXJ2ZXJQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRTdGF0ZUxvY2F0aW9uKCkudG9GaWxlKCk7Ci0JCQl0ZW1wRmlsZSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoInRtcCIsICIuIiArIHRvLmdldEZpbGVFeHRlbnNpb24oKSwgdGVtcERpcik7Ci0JCQkKLQkJCW91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRlbXBGaWxlKTsKLQkKLQkJCWludCBhdmFpbCA9IGluLnJlYWQoYnVmKTsKLQkJCXdoaWxlIChhdmFpbCA+IDApIHsKLQkJCQlvdXQud3JpdGUoYnVmLCAwLCBhdmFpbCk7Ci0JCQkJYXZhaWwgPSBpbi5yZWFkKGJ1Zik7Ci0JCQl9Ci0JCQkKLQkJCW91dC5jbG9zZSgpOwotCQkJb3V0ID0gbnVsbDsKLQkJCQotCQkJaW50IGkgPSAwOwotCQkJLy9TeXN0ZW0ub3V0LnByaW50KCJmaWxlOiAiICsgZmlsZS5leGlzdHMoKSArICIgIiArIHRlbXBGaWxlLmV4aXN0cygpKTsKLQkJCWlmIChmaWxlLmV4aXN0cygpKSB7Ci0JCQkJaSArPSAxOwotCQkJCWlmICghZmlsZS5kZWxldGUoKSkgewotCQkJCQlpICs9IDI7Ci0JCQkJCXRlbXBGaWxlLmRlbGV0ZSgpOwotCQkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yRGVsZXRlLCBmaWxlLnRvU3RyaW5nKCkpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpICs9IDQ7Ci0JCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiICIgKyBpICsgIiAiICsgZmlsZS5leGlzdHMoKSArICIgIiArIHRlbXBGaWxlLmV4aXN0cygpKTsKLQkJCWlmICghdGVtcEZpbGUucmVuYW1lVG8oZmlsZSkpIHsKLQkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yUmVuYW1lLCB0ZW1wRmlsZS50b1N0cmluZygpLCBmaWxlLnRvU3RyaW5nKCkpKTsKLQkJCX0KLQkJCQotCQkJaWYgKHRzICE9IElSZXNvdXJjZS5OVUxMX1NUQU1QICYmIHRzICE9IDApCi0JCQkJZmlsZS5zZXRMYXN0TW9kaWZpZWQodHMpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgY29weWluZyBmaWxlIiwgZSk7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEphdmFTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCBOTFMuYmluZChNZXNzYWdlcy5lcnJvckNvcHlpbmdGaWxlLCB0by50b09TU3RyaW5nKCksIGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKSwgZSkpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKHRlbXBGaWxlICE9IG51bGwgJiYgdGVtcEZpbGUuZXhpc3RzKCkpCi0JCQkJdGVtcEZpbGUuZGVsZXRlT25FeGl0KCk7Ci0JCQl0cnkgewotCQkJCWlmIChpbiAhPSBudWxsKQotCQkJCQlpbi5jbG9zZSgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCQl0cnkgewotCQkJCWlmIChvdXQgIT0gbnVsbCkKLQkJCQkJb3V0LmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkvLyBpZ25vcmUKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgY29weUZpbGUoSU1vZHVsZUZpbGUgbWYsIElQYXRoIHBhdGgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSUZpbGUgZmlsZSA9IChJRmlsZSkgbWYuZ2V0QWRhcHRlcihJRmlsZS5jbGFzcyk7Ci0JCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCWNvcHlGaWxlKGZpbGUuZ2V0Q29udGVudHMoKSwgcGF0aCwgZmlsZS5nZXRMb2NhbFRpbWVTdGFtcCgpKTsKLQkJfSBlbHNlIHsKLQkJCUZpbGUgZmlsZTIgPSAoRmlsZSkgbWYuZ2V0QWRhcHRlcihGaWxlLmNsYXNzKTsKLQkJCUlucHV0U3RyZWFtIGluID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUyKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEphdmFTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCBOTFMuYmluZChNZXNzYWdlcy5lcnJvclJlYWRpbmcsIGZpbGUyLmdldEFic29sdXRlUGF0aCgpKSwgZSkpOwotCQkJfQotCQkJY29weUZpbGUoaW4sIHBhdGgsIGZpbGUyLmxhc3RNb2RpZmllZCgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlY3Vyc2l2ZWx5IGRlbGV0ZXMgYSBkaXJlY3RvcnkuCi0JICoKLQkgKiBAcGFyYW0gZGlyIGphdmEuaW8uRmlsZQotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZGVsZXRlRGlyZWN0b3J5KEZpbGUgZGlyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJdHJ5IHsKLQkJCWlmICghZGlyLmV4aXN0cygpIHx8ICFkaXIuaXNEaXJlY3RvcnkoKSkKLQkJCQlyZXR1cm47Ci0JCi0JCQlGaWxlW10gZmlsZXMgPSBkaXIubGlzdEZpbGVzKCk7Ci0JCQlpbnQgc2l6ZSA9IGZpbGVzLmxlbmd0aDsKLQkJCW1vbml0b3IgPSBQcm9ncmVzc1V0aWwuZ2V0TW9uaXRvckZvcihtb25pdG9yKTsKLQkJCW1vbml0b3IuYmVnaW5UYXNrKE5MUy5iaW5kKE1lc3NhZ2VzLmRlbGV0aW5nVGFzaywgbmV3IFN0cmluZ1tdIHsgZGlyLmdldEFic29sdXRlUGF0aCgpIH0pLCBzaXplICogMTApOwotCQotCQkJLy8gY3ljbGUgdGhyb3VnaCBmaWxlcwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlGaWxlIGN1cnJlbnQgPSBmaWxlc1tpXTsKLQkJCQlpZiAoY3VycmVudC5pc0ZpbGUoKSkgewotCQkJCQljdXJyZW50LmRlbGV0ZSgpOwotCQkJCQltb25pdG9yLndvcmtlZCgxMCk7Ci0JCQkJfSBlbHNlIGlmIChjdXJyZW50LmlzRGlyZWN0b3J5KCkpIHsKLQkJCQkJbW9uaXRvci5zdWJUYXNrKE5MUy5iaW5kKE1lc3NhZ2VzLmRlbGV0aW5nVGFzaywgbmV3IFN0cmluZ1tdIHtjdXJyZW50LmdldEFic29sdXRlUGF0aCgpfSkpOwotCQkJCQlkZWxldGVEaXJlY3RvcnkoY3VycmVudCwgUHJvZ3Jlc3NVdGlsLmdldFN1Yk1vbml0b3JGb3IobW9uaXRvciwgMTApKTsKLQkJCQl9Ci0JCQl9Ci0JCQlkaXIuZGVsZXRlKCk7Ci0JCQltb25pdG9yLmRvbmUoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGRlbGV0aW5nIGRpcmVjdG9yeSAiICsgZGlyLmdldEFic29sdXRlUGF0aCgpLCBlKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgc21hcnRDb3B5KElNb2R1bGVSZXNvdXJjZVtdIHJlc291cmNlcywgSVBhdGggcGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChyZXNvdXJjZXMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCUZpbGUgdG9EaXIgPSBwYXRoLnRvRmlsZSgpOwotCQlGaWxlW10gdG9GaWxlcyA9IHRvRGlyLmxpc3RGaWxlcygpOwotCQlpbnQgZnJvbVNpemUgPSByZXNvdXJjZXMubGVuZ3RoOwotCQkKLQkJaWYgKHRvRGlyLmV4aXN0cygpICYmIHRvRGlyLmlzRGlyZWN0b3J5KCkpIHsKLQkJCWludCB0b1NpemUgPSB0b0ZpbGVzLmxlbmd0aDsKLQkJCS8vIGNoZWNrIGlmIHRoaXMgZXhhY3QgZmlsZSBleGlzdHMgaW4gdGhlIG5ldyBkaXJlY3RvcnkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdG9TaXplOyBpKyspIHsKLQkJCQlTdHJpbmcgbmFtZSA9IHRvRmlsZXNbaV0uZ2V0TmFtZSgpOwotCQkJCWJvb2xlYW4gaXNEaXIgPSB0b0ZpbGVzW2ldLmlzRGlyZWN0b3J5KCk7Ci0JCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgZnJvbVNpemU7IGorKykgewotCQkJCQlpZiAobmFtZS5lcXVhbHMocmVzb3VyY2VzW2pdLmdldE5hbWUoKSkgJiYgaXNEaXIgPT0gcmVzb3VyY2VzW2pdIGluc3RhbmNlb2YgSU1vZHVsZUZvbGRlcikKLQkJCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQl9Ci0JCi0JCQkJLy8gZGVsZXRlIGZpbGUgaWYgaXQgY2FuJ3QgYmUgZm91bmQgb3IgaXNuJ3QgdGhlIGNvcnJlY3QgdHlwZQotCQkJCWlmICghZm91bmQpIHsKLQkJCQkJaWYgKGlzRGlyKQotCQkJCQkJZGVsZXRlRGlyZWN0b3J5KHRvRmlsZXNbaV0sIG51bGwpOwotCQkJCQllbHNlCi0JCQkJCQl0b0ZpbGVzW2ldLmRlbGV0ZSgpOwotCQkJCX0KLQkJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJCXJldHVybjsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmICh0b0Rpci5pc0ZpbGUoKSkKLQkJCQl0b0Rpci5kZWxldGUoKTsKLQkJCXRvRGlyLm1rZGlyKCk7Ci0JCX0KLQkJCQotCQltb25pdG9yLndvcmtlZCg1MCk7Ci0JCQotCQkvLyBjeWNsZSB0aHJvdWdoIGZpbGVzIGFuZCBvbmx5IGNvcHkgd2hlbiBpdCBkb2Vzbid0IGV4aXN0Ci0JCS8vIG9yIGlzIG5ld2VyCi0JCXRvRmlsZXMgPSB0b0Rpci5saXN0RmlsZXMoKTsKLQkJaW50IHRvU2l6ZSA9IHRvRmlsZXMubGVuZ3RoOwotCQlpbnQgZHcgPSAwOwotCQlpZiAodG9TaXplID4gMCkKLQkJCWR3ID0gNTAwIC8gdG9TaXplOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZnJvbVNpemU7IGkrKykgewotCQkJSU1vZHVsZVJlc291cmNlIGN1cnJlbnQgPSByZXNvdXJjZXNbaV07Ci0KLQkJCS8vIGNoZWNrIGlmIHRoaXMgaXMgYSBuZXcgb3IgbmV3ZXIgZmlsZQotCQkJYm9vbGVhbiBjb3B5ID0gdHJ1ZTsKLQkJCWJvb2xlYW4gY3VycmVudElzRGlyID0gY3VycmVudCBpbnN0YW5jZW9mIElNb2R1bGVGb2xkZXI7Ci0JCQlpZiAoIWN1cnJlbnRJc0RpcikgewotCQkJCS8vU3RyaW5nIG5hbWUgPSBjdXJyZW50LmdldE5hbWUoKTsKLQkJCQkvL0lNb2R1bGVGaWxlIG1mID0gKElNb2R1bGVGaWxlKSBjdXJyZW50OwotCQkJCQotCQkJCS8vbG9uZyBtb2QgPSBtZi5nZXRNb2RpZmljYXRpb25TdGFtcCgpOwotCQkJCS8vIFRPRE8KLQkJCQkvKmZvciAoaW50IGogPSAwOyBqIDwgdG9TaXplOyBqKyspIHsKLQkJCQkJaWYgKG5hbWUuZXF1YWxzKHRvRmlsZXNbal0uZ2V0TmFtZSgpKSAmJiBtb2QgPD0gdG9GaWxlc1tqXS5sYXN0TW9kaWZpZWQoKSkKLQkJCQkJCWNvcHkgPSBmYWxzZTsKLQkJCQl9Ki8KLQkJCX0KLQotCQkJaWYgKGNvcHkpIHsKLQkJCQkvL1N0cmluZyBmcm9tRmlsZSA9IGN1cnJlbnQuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCQkJSVBhdGggdG9QYXRoID0gcGF0aC5hcHBlbmQoY3VycmVudC5nZXROYW1lKCkpOwotCQkJCWlmICghY3VycmVudElzRGlyKSB7Ci0JCQkJCUlNb2R1bGVGaWxlIG1mID0gKElNb2R1bGVGaWxlKSBjdXJyZW50OwotCQkJCQljb3B5RmlsZShtZiwgdG9QYXRoKTsKLQkJCQkJbW9uaXRvci53b3JrZWQoZHcpOwotCQkJCX0gZWxzZSB7IC8vaWYgKGN1cnJlbnRJc0RpcikgewotCQkJCQlJTW9kdWxlRm9sZGVyIGZvbGRlciA9IChJTW9kdWxlRm9sZGVyKSBjdXJyZW50OwotCQkJCQlJTW9kdWxlUmVzb3VyY2VbXSBjaGlsZHJlbiA9IGZvbGRlci5tZW1iZXJzKCk7Ci0JCQkJCW1vbml0b3Iuc3ViVGFzayhOTFMuYmluZChNZXNzYWdlcy5jb3B5aW5nVGFzaywgbmV3IFN0cmluZ1tdIHtyZXNvdXJjZXNbaV0uZ2V0TmFtZSgpLCBjdXJyZW50LmdldE5hbWUoKX0pKTsKLQkJCQkJc21hcnRDb3B5KGNoaWxkcmVuLCB0b1BhdGgsIFByb2dyZXNzVXRpbC5nZXRTdWJNb25pdG9yRm9yKG1vbml0b3IsIGR3KSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJCXJldHVybjsKLQkJfQotCQltb25pdG9yLndvcmtlZCg1MDAgLSBkdyAqIHRvU2l6ZSk7Ci0JCW1vbml0b3IuZG9uZSgpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBoYW5kbGVEZWx0YShpbnQga2luZCwgSVBhdGggcGF0aCwgSU1vZHVsZVJlc291cmNlRGVsdGEgZGVsdGEpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSU1vZHVsZVJlc291cmNlIHJlc291cmNlID0gZGVsdGEuZ2V0TW9kdWxlUmVzb3VyY2UoKTsKLQkJaW50IGtpbmQyID0gZGVsdGEuZ2V0S2luZCgpOwotCQkKLQkJaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSU1vZHVsZUZpbGUpIHsKLQkJCUlNb2R1bGVGaWxlIGZpbGUgPSAoSU1vZHVsZUZpbGUpIHJlc291cmNlOwotCQkJaWYgKGtpbmQyID09IElNb2R1bGVSZXNvdXJjZURlbHRhLlJFTU9WRUQpCi0JCQkJZGVsZXRlRmlsZShwYXRoLCBmaWxlKTsKLQkJCWVsc2UKLQkJCQljb3B5RmlsZShwYXRoLCBmaWxlKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJaWYgKGtpbmQyID09IElNb2R1bGVSZXNvdXJjZURlbHRhLkFEREVEKSB7Ci0JCQlJUGF0aCBwYXRoMiA9IHBhdGguYXBwZW5kKHJlc291cmNlLmdldE1vZHVsZVJlbGF0aXZlUGF0aCgpKS5hcHBlbmQocmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJCXBhdGgyLnRvRmlsZSgpLm1rZGlycygpOwotCQl9IGVsc2UgaWYgKGtpbmQgPT0gSU1vZHVsZVJlc291cmNlRGVsdGEuUkVNT1ZFRCkgewotCQkJSVBhdGggcGF0aDIgPSBwYXRoLmFwcGVuZChyZXNvdXJjZS5nZXRNb2R1bGVSZWxhdGl2ZVBhdGgoKSkuYXBwZW5kKHJlc291cmNlLmdldE5hbWUoKSk7Ci0JCQlwYXRoMi50b0ZpbGUoKS5kZWxldGUoKTsKLQkJfQotCQlJTW9kdWxlUmVzb3VyY2VEZWx0YVtdIGNoaWxkRGVsdGFzID0gZGVsdGEuZ2V0QWZmZWN0ZWRDaGlsZHJlbigpOwotCQlpbnQgc2l6ZSA9IGNoaWxkRGVsdGFzLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCWhhbmRsZURlbHRhKGtpbmQsIHBhdGgsIGNoaWxkRGVsdGFzW2ldKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBkZWxldGVGaWxlKElQYXRoIHBhdGgsIElNb2R1bGVGaWxlIGZpbGUpIHsKLQkJSVBhdGggcGF0aDIgPSBwYXRoLmFwcGVuZChmaWxlLmdldE1vZHVsZVJlbGF0aXZlUGF0aCgpKS5hcHBlbmQoZmlsZS5nZXROYW1lKCkpOwotCQlwYXRoMi50b0ZpbGUoKS5kZWxldGUoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNvcHlGaWxlKElQYXRoIHBhdGgsIElNb2R1bGVGaWxlIG1mKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlQYXRoIHBhdGgzID0gcGF0aC5hcHBlbmQobWYuZ2V0TW9kdWxlUmVsYXRpdmVQYXRoKCkpLmFwcGVuZChtZi5nZXROYW1lKCkpOwotCQlGaWxlIGYgPSBwYXRoMy50b0ZpbGUoKS5nZXRQYXJlbnRGaWxlKCk7Ci0JCWlmICghZi5leGlzdHMoKSkKLQkJCWYubWtkaXJzKCk7Ci0JCQotCQlJRmlsZSBmaWxlID0gKElGaWxlKSBtZi5nZXRBZGFwdGVyKElGaWxlLmNsYXNzKTsKLQkJaWYgKGZpbGUgIT0gbnVsbCkKLQkJCWNvcHlGaWxlKGZpbGUuZ2V0Q29udGVudHMoKSwgcGF0aDMsIGZpbGUuZ2V0TG9jYWxUaW1lU3RhbXAoKSk7Ci0JCWVsc2UgewotCQkJRmlsZSBmaWxlMiA9IChGaWxlKSBtZi5nZXRBZGFwdGVyKEZpbGUuY2xhc3MpOwotCQkJSW5wdXRTdHJlYW0gaW4gPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZTIpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSmF2YVNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yUmVhZGluZywgZmlsZTIuZ2V0QWJzb2x1dGVQYXRoKCkpLCBlKSk7Ci0JCQl9Ci0JCQljb3B5RmlsZShpbiwgcGF0aDMsIGZpbGUyLmxhc3RNb2RpZmllZCgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb3B5KElNb2R1bGVSZXNvdXJjZVtdIHJlc291cmNlcywgSVBhdGggcGF0aCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAocmVzb3VyY2VzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQlpbnQgc2l6ZSA9IHJlc291cmNlcy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQljb3B5KHJlc291cmNlc1tpXSwgcGF0aCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNvcHkoSU1vZHVsZVJlc291cmNlIHJlc291cmNlLCBJUGF0aCBwYXRoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElNb2R1bGVGb2xkZXIpIHsKLQkJCUlNb2R1bGVGb2xkZXIgZm9sZGVyID0gKElNb2R1bGVGb2xkZXIpIHJlc291cmNlOwotCQkJY29weShmb2xkZXIubWVtYmVycygpLCBwYXRoKTsKLQkJfSBlbHNlIHsKLQkJCUlNb2R1bGVGaWxlIG1mID0gKElNb2R1bGVGaWxlKSByZXNvdXJjZTsKLQkJCUlQYXRoIHBhdGgzID0gcGF0aC5hcHBlbmQobWYuZ2V0TW9kdWxlUmVsYXRpdmVQYXRoKCkpLmFwcGVuZChtZi5nZXROYW1lKCkpOwotCQkJRmlsZSBmID0gcGF0aDMudG9GaWxlKCkuZ2V0UGFyZW50RmlsZSgpOwotCQkJaWYgKCFmLmV4aXN0cygpKQotCQkJCWYubWtkaXJzKCk7Ci0JCQlJRmlsZSBmaWxlID0gKElGaWxlKSBtZi5nZXRBZGFwdGVyKElGaWxlLmNsYXNzKTsKLQkJCWlmIChmaWxlICE9IG51bGwpCi0JCQkJY29weUZpbGUoZmlsZS5nZXRDb250ZW50cygpLCBwYXRoMywgZmlsZS5nZXRMb2NhbFRpbWVTdGFtcCgpKTsKLQkJCWVsc2UgewotCQkJCUZpbGUgZmlsZTIgPSAoRmlsZSkgbWYuZ2V0QWRhcHRlcihGaWxlLmNsYXNzKTsKLQkJCQlJbnB1dFN0cmVhbSBpbiA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUyKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSmF2YVNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yUmVhZGluZywgZmlsZTIuZ2V0QWJzb2x1dGVQYXRoKCkpLCBlKSk7Ci0JCQkJfQotCQkJCWNvcHlGaWxlKGluLCBwYXRoMywgZmlsZTIubGFzdE1vZGlmaWVkKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyB6aXAgZmlsZSBjb250YWluaW5nIHRoZSBnaXZlbiBtb2R1bGUgcmVzb3VyY2VzLiBEZWxldGVzIHRoZSBleGlzdGluZyBmaWxlCi0JICogKGFuZCBkb2Vzbid0IGNyZWF0ZSBhIG5ldyBvbmUpIGlmIHJlc291cmNlcyBpcyBudWxsIG9yIGVtcHR5LgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZXMKLQkgKiBAcGFyYW0gemlwUGF0aAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGVaaXBGaWxlKElNb2R1bGVSZXNvdXJjZVtdIHJlc291cmNlcywgSVBhdGggemlwUGF0aCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAocmVzb3VyY2VzID09IG51bGwgfHwgcmVzb3VyY2VzLmxlbmd0aCA9PSAwKSB7Ci0JCQkvLyBzaG91bGQgYWxzbyBjaGVjayBpZiByZXNvdXJjZXMgY29uc2lzdHMgb2YgYWxsIGVtcHR5IGRpcmVjdG9yaWVzCi0JCQlGaWxlIGZpbGUgPSB6aXBQYXRoLnRvRmlsZSgpOwotCQkJaWYgKGZpbGUuZXhpc3RzKCkpCi0JCQkJZmlsZS5kZWxldGUoKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJRmlsZSB0ZW1wRmlsZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlGaWxlIGZpbGUgPSB6aXBQYXRoLnRvRmlsZSgpOwotCQkJRmlsZSB0ZW1wRGlyID0gSmF2YVNlcnZlclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFN0YXRlTG9jYXRpb24oKS50b0ZpbGUoKTsKLQkJCXRlbXBGaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgidG1wIiwgIi4iICsgemlwUGF0aC5nZXRGaWxlRXh0ZW5zaW9uKCksIHRlbXBEaXIpOwotCQkJCi0JCQlCdWZmZXJlZE91dHB1dFN0cmVhbSBib3V0ID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRlbXBGaWxlKSk7Ci0JCQlaaXBPdXRwdXRTdHJlYW0gem91dCA9IG5ldyBaaXBPdXRwdXRTdHJlYW0oYm91dCk7Ci0JCQlhZGRaaXBFbnRyaWVzKHpvdXQsIHJlc291cmNlcyk7Ci0JCQl6b3V0LmNsb3NlKCk7Ci0JCQkKLQkJCWlmIChmaWxlLmV4aXN0cygpKSB7Ci0JCQkJaWYgKCFmaWxlLmRlbGV0ZSgpKSB7Ci0JCQkJCXRlbXBGaWxlLmRlbGV0ZSgpOwotCQkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yRGVsZXRlLCBmaWxlLnRvU3RyaW5nKCkpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIXRlbXBGaWxlLnJlbmFtZVRvKGZpbGUpKQotCQkJCXRocm93IG5ldyBFeGNlcHRpb24oTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JSZW5hbWUsIHRlbXBGaWxlLnRvU3RyaW5nKCksIGZpbGUudG9TdHJpbmcoKSkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgemlwcGluZyIsIGUpOwotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKYXZhU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JDcmVhdGluZ1ppcEZpbGUsIHppcFBhdGgubGFzdFNlZ21lbnQoKSwgZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpLCBlKSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAodGVtcEZpbGUgIT0gbnVsbCAmJiB0ZW1wRmlsZS5leGlzdHMoKSkKLQkJCQl0ZW1wRmlsZS5kZWxldGVPbkV4aXQoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkWmlwRW50cmllcyhaaXBPdXRwdXRTdHJlYW0gem91dCwgSU1vZHVsZVJlc291cmNlW10gcmVzb3VyY2VzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaW50IHNpemUgPSByZXNvdXJjZXMubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJaWYgKHJlc291cmNlc1tpXSBpbnN0YW5jZW9mIElNb2R1bGVGb2xkZXIpIHsKLQkJCQlJTW9kdWxlRm9sZGVyIG1mID0gKElNb2R1bGVGb2xkZXIpIHJlc291cmNlc1tpXTsKLQkJCQlJTW9kdWxlUmVzb3VyY2VbXSByZXMgPSBtZi5tZW1iZXJzKCk7Ci0JCQkJYWRkWmlwRW50cmllcyh6b3V0LCByZXMpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJCi0JCQlJTW9kdWxlRmlsZSBtZiA9IChJTW9kdWxlRmlsZSkgcmVzb3VyY2VzW2ldOwotCQkJSVBhdGggcGF0aCA9IG1mLmdldE1vZHVsZVJlbGF0aXZlUGF0aCgpLmFwcGVuZChtZi5nZXROYW1lKCkpOwotCQkJCi0JCQlaaXBFbnRyeSB6ZSA9IG5ldyBaaXBFbnRyeShwYXRoLnRvUG9ydGFibGVTdHJpbmcoKSk7Ci0JCQkKLQkJCUlucHV0U3RyZWFtIGluID0gbnVsbDsKLQkJCWxvbmcgdHMgPSAwOwotCQkJSUZpbGUgZmlsZSA9IChJRmlsZSkgbWYuZ2V0QWRhcHRlcihJRmlsZS5jbGFzcyk7Ci0JCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQkJdHMgPSBmaWxlLmdldExvY2FsVGltZVN0YW1wKCk7Ci0JCQkJaW4gPSBmaWxlLmdldENvbnRlbnRzKCk7Ci0JCQl9IGVsc2UgewotCQkJCUZpbGUgZmlsZTIgPSAoRmlsZSkgbWYuZ2V0QWRhcHRlcihGaWxlLmNsYXNzKTsKLQkJCQl0cyA9IGZpbGUyLmxhc3RNb2RpZmllZCgpOwotCQkJCWluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlMik7Ci0JCQl9Ci0JCQkKLQkJCWlmICh0cyAhPSBJUmVzb3VyY2UuTlVMTF9TVEFNUCAmJiB0cyAhPSAwKQotCQkJCXplLnNldFRpbWUodHMpOwotCQkJCi0JCQl6b3V0LnB1dE5leHRFbnRyeSh6ZSk7Ci0JCQkKLQkJCXRyeSB7Ci0JCQkJaW50IG4gPSAwOwotCQkJCXdoaWxlIChuID4gLTEpIHsKLQkJCQkJbiA9IGluLnJlYWQoYnVmKTsKLQkJCQkJaWYgKG4gPiAwKQotCQkJCQkJem91dC53cml0ZShidWYsIDAsIG4pOwotCQkJCX0KLQkJCX0gZmluYWxseSB7Ci0JCQkJaW4uY2xvc2UoKTsKLQkJCX0KLQkJCQotCQkJem91dC5jbG9zZUVudHJ5KCk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc2phdmFjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9SdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJEZWxlZ2F0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc2phdmFjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9SdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJEZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTdmOGNkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NqYXZhY29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvUnVudGltZUNsYXNzcGF0aFByb3ZpZGVyRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBY2Nlc3NSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5JTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuSmF2YVNlcnZlclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuVHJhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLmludGVybmFsLlhNTE1lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lOwotLyoqCi0gKiBBIHJ1bnRpbWUgY2xhc3NwYXRoIHByb3ZpZGVyIHByb3ZpZGVzIHRoZSBjbGFzc3BhdGggZm9yIGEgSmF2YSBzZXJ2ZXIgcnVudGltZS4KLSAqIFRoaXMgcHJvdmlkZXIgaXMgc2NvcGVkIGJ5IHJ1bnRpbWUgdHlwZSBhbmQgbWF5IHByb3ZpZGUgdGhlIGNsYXNzcGF0aCBmb3IgbXVsdGlwbGUKLSAqIHJ1bnRpbWUgaW5zdGFuY2VzLgotICogPHA+Ci0gKiBUaGlzIGFic3RyYWN0IGNsYXNzIGlzIGludGVuZGVkIHRvIGJlIGV4dGVuZGVkIG9ubHkgYnkgY2xpZW50cwotICogdG8gZXh0ZW5kIHRoZSA8Y29kZT5ydW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJzPC9jb2RlPiBleHRlbnNpb24gcG9pbnQuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIDxiPlByb3Zpc2lvbmFsIEFQSTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAKLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKiAKLSAqIEBwbGFubmVkZm9yIDEuNQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUnVudGltZUNsYXNzcGF0aFByb3ZpZGVyRGVsZWdhdGUgewotCXByaXZhdGUgY2xhc3MgU291cmNlQXR0YWNobWVudFVwZGF0ZSB7Ci0JCVN0cmluZyBydW50aW1lSWQ7Ci0JCUlQYXRoIGVudHJ5OwotCQlJUGF0aCBzb3VyY2VBdHRhY2htZW50UGF0aDsKLQkJSVBhdGggc291cmNlQXR0YWNobWVudFJvb3RQYXRoOwotCQlJQ2xhc3NwYXRoQXR0cmlidXRlW10gYXR0cmlidXRlczsKLQl9Ci0KLQlwcml2YXRlIExpc3Qgc291cmNlQXR0YWNobWVudHM7Ci0KLQlwcml2YXRlIFN0cmluZyBleHRlbnNpb25JZDsKLQotCXByaXZhdGUgTWFwIHJ1bnRpbWVQYXRoTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCXB1YmxpYyBSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJEZWxlZ2F0ZSgpIHsKLQkJLy8gZGVmYXVsdCBjb25zdHJ1Y3RvcgotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoaXMgY2xhc3NwYXRoIHByb3ZpZGVyIHdpdGggaXRzIGxpZmUtbG9uZyBpZC4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIGZyYW1ld29yay4KLQkgKiBDbGllbnRzIHNob3VsZCBuZXZlciBjYWxsIHRoaXMgbWV0aG9kLgotCSAqIDwvcD4KLQkgKiBAcGFyYW0gaWQgdGhlIGV4dGVuc2lvbiBpZAotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGluaXRpYWxpemUoU3RyaW5nIGlkKSB7Ci0JCWV4dGVuc2lvbklkID0gaWQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY2xhc3NwYXRoIGNvbnRhaW5lciBsYWJlbCBmb3IgdGhlIGdpdmVuIHJ1bnRpbWUgYW5kIHRoZSBnaXZlbgotCSAqIGNsYXNzcGF0aCBjb250YWluZXIgaWQgKHJldHVybmVkIGZyb20gZ2V0Q2xhc3NwYXRoRW50cnlJZHMoKSkuIFRoaXMgbWV0aG9kCi0JICogbXVzdCBub3QgcmV0dXJuIG51bGwuCi0JICogCi0JICogQHBhcmFtIHJ1bnRpbWUgdGhlIHJ1bnRpbWUgdG8gcmVzb2x2ZSB0aGUgY29udGFpbmVyIGxhYmVsIGZvcgotCSAqIEByZXR1cm4gYSBjbGFzc3BhdGggY29udGFpbmVyIGxhYmVsCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDbGFzc3BhdGhDb250YWluZXJMYWJlbChJUnVudGltZSBydW50aW1lKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJlc29sdmVzIChjcmVhdGVzIHRoZSBjbGFzc3BhdGggZW50cmllcyBmb3IpIHRoZSBjbGFzc3BhdGggY29udGFpbmVyIHdpdGgKLQkgKiB0aGUgZ2l2ZW4gcnVudGltZSBhbmQgdGhlIGdpdmVuIGNsYXNzcGF0aCBjb250YWluZXIgaWQgKHJldHVybmVkIGZyb20KLQkgKiBnZXRDbGFzc3BhdGhFbnRyeUlkcygpKS4gSWYgdGhlIGNsYXNzcGF0aCBjb250YWluZXIgY2Fubm90IGJlIHJlc29sdmVkCi0JICogKGZvciBpbnN0YW5jZSwgaWYgdGhlIHJ1bnRpbWUgZG9lcyBub3QgZXhpc3QpLCByZXR1cm4gbnVsbC4KLQkgKiAKLQkgKiBAcGFyYW0gcnVudGltZSB0aGUgcnVudGltZSB0byByZXNvbHZlIHRoZSBjb250YWluZXIgZm9yCi0JICogQHJldHVybiBhbiBhcnJheSBvZiBjbGFzc3BhdGggZW50cmllcyBmb3IgdGhlIGNvbnRhaW5lciwgb3IgbnVsbCBpZiB0aGUKLQkgKiAgIGNvbnRhaW5lciBjb3VsZCBub3QgYmUgcmVzb2x2ZWQKLQkgKi8KLQlwdWJsaWMgSUNsYXNzcGF0aEVudHJ5W10gcmVzb2x2ZUNsYXNzcGF0aENvbnRhaW5lcihJUnVudGltZSBydW50aW1lKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNsYXNzcGF0aCBjb250YWluZXIgbGFiZWwgZm9yIHRoZSBnaXZlbiBydW50aW1lIGFuZCB0aGUgZ2l2ZW4KLQkgKiBjbGFzc3BhdGggY29udGFpbmVyIGlkIChyZXR1cm5lZCBmcm9tIGdldENsYXNzcGF0aEVudHJ5SWRzKCkpLiBUaGlzIG1ldGhvZAotCSAqIG11c3Qgbm90IHJldHVybiBudWxsLgotCSAqIAotCSAqIEBwYXJhbSBydW50aW1lIHRoZSBydW50aW1lIHRvIHJlc29sdmUgdGhlIGNvbnRhaW5lciBsYWJlbCBmb3IKLQkgKiBAcGFyYW0gaWQgdGhlIGNsYXNzcGF0aCBlbnRyeSBpZAotCSAqIEByZXR1cm4gYSBjbGFzc3BhdGggY29udGFpbmVyIGxhYmVsCi0JICogQGRlcHJlY2F0ZWQgc2hvdWxkIHVzZSB0aGUgZXF1aXZhbGVudCBtZXRob2Qgd2l0aG91dCB0aGUgdW51c2VkIGlkIHZhcmlhYmxlCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDbGFzc3BhdGhDb250YWluZXJMYWJlbChJUnVudGltZSBydW50aW1lLCBTdHJpbmcgaWQpIHsKLQkJcmV0dXJuIGdldENsYXNzcGF0aENvbnRhaW5lckxhYmVsKHJ1bnRpbWUpOwotCX0KLQotCS8qKgotCSAqIFJlc29sdmVzIChjcmVhdGVzIHRoZSBjbGFzc3BhdGggZW50cmllcyBmb3IpIHRoZSBjbGFzc3BhdGggY29udGFpbmVyIHdpdGgKLQkgKiB0aGUgZ2l2ZW4gcnVudGltZSBhbmQgdGhlIGdpdmVuIGNsYXNzcGF0aCBjb250YWluZXIgaWQgKHJldHVybmVkIGZyb20KLQkgKiBnZXRDbGFzc3BhdGhFbnRyeUlkcygpKS4gSWYgdGhlIGNsYXNzcGF0aCBjb250YWluZXIgY2Fubm90IGJlIHJlc29sdmVkCi0JICogKGZvciBpbnN0YW5jZSwgaWYgdGhlIHJ1bnRpbWUgZG9lcyBub3QgZXhpc3QpLCByZXR1cm4gbnVsbC4KLQkgKiAKLQkgKiBAcGFyYW0gcnVudGltZSB0aGUgcnVudGltZSB0byByZXNvbHZlIHRoZSBjb250YWluZXIgZm9yCi0JICogQHBhcmFtIGlkIHRoZSBjbGFzc3BhdGggZW50cnkgaWQKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGNsYXNzcGF0aCBlbnRyaWVzIGZvciB0aGUgY29udGFpbmVyLCBvciBudWxsIGlmIHRoZQotCSAqICAgY29udGFpbmVyIGNvdWxkIG5vdCBiZSByZXNvbHZlZAotCSAqIEBkZXByZWNhdGVkIHNob3VsZCB1c2UgdGhlIGVxdWl2YWxlbnQgbWV0aG9kIHdpdGhvdXQgdGhlIHVudXNlZCBpZCB2YXJpYWJsZQotCSAqLwotCXB1YmxpYyBJQ2xhc3NwYXRoRW50cnlbXSByZXNvbHZlQ2xhc3NwYXRoQ29udGFpbmVyKElSdW50aW1lIHJ1bnRpbWUsIFN0cmluZyBpZCkgewotCQlyZXR1cm4gcmVzb2x2ZUNsYXNzcGF0aENvbnRhaW5lcihydW50aW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXNvbHZlIHRoZSBjbGFzc3BhdGggY29udGFpbmVyLgotCSAqIAotCSAqIEBwYXJhbSBydW50aW1lIGEgcnVudGltZQotCSAqIEBwYXJhbSBpZCBhIGNvbnRhaW5lciBpZAotCSAqIEByZXR1cm4gYSBwb3NzaWJseSBlbXB0eSBhcnJheSBvZiBjbGFzc3BhdGggZW50cmllcwotCSAqIEBkZXByZWNhdGVkIHNob3VsZCB1c2UgdGhlIGVxdWl2YWxlbnQgbWV0aG9kIHdpdGhvdXQgdGhlIHVudXNlZCBpZCB2YXJpYWJsZQotCSAqLwotCXB1YmxpYyBJQ2xhc3NwYXRoRW50cnlbXSByZXNvbHZlQ2xhc3NwYXRoQ29udGFpbmVySW1wbChJUnVudGltZSBydW50aW1lLCBTdHJpbmcgaWQpIHsKLQkJcmV0dXJuIHJlc29sdmVDbGFzc3BhdGhDb250YWluZXJJbXBsKHJ1bnRpbWUpOwotCX0KLQotCS8qKgotCSAqIFJlc29sdmUgdGhlIGNsYXNzcGF0aCBjb250YWluZXIuCi0JICogCi0JICogQHBhcmFtIHJ1bnRpbWUgYSBydW50aW1lCi0JICogQHJldHVybiBhIHBvc3NpYmx5IGVtcHR5IGFycmF5IG9mIGNsYXNzcGF0aCBlbnRyaWVzCi0JICovCi0JcHVibGljIElDbGFzc3BhdGhFbnRyeVtdIHJlc29sdmVDbGFzc3BhdGhDb250YWluZXJJbXBsKElSdW50aW1lIHJ1bnRpbWUpIHsKLQkJaWYgKHJ1bnRpbWUgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgSUNsYXNzcGF0aEVudHJ5WzBdOwotCQlydW50aW1lUGF0aE1hcC5wdXQocnVudGltZS5nZXRJZCgpLCBydW50aW1lLmdldExvY2F0aW9uKCkpOwotCQlJQ2xhc3NwYXRoRW50cnlbXSBlbnRyaWVzID0gcmVzb2x2ZUNsYXNzcGF0aENvbnRhaW5lcihydW50aW1lLCAiIik7Ci0JCQotCQlpZiAoZW50cmllcyA9PSBudWxsKQotCQkJZW50cmllcyA9IG5ldyBJQ2xhc3NwYXRoRW50cnlbMF07Ci0JCQotCQlpZiAoc291cmNlQXR0YWNobWVudHMgPT0gbnVsbCkKLQkJCWxvYWQoKTsKLQkJCi0JCWludCBzaXplID0gZW50cmllcy5sZW5ndGg7Ci0JCWludCBzaXplMiA9IHNvdXJjZUF0dGFjaG1lbnRzLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgc2l6ZTI7IGorKykgewotCQkJCVNvdXJjZUF0dGFjaG1lbnRVcGRhdGUgc2F1ID0gKFNvdXJjZUF0dGFjaG1lbnRVcGRhdGUpIHNvdXJjZUF0dGFjaG1lbnRzLmdldChqKTsKLQkJCQlpZiAoc2F1LnJ1bnRpbWVJZC5lcXVhbHMocnVudGltZS5nZXRJZCgpKSAmJiBzYXUuZW50cnkuZXF1YWxzKGVudHJpZXNbaV0uZ2V0UGF0aCgpKSkgewotCQkJCQllbnRyaWVzW2ldID0gSmF2YUNvcmUubmV3TGlicmFyeUVudHJ5KGVudHJpZXNbaV0uZ2V0UGF0aCgpLCBzYXUuc291cmNlQXR0YWNobWVudFBhdGgsIHNhdS5zb3VyY2VBdHRhY2htZW50Um9vdFBhdGgsIG5ldyBJQWNjZXNzUnVsZVswXSwgc2F1LmF0dHJpYnV0ZXMsIGZhbHNlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBlbnRyaWVzOwotCX0KLQotCS8qCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZXJlIGFyZSBhbnkgY2hhbmdlcyBpbiB0aGUgcnVudGltZSBzaW5jZSB0aGUgbGFzdCB0aW1lIHRoYXQgdGhlCi0JICogY2xhc3NwYXRoIHdhcyByZXNvbHZlZCB3aGljaCBtYXkgYWZmZWN0IHRoZSBjbGFzc3BhdGgsIGFuZCBmYWxzZSBvdGhlcndpc2UuIFRoaXMKLQkgKiBtZXRob2QgaXMgdXNlZCB0byBjaGVjayBwcm9qZWN0cyB3aGVuIGEgcnVudGltZSBjaGFuZ2VzIGFuZCBhdXRvbWF0aWNhbGx5IHJlYnVpbGQKLQkgKiB0aGVtIGlmIG5lY2Vzc2FyeS4KLQkgKiAKLQkgKiBAcGFyYW0gcnVudGltZSBhIHJ1bnRpbWUKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjbGFzc3BhdGggbWF5IGNoYW5nZSBkdWUgdG8gYSBjaGFuZ2UgaW4gdGhlIHJ1bnRpbWUsCi0JICogICAgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGVyZSBhcmUgbm8gY2hhbmdlcwotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc1J1bnRpbWVDbGFzc3BhdGhDaGFuZ2VkKElSdW50aW1lIHJ1bnRpbWUpIHsKLQkJdHJ5IHsKLQkJCUlQYXRoIHBhdGggPSAoSVBhdGgpIHJ1bnRpbWVQYXRoTWFwLmdldChydW50aW1lLmdldElkKCkpOwotCQkJcmV0dXJuIChwYXRoICE9IG51bGwgJiYgIXBhdGguZXF1YWxzKHJ1bnRpbWUuZ2V0TG9jYXRpb24oKSkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkSmFyRmlsZXMoRmlsZSBkaXIsIExpc3QgbGlzdCwgYm9vbGVhbiBpbmNsdWRlU3ViZGlyZWN0b3JpZXMpIHsKLQkJaW50IGRlcHRoID0gMDsKLQkJaWYgKGluY2x1ZGVTdWJkaXJlY3RvcmllcykKLQkJCWRlcHRoID0gMjsKLQkJYWRkSmFyRmlsZXMoZGlyLCBsaXN0LCBkZXB0aCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRKYXJGaWxlcyhGaWxlIGRpciwgTGlzdCBsaXN0LCBpbnQgZGVwdGgpIHsKLQkJaWYgKGRpciA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQkKLQkJRmlsZVtdIGZpbGVzID0gZGlyLmxpc3RGaWxlcygpOwotCQlpZiAoZmlsZXMgIT0gbnVsbCkgewotCQkJaW50IHNpemUgPSBmaWxlcy5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCWlmIChmaWxlc1tpXS5pc0RpcmVjdG9yeSgpICYmIGRlcHRoID4gMCkgewotCQkJCQlhZGRKYXJGaWxlcyhmaWxlc1tpXSwgbGlzdCwgZGVwdGggLSAxKTsKLQkJCQl9IGVsc2UgaWYgKGZpbGVzW2ldLmdldEFic29sdXRlUGF0aCgpLmVuZHNXaXRoKCIuamFyIikgfHwgZmlsZXNbaV0uZ2V0QWJzb2x1dGVQYXRoKCkuZW5kc1dpdGgoIi56aXAiKSkgewotCQkJCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgoZmlsZXNbaV0uZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJCQlsaXN0LmFkZChKYXZhQ29yZS5uZXdMaWJyYXJ5RW50cnkocGF0aCwgbnVsbCwgbnVsbCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZCBsaWJyYXJ5IGVudHJpZXMgdG8gdGhlIGdpdmVuIGxpc3QgZm9yIGV2ZXJ5IGphciBmaWxlIGZvdW5kIGluIHRoZQotCSAqIGdpdmVuIGRpcmVjdG9yeS4gT3B0aW9uYWxseSBzZWFyY2ggc3ViZGlyZWN0b3JpZXMgYXMgd2VsbC4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdCBhIGxpc3QKLQkgKiBAcGFyYW0gZGlyIGEgZGlyZWN0b3J5Ci0JICogQHBhcmFtIGluY2x1ZGVTdWJkaXJlY3RvcmllcyA8Y29kZT50cnVlPC9jb2RlPiB0byBpbmNsdWRlIHN1YmRpcmVjdG9yaWVzLCBhbmQKLQkgKiAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGFkZExpYnJhcnlFbnRyaWVzKExpc3QgbGlzdCwgRmlsZSBkaXIsIGJvb2xlYW4gaW5jbHVkZVN1YmRpcmVjdG9yaWVzKSB7Ci0JCWlmIChkaXIgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJYWRkSmFyRmlsZXMoZGlyLCBsaXN0LCBpbmNsdWRlU3ViZGlyZWN0b3JpZXMpOwotCX0KLQotCS8qKgotCSAqIFJlcXVlc3QgdGhhdCB0aGUgY2xhc3NwYXRoIGNvbnRhaW5lciBmb3IgdGhlIGdpdmVuIHJ1bnRpbWUgYW5kIGlkIGJlIHVwZGF0ZWQKLQkgKiB3aXRoIHRoZSBnaXZlbiBjbGFzc3BhdGggY29udGFpbmVyIGVudHJpZXMuCi0JICogCi0JICogQHBhcmFtIHJ1bnRpbWUgYSBydW50aW1lCi0JICogQHBhcmFtIGlkIGFuIGlkCi0JICogQHBhcmFtIGVudHJpZXMgYW4gYXJyYXkgb2YgY2xhc3NwYXRoIGVudHJpZXMKLQkgKiBAZGVwcmVjYXRlZCBzaG91bGQgdXNlIHRoZSBlcXVpdmFsZW50IG1ldGhvZCB3aXRob3V0IHRoZSB1bnVzZWQgaWQgdmFyaWFibGUKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXF1ZXN0Q2xhc3NwYXRoQ29udGFpbmVyVXBkYXRlKElSdW50aW1lIHJ1bnRpbWUsIFN0cmluZyBpZCwgSUNsYXNzcGF0aEVudHJ5W10gZW50cmllcykgewotCQlyZXF1ZXN0Q2xhc3NwYXRoQ29udGFpbmVyVXBkYXRlKHJ1bnRpbWUsIGVudHJpZXMpOwotCX0KLQotCS8qKgotCSAqIFJlcXVlc3QgdGhhdCB0aGUgY2xhc3NwYXRoIGNvbnRhaW5lciBmb3IgdGhlIGdpdmVuIHJ1bnRpbWUgYW5kIGlkIGJlIHVwZGF0ZWQKLQkgKiB3aXRoIHRoZSBnaXZlbiBjbGFzc3BhdGggY29udGFpbmVyIGVudHJpZXMuCi0JICogCi0JICogQHBhcmFtIHJ1bnRpbWUgYSBydW50aW1lCi0JICogQHBhcmFtIGVudHJpZXMgYW4gYXJyYXkgb2YgY2xhc3NwYXRoIGVudHJpZXMKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXF1ZXN0Q2xhc3NwYXRoQ29udGFpbmVyVXBkYXRlKElSdW50aW1lIHJ1bnRpbWUsIElDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMpIHsKLQkJLy8gZGVmYXVsdCBiZWhhdmlvdXIgaXMgdG8gc2F2ZSB0aGUgc291cmNlIHBhdGggZW50cmllcwotCQlpZiAocnVudGltZSA9PSBudWxsIHx8IGVudHJpZXMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCS8vIGZpbmQgdGhlIHNvdXJjZSBhdHRhY2htZW50cwotCQlzb3VyY2VBdHRhY2htZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCi0JCWludCBzaXplID0gZW50cmllcy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlpZiAoZW50cmllc1tpXS5nZXRTb3VyY2VBdHRhY2htZW50UGF0aCgpICE9IG51bGwgfHwgZW50cmllc1tpXS5nZXRFeHRyYUF0dHJpYnV0ZXMoKSAhPSBudWxsKSB7Ci0JCQkJU291cmNlQXR0YWNobWVudFVwZGF0ZSBzYXUgPSBuZXcgU291cmNlQXR0YWNobWVudFVwZGF0ZSgpOwotCQkJCXNhdS5ydW50aW1lSWQgPSBydW50aW1lLmdldElkKCk7Ci0JCQkJc2F1LmVudHJ5ID0gZW50cmllc1tpXS5nZXRQYXRoKCk7Ci0JCQkJc2F1LnNvdXJjZUF0dGFjaG1lbnRQYXRoID0gZW50cmllc1tpXS5nZXRTb3VyY2VBdHRhY2htZW50UGF0aCgpOwotCQkJCXNhdS5zb3VyY2VBdHRhY2htZW50Um9vdFBhdGggPSBlbnRyaWVzW2ldLmdldFNvdXJjZUF0dGFjaG1lbnRSb290UGF0aCgpOwotCQkJCXNhdS5hdHRyaWJ1dGVzID0gZW50cmllc1tpXS5nZXRFeHRyYUF0dHJpYnV0ZXMoKTsKLQkJCQlzb3VyY2VBdHRhY2htZW50cy5hZGQoc2F1KTsKLQkJCX0KLQkJfQotCQlzYXZlKCk7Ci0JfQotCi0JLyoqCi0JICogTG9hZCBzb3VyY2UgYXR0YWNobWVudCBpbmZvLgotCSAqLwotCXByaXZhdGUgdm9pZCBsb2FkKCkgewotCQlzb3VyY2VBdHRhY2htZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCi0JCVN0cmluZyBpZCA9IGV4dGVuc2lvbklkOwotCQlTdHJpbmcgZmlsZW5hbWUgPSBKYXZhU2VydmVyUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U3RhdGVMb2NhdGlvbigpLmFwcGVuZChpZCArICIueG1sIikudG9PU1N0cmluZygpOwotCQkKLQkJdHJ5IHsKLQkJCUlNZW1lbnRvIG1lbWVudG8gPSBYTUxNZW1lbnRvLmxvYWRNZW1lbnRvKGZpbGVuYW1lKTsKLQkJCQotCQkJSU1lbWVudG9bXSBjaGlsZHJlbiA9IG1lbWVudG8uZ2V0Q2hpbGRyZW4oInNvdXJjZS1hdHRhY2htZW50Iik7Ci0JCQlpbnQgc2l6ZSA9IGNoaWxkcmVuLmxlbmd0aDsKLQkJCQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQl0cnkgewotCQkJCQlTb3VyY2VBdHRhY2htZW50VXBkYXRlIHNhdSA9IG5ldyBTb3VyY2VBdHRhY2htZW50VXBkYXRlKCk7Ci0JCQkJCXNhdS5ydW50aW1lSWQgPSBjaGlsZHJlbltpXS5nZXRTdHJpbmcoInJ1bnRpbWUtaWQiKTsKLQkJCQkJU3RyaW5nIHRlbXAgPSBjaGlsZHJlbltpXS5nZXRTdHJpbmcoImVudHJ5Iik7Ci0JCQkJCWlmICh0ZW1wICE9IG51bGwpCi0JCQkJCQlzYXUuZW50cnkgPSBuZXcgUGF0aCh0ZW1wKTsKLQkJCQkJdGVtcCA9IGNoaWxkcmVuW2ldLmdldFN0cmluZygic291cmNlLWF0dGFjaG1lbnQtcGF0aCIpOwotCQkJCQlpZiAodGVtcCAhPSBudWxsKQotCQkJCQkJc2F1LnNvdXJjZUF0dGFjaG1lbnRQYXRoID0gbmV3IFBhdGgodGVtcCk7Ci0JCQkJCXRlbXAgPSBjaGlsZHJlbltpXS5nZXRTdHJpbmcoInNvdXJjZS1hdHRhY2htZW50LXJvb3QtcGF0aCIpOwotCQkJCQlpZiAodGVtcCAhPSBudWxsKQotCQkJCQkJc2F1LnNvdXJjZUF0dGFjaG1lbnRSb290UGF0aCA9IG5ldyBQYXRoKHRlbXApOwotCQkJCQlJTWVtZW50b1tdIGF0dHJDaGlsZHJlbiA9IGNoaWxkcmVuW2ldLmdldENoaWxkcmVuKCJhdHRyaWJ1dGUiKTsKLQkJCQkJaWYgKGF0dHJDaGlsZHJlbiAhPSBudWxsKSB7Ci0JCQkJCQlpbnQgc2l6ZTIgPSBhdHRyQ2hpbGRyZW4ubGVuZ3RoOwotCQkJCQkJc2F1LmF0dHJpYnV0ZXMgPSBuZXcgSUNsYXNzcGF0aEF0dHJpYnV0ZVtzaXplMl07Ci0JCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHNpemUyOyBqKyspIHsKLQkJCQkJCQlTdHJpbmcgbmFtZSA9IGF0dHJDaGlsZHJlbltqXS5nZXRTdHJpbmcoIm5hbWUiKTsKLQkJCQkJCQlTdHJpbmcgdmFsdWUgPSBhdHRyQ2hpbGRyZW5bal0uZ2V0U3RyaW5nKCJ2YWx1ZSIpOwotCQkJCQkJCXNhdS5hdHRyaWJ1dGVzW2pdID0gSmF2YUNvcmUubmV3Q2xhc3NwYXRoQXR0cmlidXRlKG5hbWUsIHZhbHVlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlzb3VyY2VBdHRhY2htZW50cy5hZGQoc2F1KTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiQ291bGQgbm90IGxvYWQgbW9uaXRvcjogIiArIGUpOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJDb3VsZCBub3QgbG9hZCBzb3VyY2UgcGF0aCBpbmZvOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2F2ZSBzb3VyY2UgYXR0YWNobWVudCBpbmZvLgotCSAqLwotCXByaXZhdGUgdm9pZCBzYXZlKCkgewotCQlpZiAoc291cmNlQXR0YWNobWVudHMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJU3RyaW5nIGlkID0gZXh0ZW5zaW9uSWQ7Ci0JCVN0cmluZyBmaWxlbmFtZSA9IEphdmFTZXJ2ZXJQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRTdGF0ZUxvY2F0aW9uKCkuYXBwZW5kKGlkICsgIi54bWwiKS50b09TU3RyaW5nKCk7Ci0JCXRyeSB7Ci0JCQlYTUxNZW1lbnRvIG1lbWVudG8gPSBYTUxNZW1lbnRvLmNyZWF0ZVdyaXRlUm9vdCgiY2xhc3NwYXRoIik7Ci0KLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gc291cmNlQXR0YWNobWVudHMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlTb3VyY2VBdHRhY2htZW50VXBkYXRlIHNhdSA9IChTb3VyY2VBdHRhY2htZW50VXBkYXRlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJSU1lbWVudG8gY2hpbGQgPSBtZW1lbnRvLmNyZWF0ZUNoaWxkKCJzb3VyY2UtYXR0YWNobWVudCIpOwotCQkJCWNoaWxkLnB1dFN0cmluZygicnVudGltZS1pZCIsIHNhdS5ydW50aW1lSWQpOwotCQkJCWlmIChzYXUuZW50cnkgIT0gbnVsbCkKLQkJCQkJY2hpbGQucHV0U3RyaW5nKCJlbnRyeSIsIHNhdS5lbnRyeS50b1BvcnRhYmxlU3RyaW5nKCkpOwotCQkJCWlmIChzYXUuc291cmNlQXR0YWNobWVudFBhdGggIT0gbnVsbCkKLQkJCQkJY2hpbGQucHV0U3RyaW5nKCJzb3VyY2UtYXR0YWNobWVudC1wYXRoIiwgc2F1LnNvdXJjZUF0dGFjaG1lbnRQYXRoLnRvUG9ydGFibGVTdHJpbmcoKSk7Ci0JCQkJaWYgKHNhdS5zb3VyY2VBdHRhY2htZW50Um9vdFBhdGggIT0gbnVsbCkKLQkJCQkJY2hpbGQucHV0U3RyaW5nKCJzb3VyY2UtYXR0YWNobWVudC1yb290LXBhdGgiLCBzYXUuc291cmNlQXR0YWNobWVudFJvb3RQYXRoLnRvUG9ydGFibGVTdHJpbmcoKSk7Ci0JCQkJaWYgKHNhdS5hdHRyaWJ1dGVzICE9IG51bGwpIHsKLQkJCQkJaW50IHNpemUgPSBzYXUuYXR0cmlidXRlcy5sZW5ndGg7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJCQlJQ2xhc3NwYXRoQXR0cmlidXRlIGF0dHIgPSBzYXUuYXR0cmlidXRlc1tpXTsKLQkJCQkJCUlNZW1lbnRvIGF0dHJDaGlsZCA9IGNoaWxkLmNyZWF0ZUNoaWxkKCJhdHRyaWJ1dGUiKTsKLQkJCQkJCWF0dHJDaGlsZC5wdXRTdHJpbmcoIm5hbWUiLCBhdHRyLmdldE5hbWUoKSk7Ci0JCQkJCQlhdHRyQ2hpbGQucHV0U3RyaW5nKCJ2YWx1ZSIsIGF0dHIuZ2V0VmFsdWUoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCW1lbWVudG8uc2F2ZVRvRmlsZShmaWxlbmFtZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBzYXZpbmcgc291cmNlIHBhdGggaW5mbyIsIGUpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NqYXZhY29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvU2VydmxldC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc2phdmFjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9TZXJ2bGV0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmN2M1YWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc2phdmFjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9TZXJ2bGV0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlQXJ0aWZhY3Q7Ci0vKioKLSAqIEEgSjJFRSBTZXJ2bGV0LgotICogPHA+Ci0gKiA8Yj5Qcm92aXNpb25hbCBBUEk6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIAotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIAotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICogQHBsYW5uZWRmb3IgMS41Ci0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2bGV0IGltcGxlbWVudHMgSU1vZHVsZUFydGlmYWN0IHsKLQlwcml2YXRlIElNb2R1bGUgbW9kdWxlOwotCXByaXZhdGUgU3RyaW5nIGNsYXNzTmFtZTsKLQlwcml2YXRlIFN0cmluZyBhbGlhczsKLQkKLQkvKioKLQkgKiBDcmVhdGUgYSByZWZlcmVuY2UgdG8gYSBzZXJ2bGV0LgotCSAqIAotCSAqIEBwYXJhbSBtb2R1bGUgdGhlIG1vZHVsZSB0aGF0IHRoZSBzZXJ2bGV0IGlzIGNvbnRhaW5lZCBpbgotCSAqIEBwYXJhbSBjbGFzc05hbWUgdGhlIGNsYXNzIG5hbWUgb2YgdGhlIHNlcnZsZXQKLQkgKiBAcGFyYW0gYWxpYXMgdGhlIHNlcnZsZXQncyBhbGlhcwotCSAqLwotCXB1YmxpYyBTZXJ2bGV0KElNb2R1bGUgbW9kdWxlLCBTdHJpbmcgY2xhc3NOYW1lLCBTdHJpbmcgYWxpYXMpIHsKLQkJdGhpcy5tb2R1bGUgPSBtb2R1bGU7Ci0JCXRoaXMuY2xhc3NOYW1lID0gY2xhc3NOYW1lOwotCQl0aGlzLmFsaWFzID0gYWxpYXM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJTW9kdWxlQXJ0aWZhY3QjZ2V0TW9kdWxlKCkKLQkgKi8KLQlwdWJsaWMgSU1vZHVsZSBnZXRNb2R1bGUoKSB7Ci0JCXJldHVybiBtb2R1bGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjbGFzcyBuYW1lIG9mIHRoZSBzZXJ2bGV0LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGNsYXNzIG5hbWUgb2YgdGhlIHNlcnZsZXQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNlcnZsZXRDbGFzc05hbWUoKSB7Ci0JCXJldHVybiBjbGFzc05hbWU7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2VydmxldCdzIGFsaWFzLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHNlcnZsZXQncyBhbGlhcwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QWxpYXMoKSB7Ci0JCXJldHVybiBhbGlhczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE9iamVjdCN0b1N0cmluZygpCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJTZXJ2bGV0IFttb2R1bGU9IiArIG1vZHVsZSArICIsIGNsYXNzPSIgKyBjbGFzc05hbWUgKyAiLCBhbGlhcz0iICsgYWxpYXMgKyAiXSI7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NqYXZhY29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvR2VuZXJpY1J1bnRpbWUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NqYXZhY29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvR2VuZXJpY1J1bnRpbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2EzNjVmZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zamF2YWNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL0dlbmVyaWNSdW50aW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLklWTUluc3RhbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JVk1JbnN0YWxsVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkphdmFSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuUnVudGltZURlbGVnYXRlOwotLyoqCi0gKgotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJpY1J1bnRpbWUgZXh0ZW5kcyBSdW50aW1lRGVsZWdhdGUgaW1wbGVtZW50cyBJR2VuZXJpY1J1bnRpbWUsIElHZW5lcmljUnVudGltZVdvcmtpbmdDb3B5IHsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX1ZNX0lOU1RBTExfVFlQRV9JRCA9ICJ2bS1pbnN0YWxsLXR5cGUtaWQiOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfVk1fSU5TVEFMTF9JRCA9ICJ2bS1pbnN0YWxsLWlkIjsKLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBnZW5lcmljIHJ1bnRpbWUuCi0JICovCi0JcHVibGljIEdlbmVyaWNSdW50aW1lKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRWTUluc3RhbGxUeXBlSWQoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoUFJPUF9WTV9JTlNUQUxMX1RZUEVfSUQsIChTdHJpbmcpbnVsbCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRWTUluc3RhbGxJZCgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZShQUk9QX1ZNX0lOU1RBTExfSUQsIChTdHJpbmcpbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcnVudGltZSBpcyB1c2luZyB0aGUgZGVmYXVsdCBKUkUuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcnVudGltZSBpcyB1c2luZyB0aGUgZGVmYXVsdCBKUkUsCi0JICogICAgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1VzaW5nRGVmYXVsdEpSRSgpIHsKLQkJcmV0dXJuIGdldFZNSW5zdGFsbFR5cGVJZCgpID09IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJR2VuZXJpY1J1bnRpbWUjZ2V0Vk1JbnN0YWxsKCkKLQkgKi8KLQlwdWJsaWMgSVZNSW5zdGFsbCBnZXRWTUluc3RhbGwoKSB7Ci0JCWlmIChnZXRWTUluc3RhbGxUeXBlSWQoKSA9PSBudWxsKQotCQkJcmV0dXJuIEphdmFSdW50aW1lLmdldERlZmF1bHRWTUluc3RhbGwoKTsKLQkJdHJ5IHsKLQkJCUlWTUluc3RhbGxUeXBlIHZtSW5zdGFsbFR5cGUgPSBKYXZhUnVudGltZS5nZXRWTUluc3RhbGxUeXBlKGdldFZNSW5zdGFsbFR5cGVJZCgpKTsKLQkJCUlWTUluc3RhbGxbXSB2bUluc3RhbGxzID0gdm1JbnN0YWxsVHlwZS5nZXRWTUluc3RhbGxzKCk7Ci0JCQlpbnQgc2l6ZSA9IHZtSW5zdGFsbHMubGVuZ3RoOwotCQkJU3RyaW5nIGlkID0gZ2V0Vk1JbnN0YWxsSWQoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJaWYgKGlkLmVxdWFscyh2bUluc3RhbGxzW2ldLmdldElkKCkpKQotCQkJCQlyZXR1cm4gdm1JbnN0YWxsc1tpXTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIFJ1bnRpbWVEZWxlZ2F0ZSN2YWxpZGF0ZSgpCi0JICovCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGUoKSB7Ci0JCUlTdGF0dXMgc3RhdHVzID0gc3VwZXIudmFsaWRhdGUoKTsKLQkJaWYgKCFzdGF0dXMuaXNPSygpKQotCQkJcmV0dXJuIHN0YXR1czsKLQkJCi0JCUlSdW50aW1lIHJ1bnRpbWUgPSBnZXRSdW50aW1lKCk7Ci0KLQkJSVBhdGggcGF0aCA9IHJ1bnRpbWUuZ2V0TG9jYXRpb24oKTsKLQkJaWYgKCFwYXRoLnRvRmlsZSgpLmV4aXN0cygpKQotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSmF2YVNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIE1lc3NhZ2VzLmVycm9yTG9jYXRpb24sIG51bGwpOwotCQllbHNlIGlmIChnZXRWTUluc3RhbGwoKSA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSmF2YVNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIE1lc3NhZ2VzLmVycm9ySlJFLCBudWxsKTsKLQkJZWxzZQotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBSdW50aW1lRGVsZWdhdGUjc2V0RGVmYXVsdHMoSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0cyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJSVZNSW5zdGFsbCB2bUluc3RhbGwgPSBKYXZhUnVudGltZS5nZXREZWZhdWx0Vk1JbnN0YWxsKCk7Ci0JCXNldFZNSW5zdGFsbCh2bUluc3RhbGwuZ2V0Vk1JbnN0YWxsVHlwZSgpLmdldElkKCksIHZtSW5zdGFsbC5nZXRJZCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElHZW5lcmljUnVudGltZVdvcmtpbmdDb3B5I3NldFZNSW5zdGFsbChJVk1JbnN0YWxsKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZNSW5zdGFsbChJVk1JbnN0YWxsIHZtSW5zdGFsbCkgewotCQlpZiAodm1JbnN0YWxsID09IG51bGwpIHsKLQkJCXNldFZNSW5zdGFsbChudWxsLCBudWxsKTsKLQkJfSBlbHNlCi0JCQlzZXRWTUluc3RhbGwodm1JbnN0YWxsLmdldFZNSW5zdGFsbFR5cGUoKS5nZXRJZCgpLCB2bUluc3RhbGwuZ2V0SWQoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0Vk1JbnN0YWxsKFN0cmluZyB0eXBlSWQsIFN0cmluZyBpZCkgewotCQlpZiAodHlwZUlkID09IG51bGwpCi0JCQlzZXRBdHRyaWJ1dGUoUFJPUF9WTV9JTlNUQUxMX1RZUEVfSUQsIChTdHJpbmcpbnVsbCk7Ci0JCWVsc2UKLQkJCXNldEF0dHJpYnV0ZShQUk9QX1ZNX0lOU1RBTExfVFlQRV9JRCwgdHlwZUlkKTsKLQkJCi0JCWlmIChpZCA9PSBudWxsKQotCQkJc2V0QXR0cmlidXRlKFBST1BfVk1fSU5TVEFMTF9JRCwgKFN0cmluZyludWxsKTsKLQkJZWxzZQotCQkJc2V0QXR0cmlidXRlKFBST1BfVk1fSU5TVEFMTF9JRCwgaWQpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zamF2YWNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL0dlbmVyaWNSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NqYXZhY29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvR2VuZXJpY1J1bnRpbWVDbGFzc3BhdGhQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzEwZWNhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NqYXZhY29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvR2VuZXJpY1J1bnRpbWVDbGFzc3BhdGhQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuUnVudGltZUNsYXNzcGF0aFByb3ZpZGVyRGVsZWdhdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWU7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJpY1J1bnRpbWVDbGFzc3BhdGhQcm92aWRlciBleHRlbmRzIFJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlckRlbGVnYXRlIHsKLQkvKioKLQkgKiBAc2VlIFJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlckRlbGVnYXRlI2dldENsYXNzcGF0aENvbnRhaW5lckxhYmVsKElSdW50aW1lLCBTdHJpbmcpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDbGFzc3BhdGhDb250YWluZXJMYWJlbChJUnVudGltZSBydW50aW1lLCBTdHJpbmcgaWQpIHsKLQkJcmV0dXJuIHJ1bnRpbWUuZ2V0UnVudGltZVR5cGUoKS5nZXROYW1lKCk7Ci0JfQotCi0JLyoqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIFJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlckRlbGVnYXRlI3Jlc29sdmVDbGFzc3BhdGhDb250YWluZXIoSVJ1bnRpbWUsIFN0cmluZykKLQkgKi8KLQlwdWJsaWMgSUNsYXNzcGF0aEVudHJ5W10gcmVzb2x2ZUNsYXNzcGF0aENvbnRhaW5lcihJUnVudGltZSBydW50aW1lLCBTdHJpbmcgaWQpIHsKLQkJSVBhdGggaW5zdGFsbFBhdGggPSBydW50aW1lLmdldExvY2F0aW9uKCk7Ci0JCQotCQlpZiAoaW5zdGFsbFBhdGggPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgSUNsYXNzcGF0aEVudHJ5WzBdOwotCQkKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlhZGRMaWJyYXJ5RW50cmllcyhsaXN0LCBpbnN0YWxsUGF0aC50b0ZpbGUoKSwgZmFsc2UpOwotCQlyZXR1cm4gKElDbGFzc3BhdGhFbnRyeVtdKWxpc3QudG9BcnJheShuZXcgSUNsYXNzcGF0aEVudHJ5W2xpc3Quc2l6ZSgpXSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NqYXZhY29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvR2VuZXJpY1J1bnRpbWVVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zamF2YWNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL0dlbmVyaWNSdW50aW1lVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmRjNDg4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NqYXZhY29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvR2VuZXJpY1J1bnRpbWVVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZTsKLS8qKgotICogVXRpbGl0eSBtZXRob2RzIGZvciB0aGUgZ2VuZXJpYyBKMkVFIHJ1bnRpbWUuCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmljUnVudGltZVV0aWwgewotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJVTlRJTUVfVFlQRV9JRCA9ICJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUucnVudGltZVR5cGUiOwotCi0JLyoqCi0JICogQ2Fubm90IGNyZWF0ZSBHZW5lcmljUnVudGltZVV0aWwgLSB1c2Ugc3RhdGljIG1ldGhvZHMuCi0JICovCi0JcHJpdmF0ZSBHZW5lcmljUnVudGltZVV0aWwoKSB7Ci0JCS8vIGNhbid0IGNyZWF0ZQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIHJ1bnRpbWUgaXMgYSBnZW5lcmljIEoyRUUgcnVudGltZSwgYW5kCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4gVGhlIHJ1bnRpbWUgbWF5IG5vdCBiZSBudWxsLgotCSAqIAotCSAqIEBwYXJhbSBydW50aW1lIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzR2VuZXJpY0oyRUVSdW50aW1lKElSdW50aW1lIHJ1bnRpbWUpIHsKLQkJaWYgKHJ1bnRpbWUgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQotCQlyZXR1cm4gKHJ1bnRpbWUuZ2V0UnVudGltZVR5cGUoKSAhPSBudWxsICYmCi0JCQlydW50aW1lLmdldFJ1bnRpbWVUeXBlKCkuZ2V0SWQoKS5zdGFydHNXaXRoKFJVTlRJTUVfVFlQRV9JRCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zamF2YWNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL0lHZW5lcmljUnVudGltZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc2phdmFjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9JR2VuZXJpY1J1bnRpbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM1MDljNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zamF2YWNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL0lHZW5lcmljUnVudGltZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuSUphdmFSdW50aW1lOwotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJR2VuZXJpY1J1bnRpbWUgZXh0ZW5kcyBJSmF2YVJ1bnRpbWUgewotCS8vIG5vIGFkZGl0aW9uYWwgbWV0aG9kcwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NqYXZhY29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvSUdlbmVyaWNSdW50aW1lV29ya2luZ0NvcHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NqYXZhY29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvSUdlbmVyaWNSdW50aW1lV29ya2luZ0NvcHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDEzM2M1Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zamF2YWNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL0lHZW5lcmljUnVudGltZVdvcmtpbmdDb3B5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSVZNSW5zdGFsbDsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUdlbmVyaWNSdW50aW1lV29ya2luZ0NvcHkgZXh0ZW5kcyBJR2VuZXJpY1J1bnRpbWUgewotCS8qKgotCSAqIFNldCB0aGUgVk0gaW5zdGFsbCAoaW5zdGFsbGVkIEpSRSkgdGhhdCB0aGlzIHJ1bnRpbWUgaXMgdXNpbmcuCi0JICogVXNlIDxjb2RlPm51bGw8L2NvZGU+IHRvIHVzZSB0aGUgRWNsaXBzZSBkZWZhdWx0IEpSRS4KLQkgKiAKLQkgKiBAcGFyYW0gdm1JbnN0YWxsIHRoZSBWTSBpbnN0YWxsIHRvIHVzZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZNSW5zdGFsbChJVk1JbnN0YWxsIHZtSW5zdGFsbCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc2phdmFjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9JTWVtZW50by5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc2phdmFjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9JTWVtZW50by5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOThjNzJjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NqYXZhY29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvSU1lbWVudG8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLaAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotLyoqCi0gKiBJbnRlcmZhY2UgdG8gYSBtZW1lbnRvIHVzZWQgZm9yIHNhdmluZyB0aGUgaW1wb3J0YW50IHN0YXRlIG9mIGFuIG9iamVjdAotICogaW4gYSBmb3JtIHRoYXQgY2FuIGJlIHBlcnNpc3RlZCBpbiB0aGUgZmlsZSBzeXN0ZW0uCi0gKiA8cD4KLSAqIE1lbWVudG9zIHdlcmUgZGVzaWduZWQgd2l0aCB0aGUgZm9sbG93aW5nIHJlcXVpcmVtZW50cyBpbiBtaW5kOgotICogPG9sPgotICogIDxsaT5DZXJ0YWluIG9iamVjdHMgbmVlZCB0byBiZSBzYXZlZCBhbmQgcmVzdG9yZWQgYWNyb3NzIHBsYXRmb3JtIHNlc3Npb25zLgotICogICAgPC9saT4KLSAqICA8bGk+V2hlbiBhbiBvYmplY3QgaXMgcmVzdG9yZWQsIGFuIGFwcHJvcHJpYXRlIGNsYXNzIGZvciBhbiBvYmplY3QgbWlnaHQgbm90Ci0gKiAgICBiZSBhdmFpbGFibGUuIEl0IG11c3QgYmUgcG9zc2libGUgdG8gc2tpcCBhbiBvYmplY3QgaW4gdGhpcyBjYXNlLjwvbGk+Ci0gKiAgPGxpPldoZW4gYW4gb2JqZWN0IGlzIHJlc3RvcmVkLCB0aGUgYXBwcm9wcmlhdGUgY2xhc3MgZm9yIHRoZSBvYmplY3QgbWF5IGJlCi0gKiAgICBkaWZmZXJlbnQgZnJvbSB0aGUgb25lIHdoZW4gdGhlIG9iamVjdCB3YXMgb3JpZ2luYWxseSBzYXZlZC4gSWYgc28sIHRoZQotICogICAgbmV3IGNsYXNzIHNob3VsZCBzdGlsbCBiZSBhYmxlIHRvIHJlYWQgdGhlIG9sZCBmb3JtIG9mIHRoZSBkYXRhLjwvbGk+Ci0gKiA8L29sPgotICogPC9wPgotICogPHA+Ci0gKiBNZW1lbnRvcyBtZWV0IHRoZXNlIHJlcXVpcmVtZW50cyBieSBwcm92aWRpbmcgc3VwcG9ydCBmb3Igc3RvcmluZyBhCi0gKiBtYXBwaW5nIG9mIGFyYml0cmFyeSBzdHJpbmcga2V5cyB0byBwcmltaXRpdmUgdmFsdWVzLCBhbmQgYnkgYWxsb3dpbmcKLSAqIG1lbWVudG9zIHRvIGhhdmUgb3RoZXIgbWVtZW50b3MgYXMgY2hpbGRyZW4gKGFycmFuZ2VkIGludG8gYSB0cmVlKS4KLSAqIEEgcm9idXN0IGV4dGVybmFsIHN0b3JhZ2UgZm9ybWF0IGJhc2VkIG9uIFhNTCBpcyB1c2VkLgotICogPC9wPjxwPgotICogVGhlIGtleSBmb3IgYW4gYXR0cmlidXRlIG1heSBiZSBhbnkgYWxwaGEgbnVtZXJpYyB2YWx1ZS4gIEhvd2V2ZXIsIHRoZQotICogdmFsdWUgb2YgPGNvZGU+VEFHX0lEPC9jb2RlPiBpcyByZXNlcnZlZCBmb3IgaW50ZXJuYWwgdXNlLgotICogPC9wPjxwPgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU1lbWVudG8gewotCS8qKgotCSAqIFNwZWNpYWwgcmVzZXJ2ZWQga2V5IHVzZWQgdG8gc3RvcmUgdGhlIG1lbWVudG8gaWQgCi0JICogKHZhbHVlIDxjb2RlPiJvcmcuZWNsaXBzZS51aS5pZCI8L2NvZGU+KS4KLQkgKgotCSAqIEBzZWUgI2dldElkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0lEID0gIklNZW1lbnRvLmludGVybmFsLmlkIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjaGlsZCBvZiB0aGlzIG1lbWVudG8gd2l0aCB0aGUgZ2l2ZW4gdHlwZS4KLQkgKiA8cD4KLQkgKiBUaGUgPGNvZGU+Z2V0Q2hpbGQ8L2NvZGU+IGFuZCA8Y29kZT5nZXRDaGlsZHJlbjwvY29kZT4gbWV0aG9kcwotCSAqIGFyZSB1c2VkIHRvIHJldHJpZXZlIGNoaWxkcmVuIG9mIGEgZ2l2ZW4gdHlwZS4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZQotCSAqIEByZXR1cm4gYSBuZXcgY2hpbGQgbWVtZW50bwotCSAqIEBzZWUgI2dldENoaWxkCi0JICogQHNlZSAjZ2V0Q2hpbGRyZW4KLQkgKi8KLQlwdWJsaWMgSU1lbWVudG8gY3JlYXRlQ2hpbGQoU3RyaW5nIHR5cGUpOwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY2hpbGQgb2YgdGhpcyBtZW1lbnRvIHdpdGggdGhlIGdpdmVuIHR5cGUgYW5kIGlkLgotCSAqIFRoZSBpZCBpcyBzdG9yZWQgaW4gdGhlIGNoaWxkIG1lbWVudG8gKHVzaW5nIGEgc3BlY2lhbCByZXNlcnZlZAotCSAqIGtleSwgPGNvZGU+VEFHX0lEPC9jb2RlPikgYW5kIGNhbiBiZSByZXRyaWV2ZWQgdXNpbmcgPGNvZGU+Z2V0SWQ8L2NvZGU+LgotCSAqIDxwPgotCSAqIFRoZSA8Y29kZT5nZXRDaGlsZDwvY29kZT4gYW5kIDxjb2RlPmdldENoaWxkcmVuPC9jb2RlPiBtZXRob2RzCi0JICogYXJlIHVzZWQgdG8gcmV0cmlldmUgY2hpbGRyZW4gb2YgYSBnaXZlbiB0eXBlLgotCSAqIDwvcD4KLQkgKgotCSAqIEBwYXJhbSB0eXBlIHRoZSB0eXBlCi0JICogQHBhcmFtIGlkIHRoZSBjaGlsZCBpZAotCSAqIEByZXR1cm4gYSBuZXcgY2hpbGQgbWVtZW50byB3aXRoIHRoZSBnaXZlbiB0eXBlIGFuZCBpZAotCSAqIEBzZWUgI2dldElkCi0JICovCi0JcHVibGljIElNZW1lbnRvIGNyZWF0ZUNoaWxkKFN0cmluZyB0eXBlLCBTdHJpbmcgaWQpOwotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpcnN0IGNoaWxkIHdpdGggdGhlIGdpdmVuIHR5cGUgaWQuCi0JICoKLQkgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSBpZAotCSAqIEByZXR1cm4gdGhlIGZpcnN0IGNoaWxkIHdpdGggdGhlIGdpdmVuIHR5cGUKLQkgKi8KLQlwdWJsaWMgSU1lbWVudG8gZ2V0Q2hpbGQoU3RyaW5nIHR5cGUpOwotCQotCS8qKgotCSAqIFJldHVybnMgYWxsIGNoaWxkcmVuIHdpdGggdGhlIGdpdmVuIHR5cGUgaWQuCi0JICoKLQkgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSBpZAotCSAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgY2hpbGRyZW4gd2l0aCB0aGUgZ2l2ZW4gdHlwZQotCSAqLwotCXB1YmxpYyBJTWVtZW50b1tdIGdldENoaWxkcmVuKFN0cmluZyB0eXBlKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmbG9hdGluZyBwb2ludCB2YWx1ZSBvZiB0aGUgZ2l2ZW4ga2V5LgotCSAqCi0JICogQHBhcmFtIGtleSB0aGUga2V5Ci0JICogQHJldHVybiB0aGUgdmFsdWUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBrZXkgd2FzIG5vdCBmb3VuZCBvciB3YXMgZm91bmQKLQkgKiAgIGJ1dCB3YXMgbm90IGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyCi0JICovCi0JcHVibGljIEZsb2F0IGdldEZsb2F0KFN0cmluZyBrZXkpOwotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGlkIGZvciB0aGlzIG1lbWVudG8uCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBtZW1lbnRvIGlkLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICogQHNlZSAjY3JlYXRlQ2hpbGQoamF2YS5sYW5nLlN0cmluZyxqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuYW1lIGZvciB0aGlzIG1lbWVudG8uCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBtZW1lbnRvIG5hbWUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLQkgKiBAc2VlICNjcmVhdGVDaGlsZChqYXZhLmxhbmcuU3RyaW5nLGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbnRlZ2VyIHZhbHVlIG9mIHRoZSBnaXZlbiBrZXkuCi0JICoKLQkgKiBAcGFyYW0ga2V5IHRoZSBrZXkKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGtleSB3YXMgbm90IGZvdW5kIG9yIHdhcyBmb3VuZAotCSAqICAgYnV0IHdhcyBub3QgYW4gaW50ZWdlcgotCSAqLwotCXB1YmxpYyBJbnRlZ2VyIGdldEludGVnZXIoU3RyaW5nIGtleSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdHJpbmcgdmFsdWUgb2YgdGhlIGdpdmVuIGtleS4KLQkgKgotCSAqIEBwYXJhbSBrZXkgdGhlIGtleQotCSAqIEByZXR1cm4gdGhlIHZhbHVlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUga2V5IHdhcyBub3QgZm91bmQgb3Igd2FzIGZvdW5kCi0JICogIGJ1dCB3YXMgbm90IGFuIGludGVnZXIKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGJvb2xlYW4gdmFsdWUgb2YgdGhlIGdpdmVuIGtleS4KLQkgKgotCSAqIEBwYXJhbSBrZXkgdGhlIGtleQotCSAqIEByZXR1cm4gdGhlIHZhbHVlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUga2V5IHdhcyBub3QgZm91bmQgb3Igd2FzIGZvdW5kCi0JICogIGJ1dCB3YXMgbm90IGEgYm9vbGVhbgotCSAqLwotCXB1YmxpYyBCb29sZWFuIGdldEJvb2xlYW4oU3RyaW5nIGtleSk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBsaXN0IG9mIG5hbWVzLgotCSAqIAotCSAqIEByZXR1cm4gYSBwb3NzaWJseSBlbXB0eSBsaXN0IG9mIG5hbWVzCi0JICovCi0JcHVibGljIExpc3QgZ2V0TmFtZXMoKTsKLQkKLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4ga2V5IHRvIHRoZSBnaXZlbiBmbG9hdGluZyBwb2ludCBudW1iZXIuCi0JICoKLQkgKiBAcGFyYW0ga2V5IHRoZSBrZXkKLQkgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlCi0JICovCi0JcHVibGljIHZvaWQgcHV0RmxvYXQoU3RyaW5nIGtleSwgZmxvYXQgdmFsdWUpOwotCQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBrZXkgdG8gdGhlIGdpdmVuIGludGVnZXIuCi0JICoKLQkgKiBAcGFyYW0ga2V5IHRoZSBrZXkKLQkgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlCi0JICovCi0JcHVibGljIHZvaWQgcHV0SW50ZWdlcihTdHJpbmcga2V5LCBpbnQgdmFsdWUpOwotCQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBrZXkgdG8gdGhlIGdpdmVuIGJvb2xlYW4gdmFsdWUuCi0JICoKLQkgKiBAcGFyYW0ga2V5IHRoZSBrZXkKLQkgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlCi0JICovCi0JcHVibGljIHZvaWQgcHV0Qm9vbGVhbihTdHJpbmcga2V5LCBib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIENvcHkgdGhlIGF0dHJpYnV0ZXMgYW5kIGNoaWxkcmVuIGZyb20gIDxjb2RlPm1lbWVudG88L2NvZGU+Ci0JICogdG8gdGhlIHJlY2VpdmVyLgotCSAqCi0JICogQHBhcmFtIG1lbWVudG8gdGhlIElNZW1lbnRvIHRvIGJlIGNvcGllZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBwdXRNZW1lbnRvKElNZW1lbnRvIG1lbWVudG8pOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIGtleSB0byB0aGUgZ2l2ZW4gc3RyaW5nLgotCSAqCi0JICogQHBhcmFtIGtleSB0aGUga2V5Ci0JICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZQotCSAqLwotCXB1YmxpYyB2b2lkIHB1dFN0cmluZyhTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NqYXZhY29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvSjJFRUxhdW5jaGFibGVDbGllbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NqYXZhY29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvSjJFRUxhdW5jaGFibGVDbGllbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGYxODI5Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zamF2YWNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL0oyRUVMYXVuY2hhYmxlQ2xpZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuSm5kaUxhdW5jaGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLkNsaWVudERlbGVnYXRlOwotLyoqCi0gKgotICovCi1wdWJsaWMgY2xhc3MgSjJFRUxhdW5jaGFibGVDbGllbnQgZXh0ZW5kcyBDbGllbnREZWxlZ2F0ZSB7Ci0JLyoKLQkgKiBAc2VlIENsaWVudERlbGVnYXRlI3N1cHBvcnRzKElMYXVuY2hhYmxlKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzKElTZXJ2ZXIgc2VydmVyLCBPYmplY3QgbGF1bmNoYWJsZSwgU3RyaW5nIGxhdW5jaE1vZGUpIHsKLQkJcmV0dXJuIChsYXVuY2hhYmxlIGluc3RhbmNlb2YgSm5kaUxhdW5jaGFibGUpOwotCX0KLQotCS8qCi0JICogQHNlZSBDbGllbnREZWxlZ2F0ZSNsYXVuY2goSUxhdW5jaGFibGUpCi0JICovCi0JcHVibGljIElTdGF0dXMgbGF1bmNoKElTZXJ2ZXIgc2VydmVyLCBPYmplY3QgbGF1bmNoYWJsZSwgU3RyaW5nIGxhdW5jaE1vZGUsIElMYXVuY2ggbGF1bmNoKSB7Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIkpOREkgY2xpZW50IGxhdW5jaGVkIik7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zamF2YWNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL0oyRUVVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zamF2YWNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL0oyRUVVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1ZDdkZTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc2phdmFjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9KMkVFVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5JRW50ZXJwcmlzZUFwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5JSjJFRU1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuSVdlYk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyVXRpbDsKLS8qKgotICogVXRpbGl0eSBjbGFzcyBmb3IgZGVhbGluZyB3aXRoIEoyRUUgbW9kdWxlcy4KLSAqLwotcHVibGljIGNsYXNzIEoyRUVVdGlsIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUFSX01PRFVMRSA9ICJqc3QuZWFyIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX01PRFVMRSA9ICJqc3Qud2ViIjsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGVudGVycHJpc2UgYXBwbGljYXRpb25zIHRoYXQgdGhlIG1vZHVsZSBpcyBjb250YWluZWQgd2l0aGluLgotCSAqIAotCSAqIEBwYXJhbSBtb2R1bGUgYSBKMkVFIG1vZHVsZQotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLQkgKiBAcmV0dXJuIGEgcG9zc2libHkgZW1wdHkgYXJyYXkgb2YgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbnMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElNb2R1bGVbXSBnZXRFbnRlcnByaXNlQXBwbGljYXRpb25zKElKMkVFTW9kdWxlIG1vZHVsZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSU1vZHVsZVtdIG1vZHVsZXMgPSBTZXJ2ZXJVdGlsLmdldE1vZHVsZXMoRUFSX01PRFVMRSk7Ci0JCWlmIChtb2R1bGVzICE9IG51bGwpIHsKLQkJCWludCBzaXplID0gbW9kdWxlcy5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCUlNb2R1bGUgbW9kdWxlMiA9IG1vZHVsZXNbaV07Ci0JCQkJSUVudGVycHJpc2VBcHBsaWNhdGlvbiBlYXIgPSAoSUVudGVycHJpc2VBcHBsaWNhdGlvbikgbW9kdWxlMi5sb2FkQWRhcHRlcihJRW50ZXJwcmlzZUFwcGxpY2F0aW9uLmNsYXNzLCBtb25pdG9yKTsKLQkJCQlpZiAoZWFyICE9IG51bGwpIHsKLQkJCQkJSU1vZHVsZVtdIG1vZHVsZXMyID0gZWFyLmdldE1vZHVsZXMoKTsKLQkJCQkJaWYgKG1vZHVsZXMyICE9IG51bGwpIHsKLQkJCQkJCWludCBzaXplMiA9IG1vZHVsZXMyLmxlbmd0aDsKLQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgc2l6ZTI7IGorKykgewotCQkJCQkJCWlmIChtb2R1bGUuZXF1YWxzKG1vZHVsZXMyW2pdLmxvYWRBZGFwdGVyKElKMkVFTW9kdWxlLmNsYXNzLCBtb25pdG9yKSkpCi0JCQkJCQkJCWxpc3QuYWRkKG1vZHVsZTIpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlJTW9kdWxlW10gZWFycyA9IG5ldyBJTW9kdWxlW2xpc3Quc2l6ZSgpXTsKLQkJbGlzdC50b0FycmF5KGVhcnMpOwotCQlyZXR1cm4gZWFyczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBlbnRlcnByaXNlIGFwcGxpY2F0aW9ucyB0aGF0IHRoZSBtb2R1bGUgaXMgY29udGFpbmVkIHdpdGhpbi4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kdWxlIGEgSjJFRSBtb2R1bGUgb3IgdXRpbGl0eSBtb2R1bGUKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCi0JICogICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCi0JICogQHJldHVybiBhIHBvc3NpYmx5IGVtcHR5IGFycmF5IG9mIGVudGVycHJpc2UgYXBwbGljYXRpb25zCi0JICovCi0JcHVibGljIHN0YXRpYyBJTW9kdWxlW10gZ2V0RW50ZXJwcmlzZUFwcGxpY2F0aW9ucyhJTW9kdWxlIG1vZHVsZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSU1vZHVsZVtdIG1vZHVsZXMgPSBTZXJ2ZXJVdGlsLmdldE1vZHVsZXMoRUFSX01PRFVMRSk7Ci0JCWlmIChtb2R1bGVzICE9IG51bGwpIHsKLQkJCWludCBzaXplID0gbW9kdWxlcy5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCUlNb2R1bGUgbW9kdWxlMiA9IG1vZHVsZXNbaV07Ci0JCQkJSUVudGVycHJpc2VBcHBsaWNhdGlvbiBlYXIgPSAoSUVudGVycHJpc2VBcHBsaWNhdGlvbikgbW9kdWxlMi5sb2FkQWRhcHRlcihJRW50ZXJwcmlzZUFwcGxpY2F0aW9uLmNsYXNzLCBtb25pdG9yKTsKLQkJCQlpZiAoZWFyICE9IG51bGwpIHsKLQkJCQkJSU1vZHVsZVtdIG1vZHVsZXMyID0gZWFyLmdldE1vZHVsZXMoKTsKLQkJCQkJaWYgKG1vZHVsZXMyICE9IG51bGwpIHsKLQkJCQkJCWludCBzaXplMiA9IG1vZHVsZXMyLmxlbmd0aDsKLQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgc2l6ZTI7IGorKykgewotCQkJCQkJCWlmIChtb2R1bGUuZXF1YWxzKG1vZHVsZXMyW2pdKSkKLQkJCQkJCQkJbGlzdC5hZGQobW9kdWxlMik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCUlNb2R1bGVbXSBlYXJzID0gbmV3IElNb2R1bGVbbGlzdC5zaXplKCldOwotCQlsaXN0LnRvQXJyYXkoZWFycyk7Ci0JCXJldHVybiBlYXJzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHdlYiBtb2R1bGVzIHRoYXQgdGhlIHV0aWxpdHkgbW9kdWxlIGlzIGNvbnRhaW5lZCB3aXRoaW4uCi0JICogCi0JICogQHBhcmFtIG1vZHVsZSBhIHV0aWxpdHkgbW9kdWxlCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqIEByZXR1cm4gYSBwb3NzaWJseSBlbXB0eSBhcnJheSBvZiB3ZWIgbW9kdWxlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgSU1vZHVsZVtdIGdldFdlYk1vZHVsZXMoSU1vZHVsZSBtb2R1bGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlNb2R1bGVbXSBtb2R1bGVzID0gU2VydmVyVXRpbC5nZXRNb2R1bGVzKFdFQl9NT0RVTEUpOwotCQlpZiAobW9kdWxlcyAhPSBudWxsKSB7Ci0JCQlpbnQgc2l6ZSA9IG1vZHVsZXMubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlJTW9kdWxlIG1vZHVsZTIgPSBtb2R1bGVzW2ldOwotCQkJCUlXZWJNb2R1bGUgd2ViID0gKElXZWJNb2R1bGUpIG1vZHVsZTIubG9hZEFkYXB0ZXIoSVdlYk1vZHVsZS5jbGFzcywgbW9uaXRvcik7Ci0JCQkJaWYgKHdlYiAhPSBudWxsKSB7Ci0JCQkJCUlNb2R1bGVbXSBtb2R1bGVzMiA9IHdlYi5nZXRNb2R1bGVzKCk7Ci0JCQkJCWlmIChtb2R1bGVzMiAhPSBudWxsKSB7Ci0JCQkJCQlpbnQgc2l6ZTIgPSBtb2R1bGVzMi5sZW5ndGg7Ci0JCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHNpemUyOyBqKyspIHsKLQkJCQkJCQlpZiAobW9kdWxlLmVxdWFscyhtb2R1bGVzMltqXSkpCi0JCQkJCQkJCWxpc3QuYWRkKG1vZHVsZTIpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlJTW9kdWxlW10gd2VicyA9IG5ldyBJTW9kdWxlW2xpc3Quc2l6ZSgpXTsKLQkJbGlzdC50b0FycmF5KHdlYnMpOwotCQlyZXR1cm4gd2ViczsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc2phdmFjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9KYXZhU2VydmVyUGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zamF2YWNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL0phdmFTZXJ2ZXJQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQxMmI2OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zamF2YWNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL0phdmFTZXJ2ZXJQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lTGlmZWN5Y2xlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuU2VydmVyUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotLyoqCi0gKiBUaGUgbWFpbiBzZXJ2ZXIgdG9vbGluZyBwbHVnaW4gY2xhc3MuCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhU2VydmVyUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHsKLQkvKioKLQkgKiBKYXZhIHNlcnZlciBwbHVnaW4gaWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlIjsKLQotCS8vIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzCi0JcHJpdmF0ZSBzdGF0aWMgSmF2YVNlcnZlclBsdWdpbiBzaW5nbGV0b247Ci0KLQkvLwljYWNoZWQgY29weSBvZiBhbGwgcnVudGltZSBjbGFzc3BhdGggcHJvdmlkZXJzCi0JcHJpdmF0ZSBzdGF0aWMgTGlzdCBydW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJzOwotCi0JLy8JY2FjaGVkIGNvcHkgb2YgYWxsIHJ1bnRpbWUgZmFjZXQgbWFwcGluZ3MKLQlwcml2YXRlIHN0YXRpYyBMaXN0IHJ1bnRpbWVGYWNldE1hcHBpbmdzOwotCi0JLy8gcnVudGltZSBsaXN0ZW5lcgotCXByaXZhdGUgc3RhdGljIElSdW50aW1lTGlmZWN5Y2xlTGlzdGVuZXIgcnVudGltZUxpc3RlbmVyOwotCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBKYXZhU2VydmVyUGx1Z2luLgotCSAqLwotCXB1YmxpYyBKYXZhU2VydmVyUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlzaW5nbGV0b24gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIHBsdWdpbi4KLQkgKgotCSAqIEByZXR1cm4gYSBzaW5nbGV0b24gaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFTZXJ2ZXJQbHVnaW4gZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBzaW5nbGV0b247Ci0JfQotCi0JLyoqCi0JICogQHNlZSBQbHVnaW4jc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JCQotCQlydW50aW1lTGlzdGVuZXIgPSBuZXcgSVJ1bnRpbWVMaWZlY3ljbGVMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bnRpbWVBZGRlZChJUnVudGltZSBydW50aW1lKSB7Ci0JCQkJaGFuZGxlUnVudGltZUNoYW5nZShydW50aW1lKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgcnVudGltZUNoYW5nZWQoSVJ1bnRpbWUgcnVudGltZSkgewotCQkJCWhhbmRsZVJ1bnRpbWVDaGFuZ2UocnVudGltZSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHJ1bnRpbWVSZW1vdmVkKElSdW50aW1lIHJ1bnRpbWUpIHsKLQkJCQloYW5kbGVSdW50aW1lQ2hhbmdlKHJ1bnRpbWUpOwotCQkJfQotCQl9OwotCQkKLQkJU2VydmVyQ29yZS5hZGRSdW50aW1lTGlmZWN5Y2xlTGlzdGVuZXIocnVudGltZUxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2VydmVyQ29yZS5yZW1vdmVSdW50aW1lTGlmZWN5Y2xlTGlzdGVuZXIocnVudGltZUxpc3RlbmVyKTsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBIYW5kbGUgYSBydW50aW1lIGNoYW5nZSBieSBwb3RlbnRpYWxseSB1cGRhdGluZyB0aGUgY2xhc3NwYXRoIGNvbnRhaW5lci4KLQkgKiAKLQkgKiBAcGFyYW0gcnVudGltZSBhIHJ1bnRpbWUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVSdW50aW1lQ2hhbmdlKGZpbmFsIElSdW50aW1lIHJ1bnRpbWUpIHsKLQkJaWYgKHJ1bnRpbWUgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJCi0JCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIlBvc3NpYmxlIHJ1bnRpbWUgY2hhbmdlOiAiICsgcnVudGltZSk7Ci0JCQotCQlmaW5hbCBSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJXcmFwcGVyIHJjcHcgPSBmaW5kUnVudGltZUNsYXNzcGF0aFByb3ZpZGVyKHJ1bnRpbWUuZ2V0UnVudGltZVR5cGUoKSk7Ci0JCWlmIChyY3B3ICE9IG51bGwgJiYgcmNwdy5oYXNSdW50aW1lQ2xhc3NwYXRoQ2hhbmdlZChydW50aW1lKSkgewotCQkJZmluYWwgSVBhdGggc2VydmVyQ29udGFpbmVyUGF0aCA9IG5ldyBQYXRoKFJ1bnRpbWVDbGFzc3BhdGhDb250YWluZXIuU0VSVkVSX0NPTlRBSU5FUikKLQkJCQkuYXBwZW5kKHJjcHcuZ2V0SWQoKSkuYXBwZW5kKHJ1bnRpbWUuZ2V0SWQoKSk7Ci0JCQkKLQkJCWNsYXNzIFJlYnVpbGRSdW50aW1lUmVmZXJlbmNlc0pvYiBleHRlbmRzIEpvYiB7Ci0JCQkJcHVibGljIFJlYnVpbGRSdW50aW1lUmVmZXJlbmNlc0pvYigpIHsKLQkJCQkJc3VwZXIoTkxTLmJpbmQoTWVzc2FnZXMudXBkYXRlQ2xhc3NwYXRoQ29udGFpbmVycywgcnVudGltZS5nZXROYW1lKCkpKTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgYm9vbGVhbiBiZWxvbmdzVG8oT2JqZWN0IGZhbWlseSkgewotCQkJCQlyZXR1cm4gU2VydmVyUGx1Z2luLlBMVUdJTl9JRC5lcXVhbHMoZmFtaWx5KTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJCUlQcm9qZWN0W10gcHJvamVjdHMgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3RzKCk7Ci0JCQkJCWlmIChwcm9qZWN0cyAhPSBudWxsKSB7Ci0JCQkJCQlpbnQgc2l6ZSA9IHByb2plY3RzLmxlbmd0aDsKLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJCQkJaWYgKHByb2plY3RzW2ldLmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdHNbaV0pOwotCQkJCQkJCQkJCi0JCQkJCQkJCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQkJCQkJCQlJQ2xhc3NwYXRoRW50cnlbXSBjZSA9IGphdmFQcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpOwotCQkJCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjZS5sZW5ndGg7IGorKykgewotCQkJCQkJCQkJCWlmIChjZVtqXS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0NPTlRBSU5FUikgewotCQkJCQkJCQkJCQlpZiAoc2VydmVyQ29udGFpbmVyUGF0aC5pc1ByZWZpeE9mKGNlW2pdLmdldFBhdGgoKSkpCi0JCQkJCQkJCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQkJCi0JCQkJCQkJCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJDbGFzc3BhdGggY2hhbmdlIG9uOiAiICsgcHJvamVjdHNbaV0gKyAiICIgKyBmb3VuZCk7Ci0JCQkJCQkJCQkKLQkJCQkJCQkJCWlmIChmb3VuZCkgewotCQkJCQkJCQkJCVJ1bnRpbWVDbGFzc3BhdGhDb250YWluZXIgY29udGFpbmVyID0gbmV3IFJ1bnRpbWVDbGFzc3BhdGhDb250YWluZXIoCi0JCQkJCQkJCQkJCQlzZXJ2ZXJDb250YWluZXJQYXRoLCByY3B3LCBydW50aW1lKTsKLQkJCQkJCQkJCQlKYXZhQ29yZS5zZXRDbGFzc3BhdGhDb250YWluZXIoc2VydmVyQ29udGFpbmVyUGF0aCwgbmV3IElKYXZhUHJvamVjdFtdIHsgamF2YVByb2plY3QgfSwKLQkJCQkJCQkJCQkJCW5ldyBJQ2xhc3NwYXRoQ29udGFpbmVyW10ge2NvbnRhaW5lcn0sIG51bGwpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IHVwZGF0ZSBjbGFzc3BhdGggY29udGFpbmVyIiwgZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJCX0KLQkJCX0KLQkJCVJlYnVpbGRSdW50aW1lUmVmZXJlbmNlc0pvYiBqb2IgPSBuZXcgUmVidWlsZFJ1bnRpbWVSZWZlcmVuY2VzSm9iKCk7Ci0JCQlqb2Iuc2NoZWR1bGUoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgbG9nZ2luZy4KLQkgKgotCSAqIEBwYXJhbSBzdGF0dXMgYSBzdGF0dXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKElTdGF0dXMgc3RhdHVzKSB7Ci0JCWdldEluc3RhbmNlKCkuZ2V0TG9nKCkubG9nKHN0YXR1cyk7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgbG9nZ2luZy4KLQkgKgotCSAqIEBwYXJhbSB0IGEgdGhyb3dhYmxlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhUaHJvd2FibGUgdCkgewotCQlsb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQTFVHSU5fSUQsIElTdGF0dXMuRVJST1IsICJJbnRlcm5hbCBlcnJvciIsIHQpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgYWxsIGtub3duIHJ1bnRpbWUgY2xhc3NwYXRoIHByb3ZpZGVyIGluc3RhbmNlcy4KLQkgKiA8cD4KLQkgKiBBIG5ldyBhcnJheSBpcyByZXR1cm5lZCBvbiBlYWNoIGNhbGwsIHNvIGNsaWVudHMgbWF5IHN0b3JlIG9yIG1vZGlmeSB0aGUgcmVzdWx0LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgcG9zc2libHktZW1wdHkgYXJyYXkgb2YgcnVudGltZSBjbGFzc3BhdGggcHJvdmlkZXIgaW5zdGFuY2VzCi0JICogICAge0BsaW5rIFJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcldyYXBwZXJ9Ci0JICovCi0JcHVibGljIHN0YXRpYyBSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJXcmFwcGVyW10gZ2V0UnVudGltZUNsYXNzcGF0aFByb3ZpZGVycygpIHsKLQkJaWYgKHJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcnMgPT0gbnVsbCkKLQkJCWxvYWRSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJzKCk7Ci0JCQotCQlSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJXcmFwcGVyW10gcnRoID0gbmV3IFJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcldyYXBwZXJbcnVudGltZUNsYXNzcGF0aFByb3ZpZGVycy5zaXplKCldOwotCQlydW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJzLnRvQXJyYXkocnRoKTsKLQkJcmV0dXJuIHJ0aDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBydW50aW1lIGNsYXNzcGF0aCBwcm92aWRlciB0aGF0IHN1cHBvcnRzIHRoZSBnaXZlbiBydW50aW1lIHR5cGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogaWYgbm9uZS4gVGhpcyBjb252ZW5pZW5jZSBtZXRob2Qgc2VhcmNoZXMgdGhlIGxpc3Qgb2Yga25vd24gcnVudGltZQotCSAqIGNsYXNzcGF0aCBwcm92aWRlcnMgKHtAbGluayAjZ2V0UnVudGltZUNsYXNzcGF0aFByb3ZpZGVycygpfSkgZm9yIHRoZSBvbmUgd2l0aAotCSAqIGEgbWF0Y2hpbmcgcnVudGltZSB0eXBlLgotCSAqIFRoZSBydW50aW1lVHlwZSBtYXkgbm90IGJlIG51bGwuCi0JICoKLQkgKiBAcGFyYW0gcnVudGltZVR5cGUgYSBydW50aW1lIHR5cGUKLQkgKiBAcmV0dXJuIHRoZSBydW50aW1lIGNsYXNzcGF0aCBwcm92aWRlciBpbnN0YW5jZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYKLQkgKiAgIHRoZXJlIGlzIG5vIHJ1bnRpbWUgY2xhc3NwYXRoIHByb3ZpZGVyIHdpdGggdGhlIGdpdmVuIGlkCi0JICovCi0JcHVibGljIHN0YXRpYyBSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJXcmFwcGVyIGZpbmRSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXIoSVJ1bnRpbWVUeXBlIHJ1bnRpbWVUeXBlKSB7Ci0JCWlmIChydW50aW1lVHlwZSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCi0JCWlmIChydW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJzID09IG51bGwpCi0JCQlsb2FkUnVudGltZUNsYXNzcGF0aFByb3ZpZGVycygpOwotCQkKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBydW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcldyYXBwZXIgcnVudGltZUNsYXNzcGF0aFByb3ZpZGVyID0gKFJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcldyYXBwZXIpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChydW50aW1lQ2xhc3NwYXRoUHJvdmlkZXIuc3VwcG9ydHNSdW50aW1lVHlwZShydW50aW1lVHlwZSkpCi0JCQkJcmV0dXJuIHJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcjsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBydW50aW1lIGNsYXNzcGF0aCBwcm92aWRlciB3aXRoIHRoZSBnaXZlbiBpZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBpZiBub25lLiBUaGlzIGNvbnZlbmllbmNlIG1ldGhvZCBzZWFyY2hlcyB0aGUgbGlzdCBvZiBrbm93biBydW50aW1lCi0JICogY2xhc3NwYXRoIHByb3ZpZGVycyAoe0BsaW5rICNnZXRSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJzKCl9KSBmb3IgdGhlIG9uZSB3aXRoCi0JICogYSBtYXRjaGluZyBydW50aW1lIGNsYXNzcGF0aCBwcm92aWRlciBpZCAoe0BsaW5rIFJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcldyYXBwZXIjZ2V0SWQoKX0pLgotCSAqIFRoZSBpZCBtYXkgbm90IGJlIG51bGwuCi0JICoKLQkgKiBAcGFyYW0gaWQgdGhlIHJ1bnRpbWUgY2xhc3NwYXRoIHByb3ZpZGVyIGlkCi0JICogQHJldHVybiB0aGUgcnVudGltZSBjbGFzc3BhdGggcHJvdmlkZXIgaW5zdGFuY2UsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmCi0JICogICB0aGVyZSBpcyBubyBydW50aW1lIGNsYXNzcGF0aCBwcm92aWRlciB3aXRoIHRoZSBnaXZlbiBpZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUnVudGltZUNsYXNzcGF0aFByb3ZpZGVyV3JhcHBlciBmaW5kUnVudGltZUNsYXNzcGF0aFByb3ZpZGVyKFN0cmluZyBpZCkgewotCQlpZiAoaWQgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQotCQlpZiAocnVudGltZUNsYXNzcGF0aFByb3ZpZGVycyA9PSBudWxsKQotCQkJbG9hZFJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcnMoKTsKLQkJCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gcnVudGltZUNsYXNzcGF0aFByb3ZpZGVycy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJXcmFwcGVyIHJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlciA9IChSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJXcmFwcGVyKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoaWQuZXF1YWxzKHJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlci5nZXRJZCgpKSkKLQkJCQlyZXR1cm4gcnVudGltZUNsYXNzcGF0aFByb3ZpZGVyOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIExvYWQgdGhlIHJ1bnRpbWUgY2xhc3NwYXRoIHByb3ZpZGVycy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBzeW5jaHJvbml6ZWQgdm9pZCBsb2FkUnVudGltZUNsYXNzcGF0aFByb3ZpZGVycygpIHsKLQkJaWYgKHJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcnMgIT0gbnVsbCkKLQkJCXJldHVybjsKLQkJVHJhY2UudHJhY2UoVHJhY2UuQ09ORklHLCAiLT4tIExvYWRpbmcgLnJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcnMgZXh0ZW5zaW9uIHBvaW50IC0+LSIpOwotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjZiA9IHJlZ2lzdHJ5LmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcihKYXZhU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgInJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcnMiKTsKLQotCQlpbnQgc2l6ZSA9IGNmLmxlbmd0aDsKLQkJcnVudGltZUNsYXNzcGF0aFByb3ZpZGVycyA9IG5ldyBBcnJheUxpc3Qoc2l6ZSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCVJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcldyYXBwZXIgcnVudGltZUNsYXNzcGF0aFByb3ZpZGVyID0gbmV3IFJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcldyYXBwZXIoY2ZbaV0pOwotCQkJCXJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcnMuYWRkKHJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcik7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuQ09ORklHLCAiICBMb2FkZWQgcnVudGltZUNsYXNzcGF0aFByb3ZpZGVyczogIiArIGNmW2ldLmdldEF0dHJpYnV0ZSgiaWQiKSk7Ci0JCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIiAgQ291bGQgbm90IGxvYWQgcnVudGltZUNsYXNzcGF0aFByb3ZpZGVyczogIiArIGNmW2ldLmdldEF0dHJpYnV0ZSgiaWQiKSwgdCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCVRyYWNlLnRyYWNlKFRyYWNlLkNPTkZJRywgIi08LSBEb25lIGxvYWRpbmcgLnJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcnMgZXh0ZW5zaW9uIHBvaW50IC08LSIpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGFsbCBrbm93biBydW50aW1lIGNsYXNzcGF0aCBwcm92aWRlciBpbnN0YW5jZXMuCi0JICogPHA+Ci0JICogQSBuZXcgYXJyYXkgaXMgcmV0dXJuZWQgb24gZWFjaCBjYWxsLCBzbyBjbGllbnRzIG1heSBzdG9yZSBvciBtb2RpZnkgdGhlIHJlc3VsdC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiBhIHBvc3NpYmx5LWVtcHR5IGFycmF5IG9mIHJ1bnRpbWUgY2xhc3NwYXRoIHByb3ZpZGVyIGluc3RhbmNlcwotCSAqICAgIHtAbGluayBSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJXcmFwcGVyfQotCSAqLwotCXB1YmxpYyBzdGF0aWMgUnVudGltZUZhY2V0TWFwcGluZ1tdIGdldFJ1bnRpbWVGYWNldE1hcHBpbmcoKSB7Ci0JCWlmIChydW50aW1lRmFjZXRNYXBwaW5ncyA9PSBudWxsKQotCQkJbG9hZFJ1bnRpbWVGYWNldE1hcHBpbmcoKTsKLQkJCi0JCVJ1bnRpbWVGYWNldE1hcHBpbmdbXSByZm0gPSBuZXcgUnVudGltZUZhY2V0TWFwcGluZ1tydW50aW1lRmFjZXRNYXBwaW5ncy5zaXplKCldOwotCQlydW50aW1lRmFjZXRNYXBwaW5ncy50b0FycmF5KHJmbSk7Ci0JCXJldHVybiByZm07Ci0JfQotCi0JLyoqCi0JICogTG9hZCB0aGUgcnVudGltZSBmYWNldCBtYXBwaW5ncy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBzeW5jaHJvbml6ZWQgdm9pZCBsb2FkUnVudGltZUZhY2V0TWFwcGluZygpIHsKLQkJaWYgKHJ1bnRpbWVGYWNldE1hcHBpbmdzICE9IG51bGwpCi0JCQlyZXR1cm47Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLkNPTkZJRywgIi0+LSBMb2FkaW5nIC5ydW50aW1lRmFjZXRNYXBwaW5nIGV4dGVuc2lvbiBwb2ludCAtPi0iKTsKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2YgPSByZWdpc3RyeS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoSmF2YVNlcnZlclBsdWdpbi5QTFVHSU5fSUQsICJydW50aW1lRmFjZXRNYXBwaW5ncyIpOwotCi0JCWludCBzaXplID0gY2YubGVuZ3RoOwotCQlydW50aW1lRmFjZXRNYXBwaW5ncyA9IG5ldyBBcnJheUxpc3Qoc2l6ZSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCVJ1bnRpbWVGYWNldE1hcHBpbmcgcmZtID0gbmV3IFJ1bnRpbWVGYWNldE1hcHBpbmcoY2ZbaV0pOwotCQkJCXJ1bnRpbWVGYWNldE1hcHBpbmdzLmFkZChyZm0pOwotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkNPTkZJRywgIiAgTG9hZGVkIHJ1bnRpbWVGYWNldE1hcHBpbmc6ICIgKyBjZltpXS5nZXRBdHRyaWJ1dGUoImlkIikpOwotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICIgIENvdWxkIG5vdCBsb2FkIHJ1bnRpbWVGYWNldE1hcHBpbmc6ICIgKyBjZltpXS5nZXRBdHRyaWJ1dGUoImlkIiksIHQpOwotCQkJfQotCQl9Ci0JCQotCQlUcmFjZS50cmFjZShUcmFjZS5DT05GSUcsICItPC0gRG9uZSBsb2FkaW5nIC5ydW50aW1lRmFjZXRNYXBwaW5nIGV4dGVuc2lvbiBwb2ludCAtPC0iKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc2phdmFjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9MYXVuY2hDb25maWd1cmF0aW9uVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc2phdmFjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9MYXVuY2hDb25maWd1cmF0aW9uVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Yjk0YmJlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NqYXZhY29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvTGF1bmNoQ29uZmlndXJhdGlvblV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLmludGVybmFsOwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIExhdW5jaENvbmZpZ3VyYXRpb25VdGlsIHsKLQkvKioKLQkgKiBHZXRzIHRoZSBjbGFzc3BhdGggZnJvbSB0aGUgbGF1bmNoIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGdpdmVuIHNlcnZlci4KLQkgKiBJZiBjcmVhdGUgaXMgZmFsc2UsIGl0IHdpbGwgcmV0dXJuIG51bGwgaWYgdGhlcmUgaXMgbm8gbGF1bmNoIGNvbmZpZ3VyYXRpb24KLQkgKiAoaS5lLiB0aGUgc2VydmVyIGhhcyBub3QgYmVlbiBydW4gYmVmb3JlKSBJZiBjcmVhdGUgaXMgdHJ1ZSwgaXQgd2lsbCBjcmVhdGUKLQkgKiBhIGxhdW5jaCBjb25maWd1cmF0aW9uIGlmIG9uZSBkb2VzIG5vdCBleGlzdC4KLQkgKgotCSAqIEBwYXJhbSBzZXJ2ZXIKLQkgKiBAcGFyYW0gY3JlYXRlCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yCi0JICogQHJldHVybiBhbiBhcnJheSBjb250YWluaW5nIHJ1bnRpbWUgY2xhc3NwYXRoIGVudHJpZXMKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQkvKnB1YmxpYyBzdGF0aWMgSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeVtdIGdldENsYXNzcGF0aChJU2VydmVyIHNlcnZlciwgYm9vbGVhbiBjcmVhdGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWcgPSBzZXJ2ZXIuZ2V0TGF1bmNoQ29uZmlndXJhdGlvbihjcmVhdGUsIG1vbml0b3IpOwotCQlpZiAoY29uZmlnID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCXJldHVybiBKYXZhUnVudGltZS5jb21wdXRlVW5yZXNvbHZlZFJ1bnRpbWVDbGFzc3BhdGgoY29uZmlnKTsKLQl9Ki8KLQotCS8qKgotCSAqIFNldHMgdGhlIGNsYXNzcGF0aCBvbiB0aGUgZ2l2ZW4gc2VydmVyJ3MgbGF1bmNoIGNvbmZpZ3VyYXRpb24uCi0JICoKLQkgKiBAcGFyYW0gc2VydmVyCi0JICogQHBhcmFtIGNsYXNzcGF0aAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCS8qcHVibGljIHN0YXRpYyB2b2lkIHNldENsYXNzcGF0aChJU2VydmVyIHNlcnZlciwgSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeVtdIGNsYXNzcGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZyA9IHNlcnZlci5nZXRMYXVuY2hDb25maWd1cmF0aW9uKHRydWUsIG1vbml0b3IpOwotCQlJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IHdjID0gY29uZmlnLmdldFdvcmtpbmdDb3B5KCk7Ci0JCXdjLnNldEF0dHJpYnV0ZShJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9ERUZBVUxUX0NMQVNTUEFUSCwgZmFsc2UpOwotCQotCQlMaXN0IG1lbWVudG9zID0gbmV3IEFycmF5TGlzdChjbGFzc3BhdGgubGVuZ3RoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjbGFzc3BhdGgubGVuZ3RoOyBpKyspIHsKLQkJCUlSdW50aW1lQ2xhc3NwYXRoRW50cnkgZW50cnkgPSBjbGFzc3BhdGhbaV07Ci0JCQltZW1lbnRvcy5hZGQoZW50cnkuZ2V0TWVtZW50bygpKTsKLQkJfQotCQl3Yy5zZXRBdHRyaWJ1dGUoSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfQ0xBU1NQQVRILCBtZW1lbnRvcyk7Ci0JCXdjLmRvU2F2ZSgpOwotCX0qLwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NqYXZhY29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvTWVzc2FnZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NqYXZhY29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRhOGEyOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zamF2YWNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLaAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotLyoqCi0gKiBUcmFuc2xhdGVkIG1lc3NhZ2VzLgotICovCi1wdWJsaWMgY2xhc3MgTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yTG9jYXRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JKUkU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2xhc3NwYXRoQ29udGFpbmVyRGVzY3JpcHRpb247Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29weWluZ1Rhc2s7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVsZXRpbmdUYXNrOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yQ29weWluZ0ZpbGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JDcmVhdGluZ1ppcEZpbGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JEZWxldGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JSZW5hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JSZWFkaW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVwZGF0ZUNsYXNzcGF0aENvbnRhaW5lcnM7Ci0JCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhKYXZhU2VydmVyUGx1Z2luLlBMVUdJTl9JRCArICIuaW50ZXJuYWwuTWVzc2FnZXMiLCBNZXNzYWdlcy5jbGFzcyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NqYXZhY29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvTWVzc2FnZXMucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NqYXZhY29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvTWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTIwM2Y4Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zamF2YWNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL01lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1jbGFzc3BhdGhDb250YWluZXJEZXNjcmlwdGlvbj1TZXJ2ZXIgQ2xhc3NwYXRoIENvbnRhaW5lcgotCi1lcnJvckxvY2F0aW9uPUludmFsaWQgbG9jYXRpb24uCi1lcnJvckpSRT1JbnZhbGlkIEpSRS4KLQotY29weWluZ1Rhc2s9Q29weWluZyBmcm9tIHswfSB0byB7MX0KLWRlbGV0aW5nVGFzaz1EZWxldGluZyB7MH0KLWVycm9yQ29weWluZ0ZpbGU9RXJyb3IgY29weWluZyBmaWxlIHRvIHswfTogezF9Ci1lcnJvckNyZWF0aW5nWmlwRmlsZT1FcnJvciBjcmVhdGluZyB6aXAgZmlsZSB7MH06IHsxfQotZXJyb3JEZWxldGU9RXJyb3IgZGVsZXRpbmcgezB9Ci1lcnJvclJlbmFtZT1FcnJvciByZW5hbWluZyB7MH0gdG8gezF9Ci1lcnJvclJlYWRpbmc9RXJyb3IgcmVhZGluZyBmaWxlIHswfQotCi11cGRhdGVDbGFzc3BhdGhDb250YWluZXJzPVVwZGF0aW5nIGNsYXNzcGF0aCBjb250YWluZXIgZm9yIHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NqYXZhY29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvUHJvZ3Jlc3NVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zamF2YWNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL1Byb2dyZXNzVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NWJiZTFjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NqYXZhY29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvUHJvZ3Jlc3NVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotLyoqCi0gKiBQcm9ncmVzcyBNb25pdG9yIHV0aWxpdHkuCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9ncmVzc1V0aWwgewotCS8qKgotCSAqIFByb2dyZXNzVXRpbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXByaXZhdGUgUHJvZ3Jlc3NVdGlsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHZhbGlkIHByb2dyZXNzIG1vbml0b3IuCi0JICoKLQkgKiBAcGFyYW0gbW9uaXRvciBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQcm9ncmVzc01vbml0b3IgZ2V0TW9uaXRvckZvcihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKG1vbml0b3IgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQlyZXR1cm4gbW9uaXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzdWItcHJvZ3Jlc3MgbW9uaXRvciB3aXRoIHRoZSBnaXZlbiBhbW91bnQgb24gdGhlCi0JICogY3VycmVudCBwcm9ncmVzcyBtb25pdG9yLgotCSAqCi0JICogQHBhcmFtIG1vbml0b3Igb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IKLQkgKiBAcGFyYW0gdGlja3MgaW50Ci0JICogQHJldHVybiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb2dyZXNzTW9uaXRvciBnZXRTdWJNb25pdG9yRm9yKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgaW50IHRpY2tzKSB7Ci0JCWlmIChtb25pdG9yID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJaWYgKG1vbml0b3IgaW5zdGFuY2VvZiBOdWxsUHJvZ3Jlc3NNb25pdG9yKQotCQkJcmV0dXJuIG1vbml0b3I7Ci0JCXJldHVybiBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIHRpY2tzKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzdWItcHJvZ3Jlc3MgbW9uaXRvciB3aXRoIHRoZSBnaXZlbiBhbW91bnQgb24gdGhlCi0JICogY3VycmVudCBwcm9ncmVzcyBtb25pdG9yLgotCSAqCi0JICogQHBhcmFtIG1vbml0b3Igb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IKLQkgKiBAcGFyYW0gdGlja3MgYSBudW1iZXIgb2YgdGlja3MKLQkgKiBAcGFyYW0gc3R5bGUgYSBzdHlsZQotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQcm9ncmVzc01vbml0b3IgZ2V0U3ViTW9uaXRvckZvcihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIGludCB0aWNrcywgaW50IHN0eWxlKSB7Ci0JCWlmIChtb25pdG9yID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJaWYgKG1vbml0b3IgaW5zdGFuY2VvZiBOdWxsUHJvZ3Jlc3NNb25pdG9yKQotCQkJcmV0dXJuIG1vbml0b3I7Ci0JCXJldHVybiBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIHRpY2tzLCBzdHlsZSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NqYXZhY29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvUnVudGltZUJyaWRnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc2phdmFjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9SdW50aW1lQnJpZGdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3Mzk5MzAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc2phdmFjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9SdW50aW1lQnJpZGdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgSUJNIENvcnBvcmF0aW9uIC0gU3VwcG9ydCBmb3IgYWxsIHNlcnZlciB0eXBlcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSVZNSW5zdGFsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLklWTUluc3RhbGwyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSmF2YVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLklKYXZhUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lQnJpZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuSVJ1bnRpbWVDb21wb25lbnRWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuUnVudGltZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlckNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlJ1bnRpbWU7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUnVudGltZUJyaWRnZSBpbXBsZW1lbnRzIElSdW50aW1lQnJpZGdlIHsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU1BBVEggPSAiY2xhc3NwYXRoIjsKLQotCXByb3RlY3RlZCBzdGF0aWMgTWFwIG1hcHBpbmdzID0gbmV3IEhhc2hNYXAoKTsKLQotCXN0YXRpYyB7Ci0JCWluaXRpYWxpemUoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFkZE1hcHBpbmcoU3RyaW5nIGlkLCBTdHJpbmcgaWQyLCBTdHJpbmcgdmVyc2lvbikgewotCQl0cnkgewotCQkJbWFwcGluZ3MucHV0KGlkLCBSdW50aW1lTWFuYWdlci5nZXRSdW50aW1lQ29tcG9uZW50VHlwZShpZDIpLmdldFZlcnNpb24odmVyc2lvbikpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCVJ1bnRpbWVGYWNldE1hcHBpbmdbXSByZm1zID0gSmF2YVNlcnZlclBsdWdpbi5nZXRSdW50aW1lRmFjZXRNYXBwaW5nKCk7Ci0JCWludCBzaXplID0gcmZtcy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotCQkJYWRkTWFwcGluZyhyZm1zW2ldLmdldFJ1bnRpbWVUeXBlSWQoKSwgcmZtc1tpXS5nZXRSdW50aW1lQ29tcG9uZW50KCksIHJmbXNbaV0uZ2V0VmVyc2lvbigpKTsKLQotCQkvLyBnZW5lcmljIHJ1bnRpbWVzCi0JCWFkZE1hcHBpbmcoIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5ydW50aW1lLndlYmxvZ2ljODEiLCAib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnJ1bnRpbWUud2VibG9naWMiLCAiOC4xIik7Ci0KLQkJYWRkTWFwcGluZygib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnJ1bnRpbWUud2VibG9naWM5MCIsICJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucnVudGltZS53ZWJsb2dpYyIsICI5LjAiKTsKLQotCQlhZGRNYXBwaW5nKCJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucnVudGltZS5qYm9zczMyMyIsICJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucnVudGltZS5qYm9zcyIsICIzLjIuMyIpOwotCi0JCWFkZE1hcHBpbmcoIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5ydW50aW1lLmpvbmFzNCIsICJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucnVudGltZS5qb25hcyIsICI0LjAiKTsKLQkJCi0JCWFkZE1hcHBpbmcoIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5ydW50aW1lLm9yYWNsZTEwMTMiLCAib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnJ1bnRpbWUub3JhY2xlIiwgIjEwLjEuMyIpOwotCQkKLQkJYWRkTWFwcGluZygib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnJ1bnRpbWUud2Vic3BoZXJlLjYiLCAib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnJ1bnRpbWUud2Vic3BoZXJlIiwgIjYuMCIpOwotCX0KLQotCXB1YmxpYyBTZXQgZ2V0RXhwb3J0ZWRSdW50aW1lTmFtZXMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlSdW50aW1lW10gcnVudGltZXMgPSBTZXJ2ZXJDb3JlLmdldFJ1bnRpbWVzKCk7Ci0JCVNldCByZXN1bHQgPSBuZXcgSGFzaFNldChydW50aW1lcy5sZW5ndGgpOwotCQkKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBydW50aW1lcy5sZW5ndGg7IGkrKykgewotCQkJSVJ1bnRpbWUgcnVudGltZSA9IHJ1bnRpbWVzW2ldOwotCQkJSVJ1bnRpbWVUeXBlIHJ1bnRpbWVUeXBlID0gcnVudGltZS5nZXRSdW50aW1lVHlwZSgpOwotCQkJaWYgKHJ1bnRpbWVUeXBlICE9IG51bGwgJiYgbWFwcGluZ3MuY29udGFpbnNLZXkocnVudGltZVR5cGUuZ2V0SWQoKSkpIHsKLQkJCQlyZXN1bHQuYWRkKHJ1bnRpbWUuZ2V0TmFtZSgpKTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgSVN0dWIgYnJpZGdlKFN0cmluZyBuYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChuYW1lID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCQotCQlJUnVudGltZVtdIHJ1bnRpbWVzID0gU2VydmVyQ29yZS5nZXRSdW50aW1lcygpOwotCQlpbnQgc2l6ZSA9IHJ1bnRpbWVzLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCWlmIChydW50aW1lc1tpXS5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKQotCQkJCXJldHVybiBuZXcgU3R1YihydW50aW1lc1tpXSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU3R1YiBpbXBsZW1lbnRzIElTdHViIHsKLQkJcHJpdmF0ZSBJUnVudGltZSBydW50aW1lOwotCQlwcm90ZWN0ZWQgaW50IHRpbWVzdGFtcCA9IC0xOwotCQlwcm90ZWN0ZWQgSVZNSW5zdGFsbCB2bUluc3RhbGw7Ci0JCXByb3RlY3RlZCBTdHJpbmcganZtdmVyOwotCi0JCXB1YmxpYyBTdHViKElSdW50aW1lIHJ1bnRpbWUpIHsKLQkJCXRoaXMucnVudGltZSA9IHJ1bnRpbWU7Ci0JCX0KLQotCQlwdWJsaWMgTGlzdCBnZXRSdW50aW1lQ29tcG9uZW50cygpIHsKLQkJCUxpc3QgY29tcG9uZW50cyA9IG5ldyBBcnJheUxpc3QoMik7Ci0JCQlpZiAocnVudGltZSA9PSBudWxsKQotCQkJCXJldHVybiBjb21wb25lbnRzOwotCQkJCi0JCQkvLyBkZWZpbmUgc2VydmVyIHJ1bnRpbWUgY29tcG9uZW50Ci0JCQlTdHJpbmcgdHlwZUlkID0gcnVudGltZS5nZXRSdW50aW1lVHlwZSgpLmdldElkKCk7Ci0JCQlJUnVudGltZUNvbXBvbmVudFZlcnNpb24gbWFwcGVkID0gKElSdW50aW1lQ29tcG9uZW50VmVyc2lvbikgbWFwcGluZ3MuZ2V0KHR5cGVJZCk7Ci0JCQkKLQkJCU1hcCBwcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXAoNSk7Ci0JCQlpZiAocnVudGltZS5nZXRMb2NhdGlvbigpICE9IG51bGwpCi0JCQkJcHJvcGVydGllcy5wdXQoImxvY2F0aW9uIiwgcnVudGltZS5nZXRMb2NhdGlvbigpLnRvUG9ydGFibGVTdHJpbmcoKSk7Ci0JCQllbHNlCi0JCQkJcHJvcGVydGllcy5wdXQoImxvY2F0aW9uIiwgIiIpOwotCQkJcHJvcGVydGllcy5wdXQoIm5hbWUiLCBydW50aW1lLmdldE5hbWUoKSk7Ci0JCQlwcm9wZXJ0aWVzLnB1dCgidHlwZSIsIHJ1bnRpbWUuZ2V0UnVudGltZVR5cGUoKS5nZXROYW1lKCkpOwotCQkJcHJvcGVydGllcy5wdXQoImlkIiwgcnVudGltZS5nZXRJZCgpKTsKLQkJCQotCQkJUnVudGltZUNsYXNzcGF0aFByb3ZpZGVyV3JhcHBlciByY3B3ID0gSmF2YVNlcnZlclBsdWdpbi5maW5kUnVudGltZUNsYXNzcGF0aFByb3ZpZGVyKHJ1bnRpbWUuZ2V0UnVudGltZVR5cGUoKSk7Ci0JCQlpZiAocmNwdyAhPSBudWxsKSB7Ci0JCQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKFJ1bnRpbWVDbGFzc3BhdGhDb250YWluZXIuU0VSVkVSX0NPTlRBSU5FUik7Ci0JCQkJcGF0aCA9IHBhdGguYXBwZW5kKHJjcHcuZ2V0SWQoKSkuYXBwZW5kKHJ1bnRpbWUuZ2V0SWQoKSk7Ci0JCQkJcHJvcGVydGllcy5wdXQoQ0xBU1NQQVRILCBwYXRoLnRvUG9ydGFibGVTdHJpbmcoKSk7Ci0JCQl9Ci0JCQkKLQkJCWNvbXBvbmVudHMuYWRkKFJ1bnRpbWVNYW5hZ2VyLmNyZWF0ZVJ1bnRpbWVDb21wb25lbnQobWFwcGVkLCBwcm9wZXJ0aWVzKSk7Ci0JCQkKLQkJCS8vIGRlZmluZSBKUkUgY29tcG9uZW50Ci0JCQlJSmF2YVJ1bnRpbWUgamF2YVJ1bnRpbWUgPSAoSUphdmFSdW50aW1lKSBydW50aW1lLmxvYWRBZGFwdGVyKElKYXZhUnVudGltZS5jbGFzcywgbnVsbCk7Ci0JCQlpZiAoamF2YVJ1bnRpbWUgIT0gbnVsbCkgewotCQkJCWlmICh0aW1lc3RhbXAgIT0gKChSdW50aW1lKSBydW50aW1lKS5nZXRUaW1lc3RhbXAoKSkgewotCQkJCQl2bUluc3RhbGwgPSBudWxsOwotCQkJCQlqdm12ZXIgPSBudWxsOwotCQkJCQl0aW1lc3RhbXAgPSAoKFJ1bnRpbWUpIHJ1bnRpbWUpLmdldFRpbWVzdGFtcCgpOwotCQkJCX0KLQkJCQlpZiAodm1JbnN0YWxsID09IG51bGwpCi0JCQkJCXZtSW5zdGFsbCA9IGphdmFSdW50aW1lLmdldFZNSW5zdGFsbCgpOyAKLQkJCQlpZiAoanZtdmVyID09IG51bGwpIHsKLQkJCQkJSVZNSW5zdGFsbDIgdm1JbnN0YWxsMiA9IChJVk1JbnN0YWxsMikgdm1JbnN0YWxsOwotCQkJCQlpZiAodm1JbnN0YWxsMiAhPSBudWxsKQotCQkJCQkJanZtdmVyID0gdm1JbnN0YWxsMi5nZXRKYXZhVmVyc2lvbigpOwotCQkJCX0KLQkJCQlJUnVudGltZUNvbXBvbmVudFZlcnNpb24gcmN2OwotCQkJCQotCQkJCWlmIChqdm12ZXIgPT0gbnVsbCkKLQkJCQkJcmN2ID0gUnVudGltZU1hbmFnZXIuZ2V0UnVudGltZUNvbXBvbmVudFR5cGUoInN0YW5kYXJkLmpyZSIpLmdldFZlcnNpb24oIjEuNCIpOwotCQkJCWVsc2UgaWYgKGp2bXZlci5zdGFydHNXaXRoKCIxLjMiKSkKLQkJCQkJcmN2ID0gUnVudGltZU1hbmFnZXIuZ2V0UnVudGltZUNvbXBvbmVudFR5cGUoInN0YW5kYXJkLmpyZSIpLmdldFZlcnNpb24oIjEuMyIpOwotCQkJCWVsc2UgaWYgKGp2bXZlci5zdGFydHNXaXRoKCIxLjUiKSB8fCBqdm12ZXIuc3RhcnRzV2l0aCgiNS4wIikpCi0JCQkJCXJjdiA9IFJ1bnRpbWVNYW5hZ2VyLmdldFJ1bnRpbWVDb21wb25lbnRUeXBlKCJzdGFuZGFyZC5qcmUiKS5nZXRWZXJzaW9uKCI1LjAiKTsKLQkJCQllbHNlIGlmIChqdm12ZXIuc3RhcnRzV2l0aCgiMS42IikgfHwganZtdmVyLnN0YXJ0c1dpdGgoIjYuMCIpKQotCQkJCQlyY3YgPSBSdW50aW1lTWFuYWdlci5nZXRSdW50aW1lQ29tcG9uZW50VHlwZSgic3RhbmRhcmQuanJlIikuZ2V0VmVyc2lvbigiNS4wIik7Ci0JCQkJZWxzZSAvLyBkZWZhdWx0IHx8IGp2bXZlci5zdGFydHNXaXRoKCIxLjQiKSkKLQkJCQkJcmN2ID0gUnVudGltZU1hbmFnZXIuZ2V0UnVudGltZUNvbXBvbmVudFR5cGUoInN0YW5kYXJkLmpyZSIpLmdldFZlcnNpb24oIjEuNCIpOwotCQkJCQotCQkJCWlmICh2bUluc3RhbGwgIT0gbnVsbCkgewotCQkJCQlwcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXAoMyk7Ci0JCQkJCXByb3BlcnRpZXMucHV0KCJuYW1lIiwgdm1JbnN0YWxsLmdldE5hbWUoKSk7Ci0JCQkJCUlQYXRoIHBhdGggPSBuZXcgUGF0aChKYXZhUnVudGltZS5KUkVfQ09OVEFJTkVSKTsKLQkJCQkJcGF0aCA9IHBhdGguYXBwZW5kKHZtSW5zdGFsbC5nZXRWTUluc3RhbGxUeXBlKCkuZ2V0SWQoKSkuYXBwZW5kKHZtSW5zdGFsbC5nZXROYW1lKCkpOwotCQkJCQlwcm9wZXJ0aWVzLnB1dChDTEFTU1BBVEgsIHBhdGgudG9Qb3J0YWJsZVN0cmluZygpKTsKLQkJCQkJY29tcG9uZW50cy5hZGQoUnVudGltZU1hbmFnZXIuY3JlYXRlUnVudGltZUNvbXBvbmVudChyY3YsIHByb3BlcnRpZXMpKTsKLQkJCQl9IGVsc2UgewotCQkJCQlwcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXAoMyk7Ci0JCQkJCXByb3BlcnRpZXMucHV0KCJuYW1lIiwgIi0iKTsKLQkJCQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKEphdmFSdW50aW1lLkpSRV9DT05UQUlORVIpOwotCQkJCQlwcm9wZXJ0aWVzLnB1dChDTEFTU1BBVEgsIHBhdGgudG9Qb3J0YWJsZVN0cmluZygpKTsKLQkJCQkJY29tcG9uZW50cy5hZGQoUnVudGltZU1hbmFnZXIuY3JlYXRlUnVudGltZUNvbXBvbmVudChyY3YsIHByb3BlcnRpZXMpKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCXJldHVybiBjb21wb25lbnRzOwotCQl9Ci0KLQkJcHVibGljIE1hcCBnZXRQcm9wZXJ0aWVzKCkgewotCQkJaWYgKHJ1bnRpbWUgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbmV3IEhhc2hNYXAoMCk7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uTWFwKCJpZCIsIHJ1bnRpbWUuZ2V0SWQoKSk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc2phdmFjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9SdW50aW1lQ2xhc3NwYXRoQ29udGFpbmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zamF2YWNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL1J1bnRpbWVDbGFzc3BhdGhDb250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQyOWE1Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zamF2YWNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL1J1bnRpbWVDbGFzc3BhdGhDb250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lOwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFJ1bnRpbWVDbGFzc3BhdGhDb250YWluZXIgaW1wbGVtZW50cyBJQ2xhc3NwYXRoQ29udGFpbmVyIHsKLQkvKioKLQkgKiBUaGUgc2VydmVyIGNvbnRhaW5lciBpZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWRVJfQ09OVEFJTkVSID0gSmF2YVNlcnZlclBsdWdpbi5QTFVHSU5fSUQgKyAiLmNvbnRhaW5lciI7Ci0KLQlwcml2YXRlIElQYXRoIHBhdGg7Ci0JcHJpdmF0ZSBSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJXcmFwcGVyIGRlbGVnYXRlOwotCXByaXZhdGUgSVJ1bnRpbWUgcnVudGltZTsKLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBydW50aW1lIGNsYXNzcGF0aCBjb250YWluZXIuCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiBAcGFyYW0gZGVsZWdhdGUKLQkgKiBAcGFyYW0gcnVudGltZQotCSAqIEBwYXJhbSBpZAotCSAqIEBkZXByZWNhdGVkIHNob3VsZCB1c2UgdGhlIGVxdWl2YWxlbnQgbWV0aG9kIHdpdGhvdXQgdGhlIHVudXNlZCBpZCB2YXJpYWJsZQotCSAqLwotCXB1YmxpYyBSdW50aW1lQ2xhc3NwYXRoQ29udGFpbmVyKElQYXRoIHBhdGgsIFJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcldyYXBwZXIgZGVsZWdhdGUsIElSdW50aW1lIHJ1bnRpbWUsIFN0cmluZyBpZCkgewotCQl0aGlzLnBhdGggPSBwYXRoOwotCQl0aGlzLmRlbGVnYXRlID0gZGVsZWdhdGU7Ci0JCXRoaXMucnVudGltZSA9IHJ1bnRpbWU7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IHJ1bnRpbWUgY2xhc3NwYXRoIGNvbnRhaW5lci4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqIEBwYXJhbSBkZWxlZ2F0ZQotCSAqIEBwYXJhbSBydW50aW1lCi0JICovCi0JcHVibGljIFJ1bnRpbWVDbGFzc3BhdGhDb250YWluZXIoSVBhdGggcGF0aCwgUnVudGltZUNsYXNzcGF0aFByb3ZpZGVyV3JhcHBlciBkZWxlZ2F0ZSwgSVJ1bnRpbWUgcnVudGltZSkgewotCQl0aGlzLnBhdGggPSBwYXRoOwotCQl0aGlzLmRlbGVnYXRlID0gZGVsZWdhdGU7Ci0JCXRoaXMucnVudGltZSA9IHJ1bnRpbWU7Ci0JfQotCi0JLyoqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhDb250YWluZXIjZ2V0Q2xhc3NwYXRoRW50cmllcygpCi0JICovCi0JcHVibGljIElDbGFzc3BhdGhFbnRyeVtdIGdldENsYXNzcGF0aEVudHJpZXMoKSB7Ci0JCUlDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMgPSBudWxsOwotCQlpZiAoZGVsZWdhdGUgIT0gbnVsbCAmJiBydW50aW1lICE9IG51bGwpCi0JCQllbnRyaWVzID0gZGVsZWdhdGUucmVzb2x2ZUNsYXNzcGF0aENvbnRhaW5lckltcGwocnVudGltZSk7Ci0JCQotCQlpZiAoZW50cmllcyA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBJQ2xhc3NwYXRoRW50cnlbMF07Ci0JCQotCQlyZXR1cm4gZW50cmllczsKLQl9Ci0KLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aENvbnRhaW5lciNnZXREZXNjcmlwdGlvbigpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJaWYgKHJ1bnRpbWUgIT0gbnVsbCAmJiBkZWxlZ2F0ZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgcyA9IGRlbGVnYXRlLmdldENsYXNzcGF0aENvbnRhaW5lckxhYmVsKHJ1bnRpbWUpOwotCQkJaWYgKHMgIT0gbnVsbCkKLQkJCQlyZXR1cm4gczsKLQkJfQotCQkKLQkJcmV0dXJuIE1lc3NhZ2VzLmNsYXNzcGF0aENvbnRhaW5lckRlc2NyaXB0aW9uOwotCX0KLQotCS8qKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoQ29udGFpbmVyI2dldEtpbmQoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0S2luZCgpIHsKLQkJcmV0dXJuIElDbGFzc3BhdGhDb250YWluZXIuS19BUFBMSUNBVElPTjsKLQl9Ci0KLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aENvbnRhaW5lciNnZXRQYXRoKCkKLQkgKi8KLQlwdWJsaWMgSVBhdGggZ2V0UGF0aCgpIHsKLQkJcmV0dXJuIHBhdGg7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NqYXZhY29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvUnVudGltZUNsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zamF2YWNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL1J1bnRpbWVDbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWM1MDkxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NqYXZhY29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvUnVudGltZUNsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLaAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlckNvcmU7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUnVudGltZUNsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyIGV4dGVuZHMgQ2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIgewotCS8qKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5DbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplciNpbml0aWFsaXplKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aCwgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoSVBhdGggY29udGFpbmVyUGF0aCwgSUphdmFQcm9qZWN0IHByb2plY3QpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGNvbnRhaW5lclBhdGguc2VnbWVudENvdW50KCkgPiAwKSB7Ci0JCQlpZiAoY29udGFpbmVyUGF0aC5zZWdtZW50KDApLmVxdWFscyhSdW50aW1lQ2xhc3NwYXRoQ29udGFpbmVyLlNFUlZFUl9DT05UQUlORVIpKSB7Ci0JCQkJUnVudGltZUNsYXNzcGF0aFByb3ZpZGVyV3JhcHBlciBkZWxlZ2F0ZSA9IG51bGw7Ci0JCQkJSVJ1bnRpbWUgcnVudGltZSA9IG51bGw7Ci0JCQkJaWYgKGNvbnRhaW5lclBhdGguc2VnbWVudENvdW50KCkgPiAyKSB7Ci0JCQkJCWRlbGVnYXRlID0gSmF2YVNlcnZlclBsdWdpbi5maW5kUnVudGltZUNsYXNzcGF0aFByb3ZpZGVyKGNvbnRhaW5lclBhdGguc2VnbWVudCgxKSk7Ci0JCQkJCQotCQkJCQlTdHJpbmcgcnVudGltZUlkID0gY29udGFpbmVyUGF0aC5zZWdtZW50KDIpOwotCQkJCQlpZiAocnVudGltZUlkICE9IG51bGwpCi0JCQkJCQlydW50aW1lID0gU2VydmVyQ29yZS5maW5kUnVudGltZShydW50aW1lSWQpOwotCQkJCX0KLQkJCQlSdW50aW1lQ2xhc3NwYXRoQ29udGFpbmVyIGNvbnRhaW5lciA9IG5ldyBSdW50aW1lQ2xhc3NwYXRoQ29udGFpbmVyKGNvbnRhaW5lclBhdGgsIGRlbGVnYXRlLCBydW50aW1lKTsKLQkJCQlKYXZhQ29yZS5zZXRDbGFzc3BhdGhDb250YWluZXIoY29udGFpbmVyUGF0aCwgbmV3IElKYXZhUHJvamVjdFtdIHtwcm9qZWN0fSwgbmV3IElDbGFzc3BhdGhDb250YWluZXJbXSB7Y29udGFpbmVyfSwgbnVsbCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuQ2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIjZ2V0RGVzY3JpcHRpb24ob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoLCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbihJUGF0aCBjb250YWluZXJQYXRoLCBJSmF2YVByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gTWVzc2FnZXMuY2xhc3NwYXRoQ29udGFpbmVyRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLkNsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyI2NhblVwZGF0ZUNsYXNzcGF0aENvbnRhaW5lcihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGgsIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5VcGRhdGVDbGFzc3BhdGhDb250YWluZXIoSVBhdGggY29udGFpbmVyUGF0aCwgSUphdmFQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLkNsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyI3JlcXVlc3RDbGFzc3BhdGhDb250YWluZXJVcGRhdGUob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoLCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3QsIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhDb250YWluZXIpCi0JICovCi0JcHVibGljIHZvaWQgcmVxdWVzdENsYXNzcGF0aENvbnRhaW5lclVwZGF0ZShJUGF0aCBjb250YWluZXJQYXRoLCBJSmF2YVByb2plY3QgcHJvamVjdCwgSUNsYXNzcGF0aENvbnRhaW5lciBjb250YWluZXJTdWdnZXN0aW9uKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChjb250YWluZXJQYXRoLnNlZ21lbnRDb3VudCgpID4gMCkgewotCQkJaWYgKGNvbnRhaW5lclBhdGguc2VnbWVudCgwKS5lcXVhbHMoUnVudGltZUNsYXNzcGF0aENvbnRhaW5lci5TRVJWRVJfQ09OVEFJTkVSKSkgewotCQkJCVJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcldyYXBwZXIgZGVsZWdhdGUgPSBudWxsOwotCQkJCUlSdW50aW1lIHJ1bnRpbWUgPSBudWxsOwotCQkJCWlmIChjb250YWluZXJQYXRoLnNlZ21lbnRDb3VudCgpID4gMikgewotCQkJCQlkZWxlZ2F0ZSA9IEphdmFTZXJ2ZXJQbHVnaW4uZmluZFJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcihjb250YWluZXJQYXRoLnNlZ21lbnQoMSkpOwotCQkJCQlTdHJpbmcgcnVudGltZUlkID0gY29udGFpbmVyUGF0aC5zZWdtZW50KDIpOwotCQkJCQlpZiAocnVudGltZUlkICE9IG51bGwpCi0JCQkJCQlydW50aW1lID0gU2VydmVyQ29yZS5maW5kUnVudGltZShydW50aW1lSWQpOwotCQkJCQlkZWxlZ2F0ZS5yZXF1ZXN0Q2xhc3NwYXRoQ29udGFpbmVyVXBkYXRlKHJ1bnRpbWUsIGNvbnRhaW5lclN1Z2dlc3Rpb24uZ2V0Q2xhc3NwYXRoRW50cmllcygpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuQ2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIjZ2V0Q29tcGFyaXNvbklEKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aCwgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0Q29tcGFyaXNvbklEKElQYXRoIGNvbnRhaW5lclBhdGgsIElKYXZhUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWlmIChjb250YWluZXJQYXRoID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCXJldHVybiBjb250YWluZXJQYXRoLnRvUG9ydGFibGVTdHJpbmcoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc2phdmFjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9SdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NqYXZhY29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvUnVudGltZUNsYXNzcGF0aFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhZTQ0YzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc2phdmFjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9SdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgSUJNIENvcnBvcmF0aW9uIC0gU3VwcG9ydCBmb3IgYWxsIHNlcnZlciB0eXBlcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUNsYXNzcGF0aFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZUNvbXBvbmVudDsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXIgaW1wbGVtZW50cyBJQ2xhc3NwYXRoUHJvdmlkZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIElQcm9qZWN0RmFjZXQgV0VCX0ZBQ0VUID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KCJqc3Qud2ViIik7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSVByb2plY3RGYWNldCBFSkJfRkFDRVQgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoImpzdC5lamIiKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJUHJvamVjdEZhY2V0IEVBUl9GQUNFVCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldCgianN0LmVhciIpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIElQcm9qZWN0RmFjZXQgVVRJTElUWV9GQUNFVCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldCgianN0LnV0aWxpdHkiKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJUHJvamVjdEZhY2V0IENPTk5FQ1RPUl9GQUNFVCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldCgianN0LmNvbm5lY3RvciIpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIElQcm9qZWN0RmFjZXQgQVBQX0NMSUVOVF9GQUNFVCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldCgianN0LmFwcGNsaWVudCIpOwotCi0JcHJpdmF0ZSBmaW5hbCBJUnVudGltZUNvbXBvbmVudCByYzsKLQotCXB1YmxpYyBSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXIoZmluYWwgSVJ1bnRpbWVDb21wb25lbnQgcmMpIHsKLQkJdGhpcy5yYyA9IHJjOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldENsYXNzcGF0aEVudHJpZXMoZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZnYpIHsKLQkJSVByb2plY3RGYWNldCBwZiA9IGZ2LmdldFByb2plY3RGYWNldCgpOwotCQlpZiAoV0VCX0ZBQ0VULmVxdWFscyhwZikgfHwgRUpCX0ZBQ0VULmVxdWFscyhwZikgfHwgRUFSX0ZBQ0VULmVxdWFscyhwZikgfHwKLQkJCQlVVElMSVRZX0ZBQ0VULmVxdWFscyhwZikgfHwgQ09OTkVDVE9SX0ZBQ0VULmVxdWFscyhwZikgfHwgQVBQX0NMSUVOVF9GQUNFVC5lcXVhbHMocGYpKSB7Ci0JCQlTdHJpbmcgcyA9IHJjLmdldFByb3BlcnR5KFJ1bnRpbWVCcmlkZ2UuQ0xBU1NQQVRIKTsKLQkJCWlmIChzID09IG51bGwgfHwgcy5sZW5ndGgoKSA9PSAwKQotCQkJCXJldHVybiBudWxsOwotCi0JCQlJQ2xhc3NwYXRoRW50cnkgY3BlbnRyeSA9IEphdmFDb3JlLm5ld0NvbnRhaW5lckVudHJ5KG5ldyBQYXRoKHMpKTsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KGNwZW50cnkpOwotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZhY3RvcnkgaW1wbGVtZW50cyBJQWRhcHRlckZhY3RvcnkgewotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzc1tdIEFEQVBURVJfVFlQRVMgPSB7IElDbGFzc3BhdGhQcm92aWRlci5jbGFzcyB9OwotCi0JCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihmaW5hbCBPYmplY3QgYWRhcHRhYmxlLCBmaW5hbCBDbGFzcyBhZGFwdGVyVHlwZSkgewotCQkJSVJ1bnRpbWVDb21wb25lbnQgcmMgPSAoSVJ1bnRpbWVDb21wb25lbnQpIGFkYXB0YWJsZTsKLQkJCXJldHVybiBuZXcgUnVudGltZUNsYXNzcGF0aFByb3ZpZGVyKHJjKTsKLQkJfQotCi0JCXB1YmxpYyBDbGFzc1tdIGdldEFkYXB0ZXJMaXN0KCkgewotCQkJcmV0dXJuIEFEQVBURVJfVFlQRVM7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc2phdmFjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9SdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJXcmFwcGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zamF2YWNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL1J1bnRpbWVDbGFzc3BhdGhQcm92aWRlcldyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRjN2NjZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zamF2YWNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL1J1bnRpbWVDbGFzc3BhdGhQcm92aWRlcldyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5SdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuKjsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJXcmFwcGVyIHsKLQlwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50OwotCXByaXZhdGUgUnVudGltZUNsYXNzcGF0aFByb3ZpZGVyRGVsZWdhdGUgZGVsZWdhdGU7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgcnVudGltZSB0YXJnZXQgaGFuZGxlci4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCBhIGNvbmZpZ3VyYXRpb24gZWxlbWVudAotCSAqLwotCXB1YmxpYyBSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJXcmFwcGVyKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JfQotCQotCXByb3RlY3RlZCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZ2V0RWxlbWVudCgpIHsKLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiB0aGUgaWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImlkIik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgb3JkZXIuCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBvcmRlcgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0T3JkZXIoKSB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgbyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJvcmRlciIpOwotCQkJcmV0dXJuIEludGVnZXIucGFyc2VJbnQobyk7Ci0JCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0UnVudGltZVR5cGVJZHMoKSB7Ci0JCXRyeSB7Ci0JCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJydW50aW1lVHlwZUlkcyIpLCAiLCIpOwotCQkJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgewotCQkJCVN0cmluZyBzdHIgPSBzdC5uZXh0VG9rZW4oKTsKLQkJCQlpZiAoc3RyICE9IG51bGwgJiYgc3RyLmxlbmd0aCgpID4gMCkKLQkJCQkJbGlzdC5hZGQoc3RyLnRyaW0oKSk7Ci0JCQl9Ci0JCQlTdHJpbmdbXSBzID0gbmV3IFN0cmluZ1tsaXN0LnNpemUoKV07Ci0JCQlsaXN0LnRvQXJyYXkocyk7Ci0JCQlyZXR1cm4gczsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBwYXJzZSBydW50aW1lIHR5cGUgaWRzOiAiICsgZWxlbWVudCk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gc2VydmVyIHJlc291cmNlIHR5cGUgKGdpdmVuIGJ5IHRoZQotCSAqIGlkKSBjYW4gYmUgb3BlbmVkIHdpdGggdGhpcyBlZGl0b3IuIFRoaXMgcmVzdWx0IGlzIGJhc2VkIG9uCi0JICogdGhlIHJlc3VsdCBvZiB0aGUgZ2V0U2VydmVyUmVzb3VyY2VzKCkgbWV0aG9kLgotCSAqCi0JICogQHBhcmFtIHJ1bnRpbWVUeXBlIGEgcnVudGltZSB0eXBlCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHNSdW50aW1lVHlwZShJUnVudGltZVR5cGUgcnVudGltZVR5cGUpIHsKLQkJaWYgKHJ1bnRpbWVUeXBlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCVN0cmluZyBpZCA9IHJ1bnRpbWVUeXBlLmdldElkKCk7Ci0JCWlmIChpZCA9PSBudWxsIHx8IGlkLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJU3RyaW5nW10gcyA9IGdldFJ1bnRpbWVUeXBlSWRzKCk7Ci0JCWlmIChzID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQlpbnQgc2l6ZSA9IHMubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJaWYgKHNbaV0uZW5kc1dpdGgoIioiKSkgewotCQkJCWlmIChpZC5sZW5ndGgoKSA+PSBzW2ldLmxlbmd0aCgpICYmIGlkLnN0YXJ0c1dpdGgoc1tpXS5zdWJzdHJpbmcoMCwgc1tpXS5sZW5ndGgoKSAtIDEpKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9IGVsc2UgaWYgKGlkLmVxdWFscyhzW2ldKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiBMb2FkcyB0aGUgZGVsZWdhdGUgY2xhc3MuCi0JICovCi0JcHVibGljIFJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlckRlbGVnYXRlIGdldERlbGVnYXRlKCkgewotCQlpZiAoZGVsZWdhdGUgPT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlkZWxlZ2F0ZSA9IChSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJEZWxlZ2F0ZSkgZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJjbGFzcyIpOwotCQkJCWRlbGVnYXRlLmluaXRpYWxpemUoZ2V0SWQoKSk7Ci0JCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBjcmVhdGUgZGVsZWdhdGUgIiArIHRvU3RyaW5nKCkgKyAiOiAiICsgdC5nZXRNZXNzYWdlKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBkZWxlZ2F0ZTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgUnVudGltZUNsYXNzcGF0aFByb3ZpZGVyRGVsZWdhdGUjcmVzb2x2ZUNsYXNzcGF0aENvbnRhaW5lckltcGwoSVJ1bnRpbWUpCi0JICovCi0JcHVibGljIElDbGFzc3BhdGhFbnRyeVtdIHJlc29sdmVDbGFzc3BhdGhDb250YWluZXJJbXBsKElSdW50aW1lIHJ1bnRpbWUpIHsKLQkJaWYgKHJ1bnRpbWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQl0cnkgewotCQkJcmV0dXJuIGdldERlbGVnYXRlKCkucmVzb2x2ZUNsYXNzcGF0aENvbnRhaW5lckltcGwocnVudGltZSwgIiIpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgY2FsbGluZyBkZWxlZ2F0ZSAiICsgdG9TdHJpbmcoKSArICI6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIFJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlckRlbGVnYXRlI2dldENsYXNzcGF0aENvbnRhaW5lckxhYmVsKElSdW50aW1lKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NwYXRoQ29udGFpbmVyTGFiZWwoSVJ1bnRpbWUgcnVudGltZSkgewotCQlpZiAocnVudGltZSA9PSBudWxsKQotCQkJcmV0dXJuICJuL2EiOwotCQl0cnkgewotCQkJcmV0dXJuIGdldERlbGVnYXRlKCkuZ2V0Q2xhc3NwYXRoQ29udGFpbmVyTGFiZWwocnVudGltZSwgIiIpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgY2FsbGluZyBkZWxlZ2F0ZSAiICsgdG9TdHJpbmcoKSArICI6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQkJcmV0dXJuICJuL2EiOwotCX0KLQotCS8qCi0JICogQHNlZSBSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJEZWxlZ2F0ZSNyZXF1ZXN0Q2xhc3NwYXRoQ29udGFpbmVyVXBkYXRlKElSdW50aW1lLCBJQ2xhc3NwYXRoRW50cnlbXSkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXF1ZXN0Q2xhc3NwYXRoQ29udGFpbmVyVXBkYXRlKElSdW50aW1lIHJ1bnRpbWUsIElDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMpIHsKLQkJaWYgKHJ1bnRpbWUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJdHJ5IHsKLQkJCWdldERlbGVnYXRlKCkucmVxdWVzdENsYXNzcGF0aENvbnRhaW5lclVwZGF0ZShydW50aW1lLCAiIiwgZW50cmllcyk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBjYWxsaW5nIGRlbGVnYXRlICIgKyB0b1N0cmluZygpICsgIjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJEZWxlZ2F0ZSNoYXNSdW50aW1lQ2xhc3NwYXRoQ2hhbmdlZChJUnVudGltZSkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNSdW50aW1lQ2xhc3NwYXRoQ2hhbmdlZChJUnVudGltZSBydW50aW1lKSB7Ci0JCWlmIChydW50aW1lID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZ2V0RGVsZWdhdGUoKS5oYXNSdW50aW1lQ2xhc3NwYXRoQ2hhbmdlZChydW50aW1lKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGNhbGxpbmcgZGVsZWdhdGUgIiArIHRvU3RyaW5nKCkgKyAiOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIlJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcldyYXBwZXJbIiArIGdldElkKCkgKyAiXSI7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NqYXZhY29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvUnVudGltZUZhY2V0TWFwcGluZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc2phdmFjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9SdW50aW1lRmFjZXRNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhODI5YTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc2phdmFjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9SdW50aW1lRmFjZXRNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUnVudGltZUZhY2V0TWFwcGluZyB7Ci0JcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudDsKLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBydW50aW1lIGZhY2V0IG1hcHBpbmcuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQgYSBjb25maWd1cmF0aW9uIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgUnVudGltZUZhY2V0TWFwcGluZyhJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcigpOwotCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGlkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJpZCIpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGlkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSdW50aW1lVHlwZUlkKCkgewotCQlyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoInJ1bnRpbWVUeXBlSWQiKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBpZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpIHsKLQkJcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ2ZXJzaW9uIik7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiB0aGUgaWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJ1bnRpbWVDb21wb25lbnQoKSB7Ci0JCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZSgicnVudGltZS1jb21wb25lbnQiKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIlJ1bnRpbWVGYWNldE1hcHBpbmdbIiArIGdldElkKCkgKyAiXSI7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NqYXZhY29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvU3RhbmRhcmRKcmVDbGFzc3BhdGhQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc2phdmFjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9TdGFuZGFyZEpyZUNsYXNzcGF0aFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0M2ZlMWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc2phdmFjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9TdGFuZGFyZEpyZUNsYXNzcGF0aFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIENsZWFudXAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklDbGFzc3BhdGhQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuSVJ1bnRpbWVDb21wb25lbnQ7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU3RhbmRhcmRKcmVDbGFzc3BhdGhQcm92aWRlciBpbXBsZW1lbnRzIElDbGFzc3BhdGhQcm92aWRlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSVByb2plY3RGYWNldCBKQVZBX0ZBQ0VUID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KCJqc3QuamF2YSIpOwotCi0JcHJpdmF0ZSBJUnVudGltZUNvbXBvbmVudCByYzsKLQotCXB1YmxpYyBTdGFuZGFyZEpyZUNsYXNzcGF0aFByb3ZpZGVyKGZpbmFsIElSdW50aW1lQ29tcG9uZW50IHJjKSB7Ci0JCXRoaXMucmMgPSByYzsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRDbGFzc3BhdGhFbnRyaWVzKGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2KSB7Ci0JCWlmIChmdi5nZXRQcm9qZWN0RmFjZXQoKSA9PSBKQVZBX0ZBQ0VUKSB7Ci0JCQlJQ2xhc3NwYXRoRW50cnkgY3BlbnRyeSA9IEphdmFDb3JlLm5ld0NvbnRhaW5lckVudHJ5KG5ldyBQYXRoKHJjLmdldFByb3BlcnR5KFJ1bnRpbWVCcmlkZ2UuQ0xBU1NQQVRIKSkpOwotCQkJcmV0dXJuIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoY3BlbnRyeSk7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZhY3RvcnkgaW1wbGVtZW50cyBJQWRhcHRlckZhY3RvcnkgewotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzc1tdIEFEQVBURVJfVFlQRVMgPSB7IElDbGFzc3BhdGhQcm92aWRlci5jbGFzcyB9OwotCi0JCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihmaW5hbCBPYmplY3QgYWRhcHRhYmxlLCBmaW5hbCBDbGFzcyBhZGFwdGVyVHlwZSkgewotCQkJSVJ1bnRpbWVDb21wb25lbnQgcmMgPSAoSVJ1bnRpbWVDb21wb25lbnQpIGFkYXB0YWJsZTsKLQkJCXJldHVybiBuZXcgU3RhbmRhcmRKcmVDbGFzc3BhdGhQcm92aWRlcihyYyk7Ci0JCX0KLQotCQlwdWJsaWMgQ2xhc3NbXSBnZXRBZGFwdGVyTGlzdCgpIHsKLQkJCXJldHVybiBBREFQVEVSX1RZUEVTOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NqYXZhY29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvVHJhY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NqYXZhY29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvVHJhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY3ZGI1Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zamF2YWNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL1RyYWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKLS8qKgotICogSGVscGVyIGNsYXNzIHRvIHJvdXRlIHRyYWNlIG91dHB1dC4KLSAqLwotcHVibGljIGNsYXNzIFRyYWNlIHsKLQkvKioKLQkgKiBDb25maWcgdHJhY2luZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgYnl0ZSBDT05GSUcgPSAwOwotCS8qKgotCSAqIFdhcm5pbmcgdHJhY2luZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgYnl0ZSBXQVJOSU5HID0gMTsKLQkvKioKLQkgKiBTZXZlcmUgdHJhY2luZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgYnl0ZSBTRVZFUkUgPSAyOwotCS8qKgotCSAqIEZpbmVzdCB0cmFjaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBieXRlIEZJTkVTVCA9IDM7Ci0KLQkvKioKLQkgKiBUcmFjZSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXByaXZhdGUgVHJhY2UoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogVHJhY2UgdGhlIGdpdmVuIHRleHQuCi0JICoKLQkgKiBAcGFyYW0gbGV2ZWwgdHJhY2UgbGV2ZWwKLQkgKiBAcGFyYW0gcyBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2UoYnl0ZSBsZXZlbCwgU3RyaW5nIHMpIHsKLQkJVHJhY2UudHJhY2UobGV2ZWwsIHMsIG51bGwpOwotCX0KLQkKLQkvKioKLQkgKiBUcmFjZSB0aGUgZ2l2ZW4gbWVzc2FnZSBhbmQgZXhjZXB0aW9uLgotCSAqCi0JICogQHBhcmFtIGxldmVsIHRyYWNlIGxldmVsCi0JICogQHBhcmFtIHMgU3RyaW5nCi0JICogQHBhcmFtIHQgVGhyb3dhYmxlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlKGJ5dGUgbGV2ZWwsIFN0cmluZyBzLCBUaHJvd2FibGUgdCkgewotCQlpZiAoIUphdmFTZXJ2ZXJQbHVnaW4uZ2V0SW5zdGFuY2UoKS5pc0RlYnVnZ2luZygpKQotCQkJcmV0dXJuOwotCi0JCVN5c3RlbS5vdXQucHJpbnRsbihKYXZhU2VydmVyUGx1Z2luLlBMVUdJTl9JRCArICIgIiArcyk7Ci0JCWlmICh0ICE9IG51bGwpCi0JCQl0LnByaW50U3RhY2tUcmFjZSgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zamF2YWNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL1hNTE1lbWVudG8uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NqYXZhY29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvWE1MTWVtZW50by5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWI4MWM5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NqYXZhY29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvWE1MTWVtZW50by5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IG9yZy53M2MuZG9tLio7Ci1pbXBvcnQgb3JnLnhtbC5zYXguKjsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLio7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS4qOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7Ci0vKioKLSAqIEEgTWVtZW50byBpcyBhIGNsYXNzIGluZGVwZW5kZW50IGNvbnRhaW5lciBmb3IgcGVyc2lzdGVuY2UKLSAqIGluZm8uICBJdCBpcyBhIHJlZmxlY3Rpb24gb2YgMyBzdG9yYWdlIHJlcXVpcmVtZW50cy4KLSAqCi0gKiAxKSAgIFdlIG5lZWQgdGhlIGFiaWxpdHkgdG8gcGVyc2lzdCBhbiBvYmplY3QgYW5kIHJlc3RvcmUgaXQuICAKLSAqIDIpICAgVGhlIGNsYXNzIGZvciBhbiBvYmplY3QgbWF5IGJlIGFic2VudC4gIElmIHNvIHdlIHdvdWxkIAotICogICAgICBsaWtlIHRvIHNraXAgdGhlIG9iamVjdCBhbmQga2VlcCByZWFkaW5nLiAKLSAqIDMpICAgVGhlIGNsYXNzIGZvciBhbiBvYmplY3QgbWF5IGNoYW5nZS4gIElmIHNvIHRoZSBuZXcgY2xhc3MgCi0gKiAgICAgIHNob3VsZCBiZSBhYmxlIHRvIHJlYWQgdGhlIG9sZCBwZXJzaXN0ZW5jZSBpbmZvLgotICoKLSAqIFdlIGNvdWxkIGFzayB0aGUgb2JqZWN0cyB0byBzZXJpYWxpemUgdGhlbXNlbHZlcyBpbnRvIGFuIAotICogT2JqZWN0T3V0cHV0U3RyZWFtLCBEYXRhT3V0cHV0U3RyZWFtLCBvciBIYXNodGFibGUuICBIb3dldmVyIAotICogYWxsIG9mIHRoZXNlIGFwcHJvYWNoZXMgZmFpbCB0byBtZWV0IHRoZSBzZWNvbmQgcmVxdWlyZW1lbnQuCi0gKgotICogTWVtZW50byBzdXBwb3J0cyBiaW5hcnkgcGVyc2lzdGFuY2Ugd2l0aCBhIHZlcnNpb24gSUQuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBYTUxNZW1lbnRvIGltcGxlbWVudHMgSU1lbWVudG8gewotCXByaXZhdGUgRG9jdW1lbnQgZmFjdG9yeTsKLQlwcml2YXRlIEVsZW1lbnQgZWxlbWVudDsKLQotCS8qKgotCSAqIEFuc3dlciBhIG1lbWVudG8gZm9yIHRoZSBkb2N1bWVudCBhbmQgZWxlbWVudC4gIEZvciBzaW1wbGljaXR5Ci0JICogeW91IHNob3VsZCB1c2UgY3JlYXRlUmVhZFJvb3QgYW5kIGNyZWF0ZVdyaXRlUm9vdCB0byBjcmVhdGUgdGhlIGluaXRpYWwKLQkgKiBtZW1lbnRvcyBvbiBhIGRvY3VtZW50LgotCSAqLwotCXByaXZhdGUgWE1MTWVtZW50byhEb2N1bWVudCBkb2MsIEVsZW1lbnQgZWwpIHsKLQkJZmFjdG9yeSA9IGRvYzsKLQkJZWxlbWVudCA9IGVsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSU1lbWVudG8jY3JlYXRlQ2hpbGQoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJTWVtZW50byBjcmVhdGVDaGlsZChTdHJpbmcgdHlwZSkgewotCQlFbGVtZW50IGNoaWxkID0gZmFjdG9yeS5jcmVhdGVFbGVtZW50KHR5cGUpOwotCQllbGVtZW50LmFwcGVuZENoaWxkKGNoaWxkKTsKLQkJcmV0dXJuIG5ldyBYTUxNZW1lbnRvKGZhY3RvcnksIGNoaWxkKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElNZW1lbnRvI2NyZWF0ZUNoaWxkKFN0cmluZywgU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJTWVtZW50byBjcmVhdGVDaGlsZChTdHJpbmcgdHlwZSwgU3RyaW5nIGlkKSB7Ci0JCUVsZW1lbnQgY2hpbGQgPSBmYWN0b3J5LmNyZWF0ZUVsZW1lbnQodHlwZSk7Ci0JCWNoaWxkLnNldEF0dHJpYnV0ZShUQUdfSUQsIGlkKTsKLQkJZWxlbWVudC5hcHBlbmRDaGlsZChjaGlsZCk7Ci0JCXJldHVybiBuZXcgWE1MTWVtZW50byhmYWN0b3J5LCBjaGlsZCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgRG9jdW1lbnQgZnJvbSBhIFJlYWRlciBhbmQgYW5zd2VyIGEgcm9vdCBtZW1lbnRvIGZvciByZWFkaW5nIAotCSAqIGEgZG9jdW1lbnQuCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBYTUxNZW1lbnRvIGNyZWF0ZVJlYWRSb290KElucHV0U3RyZWFtIGluKSB7Ci0JCURvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCURvY3VtZW50QnVpbGRlckZhY3RvcnkgZmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLQkJCURvY3VtZW50QnVpbGRlciBwYXJzZXIgPSBmYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOwotCQkJZG9jdW1lbnQgPSBwYXJzZXIucGFyc2UobmV3IElucHV0U291cmNlKGluKSk7Ci0JCQlOb2RlIG5vZGUgPSBkb2N1bWVudC5nZXRGaXJzdENoaWxkKCk7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpCi0JCQkJcmV0dXJuIG5ldyBYTUxNZW1lbnRvKGRvY3VtZW50LCAoRWxlbWVudCkgbm9kZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJaW4uY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIEFuc3dlciBhIHJvb3QgbWVtZW50byBmb3Igd3JpdGluZyBhIGRvY3VtZW50LgotCSAqIAotCSAqIEBwYXJhbSB0eXBlIGEgdHlwZQotCSAqIEByZXR1cm4gYSBtZW1lbnRvCi0JICovCi0JcHVibGljIHN0YXRpYyBYTUxNZW1lbnRvIGNyZWF0ZVdyaXRlUm9vdChTdHJpbmcgdHlwZSkgewotCQlEb2N1bWVudCBkb2N1bWVudDsKLQkJdHJ5IHsKLQkJCWRvY3VtZW50ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld0RvY3VtZW50QnVpbGRlcigpLm5ld0RvY3VtZW50KCk7Ci0JCQlFbGVtZW50IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHR5cGUpOwotCQkJZG9jdW1lbnQuYXBwZW5kQ2hpbGQoZWxlbWVudCk7Ci0JCQlyZXR1cm4gbmV3IFhNTE1lbWVudG8oZG9jdW1lbnQsIGVsZW1lbnQpOyAgICAgICAgICAgIAotCQl9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBFcnJvcihlKTsKLQkJfQotCX0KLQkKLQkvKgotCSAqIEBzZWUgSU1lbWVudG8KLQkgKi8KLQlwdWJsaWMgSU1lbWVudG8gZ2V0Q2hpbGQoU3RyaW5nIHR5cGUpIHsKLQkJLy8gR2V0IHRoZSBub2Rlcy4KLQkJTm9kZUxpc3Qgbm9kZXMgPSBlbGVtZW50LmdldENoaWxkTm9kZXMoKTsKLQkJaW50IHNpemUgPSBub2Rlcy5nZXRMZW5ndGgoKTsKLQkJaWYgKHNpemUgPT0gMCkKLQkJCXJldHVybiBudWxsOwotCQotCQkvLyBGaW5kIHRoZSBmaXJzdCBub2RlIHdoaWNoIGlzIGEgY2hpbGQgb2YgdGhpcyBub2RlLgotCQlmb3IgKGludCBuWCA9IDA7IG5YIDwgc2l6ZTsgblggKyspIHsKLQkJCU5vZGUgbm9kZSA9IG5vZGVzLml0ZW0oblgpOwotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0JCQkJRWxlbWVudCBlbGVtZW50MiA9IChFbGVtZW50KW5vZGU7Ci0JCQkJaWYgKGVsZW1lbnQyLmdldE5vZGVOYW1lKCkuZXF1YWxzKHR5cGUpKQotCQkJCQlyZXR1cm4gbmV3IFhNTE1lbWVudG8oZmFjdG9yeSwgZWxlbWVudDIpOwotCQkJfQotCQl9Ci0JCi0JCS8vIEEgY2hpbGQgd2FzIG5vdCBmb3VuZC4KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElNZW1lbnRvCi0JICovCi0JcHVibGljIElNZW1lbnRvIFtdIGdldENoaWxkcmVuKFN0cmluZyB0eXBlKSB7Ci0JCS8vIEdldCB0aGUgbm9kZXMuCi0JCU5vZGVMaXN0IG5vZGVzID0gZWxlbWVudC5nZXRDaGlsZE5vZGVzKCk7Ci0JCWludCBzaXplID0gbm9kZXMuZ2V0TGVuZ3RoKCk7Ci0JCWlmIChzaXplID09IDApCi0JCQlyZXR1cm4gbmV3IElNZW1lbnRvWzBdOwotCQotCQkvLyBFeHRyYWN0IGVhY2ggbm9kZSB3aXRoIGdpdmVuIHR5cGUuCi0JCUFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdChzaXplKTsKLQkJZm9yIChpbnQgblggPSAwOyBuWCA8IHNpemU7IG5YICsrKSB7Ci0JCQlOb2RlIG5vZGUgPSBub2Rlcy5pdGVtKG5YKTsKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJCUVsZW1lbnQgZWxlbWVudDIgPSAoRWxlbWVudClub2RlOwotCQkJCWlmIChlbGVtZW50Mi5nZXROb2RlTmFtZSgpLmVxdWFscyh0eXBlKSkKLQkJCQkJbGlzdC5hZGQoZWxlbWVudDIpOwotCQkJfQotCQl9Ci0JCi0JCS8vIENyZWF0ZSBhIG1lbWVudG8gZm9yIGVhY2ggbm9kZS4KLQkJc2l6ZSA9IGxpc3Quc2l6ZSgpOwotCQlJTWVtZW50byBbXSByZXN1bHRzID0gbmV3IElNZW1lbnRvW3NpemVdOwotCQlmb3IgKGludCB4ID0gMDsgeCA8IHNpemU7IHggKyspIHsKLQkJCXJlc3VsdHNbeF0gPSBuZXcgWE1MTWVtZW50byhmYWN0b3J5LCAoRWxlbWVudClsaXN0LmdldCh4KSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdHM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjb250ZW50cyBvZiB0aGlzIG1lbWVudG8gYXMgYSBieXRlIGFycmF5LgotCSAqCi0JICogQHJldHVybiBieXRlW10KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFueXRoaW5nIGdvZXMgd3JvbmcKLQkgKi8KLQlwdWJsaWMgYnl0ZVtdIGdldENvbnRlbnRzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJc2F2ZShvdXQpOwotCQlyZXR1cm4gb3V0LnRvQnl0ZUFycmF5KCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBpbnB1dCBzdHJlYW0gZm9yIHdyaXRpbmcgdG8gdGhlIGRpc2sgd2l0aCBhIGxvY2FsIGxvY2FsZS4KLQkgKgotCSAqIEByZXR1cm4gamF2YS5pby5JbnB1dFN0cmVhbQotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYW55dGhpbmcgZ29lcyB3cm9uZwotCSAqLwotCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCXNhdmUob3V0KTsKLQkJcmV0dXJuIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvdXQudG9CeXRlQXJyYXkoKSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElNZW1lbnRvCi0JICovCi0JcHVibGljIEZsb2F0IGdldEZsb2F0KFN0cmluZyBrZXkpIHsKLQkJQXR0ciBhdHRyID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVOb2RlKGtleSk7Ci0JCWlmIChhdHRyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgCi0JCVN0cmluZyBzdHJWYWx1ZSA9IGF0dHIuZ2V0VmFsdWUoKTsKLQkJdHJ5IHsKLQkJCXJldHVybiBuZXcgRmxvYXQoc3RyVmFsdWUpOwotCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgSU1lbWVudG8KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoVEFHX0lEKTsKLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIElNZW1lbnRvCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gZWxlbWVudC5nZXROb2RlTmFtZSgpOwotCX0KLQotCS8qCi0JICogQHNlZSBJTWVtZW50bwotCSAqLwotCXB1YmxpYyBJbnRlZ2VyIGdldEludGVnZXIoU3RyaW5nIGtleSkgewotCQlBdHRyIGF0dHIgPSBlbGVtZW50LmdldEF0dHJpYnV0ZU5vZGUoa2V5KTsKLQkJaWYgKGF0dHIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAKLQkJU3RyaW5nIHN0clZhbHVlID0gYXR0ci5nZXRWYWx1ZSgpOwotCQl0cnkgewotCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKHN0clZhbHVlKTsKLQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElNZW1lbnRvCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgewotCQlBdHRyIGF0dHIgPSBlbGVtZW50LmdldEF0dHJpYnV0ZU5vZGUoa2V5KTsKLQkJaWYgKGF0dHIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAKLQkJcmV0dXJuIGF0dHIuZ2V0VmFsdWUoKTsKLQl9Ci0JCi0JcHVibGljIExpc3QgZ2V0TmFtZXMoKSB7Ci0JCU5hbWVkTm9kZU1hcCBtYXAgPSBlbGVtZW50LmdldEF0dHJpYnV0ZXMoKTsKLQkJaW50IHNpemUgPSBtYXAuZ2V0TGVuZ3RoKCk7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCU5vZGUgbm9kZSA9IG1hcC5pdGVtKGkpOwotCQkJU3RyaW5nIG5hbWUgPSBub2RlLmdldE5vZGVOYW1lKCk7Ci0JCQlsaXN0LmFkZChuYW1lKTsKLQkJfQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkcyBhIG1lbWVudG8gZnJvbSB0aGUgZ2l2ZW4gZmlsZW5hbWUuCi0JICoKLQkgKiBAcGFyYW0gZmlsZW5hbWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UudWkuSU1lbWVudG8KLQkgKiBAZXhjZXB0aW9uIGphdmEuaW8uSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElNZW1lbnRvIGxvYWRNZW1lbnRvKFN0cmluZyBmaWxlbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIFhNTE1lbWVudG8uY3JlYXRlUmVhZFJvb3QobmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlbmFtZSkpOwotCX0KLQotCS8qCi0JICogQHNlZSBJTWVtZW50bwotCSAqLwotCXByaXZhdGUgdm9pZCBwdXRFbGVtZW50KEVsZW1lbnQgZWxlbWVudDIpIHsKLQkJTmFtZWROb2RlTWFwIG5vZGVNYXAgPSBlbGVtZW50Mi5nZXRBdHRyaWJ1dGVzKCk7Ci0JCWludCBzaXplID0gbm9kZU1hcC5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspewotCQkJQXR0ciBhdHRyID0gKEF0dHIpbm9kZU1hcC5pdGVtKGkpOwotCQkJcHV0U3RyaW5nKGF0dHIuZ2V0TmFtZSgpLGF0dHIuZ2V0VmFsdWUoKSk7Ci0JCX0KLQkJCi0JCU5vZGVMaXN0IG5vZGVzID0gZWxlbWVudDIuZ2V0Q2hpbGROb2RlcygpOwotCQlzaXplID0gbm9kZXMuZ2V0TGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSArKykgewotCQkJTm9kZSBub2RlID0gbm9kZXMuaXRlbShpKTsKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJCVhNTE1lbWVudG8gY2hpbGQgPSAoWE1MTWVtZW50byljcmVhdGVDaGlsZChub2RlLmdldE5vZGVOYW1lKCkpOwotCQkJCWNoaWxkLnB1dEVsZW1lbnQoKEVsZW1lbnQpbm9kZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgSU1lbWVudG8KLQkgKi8KLQlwdWJsaWMgdm9pZCBwdXRGbG9hdChTdHJpbmcga2V5LCBmbG9hdCBmKSB7Ci0JCWVsZW1lbnQuc2V0QXR0cmlidXRlKGtleSwgU3RyaW5nLnZhbHVlT2YoZikpOwotCX0KLQotCS8qCi0JICogQHNlZSBJTWVtZW50bwotCSAqLwotCXB1YmxpYyB2b2lkIHB1dEludGVnZXIoU3RyaW5nIGtleSwgaW50IG4pIHsKLQkJZWxlbWVudC5zZXRBdHRyaWJ1dGUoa2V5LCBTdHJpbmcudmFsdWVPZihuKSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElNZW1lbnRvCi0JICovCi0JcHVibGljIHZvaWQgcHV0TWVtZW50byhJTWVtZW50byBtZW1lbnRvKSB7Ci0JCVhNTE1lbWVudG8geG1sTWVtZW50byA9IChYTUxNZW1lbnRvKSBtZW1lbnRvOwotCQlwdXRFbGVtZW50KHhtbE1lbWVudG8uZWxlbWVudCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElNZW1lbnRvCi0JICovCi0JcHVibGljIHZvaWQgcHV0U3RyaW5nKFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgewotCQlpZiAodmFsdWUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZWxlbWVudC5zZXRBdHRyaWJ1dGUoa2V5LCB2YWx1ZSk7Ci0JfQotCQotCS8qKgotCSAqIFNhdmUgdGhpcyBNZW1lbnRvIHRvIGEgV3JpdGVyLgotCSAqIAotCSAqIEBwYXJhbSBvcyBhbiBvdXRwdXQgc3RyZWFtCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbnl0aGluZyBnb2VzIHdyb25nCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZShPdXRwdXRTdHJlYW0gb3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVJlc3VsdCByZXN1bHQgPSBuZXcgU3RyZWFtUmVzdWx0KG9zKTsKLQkJU291cmNlIHNvdXJjZSA9IG5ldyBET01Tb3VyY2UoZmFjdG9yeSk7Ci0JCXRyeSB7Ci0JCQlUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1RyYW5zZm9ybWVyKCk7Ci0JCQl0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLklOREVOVCwgInllcyIpOwotCQkJdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5NRVRIT0QsICJ4bWwiKTsKLQkJCXRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuRU5DT0RJTkcsICJVVEYtOCIpOwotCQkJdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoIntodHRwOi8veG1sLmFwYWNoZS5vcmcveGFsYW59aW5kZW50LWFtb3VudCIsICIyIik7Ci0JCQl0cmFuc2Zvcm1lci50cmFuc2Zvcm0oc291cmNlLCByZXN1bHQpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgKElPRXhjZXB0aW9uKSAobmV3IElPRXhjZXB0aW9uKCkuaW5pdENhdXNlKGUpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNhdmVzIHRoZSBtZW1lbnRvIHRvIHRoZSBnaXZlbiBmaWxlLgotCSAqCi0JICogQHBhcmFtIGZpbGVuYW1lIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAZXhjZXB0aW9uIGphdmEuaW8uSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlVG9GaWxlKFN0cmluZyBmaWxlbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJRmlsZU91dHB1dFN0cmVhbSB3ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXcgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlbmFtZSk7Ci0JCQlzYXZlKHcpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmICh3ICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQl3LmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gaWdub3JlCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCS8qCi0JICogQHNlZSBJTWVtZW50byNnZXRCb29sZWFuKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBnZXRCb29sZWFuKFN0cmluZyBrZXkpIHsKLQkJQXR0ciBhdHRyID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVOb2RlKGtleSk7Ci0JCWlmIChhdHRyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nIHN0clZhbHVlID0gYXR0ci5nZXRWYWx1ZSgpOwotCQlpZiAoInRydWUiLmVxdWFsc0lnbm9yZUNhc2Uoc3RyVmFsdWUpKQotCQkJcmV0dXJuIG5ldyBCb29sZWFuKHRydWUpOwotCQlyZXR1cm4gbmV3IEJvb2xlYW4oZmFsc2UpOwotCX0KLQotCS8qCi0JICogQHNlZSBJTWVtZW50byNwdXRCb29sZWFuKFN0cmluZywgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBwdXRCb29sZWFuKFN0cmluZyBrZXksIGJvb2xlYW4gdmFsdWUpIHsKLQkJZWxlbWVudC5zZXRBdHRyaWJ1dGUoa2V5LCB2YWx1ZSA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zamF2YWNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL2NhY3R1cy9DYWN0dXNMYXVuY2hhYmxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zamF2YWNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL2NhY3R1cy9DYWN0dXNMYXVuY2hhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlMmY0NDcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc2phdmFjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9jYWN0dXMvQ2FjdHVzTGF1bmNoYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcywgSW5jLiBhbmQgb3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIERhbmllbCBSLiBTb21lcmZpZWxkIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLmludGVybmFsLmNhY3R1czsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLS8qKgotICoKLSAqLwotcHVibGljIGNsYXNzIENhY3R1c0xhdW5jaGFibGUgewotCXByaXZhdGUgU3RyaW5nIGZQcm9qZWN0bmFtZTsKLQlwcml2YXRlIFN0cmluZyBmQ2xhc3NOYW1lOwotCXByaXZhdGUgU3RyaW5nIGZUZXN0TmFtZTsKLQlwcml2YXRlIFVSTCBmQ2FjdHVzVVJMOwotCi0JcHVibGljIENhY3R1c0xhdW5jaGFibGUoU3RyaW5nIHByb2plY3ROYW1lLCBTdHJpbmcgY2xhc3NOYW1lLCBTdHJpbmcgdGVzdE5hbWUsIFVSTCBjYWN0dXNVUkwpIHsKLQkJZlByb2plY3RuYW1lID0gcHJvamVjdE5hbWU7Ci0JCWZDbGFzc05hbWUgPSBjbGFzc05hbWU7Ci0JCWZUZXN0TmFtZSA9IHRlc3ROYW1lOwotCQlmQ2FjdHVzVVJMID0gY2FjdHVzVVJMOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGVzdENsYXNzTmFtZSgpIHsKLQkJcmV0dXJuIGZDbGFzc05hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXN0TmFtZSgpIHsKLQkJcmV0dXJuIGZUZXN0TmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFByb2plY3ROYW1lKCkgewotCQlyZXR1cm4gZlByb2plY3RuYW1lOwotCX0KLQotCXB1YmxpYyBVUkwgZ2V0Q2FjdHVzVVJMKCkgewotCQlyZXR1cm4gZkNhY3R1c1VSTDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc2phdmFjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9jYWN0dXMvQ2FjdHVzTGF1bmNoYWJsZUFkYXB0ZXJEZWxlZ2F0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc2phdmFjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9jYWN0dXMvQ2FjdHVzTGF1bmNoYWJsZUFkYXB0ZXJEZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjM0MTQ5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NqYXZhY29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvY2FjdHVzL0NhY3R1c0xhdW5jaGFibGVBZGFwdGVyRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMsIEluYy4gYW5kIG90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBEYW5pZWwgUi4gU29tZXJmaWVsZCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5jYWN0dXM7Ci0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5KYXZhU2VydmVyUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklVUkxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuTGF1bmNoYWJsZUFkYXB0ZXJEZWxlZ2F0ZTsKLS8qKgotICoKLSAqLwotcHVibGljIGNsYXNzIENhY3R1c0xhdW5jaGFibGVBZGFwdGVyRGVsZWdhdGUgZXh0ZW5kcyBMYXVuY2hhYmxlQWRhcHRlckRlbGVnYXRlIHsKLQlwdWJsaWMgT2JqZWN0IGdldExhdW5jaGFibGUoSVNlcnZlciBzZXJ2ZXIsIElNb2R1bGVBcnRpZmFjdCBtb2R1bGVBcnRpZmFjdCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAobW9kdWxlQXJ0aWZhY3QgaW5zdGFuY2VvZiBXZWJUZXN0YWJsZVJlc291cmNlKSB7Ci0JCQlXZWJUZXN0YWJsZVJlc291cmNlIHJlc291cmNlID0gKFdlYlRlc3RhYmxlUmVzb3VyY2UpIG1vZHVsZUFydGlmYWN0OwotCQkJVVJMIHVybCA9ICgoSVVSTFByb3ZpZGVyKSBzZXJ2ZXIuZ2V0QWRhcHRlcihJVVJMUHJvdmlkZXIuY2xhc3MpKQotCQkJCQkuZ2V0TW9kdWxlUm9vdFVSTChyZXNvdXJjZS5nZXRNb2R1bGUoKSk7Ci0JCQkKLQkJCVN0cmluZyB1cmxTdHJpbmcgPSB1cmwudG9TdHJpbmcoKTsKLQkJCWlmICh1cmxTdHJpbmcuZW5kc1dpdGgoIi8iKSkgewotCQkJCXRyeSB7Ci0JCQkJCXVybCA9IG5ldyBVUkwodXJsU3RyaW5nLnN1YnN0cmluZygwLCB1cmxTdHJpbmcubGVuZ3RoKCkgLSAxKSk7Ci0JCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCQkJSmF2YVNlcnZlclBsdWdpbi5sb2coZSk7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBuZXcgQ2FjdHVzTGF1bmNoYWJsZShyZXNvdXJjZS5nZXRQcm9qZWN0TmFtZSgpLAotCQkJCQlyZXNvdXJjZS5nZXRDbGFzc05hbWUoKSwgcmVzb3VyY2UuZ2V0VGVzdE5hbWUoKSwgdXJsKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc2phdmFjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9jYWN0dXMvQ2FjdHVzTW9kdWxlQXJ0aWZhY3RBZGFwdGVyRGVsZWdhdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NqYXZhY29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvY2FjdHVzL0NhY3R1c01vZHVsZUFydGlmYWN0QWRhcHRlckRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlODE5NmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc2phdmFjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9jYWN0dXMvQ2FjdHVzTW9kdWxlQXJ0aWZhY3RBZGFwdGVyRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zLCBJbmMuIGFuZCBvdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgRGFuaWVsIFIuIFNvbWVyZmllbGQgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuY2FjdHVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZUhpZXJhcmNoeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuU2lnbmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5UcmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZUFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5Nb2R1bGVBcnRpZmFjdEFkYXB0ZXJEZWxlZ2F0ZTsKLS8qKgotICoKLSAqLwotcHVibGljIGNsYXNzIENhY3R1c01vZHVsZUFydGlmYWN0QWRhcHRlckRlbGVnYXRlIGV4dGVuZHMgTW9kdWxlQXJ0aWZhY3RBZGFwdGVyRGVsZWdhdGUgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWTEVUX1RFU1RfQ0FTRV9UWVBFID0gIm9yZy5hcGFjaGUuY2FjdHVzLlNlcnZsZXRUZXN0Q2FzZSI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VJVEVfTUVUSE9EID0gInN1aXRlIjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0NMQVNTX05BTUUgPSAianVuaXQuZnJhbWV3b3JrLlRlc3QiOwotCi0JcHVibGljIElNb2R1bGVBcnRpZmFjdCBnZXRNb2R1bGVBcnRpZmFjdChPYmplY3Qgb2JqKSB7Ci0JCVN0cmluZyBtZXRob2ROYW1lID0gIiI7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBJTWV0aG9kKSB7Ci0JCQlJTWV0aG9kIG1ldGhvZCA9IChJTWV0aG9kKSBvYmo7Ci0JCQltZXRob2ROYW1lID0gbWV0aG9kLmdldEVsZW1lbnROYW1lKCk7Ci0JCQlvYmogPSBtZXRob2QuZ2V0Q29tcGlsYXRpb25Vbml0KCk7Ci0JCX0KLQkJaWYgKG9iaiBpbnN0YW5jZW9mIElBZGFwdGFibGUpIHsKLQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IChJUmVzb3VyY2UpICgoSUFkYXB0YWJsZSkgb2JqKS5nZXRBZGFwdGVyKElSZXNvdXJjZS5jbGFzcyk7Ci0JCQlTdHJpbmcgdGVzdENsYXNzTmFtZSA9IGdldENsYXNzTmFtZUZvclR5cGUocmVzb3VyY2UsIFNFUlZMRVRfVEVTVF9DQVNFX1RZUEUpOwotCQkJU3RyaW5nIHByb2plY3ROYW1lID0gcmVzb3VyY2UuZ2V0UHJvamVjdCgpLmdldE5hbWUoKTsKLQkJCWlmICh0ZXN0Q2xhc3NOYW1lICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gbmV3IFdlYlRlc3RhYmxlUmVzb3VyY2UoZ2V0TW9kdWxlKHJlc291cmNlLmdldFByb2plY3QoKSksIGZhbHNlLAotCQkJCQkJcHJvamVjdE5hbWUsIHRlc3RDbGFzc05hbWUsIG1ldGhvZE5hbWUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldENsYXNzTmFtZUZvclR5cGUoSVJlc291cmNlIHJlc291cmNlLCBTdHJpbmcgc3VwZXJUeXBlKSB7Ci0JCWlmIChyZXNvdXJjZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXRyeSB7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gcmVzb3VyY2UuZ2V0UHJvamVjdCgpOwotCQkJSVBhdGggcGF0aCA9IHJlc291cmNlLmdldEZ1bGxQYXRoKCk7Ci0JCQlpZiAoIXByb2plY3QuaGFzTmF0dXJlKEphdmFDb3JlLk5BVFVSRV9JRCkgfHwgcGF0aCA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCi0JCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSAoSUphdmFQcm9qZWN0KSBwcm9qZWN0LmdldE5hdHVyZShKYXZhQ29yZS5OQVRVUkVfSUQpOwotCQkJaWYgKCFqYXZhUHJvamVjdC5pc09wZW4oKSkKLQkJCQlqYXZhUHJvamVjdC5vcGVuKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCi0JCQkvLyBvdXRwdXQgbG9jYXRpb24gbWF5IG5vdCBiZSBvbiBjbGFzc3BhdGgKLQkJCUlQYXRoIG91dHB1dFBhdGggPSBqYXZhUHJvamVjdC5nZXRPdXRwdXRMb2NhdGlvbigpOwotCQkJaWYgKG91dHB1dFBhdGggIT0gbnVsbAotCQkJCQkmJiAiY2xhc3MiLmVxdWFscyhwYXRoLmdldEZpbGVFeHRlbnNpb24oKSkgJiYgb3V0cHV0UGF0aC5pc1ByZWZpeE9mKHBhdGgpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlpbnQgY291bnQgPSBvdXRwdXRQYXRoLnNlZ21lbnRDb3VudCgpOwotCQkJCXBhdGggPSBwYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMoY291bnQpOwotCQkJfQotCQkJCi0JCQkvLyByZW1vdmUgaW5pdGlhbCBwYXJ0IG9mIGNsYXNzcGF0aAotCQkJSUNsYXNzcGF0aEVudHJ5W10gY2xhc3NQYXRoRW50cnkgPSBqYXZhUHJvamVjdC5nZXRSZXNvbHZlZENsYXNzcGF0aCh0cnVlKTsKLQkJCWlmIChjbGFzc1BhdGhFbnRyeSAhPSBudWxsKSB7Ci0JCQkJaW50IHNpemUgPSBjbGFzc1BhdGhFbnRyeS5sZW5ndGg7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQkJSVBhdGggY2xhc3NQYXRoID0gY2xhc3NQYXRoRW50cnlbaV0uZ2V0UGF0aCgpOwotCQkJCQlpZiAoY2xhc3NQYXRoLmlzUHJlZml4T2YocGF0aCkpIHsKLQkJCQkJCWludCBjb3VudCA9IGNsYXNzUGF0aC5zZWdtZW50Q291bnQoKTsKLQkJCQkJCXBhdGggPSBwYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMoY291bnQpOwotCQkJCQkJaSArPSBzaXplOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJCi0JCQkvLyBnZXQgamF2YSBlbGVtZW50Ci0JCQlJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQgPSBqYXZhUHJvamVjdC5maW5kRWxlbWVudChwYXRoKTsKLQkJCUlUeXBlW10gdHlwZXMgPSBnZXRUeXBlcyhqYXZhRWxlbWVudCk7Ci0JCQlpZiAodHlwZXMgIT0gbnVsbCkgewotCQkJCWludCBzaXplMiA9IHR5cGVzLmxlbmd0aDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemUyOyBpKyspIHsKLQkJCQkJaWYgKGhhc1N1cGVyY2xhc3ModHlwZXNbaV0sIHN1cGVyVHlwZSkgfHwgaGFzU3VpdGVNZXRob2QodHlwZXNbaV0pKQotCQkJCQkJcmV0dXJuIHR5cGVzW2ldLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIlVuZXhwZWN0ZWQgZXhjZXB0aW9uOiAiICsgZSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaGFzU3VpdGVNZXRob2QoSVR5cGUgdHlwZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlNZXRob2RbXSBtZXRob2RzID0gdHlwZS5nZXRNZXRob2RzKCk7Ci0JCWludCBzaXplID0gbWV0aG9kcy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlJTWV0aG9kIG1ldGhvZCA9IG1ldGhvZHNbaV07Ci0JCQlpZiAobWV0aG9kLmdldFBhcmFtZXRlck5hbWVzKCkubGVuZ3RoID09IDAgJiYgbWV0aG9kLmdldEVsZW1lbnROYW1lKCkuZXF1YWxzKFNVSVRFX01FVEhPRCkpIHsKLQkJCQlTdHJpbmcgcmV0dXJuVHlwZSA9IGdldEZ1bGx5UXVhbGlmaWVkVHlwZUZvck1hbmdsZWRUeXBlKG1ldGhvZC5nZXRSZXR1cm5UeXBlKCksIHR5cGUpOwotCQkJCWlmIChURVNUX0NMQVNTX05BTUUuZXF1YWxzKHJldHVyblR5cGUpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSVR5cGVbXSBnZXRUeXBlcyhJSmF2YUVsZW1lbnQgZWxlbWVudCkgewotCQl0cnkgewotCQkJaWYgKGVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSAhPSBJSmF2YUVsZW1lbnQuQ09NUElMQVRJT05fVU5JVCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXJldHVybiAoKElDb21waWxhdGlvblVuaXQpIGVsZW1lbnQpLmdldEFsbFR5cGVzKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNTdXBlcmNsYXNzKElUeXBlIHR5cGUsIFN0cmluZyBzdXBlckNsYXNzTmFtZSkgewotCQl0cnkgewotCQkJSVR5cGVIaWVyYXJjaHkgaGllcmFyY2h5ID0gdHlwZS5uZXdTdXBlcnR5cGVIaWVyYXJjaHkobnVsbCk7Ci0JCQlJVHlwZVtdIHN1cGVyQ2xhc3NlcyA9IGhpZXJhcmNoeS5nZXRBbGxTdXBlcmNsYXNzZXModHlwZSk7Ci0JCQlpbnQgc2l6ZSA9IHN1cGVyQ2xhc3Nlcy5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCWlmIChzdXBlckNsYXNzTmFtZS5lcXVhbHMoc3VwZXJDbGFzc2VzW2ldLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKSkgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgSU1vZHVsZSBnZXRNb2R1bGUoSVByb2plY3QgcHJvamVjdCkgewotCQlJTW9kdWxlIGRlcGxveWFibGUgPSBudWxsOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IEFycmF5cy5hc0xpc3QoU2VydmVyVXRpbC5nZXRNb2R1bGVzKCJqc3Qud2ViIikpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBuZXh0ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKG5leHQgaW5zdGFuY2VvZiBJTW9kdWxlKSB7Ci0JCQkJZGVwbG95YWJsZSA9IChJTW9kdWxlKSBuZXh0OwotCQkJCWlmIChkZXBsb3lhYmxlLmdldFByb2plY3QoKS5lcXVhbHMocHJvamVjdCkpCi0JCQkJCXJldHVybiBkZXBsb3lhYmxlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRGdWxseVF1YWxpZmllZFR5cGVGb3JNYW5nbGVkVHlwZShTdHJpbmcgdHlwZSwKLQkJCUlUeXBlIGRlY2xhcmluZ1R5cGUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQl0eXBlID0gU2lnbmF0dXJlLnRvU3RyaW5nKHR5cGUpOwotCQlyZXR1cm4gZ2V0RnVsbHlRdWFsaWZpZWRUeXBlRm9yVHlwZSh0eXBlLCBkZWNsYXJpbmdUeXBlKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWRUeXBlRm9yVHlwZShTdHJpbmcgdHlwZSwgSVR5cGUgZGVjbGFyaW5nVHlwZSkKLQkJCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlTdHJpbmdbXVtdIHJlc29sdmVkVHlwZXMgPSBkZWNsYXJpbmdUeXBlLnJlc29sdmVUeXBlKHR5cGUpOwotCQkvL1RPRE86IEFyZSB0aGVyZSBsZWdpdCBjYXNlcyB3aGVyZSB0aGlzIHdvdWxkIG5vdCBiZSB0aGUgY2FzZT8gV2UgbWlnaHQgbmVlZCB0byBjaGVjawotCQkvL2ZvciB0aGlzIGFuZCBib21iIG91dCBpZiB0aGUgdHlwZSBjYW5ub3QgYmUgdW5hbWJpZ2lvdXNseSByZXNvbHZlZAotCQlpZiAocmVzb2x2ZWRUeXBlcy5sZW5ndGggIT0gMSkKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJUaGUgdHlwZSBjYW5ub3QgYmUgdW5hbWJpZ2lvdXNseSByZXNvbHZlZC4gTmVlZCB0byBoYW5kbGUgdGhpcyBjYXNlIik7Ci0JCVN0cmluZ1tdIHJlc29sdmVkVHlwZSA9IHJlc29sdmVkVHlwZXNbMF07Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzb2x2ZWRUeXBlLmxlbmd0aCAtIDE7IGkrKykgewotCQkJYnVmZmVyLmFwcGVuZChyZXNvbHZlZFR5cGVbaV0pOwotCQkJYnVmZmVyLmFwcGVuZCgnLicpOwotCQl9Ci0KLQkJYnVmZmVyLmFwcGVuZChyZXNvbHZlZFR5cGVbcmVzb2x2ZWRUeXBlLmxlbmd0aCAtIDFdKTsKLQotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NqYXZhY29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvY2FjdHVzL1NlcnZsZXRUZXN0Q2FzZVByb3BlcnR5VGVzdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zamF2YWNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL2ludGVybmFsL2NhY3R1cy9TZXJ2bGV0VGVzdENhc2VQcm9wZXJ0eVRlc3Rlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2I2YzUyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NqYXZhY29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvY2FjdHVzL1NlcnZsZXRUZXN0Q2FzZVByb3BlcnR5VGVzdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zLCBJbmMuIGFuZCBvdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgRGFuaWVsIFIuIFNvbWVyZmllbGQgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuY2FjdHVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5Qcm9wZXJ0eVRlc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLlNpZ25hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuSmF2YVNlcnZlclBsdWdpbjsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2bGV0VGVzdENhc2VQcm9wZXJ0eVRlc3RlciBleHRlbmRzIFByb3BlcnR5VGVzdGVyIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9JU19TRVJWTEVUX1RFU1RfQ0FTRSA9ICJpc1NlcnZsZXRUZXN0Q2FzZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfU1VQRVJDTEFTU19OQU1FID0gIm9yZy5hcGFjaGUuY2FjdHVzLlNlcnZsZXRUZXN0Q2FzZSI7Ci0KLQlwdWJsaWMgYm9vbGVhbiB0ZXN0KE9iamVjdCByZWNlaXZlciwgU3RyaW5nIG1ldGhvZCwgT2JqZWN0W10gYXJncywgT2JqZWN0IGV4cGVjdGVkVmFsdWUpIHsKLQkJSUphdmFFbGVtZW50IGphdmFFbGVtZW50ID0gbnVsbDsKLQkJaWYgKHJlY2VpdmVyIGluc3RhbmNlb2YgSUFkYXB0YWJsZSkgewotCQkJamF2YUVsZW1lbnQgPSAoSUphdmFFbGVtZW50KSAoKElBZGFwdGFibGUpIHJlY2VpdmVyKS5nZXRBZGFwdGVyKElKYXZhRWxlbWVudC5jbGFzcyk7Ci0JCX0KLQkJaWYgKGphdmFFbGVtZW50ICE9IG51bGwpIHsKLQkJCWlmICghamF2YUVsZW1lbnQuZXhpc3RzKCkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJaWYgKGphdmFFbGVtZW50IGluc3RhbmNlb2YgSUphdmFQcm9qZWN0Ci0JCQkJfHwgamF2YUVsZW1lbnQgaW5zdGFuY2VvZiBJUGFja2FnZUZyYWdtZW50Um9vdAotCQkJCXx8IGphdmFFbGVtZW50IGluc3RhbmNlb2YgSVBhY2thZ2VGcmFnbWVudCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKGphdmFFbGVtZW50ICE9IG51bGwpIHsKLQkJCWlmIChQUk9QRVJUWV9JU19TRVJWTEVUX1RFU1RfQ0FTRS5lcXVhbHMobWV0aG9kKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIGlzU2VydmxldFRlc3RDYXNlKGphdmFFbGVtZW50KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzU2VydmxldFRlc3RDYXNlKElKYXZhRWxlbWVudCBlbGVtZW50KSB7Ci0JCUlUeXBlIHRlc3RUeXBlID0gbnVsbDsKLQotCQl0cnkgewotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJQ29tcGlsYXRpb25Vbml0KSB7Ci0JCQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IChJQ29tcGlsYXRpb25Vbml0KSBlbGVtZW50OwotCQkJCXRlc3RUeXBlID0gY3UuZ2V0VHlwZShTaWduYXR1cmUuZ2V0UXVhbGlmaWVyKGN1LmdldEVsZW1lbnROYW1lKCkpKTsKLQkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElDbGFzc0ZpbGUpIHsKLQkJCQl0ZXN0VHlwZSA9ICgoSUNsYXNzRmlsZSkgZWxlbWVudCkuZ2V0VHlwZSgpOwotCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSVR5cGUpIHsKLQkJCQl0ZXN0VHlwZSA9IChJVHlwZSkgZWxlbWVudDsKLQkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElNZW1iZXIpIHsKLQkJCQl0ZXN0VHlwZSA9ICgoSU1lbWJlcikgZWxlbWVudCkuZ2V0RGVjbGFyaW5nVHlwZSgpOwotCQkJfQotCi0JCQlpZiAodGVzdFR5cGUgIT0gbnVsbCAmJiB0ZXN0VHlwZS5leGlzdHMoKSAmJiBpc1Rlc3RPclN1aXRlKHRlc3RUeXBlKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJLy8gVE9ETzogd2hhdCBkbyB3ZSBkbyBoZXJlPwotCQkJSmF2YVNlcnZlclBsdWdpbi5sb2coZSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSB0ZXN0VHlwZQotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdHlwZSBpcyBhIHRlc3QsIGZhbHNlIG90aGVyd2lzZQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1Rlc3RPclN1aXRlKElUeXBlIHRlc3RUeXBlKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSVR5cGVbXSB0eXBlcyA9IHRlc3RUeXBlLm5ld1N1cGVydHlwZUhpZXJhcmNoeShudWxsKS5nZXRBbGxTdXBlcmNsYXNzZXModGVzdFR5cGUpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAodHlwZXNbaV0uZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkuZXF1YWxzKFRFU1RfU1VQRVJDTEFTU19OQU1FKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc2phdmFjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9jYWN0dXMvV2ViVGVzdGFibGVSZXNvdXJjZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc2phdmFjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9jYWN0dXMvV2ViVGVzdGFibGVSZXNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzYwY2U4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NqYXZhY29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvY2FjdHVzL1dlYlRlc3RhYmxlUmVzb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMsIEluYy4gYW5kIG90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBEYW5pZWwgUi4gU29tZXJmaWVsZCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLmludGVybmFsLmNhY3R1czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlQXJ0aWZhY3Q7Ci0KLXB1YmxpYyBjbGFzcyBXZWJUZXN0YWJsZVJlc291cmNlIGltcGxlbWVudHMgSU1vZHVsZUFydGlmYWN0IHsKLQlwcml2YXRlIElNb2R1bGUgZk1vZHVsZTsKLQlwcml2YXRlIGJvb2xlYW4gZlNlcnZsZXRJc0NvbmZpZ3VyZWQ7Ci0JcHJpdmF0ZSBTdHJpbmcgZkNsYXNzTmFtZTsKLQlwcml2YXRlIFN0cmluZyBmVGVzdE5hbWU7Ci0JcHJpdmF0ZSBTdHJpbmcgZlByb2plY3ROYW1lOwotCi0JcHVibGljIFdlYlRlc3RhYmxlUmVzb3VyY2UoSU1vZHVsZSBtb2R1bGUsIGJvb2xlYW4gc2VydmxldElzQ29uZmlndXJlZCwKLQkJCVN0cmluZyBwcm9qZWN0TmFtZSwgU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nIHRlc3ROYW1lKSB7Ci0JCWZNb2R1bGUgPSBtb2R1bGU7Ci0JCWZTZXJ2bGV0SXNDb25maWd1cmVkID0gc2VydmxldElzQ29uZmlndXJlZDsKLQkJZkNsYXNzTmFtZSA9IGNsYXNzTmFtZTsKLQkJZlRlc3ROYW1lID0gdGVzdE5hbWU7Ci0JCWZQcm9qZWN0TmFtZSA9IHByb2plY3ROYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvamVjdE5hbWUoKSB7Ci0JCXJldHVybiBmUHJvamVjdE5hbWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNTZXJ2bGV0Q29uZmlndXJlZCgpIHsKLQkJcmV0dXJuIGZTZXJ2bGV0SXNDb25maWd1cmVkOwotCX0KLQotCXB1YmxpYyBJTW9kdWxlIGdldE1vZHVsZSgpIHsKLQkJcmV0dXJuIGZNb2R1bGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0JCXJldHVybiBmQ2xhc3NOYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGVzdE5hbWUoKSB7Ci0JCXJldHVybiBmVGVzdE5hbWU7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlL3NqYXZhY29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2NvcmUvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc2phdmFjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkZmEzYzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc2phdmFjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi08aHRtbD4KLTxoZWFkPgotPE1FVEEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uLy4uLy4uLy4uLy9hcGlzdHlsZXMuY3NzIiB0eXBlPSJ0ZXh0L2NzcyI+Ci08dGl0bGU+V1RQIEFQSSBvdmVydmlldzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLTx0YWJsZSB3aWR0aD0iNTAwIj4KLTx0cj4KLTx0ZD4KLTxwPlN1cHBvcnQgZm9yIEphdmEgYW5kIEoyRUUgc2VydmVyIHR5cGVzLjwvcD4KLTwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTx0YWJsZSB3aWR0aD0iNTAwIj4KLTx0cj4KLTx0ZD4KLTxwPlRoZSBDbGFzc3BhdGhSdW50aW1lVGFyZ2V0SGFuZGxlciBjbGFzcyBwcm92aWRlcyBhIGNvbW1vbiBzdWJjbGFzcwotZm9yIHJ1bnRpbWUgdGFyZ2V0IGhhbmRsZXJzIHRoYXQgbmVlZCB0byBtb2RpZnkgYSBwcm9qZWN0J3MgY2xhc3NwYXRoCi13aGVuIGEgcHJvamVjdCBpcyB0YXJnZXR0ZWQgdG8gYSBwYXJ0aWN1bGFyIHJ1bnRpbWUuPC9wPgotPC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPHRhYmxlIHdpZHRoPSI1MDAiPgotPHRyPgotPHRkPgotPHA+SUdlbmVyaWNSdW50aW1lIGFuZCBpdHMgd29ya2luZyBjb3B5IHByb3ZpZGUgdHlwZS1zcGVjaWZpYyBhY2Nlc3MKLXRvIHRoZSBnZW5lcmljIHJ1bnRpbWUgdHlwZS4gV2hlbiB1c2luZyBhIGdlbmVyaWMgcnVudGltZSwgY2xpZW50cyBjYW4KLWFjY2VzcyB0aGUgdHlwZSBzcGVjaWZpYyBpbmZvcm1hdGlvbiBieSBhZGFwdGluZyB0byB0aGVzZSB0eXBlcyB1c2luZwotPHByZT5JR2VuZXJpY1J1bnRpbWUgZ3IgPSAoSUdlbmVyaWNSdW50aW1lKSBydW50aW1lLmdldEFkYXB0ZXIoSUdlbmVyaWNSdW50aW1lLmNsYXNzKTwvcHJlPi4KLUdlbmVyaWNSdW50aW1lVXRpbCBjb250YWlucyBzb21lIHV0aWxpdHkgbWV0aG9kcyBmb3IgaGFuZGxpbmcgdGhlCi1nZW5lcmljIHJ1bnRpbWUgdHlwZS48L3A+Ci08L3RkPgotPC90cj4KLTwvdGFibGU+Ci08dGFibGUgd2lkdGg9IjUwMCI+Ci08dHI+Ci08dGQ+Ci08cD5JRW50ZXJwcmlzZUFwcGxpY2F0aW9uLCBJRUpCTW9kdWxlLCBJV2ViTW9kdWxlLCBJQXBwbGljYXRpb25DbGllbnRNb2R1bGUsCi1hbmQgSUNvbm5lY3Rvck1vZHVsZSBhcmUgSjJFRSBtb2R1bGUgaW50ZXJmYWNlcyBtZWFudCB0byBiZSBpbXBsZW1lbnRlZAotYnkgbW9kdWxlIGRlbGVnYXRlcyB0aGF0IHByb3ZpZGUgSjJFRSBtb2R1bGUgc3VwcG9ydC48L3A+Ci08L3RkPgotPC90cj4KLTwvdGFibGU+Ci08dGFibGUgd2lkdGg9IjUwMCI+Ci08dHI+Ci08dGQ+Ci08cD5JTG9vc2VBcmNoaXZlIGFuZCBJTG9vc2VBcmNoaXZlU3VwcG9ydCBhcmUgbW9kdWxlIGludGVyZmFjZXMgZm9yIG1vZHVsZXMKLXRoYXQgdGFrZSBhZHZhbnRhZ2Ugb2YgbG9vc2UgYXJjaGl2ZSBzdXBwb3J0IC0gYWxsb3dpbmcgSkFScyBjb250YWluZWQgd2l0aGluCi10aGUgbW9kdWxlIHRvIGJlIGF2YWlsYWJsZSBpbiBhIHNlcGFyYXRlIEphdmEgcHJvamVjdCBpbnN0ZWFkIG9mIGRpcmVjdGx5Ci13aXRoaW4gdGhlIG1vZHVsZS48L3A+Ci08L3RkPgotPC90cj4KLTwvdGFibGU+Ci08dGFibGUgd2lkdGg9IjUwMCI+Ci08dHI+Ci08dGQ+Ci08cD5UaGUgcmVtYWluZGVyIG9mIHRoZSBjbGFzc2VzIGluIHRoaXMgcGFja2FnZSBhcmUgbW9kdWxlIGFydGlmYWN0IGFuZAotbGF1bmNoYWJsZSB0eXBlcyB0byBwcm92aWRlIGFjY2VzcyB0byBKMkVFIHJlc291cmNlIHR5cGVzIGZvciB0aGUgc2VydmVyIHRvb2wKLWZyYW1ld29yay48L3A+Ci08L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zamF2YWNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL3BhY2thZ2UueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUvc2phdmFjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvY29yZS9wYWNrYWdlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRjMDUyOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS9zamF2YWNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9jb3JlL3BhY2thZ2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxodG1sPgotPGhlYWQ+Ci0JPCEtLSAgRXNjYXBlIHRvIHRoZSByb290IG9mIHlvdXIgc291cmNlIGZvbGRlciAgLS0+Ci0JPG1ldGEKLQkJbmFtZT0icm9vdCIKLQkJY29udGVudD0iLi4vLi4vLi4vLi4vLi4vIiAvPgotCTx0aXRsZT5XVFAgQVBJIG92ZXJ2aWV3PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHk+Ci0KLTxwPlN1cHBvcnQgZm9yIEphdmEgYW5kIEoyRUUgc2VydmVyIHR5cGVzLjwvcD4KLQotPHA+VGhlIENsYXNzcGF0aFJ1bnRpbWVUYXJnZXRIYW5kbGVyIGNsYXNzIHByb3ZpZGVzIGEgY29tbW9uIHN1YmNsYXNzCi1mb3IgcnVudGltZSB0YXJnZXQgaGFuZGxlcnMgdGhhdCBuZWVkIHRvIG1vZGlmeSBhIHByb2plY3QncyBjbGFzc3BhdGgKLXdoZW4gYSBwcm9qZWN0IGlzIHRhcmdldHRlZCB0byBhIHBhcnRpY3VsYXIgcnVudGltZS48L3A+Ci0KLTxwPklHZW5lcmljUnVudGltZSBhbmQgaXRzIHdvcmtpbmcgY29weSBwcm92aWRlIHR5cGUtc3BlY2lmaWMgYWNjZXNzCi10byB0aGUgZ2VuZXJpYyBydW50aW1lIHR5cGUuIFdoZW4gdXNpbmcgYSBnZW5lcmljIHJ1bnRpbWUsIGNsaWVudHMgY2FuCi1hY2Nlc3MgdGhlIHR5cGUgc3BlY2lmaWMgaW5mb3JtYXRpb24gYnkgYWRhcHRpbmcgdG8gdGhlc2UgdHlwZXMgdXNpbmcKLTxwcmU+SUdlbmVyaWNSdW50aW1lIGdyID0gKElHZW5lcmljUnVudGltZSkgcnVudGltZS5nZXRBZGFwdGVyKElHZW5lcmljUnVudGltZS5jbGFzcyk8L3ByZT4uCi1HZW5lcmljUnVudGltZVV0aWwgY29udGFpbnMgc29tZSB1dGlsaXR5IG1ldGhvZHMgZm9yIGhhbmRsaW5nIHRoZQotZ2VuZXJpYyBydW50aW1lIHR5cGUuPC9wPgotCi08cD5JRW50ZXJwcmlzZUFwcGxpY2F0aW9uLCBJRUpCTW9kdWxlLCBJV2ViTW9kdWxlLCBJQXBwbGljYXRpb25DbGllbnRNb2R1bGUsCi1hbmQgSUNvbm5lY3Rvck1vZHVsZSBhcmUgSjJFRSBtb2R1bGUgaW50ZXJmYWNlcyBtZWFudCB0byBiZSBpbXBsZW1lbnRlZAotYnkgbW9kdWxlIGRlbGVnYXRlcyB0aGF0IHByb3ZpZGUgSjJFRSBtb2R1bGUgc3VwcG9ydC48L3A+Ci0KLTxwPklMb29zZUFyY2hpdmUgYW5kIElMb29zZUFyY2hpdmVTdXBwb3J0IGFyZSBtb2R1bGUgaW50ZXJmYWNlcyBmb3IgbW9kdWxlcwotdGhhdCB0YWtlIGFkdmFudGFnZSBvZiBsb29zZSBhcmNoaXZlIHN1cHBvcnQgLSBhbGxvd2luZyBKQVJzIGNvbnRhaW5lZCB3aXRoaW4KLXRoZSBtb2R1bGUgdG8gYmUgYXZhaWxhYmxlIGluIGEgc2VwYXJhdGUgSmF2YSBwcm9qZWN0IGluc3RlYWQgb2YgZGlyZWN0bHkKLXdpdGhpbiB0aGUgbW9kdWxlLjwvcD4KLQotPHA+VGhlIHJlbWFpbmRlciBvZiB0aGUgY2xhc3NlcyBpbiB0aGlzIHBhY2thZ2UgYXJlIG1vZHVsZSBhcnRpZmFjdCBhbmQKLWxhdW5jaGFibGUgdHlwZXMgdG8gcHJvdmlkZSBhY2Nlc3MgdG8gSjJFRSByZXNvdXJjZSB0eXBlcyBmb3IgdGhlIHNlcnZlciB0b29sCi1mcmFtZXdvcmsuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTFjOGYyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvLmN2c2lnbm9yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ3ODY2Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLWJpbgotYnVpbGQueG1sCi1nZW5lcmljc2VydmVyLmphcgotb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmVfMS4wLjAuamFyCi10ZW1wLmZvbGRlcgotKi5zZXR0aW5ncwotZ2VuZXJpY3NlcnZlcnNyYy56aXAKLUBkb3QKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvLm9wdGlvbnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLy5vcHRpb25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmU3N2FjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSMgRGVidWdnaW5nIG9wdGlvbnMgZm9yIHRoZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlIHBsdWdpbgotCi0jIFR1cm4gb24gZ2VuZXJhbCBkZWJ1Z2dpbmcKLW9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL2RlYnVnPXRydWUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTdlZTA2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE4YzBhOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsLkNvcmVQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsLAotIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsLnB1Ymxpc2hlcnMsCi0gb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLmNvcmUudXRpbCwKLSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLAotIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbCwKLSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLnV0aWwsCi0gb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnhtbCwKLSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUsCi0gb3JnLmVjbGlwc2UuamR0LmNvcmUsCi0gb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZzt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUsCi0gb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLAotIG9yZy5lY2xpcHNlLmFudC51aTtyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZSwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLAotIG9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHM7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCi0gb3JnLmFwYWNoZS5hbnQsCi0gb3JnLmVjbGlwc2UuZGVidWcudWk7cmVzb2x1dGlvbjo9b3B0aW9uYWwKLUVjbGlwc2UtQXV0b1N0YXJ0OiB0cnVlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL2Fib3V0Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNmI5NmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkZlYnJ1YXJ5IDI0LCAyMDA1PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzN2FiODguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0jIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6IEdvcmtlbSBFcmNhbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyAgICAgICAgICAgICAgIAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBzZXJ2ZXJzLyxcCi0gICAgICAgICAgICAgICB4c2QvU2VydmVyVHlwZURlZmluaXRpb25TY2hlbWEueHNkLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKLXNyYy5pbmNsdWRlcyA9IHNlcnZlcnMvLFwKLSAgICAgICAgICAgICAgIHhzZC8sXAotICAgICAgICAgICAgICAgc2NoZW1hLyxcCi0gICAgICAgICAgICAgICBidWlsZC5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhmM2M4Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0jIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6IEdvcmtlbSBFcmNhbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyAgICAgICAgICAgICAgIAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wbHVnaW5OYW1lPSBHZW5lcmljIFNlcnZlciBQbHVnaW4KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotcGx1Z2luRGVzY3JpcHRpb249UHJvdmlkZXMgZ2VuZXJpYyBzZXJ2ZXIgdG9vbHMgd2l0aCBlYXN5IHRvIGRldmVsb3AgbWV0YSBkYXRhIGNvbmZpZ3VyYXRpb24gZmlsZXMKLQotZXh0ZXJuYWxMYXVuY2hDb25maWd1cmF0aW9uVHlwZU5hbWU9R2VuZXJpYyBTZXJ2ZXIKLWxhdW5jaENvbmZpZ3VyYXRpb25UeXBlTmFtZT1HZW5lcmljIFNlcnZlcgotZXh0ZW5zaW9uUG9pbnRTZXJ2ZXJkZWZpbml0aW9uPVNlcnZlciBkZWZpbml0aW9uCi1leHRlbnNpb25Qb2ludEdlbmVyaWNwdWJsaXNoZXI9R2VuZXJpYyBQdWJsaXNoZXIKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9wbHVnaW4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWJiMzdiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0gPGV4dGVuc2lvbi1wb2ludCBpZD0ic2VydmVyZGVmaW5pdGlvbiIgbmFtZT0iJWV4dGVuc2lvblBvaW50U2VydmVyZGVmaW5pdGlvbiIgc2NoZW1hPSJzY2hlbWEvc2VydmVyZGVmaW5pdGlvbi5leHNkIi8+Ci0gPGV4dGVuc2lvbi1wb2ludCBpZD0iZ2VuZXJpY3B1Ymxpc2hlciIgbmFtZT0iJWV4dGVuc2lvblBvaW50R2VuZXJpY3B1Ymxpc2hlciIgc2NoZW1hPSJzY2hlbWEvZ2VuZXJpY3B1Ymxpc2hlci5leHNkIi8+Ci0JCi0gPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZGVidWcuY29yZS5sYXVuY2hDb25maWd1cmF0aW9uVHlwZXMiPgotICAgICA8bGF1bmNoQ29uZmlndXJhdGlvblR5cGUKLSAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmxhdW5jaENvbmZpZ3VyYXRpb25UeXBlIgotICAgICAgICBuYW1lPSIlbGF1bmNoQ29uZmlndXJhdGlvblR5cGVOYW1lIgotICAgICAgICBkZWxlZ2F0ZT0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuaW50ZXJuYWwuR2VuZXJpY1NlcnZlckxhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZSIKLSAgICAgICAgbW9kZXM9InJ1biwgZGVidWciCi0gICAgICAgIHNvdXJjZUxvY2F0b3JJZD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5zb3VyY2VMb2NhdG9yLkphdmFTb3VyY2VMb29rdXBEaXJlY3RvciIKLSAgICAgICAgc291cmNlUGF0aENvbXB1dGVySWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLnNvdXJjZVBhdGhDb21wdXRlciIvPgotICAgICA8bGF1bmNoQ29uZmlndXJhdGlvblR5cGUKLSAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLkV4dGVybmFsTGF1bmNoQ29uZmlndXJhdGlvblR5cGUiCi0gICAgICAgIG5hbWU9IiVleHRlcm5hbExhdW5jaENvbmZpZ3VyYXRpb25UeXBlTmFtZSIKLSAgICAgICAgZGVsZWdhdGU9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsLkV4dGVybmFsTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlIgotICAgICAgICBtb2Rlcz0icnVuLCBkZWJ1ZyIKLSAgICAgICAgc291cmNlTG9jYXRvcklkPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLnNvdXJjZUxvY2F0b3IuSmF2YVNvdXJjZUxvb2t1cERpcmVjdG9yIgotICAgICAgICBzb3VyY2VQYXRoQ29tcHV0ZXJJZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuc291cmNlUGF0aENvbXB1dGVyIi8+Ci0gPC9leHRlbnNpb24+Ci0KLSA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLnNvdXJjZVBhdGhDb21wdXRlcnMiPgotICAgICA8c291cmNlUGF0aENvbXB1dGVyCi0gICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5zb3VyY2VQYXRoQ29tcHV0ZXIiCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5pbnRlcm5hbC5HZW5lcmljU2VydmVyU291cmNlUGF0aENvbXB1dGVyRGVsZWdhdGUiLz4KLSA8L2V4dGVuc2lvbj4KLSAKLSA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubGF1bmNoYWJsZUFkYXB0ZXJzIj4KLSAgICAgIDxsYXVuY2hhYmxlQWRhcHRlcgotICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsLkdlbmVyaWNTZXJ2ZXJMYXVuY2hhYmxlQWRhcHRlckRlbGVnYXRlIgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy53ZWIiLz4KLSA8L2V4dGVuc2lvbj4KLSAKLSA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5nZW5lcmljcHVibGlzaGVyIj4KLSAgICAgIDxnZW5lcmljcHVibGlzaGVyCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuaW50ZXJuYWwucHVibGlzaGVycy5BbnRQdWJsaXNoZXIiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmFudHB1Ymxpc2hlciIvPgotIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc2NoZW1hL2dlbmVyaWNwdWJsaXNoZXIuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc2NoZW1hL2dlbmVyaWNwdWJsaXNoZXIuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTg3MmI0Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NjaGVtYS9nZW5lcmljcHVibGlzaGVyLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlIiBpZD0iZ2VuZXJpY3B1Ymxpc2hlciIgbmFtZT0iR2VuZXJpYyBQdWJsaXNoZXIiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImdlbmVyaWNwdWJsaXNoZXIiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImdlbmVyaWNwdWJsaXNoZXIiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O2ImZ3Q7VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4mbHQ7L2ImZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0mbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc2NoZW1hL3NlcnZlcmRlZmluaXRpb24uZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc2NoZW1hL3NlcnZlcmRlZmluaXRpb24uZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNhMzI4Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NjaGVtYS9zZXJ2ZXJkZWZpbml0aW9uLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlIiBpZD0ic2VydmVyZGVmaW5pdGlvbiIgbmFtZT0iU2VydmVyIERlZmluaXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgZGVmaW5lcyBhIG5ldyBnZW5lcmljIHNlcnZlciBwbHVnaW4uCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InNlcnZlcmRlZmluaXRpb24iIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InNlcnZlcmRlZmluaXRpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgc2VydmVyIGlkCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVmaW5pdGlvbmZpbGUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgbG9jYXRpb24gb2YgdGhlIGdlbmVyaWMgc2VydmVyIGRlZmluaXRpb24gZmlsZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0icmVzb3VyY2UiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O2ImZ3Q7VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4mbHQ7L2ImZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0mbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9jb3JlL2ludGVybmFsL0NvcmVQbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9jb3JlL2ludGVybmFsL0NvcmVQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZkZDYwNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvY29yZS9pbnRlcm5hbC9Db3JlUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgRXRlcmF0aW9uIEEuUy4gYW5kIEdvcmtlbSBFcmNhbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBHb3JrZW0gRXJjYW4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAgICAgICAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotLyoqCi0gKiBUaGUgbWFpbiBwbHVnaW4gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZGVza3RvcC4KLSAqIAotICogQGF1dGhvciBHb3JrZW0gRXJjYW4KLSAqLwotcHVibGljIGNsYXNzIENvcmVQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlIjsKLQotCS8vVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBDb3JlUGx1Z2luIHBsdWdpbjsKLQlwcml2YXRlIFNlcnZlclR5cGVEZWZpbml0aW9uTWFuYWdlciBmU2VydmVyVHlwZURlZmluaXRpb25NYW5hZ2VyOwotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgQ29yZVBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdXBvbiBwbHVnLWluIGFjdGl2YXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgcGx1Zy1pbiBpcyBzdG9wcGVkCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvcmVQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFNlcnZlclR5cGVEZWZpbml0aW9uTWFuYWdlciBnZXRTZXJ2ZXJUeXBlRGVmaW5pdGlvbk1hbmFnZXIoKQotCXsKLQkJaWYoZlNlcnZlclR5cGVEZWZpbml0aW9uTWFuYWdlcj09bnVsbCkKLQkJCWZTZXJ2ZXJUeXBlRGVmaW5pdGlvbk1hbmFnZXIgPSBuZXcgU2VydmVyVHlwZURlZmluaXRpb25NYW5hZ2VyKGdldEluc3RhbGxVcmwoKSk7Ci0JCXJldHVybiBmU2VydmVyVHlwZURlZmluaXRpb25NYW5hZ2VyOwotCX0KLQkKLQlwcml2YXRlIFVSTCBnZXRJbnN0YWxsVXJsKCkKLQl7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gUGxhdGZvcm0ucmVzb2x2ZSh0aGlzLmdldEJ1bmRsZSgpLmdldEVudHJ5KCIvIikpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQkKLQl9Ci0JCi0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvY29yZS9pbnRlcm5hbC9FeHRlcm5hbExhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2NvcmUvaW50ZXJuYWwvRXh0ZXJuYWxMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRmNzI2OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvY29yZS9pbnRlcm5hbC9FeHRlcm5hbExhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMsIEluYy4gCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIHJmcm9zdEBiZWEuY29tCi0gKiAgICB0eWlwQGJlYS5jb20KLSAqICAgIAotICogICAgQmFzZWQgb24gR2VuZXJpY1NlcnZlckxhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZSBieSBHb3JrZW0gRXJjYW4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkV4ZWN1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkRlYnVnUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5SdW50aW1lUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwubGF1bmNoaW5nLkphdmFSZW1vdGVBcHBsaWNhdGlvbkxhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkFic3RyYWN0SmF2YUxhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLklKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuU2VydmVyQmVoYXZpb3VyRGVsZWdhdGU7Ci0KLS8qKgotICogPHA+RXh0ZW5zaW9uIG9mIDxjb2RlPkFic3RyYWN0SmF2YUxhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZTwvY29kZT4gdGhhdCBzdXBwb3J0cyAKLSAqIHNlcnZlcnMgd2hpY2ggYXJlIHN0YXJ0ZWQvc3RvcHBlZCB2aWEgZXh0ZXJuYWwgZXhlY3V0YWJsZXMgKGUuZy4gc2NyaXB0cykuPC9wPgotICogCi0gKiA8cD5Ob3RlOiA8Y29kZT5BYnN0cmFjdEphdmFMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGU8L2NvZGU+IGlzIGV4dGVuZGVkIHNpbXBseSB0byB0YWtlIGFkdmFudGFnZQotICogb2YgYSBzZXQgb2YgdXNlZnVsIGNvZGUgdGhhdCBpcyBub3QgZGlyZWN0bHkgcmVsYXRlZCB0byBsYXVuY2hpbmcgYSBKVk0tYmFzZWQgYXBwLjwvcD4KLSAqLwotcHVibGljIGNsYXNzIEV4dGVybmFsTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlIGV4dGVuZHMgQWJzdHJhY3RKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlIHsKLQotCS8qKgotCSAqIElkZW50aWZpZXIgZm9yIHRoZSBleGVjdXRhYmxlIHNlcnZlciBjb25maWd1cmF0aW9uIHR5cGUKLQkgKiAodmFsdWUgPGNvZGU+Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLkV4dGVybmFsTGF1bmNoQ29uZmlndXJhdGlvblR5cGUiPC9jb2RlPikuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRVhURVJOQUxfTEFVTkNIX1RZUEUgPSBDb3JlUGx1Z2luLlBMVUdJTl9JRCArICIuRXh0ZXJuYWxMYXVuY2hDb25maWd1cmF0aW9uVHlwZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIE5hbWUgb2YgdGhlIGxhdW5jaCBjb25maWd1cmF0aW9uIGF0dHJpYnV0ZSB0aGF0IGhvbGRzIHRoZSBleHRlcm5hbCBleGVjdXRhYmxlIGNvbW1hbmRsaW5lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1BTkRMSU5FID0gQ29yZVBsdWdpbi5QTFVHSU5fSUQgICsgIi5DT01NQU5ETElORSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIE5hbWUgb2YgdGhlIGxhdW5jaCBjb25maWd1cmF0aW9uIGF0dHJpYnV0ZSB0aGF0IGhvbGRzIGEgZGVzY3JpcHRpdmUgbmFtZSBmb3IgdGhlIGV4dGVybmFsIGV4ZWN1dGFibGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhFQ1VUQUJMRV9OQU1FID0gQ29yZVBsdWdpbi5QTFVHSU5fSUQgKyAiLkVYRUNVVEFCTEVfTkFNRSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIE5hbWUgb2YgdGhlIGxhdW5jaCBjb25maWd1cmF0aW9uIGF0dHJpYnV0ZSB0aGF0IGhvbGRzIHRoZSBkZWJ1ZyBwb3J0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFQlVHX1BPUlQgPSBDb3JlUGx1Z2luLlBMVUdJTl9JRCArICIuREVCVUdfUE9SVCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBEZWZhdWx0IHZhbHVlIGZvciB0aGUgZGVzY3JpcHRpdmUgbmFtZSBmb3IgdGhlIGV4dGVybmFsIGV4ZWN1dGFibGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9FWEVDVVRBQkxFX05BTUUgPSAiRXh0ZXJuYWwgR2VuZXJpYyBTZXJ2ZXIiOwotCQotCS8qKgotCSAqIERlYnVnZ2luZyBsYXVuY2ggY29uZmlndXJhdGlvbiBkZWxlZ2F0ZS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBKYXZhUmVtb3RlQXBwbGljYXRpb25MYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGUgZGVidWdnaW5nRGVsZWdhdGUgPQotICAgICAgICBuZXcgSmF2YVJlbW90ZUFwcGxpY2F0aW9uTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlKCk7Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlI2xhdW5jaChvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uLCBqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2gsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIGxhdW5jaChJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uLCAKLQkJCSAgICAgICBTdHJpbmcgbW9kZSwKLQkJCSAgICAgICBJTGF1bmNoIGxhdW5jaCwgCi0JCQkgICAgICAgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlTZXJ2ZXIgc2VydmVyID0gU2VydmVyVXRpbC5nZXRTZXJ2ZXIoY29uZmlndXJhdGlvbik7Ci0JCWlmIChzZXJ2ZXIgPT0gbnVsbCkgewotCQkgICAgYWJvcnQoR2VuZXJpY1NlcnZlckNvcmVNZXNzYWdlcy5taXNzaW5nU2VydmVyLCBudWxsLCBJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuRVJSX0lOVEVSTkFMX0VSUk9SKTsKLQkJfQkKLQotCQlFeHRlcm5hbFNlcnZlckJlaGF2aW91ciBzZXJ2ZXJCZWhhdmlvciA9IChFeHRlcm5hbFNlcnZlckJlaGF2aW91cikgc2VydmVyLmxvYWRBZGFwdGVyKFNlcnZlckJlaGF2aW91ckRlbGVnYXRlLmNsYXNzLCBudWxsKTsKLQkJCi0JCS8vIGluaXRpYWxpemUgdGhlIHNlcnZlciwgY2hlY2sgdGhlIHBvcnRzIGFuZCBzdGFydCB0aGUgUGluZ1RocmVhZCB0aGF0IHdpbGwgY2hlY2sgCi0JCS8vIHNlcnZlciBzdGF0ZQotCQlzZXJ2ZXJCZWhhdmlvci5zZXR1cExhdW5jaChsYXVuY2gsIG1vZGUsIG1vbml0b3IpOwotCQkKLQkJLy8gZ2V0IHRoZSAiZXh0ZXJuYWwiIGNvbW1hbmQKLQkJU3RyaW5nIGNvbW1hbmRsaW5lID0gY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoQ09NTUFORExJTkUsIChTdHJpbmcpIG51bGwpOwotCQlpZiAoY29tbWFuZGxpbmUgPT0gbnVsbCB8fCBjb21tYW5kbGluZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlhYm9ydChHZW5lcmljU2VydmVyQ29yZU1lc3NhZ2VzLmNvbW1hbmRsaW5lVW5zcGVjaWZpZWQsIG51bGwsIElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5FUlJfSU5URVJOQUxfRVJST1IpOwkJCQotCQl9Ci0JCQotCQkvLyBwYXJzZSB0aGUgImV4dGVybmFsIiBjb21tYW5kIGludG8gbXVsdGlwbGUgYXJncwotCQlTdHJpbmdbXSBjbWRBcmdzID0gRGVidWdQbHVnaW4ucGFyc2VBcmd1bWVudHMoY29tbWFuZGxpbmUpOwotCQkvLyBnZXQgdGhlICJwcm9ncmFtQXJndW1lbnRzIiwgcGFyc2VkIGludG8gbXVsdGlwbGUgYXJncwotCQlTdHJpbmdbXSBwZ21BcmdzID0gRGVidWdQbHVnaW4ucGFyc2VBcmd1bWVudHMoZ2V0UHJvZ3JhbUFyZ3VtZW50cyhjb25maWd1cmF0aW9uKSk7Ci0JCQotCQkvLyBDcmVhdGUgdGhlIGZ1bGwgYXJyYXkgb2YgY21kcwotCQlTdHJpbmdbXSBjbWRzID0gbmV3IFN0cmluZ1tjbWRBcmdzLmxlbmd0aCArIHBnbUFyZ3MubGVuZ3RoXTsKLQkJU3lzdGVtLmFycmF5Y29weShjbWRBcmdzLCAwLCBjbWRzLCAwLCBjbWRBcmdzLmxlbmd0aCk7Ci0JCVN5c3RlbS5hcnJheWNvcHkocGdtQXJncywgMCwgY21kcywgY21kQXJncy5sZW5ndGgsIHBnbUFyZ3MubGVuZ3RoKTsKLQkJCi0JCS8vIGdldCBhIGRlc2NyaXB0aXZlIG5hbWUgZm9yIHRoZSBleGVjdXRhYmxlCi0JCVN0cmluZyBleGVjdXRhYmxlTmFtZSA9IGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKEVYRUNVVEFCTEVfTkFNRSwgREVGQVVMVF9FWEVDVVRBQkxFX05BTUUpOwotCQkKLQkJLy8gZ2V0IHRoZSBleGVjdXRhYmxlIGVudmlyb25tZW50Ci0JCUlMYXVuY2hNYW5hZ2VyIG1hbmFnZXIgPSBEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TGF1bmNoTWFuYWdlcigpOwotCQlTdHJpbmdbXSBlbnYgPSBtYW5hZ2VyLmdldEVudmlyb25tZW50KGNvbmZpZ3VyYXRpb24pOwotCQkKLQkJLy8gZ2V0IHRoZSB3b3JraW5nIGRpcmVjdG9yeQotCQlGaWxlIHdvcmtpbmdEaXIgPSB2ZXJpZnlXb3JraW5nRGlyZWN0b3J5KGNvbmZpZ3VyYXRpb24pOwotCQlpZiAod29ya2luZ0RpciA9PSBudWxsKSB7Ci0JCQlhYm9ydChHZW5lcmljU2VydmVyQ29yZU1lc3NhZ2VzLndvcmtpbmdkaXJVbnNwZWNpZmllZCwgbnVsbCwgSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkVSUl9JTlRFUk5BTF9FUlJPUik7CQkJCi0JCX0KLQkJCi0JCS8vIExhdW5jaCB0aGUgZXhlY3V0YWJsZSBmb3IgdGhlIGNvbmZpZ3VyYXRpb24gdXNpbmcgdGhlIEFudCBFeGVjdXRlIGNsYXNzCi0JCXRyeSB7Ci0JCQlQcm9jZXNzIHByb2Nlc3MgPSBFeGVjdXRlLmxhdW5jaChudWxsLCBjbWRzLCBlbnYsIHdvcmtpbmdEaXIsIHRydWUpOwotCQkJSVByb2Nlc3MgcnVudGltZVByb2Nlc3MgPSBuZXcgUnVudGltZVByb2Nlc3MobGF1bmNoLCBwcm9jZXNzLCBleGVjdXRhYmxlTmFtZSwgbnVsbCk7Ci0JCQlsYXVuY2guYWRkUHJvY2VzcyhydW50aW1lUHJvY2Vzcyk7Ci0JCQlzZXJ2ZXJCZWhhdmlvci5zZXRQcm9jZXNzKHJ1bnRpbWVQcm9jZXNzKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0JCQlhYm9ydChHZW5lcmljU2VydmVyQ29yZU1lc3NhZ2VzLmVycm9yTGF1bmNoaW5nRXhlY3V0YWJsZSwgaW9lLCAgSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkVSUl9JTlRFUk5BTF9FUlJPUik7Ci0JCX0KLQotCQlpZiAobW9kZS5lcXVhbHMoImRlYnVnIikpIHsKLQkJCUlMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgd2MgPSBjcmVhdGVEZWJ1Z2dpbmdDb25maWcoY29uZmlndXJhdGlvbik7Ci0JCQkvLyBpZiB3ZSdyZSBsYXVuY2hpbmcgdGhlIGRlYnVnZ2luZyB3ZSBuZWVkIHRvIHdhaXQgZm9yIHRoZSBjb25maWcgdG8gc3RhcnQKLQkJCS8vIGJlZm9yZSBsYXVuY2hpbmcgdGhlIGRlYnVnZ2luZyBzZXNzaW9uCi0JCQlzZXJ2ZXJCZWhhdmlvci5zZXREZWJ1Z2dpbmdDb25maWcod2MsIG1vZGUsIGxhdW5jaCwgbW9uaXRvcik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY3JlYXRlRGVidWdnaW5nQ29uZmlnKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIAotCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSB3YyA9IGNvbmZpZ3VyYXRpb24uZ2V0V29ya2luZ0NvcHkoKTsKLSAgICAgICAgc2V0RGVidWdBcmd1bWVudCh3YywgSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfQ09OTkVDVF9NQVAsICJob3N0bmFtZSIsICJsb2NhbGhvc3QiKTsKLSAgICAgICAgU3RyaW5nIHBvcnQgPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShERUJVR19QT1JULCAoU3RyaW5nKSBudWxsKTsKLSAgICAgICAgaWYgKHBvcnQ9PW51bGwgfHwgcG9ydC5sZW5ndGgoKT09MCkgewotICAgICAgICAJYWJvcnQoR2VuZXJpY1NlcnZlckNvcmVNZXNzYWdlcy5kZWJ1Z1BvcnRVbnNwZWNpZmllZCwgbnVsbCwgSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkVSUl9JTlRFUk5BTF9FUlJPUik7Ci0gICAgICAgIH0KLSAgICAgICAgc2V0RGVidWdBcmd1bWVudCh3YywgSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfQ09OTkVDVF9NQVAsICJwb3J0IiwgcG9ydCk7Ci0gICAgICAgIHJldHVybiB3YzsKLQl9Ci0JCi0JLyoqCi0JICogU3RhcnRzIHRoZSBkZWJ1Z2dpbmcgc2Vzc2lvbgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBzdGFydERlYnVnZ2luZyhJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IHdjLAotCQkJICAgICAgIAkJCQkJCSBTdHJpbmcgbW9kZSwKLQkJCSAgICAgICAJCQkJCQkgSUxhdW5jaCBsYXVuY2gsIAotCQkJICAgICAgIAkJCQkJCSBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiU3RhcnRpbmcgZGVidWdnaW5nIik7Ci0JCWRlYnVnZ2luZ0RlbGVnYXRlLmxhdW5jaCh3YywgbW9kZSwgbGF1bmNoLCBtb25pdG9yKTsKLQl9Ci0JCi0gICAgcHJpdmF0ZSB2b2lkIHNldERlYnVnQXJndW1lbnQoSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBjb25maWcsIFN0cmluZyBhdHRyaWJLZXksIFN0cmluZyBrZXksIFN0cmluZyBhcmcpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE1hcCBhcmdzID0gY29uZmlnLmdldEF0dHJpYnV0ZShhdHRyaWJLZXksIChNYXApbnVsbCk7Ci0gICAgICAgICAgICBpZiAoYXJncyE9bnVsbCkgewotICAgICAgICAgICAgICAgIGFyZ3MgPSBuZXcgSGFzaE1hcChhcmdzKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYXJncyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhcmdzLnB1dChrZXksIFN0cmluZy52YWx1ZU9mKGFyZykpOwotICAgICAgICAgICAgY29uZmlnLnNldEF0dHJpYnV0ZShhdHRyaWJLZXksIGFyZ3MpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICAvLyBpZ25vcmUKLSAgICAgICAgfSAgICAgICAgCi0gICAgfQotCQotCS8qKgotCSAqIFRocm93cyBhIGNvcmUgZXhjZXB0aW9uIHdpdGggdGhlIGdpdmVuIG1lc3NhZ2UgYW5kIG9wdGlvbmFsCi0JICogZXhjZXB0aW9uLiBUaGUgZXhjZXB0aW9uJ3Mgc3RhdHVzIGNvZGUgd2lsbCBpbmRpY2F0ZSBhbiBlcnJvci4KLQkgKiAKLQkgKiBAcGFyYW0gbWVzc2FnZSBlcnJvciBtZXNzYWdlCi0JICogQHBhcmFtIGV4Y2VwdGlvbiBjYXVzZSBvZiB0aGUgZXJyb3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uIHdpdGggdGhlIGdpdmVuIG1lc3NhZ2UgYW5kIHVuZGVybHlpbmcKLQkgKiAgZXhjZXB0aW9uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWJvcnQoU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24sIGludCBjb2RlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIGNvZGUsIG1lc3NhZ2UsIGV4Y2VwdGlvbikpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9jb3JlL2ludGVybmFsL0V4dGVybmFsU2VydmVyQmVoYXZpb3VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvY29yZS9pbnRlcm5hbC9FeHRlcm5hbFNlcnZlckJlaGF2aW91ci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzkyYTQ2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9jb3JlL2ludGVybmFsL0V4dGVybmFsU2VydmVyQmVoYXZpb3VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcywgSW5jLiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgcmZyb3N0QGJlYS5jb20gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgIAotICogICAgQmFzZWQgb24gR2VuZXJpY1NlcnZlckJlaGF2aW9yIGJ5IEdvcmtlbSBFcmNhbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC54bWwuUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5FeHRlcm5hbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudXRpbC5Tb2NrZXRVdGlsOwotCi0vKioKLSAqIFN1YmNsYXNzIG9mIDxjb2RlPkdlbmVyaWNTZXJ2ZXJCZWhhdmlvcjwvY29kZT4gdGhhdCBzdXBwb3J0cyAKLSAqIHNlcnZlcnMgd2hpY2ggYXJlIHN0YXJ0ZWQvc3RvcHBlZCB2aWEgZXh0ZXJuYWwgZXhlY3V0YWJsZXMgKGUuZy4gc2NyaXB0cykuCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHRlcm5hbFNlcnZlckJlaGF2aW91ciBleHRlbmRzIEdlbmVyaWNTZXJ2ZXJCZWhhdmlvdXIgewotCQotCS8vIGNvbmZpZyBmb3IgZGVidWdnaW5nIHNlc3Npb24KLQlwcml2YXRlIElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgd2M7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbW9kZTsKLSAgICBwcml2YXRlIElMYXVuY2ggbGF1bmNoOyAKLSAgICBwcml2YXRlIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBPdmVycmlkZSB0byByZXNldCB0aGUgc3RhdHVzIGlmIHRoZSBzdGF0ZSB3YXMgdW5rbm93bgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHN0b3AoYm9vbGVhbiBmb3JjZSkgewotICAgIAlyZXNldFN0YXR1cyhnZXRTZXJ2ZXIoKS5nZXRTZXJ2ZXJTdGF0ZSgpKTsKLSAgICAJc3VwZXIuc3RvcChmb3JjZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogT3ZlcnJpZGUgdG8gc2V0IHN0YXR1cyB0byB1bmtub3duIGlmIHRoZSBwb3J0IHdhcyBpbiB1c2UgYW5kIHRvIHJlc2V0IHRoZSBzdGF0dXMgaWYgdGhlIHN0YXRlIHdhcyAKLSAgICAgKiB1bmtub3duIGFuZCBhbiBleGNlcHRpb24gd2FzIG5vdCB0aHJvd24uIFdpbGwgd2FudCB0byBjaGFuZ2UgbG9naWMgb25jZSBleHRlcm5hbCBnZW5lcmljIHNlcnZlciBwaW5ncwotICAgICAqIHNlcnZlciBwcm9jZXNzIHRvIGRldGVybWluZSBzdGF0ZSBpbnN0ZWFkIG9mIG1haW50YWluaW5nIGhhbmRsZSB0byBwcm9jZXNzLiAKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXR1cExhdW5jaChJTGF1bmNoIGxhdW5jaCwgU3RyaW5nIGxhdW5jaE1vZGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgIAlpbnQgc3RhdGUgPSBnZXRTZXJ2ZXIoKS5nZXRTZXJ2ZXJTdGF0ZSgpOwotICAgIAl0cnkgewotICAgIAkJc3VwZXIuc2V0dXBMYXVuY2gobGF1bmNoLCBsYXVuY2hNb2RlLCBtb25pdG9yKTsKLSAgICAJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgIAkJU2VydmVyUG9ydCBwb3J0SW5Vc2UgPSBwb3J0SW5Vc2UoKTsKLSAgICAJCWlmIChwb3J0SW5Vc2UgIT0gbnVsbCkgewotICAgIAkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJQb3J0ICIgKyBwb3J0SW5Vc2UuZ2V0UG9ydCgpICsgIiBpcyBjdXJyZW50bHkgaW4gdXNlIik7Ci0JCQkJU3RhdHVzIHN0YXR1cyA9IG5ldyBTdGF0dXMoU3RhdHVzLldBUk5JTkcsIENvcmVQbHVnaW4uUExVR0lOX0lELCBTdGF0dXMuT0ssIAotCQkJCQkJCUdlbmVyaWNTZXJ2ZXJDb3JlTWVzc2FnZXMuYmluZChHZW5lcmljU2VydmVyQ29yZU1lc3NhZ2VzLmVycm9yUG9ydEluVXNlLEludGVnZXIudG9TdHJpbmcocG9ydEluVXNlLmdldFBvcnQoKSkscG9ydEluVXNlLmdldE5hbWUoKSksIG51bGwpOwotCQkJCXNldFNlcnZlclN0YXR1cyhzdGF0dXMpOwotCQkJCXNldFNlcnZlclN0YXRlKElTZXJ2ZXIuU1RBVEVfVU5LTk9XTik7Ci0gICAgCQl9Ci0gICAgCQl0aHJvdyBjZTsKLSAgICAJfQotICAgIAlyZXNldFN0YXR1cyhzdGF0ZSk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgU2VydmVyUG9ydCBwb3J0SW5Vc2UoKSB7Ci0gICAgCVNlcnZlclBvcnRbXSBwb3J0cyA9IGdldFNlcnZlcigpLmdldFNlcnZlclBvcnRzKG51bGwpOwotICAgIAlTZXJ2ZXJQb3J0IHNwOwotICAgIAlmb3IoaW50IGk9MDtpPHBvcnRzLmxlbmd0aDtpKyspewotICAgIAkJc3AgPSBwb3J0c1tpXTsKLSAgICAJCWlmIChTb2NrZXRVdGlsLmlzUG9ydEluVXNlKHNwLmdldFBvcnQoKSwgNSkpIHsKLSAgICAJCQlyZXR1cm4gc3A7Ci0gICAgCQl9Ci0gICAgCX0KLSAgICAJcmV0dXJuIG51bGw7Ci0JfQotICAgIAotCS8qKgotCSAqIE92ZXJyaWRlIHRvIHRyaWdnZXIgdGhlIGxhdW5jaCBvZiB0aGUgZGVidWdnaW5nIHNlc3Npb24gKGlmIGFwcHJvcHJpYXRlKS4KLQkgKi8KLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgc2V0U2VydmVyU3RhcnRlZCgpIHsKLQkJaWYgKHdjICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJRXh0ZXJuYWxMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGUuc3RhcnREZWJ1Z2dpbmcod2MsIG1vZGUsIGxhdW5jaCwgbW9uaXRvcik7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkJLy8gZmFpbGVkIHRvIHN0YXJ0IGRlYnVnZ2luZywgc28gc2V0IG1vZGUgdG8gcnVuCi0JCQkJc2V0TW9kZShJTGF1bmNoTWFuYWdlci5SVU5fTU9ERSk7Ci0JCQkJZmluYWwgU3RhdHVzIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ29yZVBsdWdpbi5QTFVHSU5fSUQsIDEsCi0JCQkJCQkJR2VuZXJpY1NlcnZlckNvcmVNZXNzYWdlcy5lcnJvclN0YXJ0aW5nRXh0ZXJuYWxEZWJ1Z2dpbmcsIGNlKTsgCi0JCQkJQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nKCkubG9nKHN0YXR1cyk7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCBHZW5lcmljU2VydmVyQ29yZU1lc3NhZ2VzLmVycm9yU3RhcnRpbmdFeHRlcm5hbERlYnVnZ2luZywgY2UpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQljbGVhckRlYnVnZ2luZ0NvbmZpZygpOwotCQkJfQotCQl9Ci0JCXNldFNlcnZlclN0YXRlKElTZXJ2ZXIuU1RBVEVfU1RBUlRFRCk7Ci0gCX0KLQkKLQkvKgotCSAqIElmIHRoZSBzZXJ2ZXIgc3RhdGUgaXMgdW5rbm93biwgcmVzZXQgdGhlIHN0YXR1cyB0byBPSwotCSAqLwotCXByaXZhdGUgdm9pZCByZXNldFN0YXR1cyhpbnQgc3RhdGUpIHsKLQkJaWYgKHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfVU5LTk9XTikgewotCQkJc2V0U2VydmVyU3RhdHVzKG51bGwpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFNpbmNlIHRlcm1pbmF0ZSgpIGlzIGNhbGxlZCBkdXJpbmcgcmVzdGFydCwgbmVlZCB0byBvdmVycmlkZSB0bwotCSAqIGNhbGwgc2h1dGRvd24gaW5zdGVhZCBvZiBqdXN0IGtpbGxpbmcgdGhlIG9yaWdpbmFsIHByb2Nlc3MuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGVybWluYXRlKCkgewotCQlpbnQgc3RhdGUgPSBnZXRTZXJ2ZXIoKS5nZXRTZXJ2ZXJTdGF0ZSgpOwotCQlpZiAoc3RhdGUgPT0gSVNlcnZlci5TVEFURV9TVE9QUEVEKSAKLSAgICAJCXJldHVybjsKLSAgICAKLQkJLy8gY2FjaGUgYSByZWYgdG8gdGhlIGN1cnJlbnQgcHJvY2VzcwotCQlJUHJvY2VzcyBjdXJyZW50UHJvY2VzcyA9IHByb2Nlc3M7Ci0JCS8vIHNldCB0aGUgcHJvY2VzcyB2YXIgdG8gbnVsbCBzbyB0aGF0IEdlbmVyaWNTZXJ2ZXJCZWhhdmlvci5zZXRQcm9jZXNzKCkKLQkJLy8gd2lsbCBncmFiIHRoZSBzdG9wIGV4ZWN1dGFibGUgKGFuZCBkZWNsYXJlIHRoZSBzZXJ2ZXIgc3RvcHBlZCB3aGVuIGl0IGV4aXRzKQotCQlwcm9jZXNzID0gbnVsbDsKLQotCQkvLyBleGVjdXRlIHRoZSBzdGFuZGFyZCBzaHV0ZG93bgotCQlzaHV0ZG93bihzdGF0ZSk7Ci0JCQotCQkvLyBpZiB0aGUgc2h1dGRvd24gZGlkIG5vdCB0ZXJtaW5hdGUgdGhlIHByb2Nlc3MsIGZvcmNpYmx5IHRlcm1pbmF0ZSBpdAotCQl0cnkgewotICAgIAkJaWYgKGN1cnJlbnRQcm9jZXNzICE9IG51bGwgJiYgIWN1cnJlbnRQcm9jZXNzLmlzVGVybWluYXRlZCgpKSB7Ci0gICAgCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVIsICJBYm91dCB0byBraWxsIHByb2Nlc3M6ICIgKyBjdXJyZW50UHJvY2Vzcyk7Ci0gICAgCQkJY3VycmVudFByb2Nlc3MudGVybWluYXRlKCk7Ci0gICAgCQkJY3VycmVudFByb2Nlc3MgPSBudWxsOwotICAgIAkJfQotICAgIAl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgIAkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3Iga2lsbGluZyB0aGUgcHJvY2VzcyIsIGUpOwotICAgIAl9Ci0JfQotCQotCS8qKgotCSAqIE92ZXJyaWRlIHN1cGVyY2xhc3MgbWV0aG9kIHRvIGNvcnJlY3RseSBzZXR1cCB0aGUgbGF1bmNoIGNvbmZpZ3VyYXRpb24gZm9yIHN0YXJ0aW5nIGFuIGV4dGVybmFsCi0JICogc2VydmVyLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldHVwTGF1bmNoQ29uZmlndXJhdGlvbihJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IHdvcmtpbmdDb3B5LAotCQkJCQkJCQkJCSBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJY2xlYXJEZWJ1Z2dpbmdDb25maWcoKTsKLQkJU2VydmVyUnVudGltZSBzZXJ2ZXJEZWYgPSBnZXRTZXJ2ZXJEZWZpbml0aW9uKCk7Ci0JCVJlc29sdmVyIHJlc29sdmVyID0gc2VydmVyRGVmLmdldFJlc29sdmVyKCk7Ci0JCXdvcmtpbmdDb3B5LnNldEF0dHJpYnV0ZShJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9XT1JLSU5HX0RJUkVDVE9SWSwKLQkJCQkJcmVzb2x2ZXIucmVzb2x2ZVByb3BlcnRpZXMoc2VydmVyRGVmLmdldFN0YXJ0KCkuZ2V0V29ya2luZ0RpcmVjdG9yeSgpKSk7Ci0JCVN0cmluZyBleHRlcm5hbCA9IHJlc29sdmVyLnJlc29sdmVQcm9wZXJ0aWVzKGdldEV4dGVybmFsRm9yT1Moc2VydmVyRGVmLmdldFN0YXJ0KCkuZ2V0RXh0ZXJuYWwoKSkpOwotCQl3b3JraW5nQ29weS5zZXRBdHRyaWJ1dGUoRXh0ZXJuYWxMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGUuQ09NTUFORExJTkUsIGV4dGVybmFsKTsKLQkJd29ya2luZ0NvcHkuc2V0QXR0cmlidXRlKEV4dGVybmFsTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlLkRFQlVHX1BPUlQsIAotCQkJCQlyZXNvbHZlci5yZXNvbHZlUHJvcGVydGllcyhzZXJ2ZXJEZWYuZ2V0U3RhcnQoKS5nZXREZWJ1Z1BvcnQoKSkpOwotCQkvLyBqdXN0IHVzZSB0aGUgY29tbWFuZGxpbmUgZm9yIG5vdwotCQl3b3JraW5nQ29weS5zZXRBdHRyaWJ1dGUoRXh0ZXJuYWxMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGUuRVhFQ1VUQUJMRV9OQU1FLCBleHRlcm5hbCk7Ci0gICAgICAgIE1hcCBlbnZpcm9uVmFycyA9IGdldEVudmlyb25tZW50VmFyaWFibGVzKGdldFNlcnZlckRlZmluaXRpb24oKS5nZXRTdGFydCgpKTsKLSAgICAgICAgaWYoIWVudmlyb25WYXJzLmlzRW1wdHkoKSl7Ci0gICAgICAgIAl3b3JraW5nQ29weS5zZXRBdHRyaWJ1dGUoSUxhdW5jaE1hbmFnZXIuQVRUUl9FTlZJUk9OTUVOVF9WQVJJQUJMRVMsZW52aXJvblZhcnMpOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyBleGlzdGluZ1Byb2dBcmdzICA9IHdvcmtpbmdDb3B5LmdldEF0dHJpYnV0ZShJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9QUk9HUkFNX0FSR1VNRU5UUywgKFN0cmluZyludWxsKTsKLSAgICAgICAgU3RyaW5nIHNlcnZlclByb2dBcmdzID0gIGdldFByb2dyYW1Bcmd1bWVudHMoKTsKLSAgICAgICAgaWYoZXhpc3RpbmdQcm9nQXJncz09bnVsbCB8fCBleGlzdGluZ1Byb2dBcmdzLmluZGV4T2Yoc2VydmVyUHJvZ0FyZ3MpPDApIHsKLSAgICAgICAgICAgIHdvcmtpbmdDb3B5LnNldEF0dHJpYnV0ZShJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9QUk9HUkFNX0FSR1VNRU5UUyxzZXJ2ZXJQcm9nQXJncyk7Ci0gICAgICAgIH0KLQl9Ci0KLQkvKgotCSAqIFJldHVybnMgdGhlIGZpcnN0IGV4dGVybmFsIHdob3NlICJvcyIgYXR0cmlidXRlIG1hdGNoZXMgKGNhc2UgaW5zZW5zaXRpdmUpIHRoZSBiZWdpbm5pbmcgCi0JICogb2YgdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgT1MgKGFzIGRldGVybWluZWQgYnkgdGhlIFN5c3RlbSAib3MubmFtZSIgcHJvcGVydHkpLiBJZgotCSAqIG5vIHN1Y2ggbWF0Y2ggaXMgZm91bmQsIHJldHVybnMgdGhlIGZpcnN0IGV4dGVybmFsIHRoYXQgZG9lcyBub3QgaGF2ZSBhbiBPUyBhdHRyaWJ1dGUuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RXh0ZXJuYWxGb3JPUyhMaXN0IGV4dGVybmFscykgewotCQlTdHJpbmcgY3VycmVudE9TID0gU3lzdGVtLmdldFByb3BlcnR5KCJvcy5uYW1lIikudG9Mb3dlckNhc2UoKTsKLQkJRXh0ZXJuYWwgZXh0ZXJuYWw7Ci0JCVN0cmluZyBtYXRjaGluZ0V4dGVybmFsID0gbnVsbDsKLQkJU3RyaW5nIGV4dGVybmFsT1M7Ci0JCUl0ZXJhdG9yIGkgPSBleHRlcm5hbHMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQlleHRlcm5hbD0gKEV4dGVybmFsKSBpLm5leHQoKTsKLQkJCWV4dGVybmFsT1MgPSBleHRlcm5hbC5nZXRPcygpOwotCQkJaWYgKGV4dGVybmFsT1MgPT0gbnVsbCkgewotCQkJCWlmIChtYXRjaGluZ0V4dGVybmFsID09IG51bGwpIHsKLQkJCQkJbWF0Y2hpbmdFeHRlcm5hbCA9IGV4dGVybmFsLmdldFZhbHVlKCk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChjdXJyZW50T1Muc3RhcnRzV2l0aChleHRlcm5hbE9TLnRvTG93ZXJDYXNlKCkpKSB7Ci0JCQkJbWF0Y2hpbmdFeHRlcm5hbCA9IGV4dGVybmFsLmdldFZhbHVlKCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1hdGNoaW5nRXh0ZXJuYWw7Ci0JfQotCi0JLyoqCi0gICAgICogUmV0dXJucyB0aGUgU3RyaW5nIElEIG9mIHRoZSBsYXVuY2ggY29uZmlndXJhdGlvbiB0eXBlLgotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldENvbmZpZ1R5cGVJRCgpIHsKLQkJcmV0dXJuIEV4dGVybmFsTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlLklEX0VYVEVSTkFMX0xBVU5DSF9UWVBFOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIFN0cmluZyBuYW1lIG9mIHRoZSBzdG9wIGxhdW5jaCBjb25maWd1cmF0aW9uLgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFN0b3BMYXVuY2hOYW1lKCkgewotCQlyZXR1cm4gR2VuZXJpY1NlcnZlckNvcmVNZXNzYWdlcy5leHRlcm5hbFN0b3BMYXVuY2hlcjsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB1cCB0aGUgbGF1bmNoIGNvbmZpZ3VyYXRpb24gZm9yIHN0b3BwaW5nIHRoZSBzZXJ2ZXIuCi0JICogQHBhcmFtIHdvcmtpbmdDb3B5Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0dXBTdG9wTGF1bmNoQ29uZmlndXJhdGlvbihHZW5lcmljU2VydmVyUnVudGltZSBydW50aW1lLCBJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IHdjKSB7Ci0JCWNsZWFyRGVidWdnaW5nQ29uZmlnKCk7Ci0JCVNlcnZlclJ1bnRpbWUgc2VydmVyRGVmID0gZ2V0U2VydmVyRGVmaW5pdGlvbigpOwotCQlSZXNvbHZlciByZXNvbHZlciA9IHNlcnZlckRlZi5nZXRSZXNvbHZlcigpOyAKLQkJd2Muc2V0QXR0cmlidXRlKElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1dPUktJTkdfRElSRUNUT1JZLAotCQkJCQlyZXNvbHZlci5yZXNvbHZlUHJvcGVydGllcyhzZXJ2ZXJEZWYuZ2V0U3RvcCgpLmdldFdvcmtpbmdEaXJlY3RvcnkoKSkpOwotCQlTdHJpbmcgZXh0ZXJuYWwgPSByZXNvbHZlci5yZXNvbHZlUHJvcGVydGllcyhnZXRFeHRlcm5hbEZvck9TKHNlcnZlckRlZi5nZXRTdG9wKCkuZ2V0RXh0ZXJuYWwoKSkpOwotCQl3Yy5zZXRBdHRyaWJ1dGUoRXh0ZXJuYWxMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGUuQ09NTUFORExJTkUsIGV4dGVybmFsKTsKLQkJLy8ganVzdCB1c2UgY29tbWFuZGxpbmUgZm9yIG5vdwotICAgICAgICBNYXAgZW52aXJvblZhcnMgPSBnZXRFbnZpcm9ubWVudFZhcmlhYmxlcyhnZXRTZXJ2ZXJEZWZpbml0aW9uKCkuZ2V0U3RvcCgpKTsKLSAgICAgICAgaWYoIWVudmlyb25WYXJzLmlzRW1wdHkoKSl7Ci0gICAgICAgIAl3Yy5zZXRBdHRyaWJ1dGUoSUxhdW5jaE1hbmFnZXIuQVRUUl9FTlZJUk9OTUVOVF9WQVJJQUJMRVMsZW52aXJvblZhcnMpOwotICAgICAgICB9Ci0JCXdjLnNldEF0dHJpYnV0ZShFeHRlcm5hbExhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZS5FWEVDVVRBQkxFX05BTUUsIGV4dGVybmFsKTsgCQotCQl3Yy5zZXRBdHRyaWJ1dGUoU2VydmVyLkFUVFJfU0VSVkVSX0lELCBnZXRTZXJ2ZXIoKS5nZXRJZCgpKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgY29uZmlndXJhdGlvbiB0byB1c2UgZm9yIGxhdW5jaGluZyBhIGRlYnVnZ2luZyBzZXNzaW9uCi0JICovCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIHNldERlYnVnZ2luZ0NvbmZpZyhJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IHdjLAotCQkJCQkgCQkJICAgICAgU3RyaW5nIG1vZGUsCi0JCQkJCSAJCQkgICAgICBJTGF1bmNoIGxhdW5jaCwgCi0JCQkJCSAJCQkgICAgICBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJdGhpcy53YyA9IHdjOwotCQl0aGlzLm1vZGUgPSBtb2RlOwotCQl0aGlzLmxhdW5jaCA9IGxhdW5jaDsKLQkJdGhpcy5tb25pdG9yID0gbW9uaXRvcjsKLQl9Ci0JCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBjbGVhckRlYnVnZ2luZ0NvbmZpZygpIHsKLQkJdGhpcy53YyA9IG51bGw7Ci0JCXRoaXMubW9kZSA9IG51bGw7Ci0JCXRoaXMubGF1bmNoID0gbnVsbDsKLQkJdGhpcy5tb25pdG9yID0gbnVsbDsKLQl9Ci0JCi0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvY29yZS9pbnRlcm5hbC9HZW5lcmljUHVibGlzaGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvY29yZS9pbnRlcm5hbC9HZW5lcmljUHVibGlzaGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhOTgzNjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2NvcmUvaW50ZXJuYWwvR2VuZXJpY1B1Ymxpc2hlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci0KLS8qKgotICogVGhlIGFic3RyYWN0IHB1Ymxpc2hlci4gVGhpcyBpcyBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkIGJ5Ci0gKiBjbGllbnRzIGltcGxlbWVudGluZyB0aGUgZ2VuZXJpY3B1Ymxpc2hlciBleHRlbnNpb24gcG9pbnQuCi0gKgotICogQGF1dGhvciBHb3JrZW0gRXJjYW4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEdlbmVyaWNQdWJsaXNoZXIgCi17Ci0gICAgCi0gICAgcHJpdmF0ZSBJTW9kdWxlW10gZk1vZHVsZTsKLSAgICBwcml2YXRlIEdlbmVyaWNTZXJ2ZXJSdW50aW1lIGZTZXJ2ZXJSdW50aW1lOwotICAgIHByaXZhdGUgR2VuZXJpY1NlcnZlciBmU2VydmVyOwotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoSU1vZHVsZVtdIG1vZHVsZSwgSVNlcnZlciBzZXJ2ZXIpCi0gICAgewotICAgICAgICBmTW9kdWxlID0gbW9kdWxlOwotICAgICAgICBmU2VydmVyID0gKEdlbmVyaWNTZXJ2ZXIpc2VydmVyLmxvYWRBZGFwdGVyKEdlbmVyaWNTZXJ2ZXIuY2xhc3MsbnVsbCk7Ci0gICAgICAgIGZTZXJ2ZXJSdW50aW1lID0gKEdlbmVyaWNTZXJ2ZXJSdW50aW1lKXNlcnZlci5nZXRSdW50aW1lKCkubG9hZEFkYXB0ZXIoR2VuZXJpY1NlcnZlclJ1bnRpbWUuY2xhc3MsbnVsbCk7Ci0gICAgfQotICAgLyoqCi0gICAgKiBDYWxsZWQgYnkgdGhlIGdlbmVyaWMgc2VydmVyIGltcGxlbWVudGF0aW9uIHdoZW4gYSBtb2R1bGUgaXMgCi0gICAgKiByZW1vdmVkIGZvcm0gdGhlIHNlcnZlciBpbnN0YW5jZS4gCi0gICAgKiBTdWJjbGFzc2VzIG1heSBleHRlbmQgdGhpcyBtZXRob2QgdG8gcGVyZm9ybSB0aGVpciBvd24gbW9kdWxlIHJlbW92YWwKLSAgICAqIAotICAgICogQHBhcmFtIG1vZHVsZQotICAgICogQHBhcmFtIG1vbml0b3IKLSAgICAqIEByZXR1cm4KLSAgICAqLyAKLSAgIHB1YmxpYyBhYnN0cmFjdCBJU3RhdHVzW10gdW5wdWJsaXNoKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcik7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIGJ5IHRoZSBnZW5lcmljIHNlcnZlciBpbXBsZW1lbnRhdGlvbiB3aGVuIGEgcHVibGlzaCBtb2R1bGUgCi0gICAgICogZXZlbnQgb2NjdXJzLiAKLSAgICAgKiBTdWJjbGFzc2VzIG1heSBleHRlbmQgdGhpcyBtZXRob2QgdG8gcGVyZm9ybSB0aGVpciBvd24gcHVibGlzaGluZwotICAgICAqIAotICAgICAqIEBwYXJhbSByZXNvdXJjZQotICAgICAqIEBwYXJhbSBtb25pdG9yCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBJU3RhdHVzW10gcHVibGlzaChJTW9kdWxlQXJ0aWZhY3RbXSByZXNvdXJjZSwKLSAgICAgICAgICAgIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcik7Ci0gICAKLSAgICBwdWJsaWMgSU1vZHVsZVtdIGdldE1vZHVsZSgpIHsKLSAgICAgICAgcmV0dXJuIGZNb2R1bGU7Ci0gICAgfQotCi0gICAgcHVibGljIEdlbmVyaWNTZXJ2ZXIgZ2V0U2VydmVyKCl7Ci0gICAgCXJldHVybiBmU2VydmVyOwotICAgIH0KLSAgICBwdWJsaWMgR2VuZXJpY1NlcnZlclJ1bnRpbWUgZ2V0U2VydmVyUnVudGltZSgpIHsKLSAgICAgICAgcmV0dXJuIGZTZXJ2ZXJSdW50aW1lOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvY29yZS9pbnRlcm5hbC9HZW5lcmljU2VydmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvY29yZS9pbnRlcm5hbC9HZW5lcmljU2VydmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5YTc1ZTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2NvcmUvaW50ZXJuYWwvR2VuZXJpY1NlcnZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBFdGVyYXRpb24gQS5TLiBhbmQgR29ya2VtIEVyY2FuLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IEdvcmtlbSBFcmNhbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgICAgICAgICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuSUVudGVycHJpc2VBcHBsaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuSVdlYk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklVUkxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuU2VydmVyRGVsZWdhdGU7Ci0KLS8qKgotICogR2VuZXJpYyBYTUwgYmFzZWQgc2VydmVyIGltcGxlbWVudGF0aW9uLgotICogCi0gKiBAYXV0aG9yIEdvcmtlbSBFcmNhbgotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJpY1NlcnZlciBleHRlbmRzIFNlcnZlckRlbGVnYXRlIGltcGxlbWVudHMgSVVSTFByb3ZpZGVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0dFTkVSSUNfU0VSVkVSX01PRFVMRVMgPSAiR2VuZXJpY19TZXJ2ZXJfTW9kdWxlc19MaXN0IjsKLQotCXB1YmxpYyBJU3RhdHVzIGNhbk1vZGlmeU1vZHVsZXMoSU1vZHVsZVtdIGFkZCwgSU1vZHVsZVtdIHJlbW92ZSkgewotCQlMaXN0IG1vZHVsZVR5cGVzID0gZ2V0U2VydmVyRGVmaW5pdGlvbigpLmdldE1vZHVsZSgpOwotICAgICAgICBpbnQgZm91bmQgPTA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYWRkLmxlbmd0aDsgaSsrKSB7Ci0JCQlmb3IoaW50IGo9MDtqPG1vZHVsZVR5cGVzLnNpemUoKTtqKyspewotCQkJCSBNb2R1bGUgbW9kdWxlID0gKE1vZHVsZSltb2R1bGVUeXBlcy5nZXQoaik7Ci0JCQkJIGlmKGFkZFtpXS5nZXRNb2R1bGVUeXBlKCkhPSBudWxsICYmIGFkZFtpXS5nZXRNb2R1bGVUeXBlKCkuZ2V0SWQoKS5lcXVhbHMobW9kdWxlLmdldFR5cGUoKSkpewotCQkJCQkgZm91bmQrKzsKLQkJCQkJIGJyZWFrOwotCQkJCSAgfQotCQkJfQotICAgICAgICB9Ci0JCWlmKGZvdW5kPT1hZGQubGVuZ3RoKQotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgQ29yZVBsdWdpbi5QTFVHSU5fSUQsIDAsICJDYW5Nb2RpZnlNb2R1bGVzIiwgbnVsbCk7Ci0JCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIENvcmVQbHVnaW4uUExVR0lOX0lELCAwLCBHZW5lcmljU2VydmVyQ29yZU1lc3NhZ2VzLm1vZHVsZU5vdENvbXBhdGlibGUsIG51bGwpOwotCX0KLQkKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuU2VydmVyRGVsZWdhdGUjbW9kaWZ5TW9kdWxlcyhvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZVtdLCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZVtdLCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBtb2RpZnlNb2R1bGVzKElNb2R1bGVbXSBhZGQsIElNb2R1bGVbXSByZW1vdmUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgCi0gICAgICAgIExpc3QgbW9kdWxlcyA9IHRoaXMuZ2V0QXR0cmlidXRlKEFUVFJfR0VORVJJQ19TRVJWRVJfTU9EVUxFUywoTGlzdCludWxsKTsKLSAgICAgICAgCi0gICAgICAgIGlmKGFkZCE9bnVsbCYmIGFkZC5sZW5ndGg+MCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobW9kdWxlcz09bnVsbCkgewotICAgICAgICAgICAgICAgbW9kdWxlcz1uZXcgQXJyYXlMaXN0KGFkZC5sZW5ndGgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhZGQubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgaWYobW9kdWxlcy5jb250YWlucyhhZGRbaV0uZ2V0SWQoKSk9PWZhbHNlKQotICAgICAgICAgICAgICAgICAgICBtb2R1bGVzLmFkZChhZGRbaV0uZ2V0SWQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYocmVtb3ZlIT1udWxsICYmIHJlbW92ZS5sZW5ndGg+MCAmJiBtb2R1bGVzIT1udWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlbW92ZS5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIG1vZHVsZXMucmVtb3ZlKHJlbW92ZVtpXS5nZXRJZCgpKTsKLSAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYobW9kdWxlcyE9bnVsbCkgICAgCi0gICAgICAgICAgICBzZXRBdHRyaWJ1dGUoQVRUUl9HRU5FUklDX1NFUlZFUl9NT0RVTEVTLG1vZHVsZXMpOwotICAgICAgICAKLSAgICB9Ci0KLSAJLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSVNlcnZlckRlbGVnYXRlI2dldENoaWxkTW9kdWxlcyhvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSU1vZHVsZVtdKQotCSAqLwotCXB1YmxpYyBJTW9kdWxlW10gZ2V0Q2hpbGRNb2R1bGVzKElNb2R1bGVbXSBtb2R1bGUpIHsKLQkJaWYgKG1vZHVsZVswXSAhPSBudWxsICYmIG1vZHVsZVswXS5nZXRNb2R1bGVUeXBlKCkgIT0gbnVsbCkgewotCQkJaWYgKG1vZHVsZS5sZW5ndGggPT0gMSAmJiAianN0LmVhciIuZXF1YWxzKG1vZHVsZVswXS5nZXRNb2R1bGVUeXBlKCkuZ2V0SWQoKSkpIHsKLQkJCQlJRW50ZXJwcmlzZUFwcGxpY2F0aW9uIGVudGVycHJpc2VBcHBsaWNhdGlvbiA9IChJRW50ZXJwcmlzZUFwcGxpY2F0aW9uKSBtb2R1bGVbMF0KLQkJCQkJCS5sb2FkQWRhcHRlcihJRW50ZXJwcmlzZUFwcGxpY2F0aW9uLmNsYXNzLCBudWxsKTsKLQkJCQlpZiAoZW50ZXJwcmlzZUFwcGxpY2F0aW9uICE9IG51bGwpIHsKLQkJCQkJSU1vZHVsZVtdIGVhck1vZHVsZXMgPSBlbnRlcnByaXNlQXBwbGljYXRpb24uZ2V0TW9kdWxlcygpOyAKLQkJCQkJaWYgKCBlYXJNb2R1bGVzICE9IG51bGwpIHsKLQkJCQkJCXJldHVybiBlYXJNb2R1bGVzOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBuZXcgSU1vZHVsZVswXTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZXJ2ZXIgaW5zdGFuY2UgcHJvcGVydGllcyBpbmNsdWRpbmcgcnVudGltZSBwcm9wZXJ0aWVzLiAKLQkgKiAKLQkgKiBAcmV0dXJuIHNlcnZlciBpbnN0YW5jZSBwcm9wZXJ0aWVzLgotCSAqLwotCXByaXZhdGUgTWFwIGdldEluc3RhbmNlUHJvcGVydGllcygpIHsKLQkJTWFwIHJ1bnRpbWVQcm9wZXJ0aWVzID1nZXRSdW50aW1lRGVsZWdhdGUoKS5nZXRTZXJ2ZXJJbnN0YW5jZVByb3BlcnRpZXMoKTsKLQkJTWFwIHNlcnZlclByb3BlcnRpZXMgPSBnZXRTZXJ2ZXJJbnN0YW5jZVByb3BlcnRpZXMoKTsKLQkJTWFwIGluc3RhbmNlUHJvcGVydGllcyA9IG5ldyBIYXNoTWFwKHJ1bnRpbWVQcm9wZXJ0aWVzLnNpemUoKStzZXJ2ZXJQcm9wZXJ0aWVzLnNpemUoKSk7Ci0JCWluc3RhbmNlUHJvcGVydGllcy5wdXRBbGwocnVudGltZVByb3BlcnRpZXMpOwotCQlpbnN0YW5jZVByb3BlcnRpZXMucHV0QWxsKHNlcnZlclByb3BlcnRpZXMpOwotCQlyZXR1cm4gaW5zdGFuY2VQcm9wZXJ0aWVzOwotCX0KLQkKLSAJCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSU1vbml0b3JhYmxlU2VydmVyI2dldFNlcnZlclBvcnRzKCkKLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclBvcnRbXSBnZXRTZXJ2ZXJQb3J0cygpIHsKLQkJTGlzdCBwb3J0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSXRlcmF0b3IgcEl0ZXIgPSB0aGlzLmdldFNlcnZlckRlZmluaXRpb24oKS5nZXRQb3J0KCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKHBJdGVyLmhhc05leHQoKSkgewotCQkJUG9ydCBlbGVtZW50ID0gKFBvcnQpIHBJdGVyLm5leHQoKTsKLQkJCWludCBwb3J0ID0gSW50ZWdlci5wYXJzZUludChnZXRTZXJ2ZXJEZWZpbml0aW9uKCkuZ2V0UmVzb2x2ZXIoKS5yZXNvbHZlUHJvcGVydGllcyhlbGVtZW50LmdldE5vKCkpKTsKLQkJCXBvcnRzLmFkZChuZXcgU2VydmVyUG9ydCgic2VydmVyIiwgZWxlbWVudC5nZXROYW1lKCksIHBvcnQsIGVsZW1lbnQuZ2V0UHJvdG9jb2woKSkpOwkJCi0JCX0KLQkKLQkJcmV0dXJuIChvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyUG9ydFtdKXBvcnRzLnRvQXJyYXkobmV3IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJQb3J0W3BvcnRzLnNpemUoKV0pOwotCX0KLQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3RwLnNlcnZlci5jb3JlLm1vZGVsLklVUkxQcm92aWRlciNnZXRNb2R1bGVSb290VVJMKG9yZy5lY2xpcHNlLnd0cC5zZXJ2ZXIuY29yZS5tb2RlbC5JTW9kdWxlKQotCSAqLwotCXB1YmxpYyBVUkwgZ2V0TW9kdWxlUm9vdFVSTChJTW9kdWxlIG1vZHVsZSkgewotCi0JCXRyeSB7CQkJCi0gICAgICAgICAgICBpZiAobW9kdWxlID09IG51bGwgfHwgbW9kdWxlLmxvYWRBZGFwdGVyKElXZWJNb2R1bGUuY2xhc3MsbnVsbCk9PW51bGwgKQotCQkJCXJldHVybiBudWxsOwotCi0gICAgICAgICAgICBTdHJpbmcgaG9zdCA9IGdldFNlcnZlcigpLmdldEhvc3QoKTsKLQkJCVN0cmluZyB1cmwgPSAiaHR0cDovLyIraG9zdDsKLQkJCWludCBwb3J0ID0gMDsKLQkJCQotCQkJcG9ydCA9IGdldEh0dHBQb3J0KCk7Ci0JCQlwb3J0ID1TZXJ2ZXJVdGlsLmdldE1vbml0b3JlZFBvcnQoZ2V0U2VydmVyKCksIHBvcnQsICJ3ZWIiKTsKLQkJCWlmIChwb3J0ICE9IDgwKQotCQkJCXVybCArPSAiOiIgKyBwb3J0OwotCi0JCQl1cmwgKz0gIi8iK21vZHVsZS5nZXROYW1lKCk7Ci0KLQkJCWlmICghdXJsLmVuZHNXaXRoKCIvIikpCi0JCQkJdXJsICs9ICIvIjsKLQotCQkJcmV0dXJuIG5ldyBVUkwodXJsKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKCJDb3VsZCBub3QgZ2V0IHJvb3QgVVJMIiwgZSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBpbnQgZ2V0SHR0cFBvcnQoKSB7Ci0JCWludCBwb3J0PS0xOwotCQlJdGVyYXRvciBwSXRlciA9IHRoaXMuZ2V0U2VydmVyRGVmaW5pdGlvbigpLmdldFBvcnQoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAocEl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlQb3J0IGFQb3J0ID0gKFBvcnQpIHBJdGVyLm5leHQoKTsKLQkJCWlmKHBvcnQ9PSAtMSkKLQkJCQlwb3J0ID0gSW50ZWdlci5wYXJzZUludChnZXRTZXJ2ZXJEZWZpbml0aW9uKCkuZ2V0UmVzb2x2ZXIoKS5yZXNvbHZlUHJvcGVydGllcyhhUG9ydC5nZXRObygpKSk7Ci0JCQllbHNlIGlmKCAiaHR0cCIuZXF1YWxzKGFQb3J0LmdldFByb3RvY29sKCkgKSApCi0JCQkJcG9ydCA9IEludGVnZXIucGFyc2VJbnQoYVBvcnQuZ2V0Tm8oKSk7CQotCQl9Ci0JCWlmKCBwb3J0ID09IC0xKQotCQkJcG9ydCA9IDgwODA7Ci0JCXJldHVybiBwb3J0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIFNlcnZlclJ1bnRpbWUgdGhhdCByZXByZXNlbnRzIHRoZSAuc2VydmVyZGVmCi0JICogZmlsZSBmb3IgdGhpcyBzZXJ2ZXIuIAotCSAqIEByZXR1cm4gc2VydmVyIHJ1bnRpbWUKLQkgKi8KLSAgICBwdWJsaWMgU2VydmVyUnVudGltZSBnZXRTZXJ2ZXJEZWZpbml0aW9uKCl7Ci0JCVN0cmluZyBydFR5cGVJZCA9IGdldFNlcnZlcigpLmdldFJ1bnRpbWUoKS5nZXRSdW50aW1lVHlwZSgpLmdldElkKCk7Ci0JCXJldHVybiBDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTZXJ2ZXJUeXBlRGVmaW5pdGlvbk1hbmFnZXIoKS5nZXRTZXJ2ZXJSdW50aW1lRGVmaW5pdGlvbihydFR5cGVJZCxnZXRJbnN0YW5jZVByb3BlcnRpZXMoKSk7Ci0JfQotCi0gICAgcHJpdmF0ZSBHZW5lcmljU2VydmVyUnVudGltZSBnZXRSdW50aW1lRGVsZWdhdGUoKXsKLSAgICAJcmV0dXJuIChHZW5lcmljU2VydmVyUnVudGltZSlnZXRTZXJ2ZXIoKS5nZXRSdW50aW1lKCkubG9hZEFkYXB0ZXIoR2VuZXJpY1NlcnZlclJ1bnRpbWUuY2xhc3MsbnVsbCk7Ci0gICAgIH0KLQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuU2VydmVyRGVsZWdhdGUjZ2V0Um9vdE1vZHVsZXMob3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGUpCi0gICAgICovCi0gICAgcHVibGljIElNb2R1bGVbXSBnZXRSb290TW9kdWxlcyhJTW9kdWxlIG1vZHVsZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAJSVN0YXR1cyBzdGF0dXMgPSBjYW5Nb2RpZnlNb2R1bGVzKG5ldyBJTW9kdWxlW10geyBtb2R1bGUgfSwgbnVsbCk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gbnVsbCAmJiAhc3RhdHVzLmlzT0soKSkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICBJTW9kdWxlW10gY2hpbGRzID0gZG9HZXRQYXJlbnRNb2R1bGVzKG1vZHVsZSk7Ci0gICAgICAgIGlmKGNoaWxkcy5sZW5ndGg+MCkKLSAgICAgICAgCXJldHVybiBjaGlsZHM7Ci0gICAgICAgIHJldHVybiBuZXcgSU1vZHVsZVtdIHsgbW9kdWxlIH07Ci0gICAgfQotCi0KLQlwcml2YXRlIElNb2R1bGVbXSBkb0dldFBhcmVudE1vZHVsZXMoSU1vZHVsZSBtb2R1bGUpIHsKLQkJSU1vZHVsZVtdIGVhcnMgPSBTZXJ2ZXJVdGlsLmdldE1vZHVsZXMoImpzdC5lYXIiKTsKLQkJQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWFycy5sZW5ndGg7IGkrKykgewotCQkJSUVudGVycHJpc2VBcHBsaWNhdGlvbiBlYXIgPSAoSUVudGVycHJpc2VBcHBsaWNhdGlvbillYXJzW2ldLmxvYWRBZGFwdGVyKElFbnRlcnByaXNlQXBwbGljYXRpb24uY2xhc3MsbnVsbCk7Ci0JCQlJTW9kdWxlW10gY2hpbGRzID0gZWFyLmdldE1vZHVsZXMoKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgY2hpbGRzLmxlbmd0aDsgaisrKSB7Ci0JCQkJaWYoY2hpbGRzW2pdLmVxdWFscyhtb2R1bGUpKQotCQkJCQlsaXN0LmFkZChlYXJzW2ldKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gKElNb2R1bGVbXSlsaXN0LnRvQXJyYXkobmV3IElNb2R1bGVbbGlzdC5zaXplKCldKTsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgc2VydmVyIHByb3BlcnRpZXMuCi0JICogQHJldHVybiBNYXAgb2YgcHJvcGVydGllcy4KLQkgKi8KLSAgICBwdWJsaWMgTWFwIGdldFNlcnZlckluc3RhbmNlUHJvcGVydGllcygpIHsKLSAJCXJldHVybiBnZXRBdHRyaWJ1dGUoR2VuZXJpY1NlcnZlclJ1bnRpbWUuU0VSVkVSX0lOU1RBTkNFX1BST1BFUlRJRVMsIG5ldyBIYXNoTWFwKCkpOwotIAl9Ci0gCS8qKgotIAkgKiBDaGFuZ2UgdGhlIHNlcnZlciBpbnN0YW5jZSBwcm9wZXJ0aWVzLgotIAkgKiAKLSAJICogQHBhcmFtIG1hcAotIAkgKi8KLSAJcHVibGljIHZvaWQgc2V0U2VydmVySW5zdGFuY2VQcm9wZXJ0aWVzKE1hcCBtYXApIHsKLSAJCXNldEF0dHJpYnV0ZShHZW5lcmljU2VydmVyUnVudGltZS5TRVJWRVJfSU5TVEFOQ0VfUFJPUEVSVElFUywgbWFwKTsKLSAJfQotIAkvKioKLSAJICogQ2hlY2tzIGlmIHRoZSBwcm9wZXJ0aWVzIHNldCBmb3IgdGhpcyBzZXJ2ZXIgaXMgdmFsaWQuIAotIAkgKiBAcmV0dXJuCi0gCSAqLwotIAlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZSgpIHsKLSAJCUxpc3QgcHJvcHMgPSB0aGlzLmdldFNlcnZlckRlZmluaXRpb24oKS5nZXRQcm9wZXJ0eSgpOwotIAkJZm9yKGludCBpPTA7aTxwcm9wcy5zaXplKCk7aSsrKQotIAkJewotIAkJCVByb3BlcnR5IHByb3BlcnR5ID0oUHJvcGVydHkpcHJvcHMuZ2V0KGkpOwotIAkJCWlmKHByb3BlcnR5LmdldFR5cGUoKS5lcXVhbHMoUHJvcGVydHkuVFlQRV9ESVJFQ1RPUlkpIHx8IHByb3BlcnR5LmdldFR5cGUoKS5lcXVhbHMoUHJvcGVydHkuVFlQRV9GSUxFKSkKLSAJCQl7Ci0gCQkJCVN0cmluZyBwYXRoPSAoU3RyaW5nKWdldEluc3RhbmNlUHJvcGVydGllcygpLmdldChwcm9wZXJ0eS5nZXRJZCgpKTsKLSAJCQkJaWYocGF0aCE9bnVsbCAmJiAhcGF0aEV4aXN0KHBhdGgpKQotIAkJCQkJcmV0dXJuICBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIENvcmVQbHVnaW4uUExVR0lOX0lELCAwLCBHZW5lcmljU2VydmVyQ29yZU1lc3NhZ2VzLmJpbmQoR2VuZXJpY1NlcnZlckNvcmVNZXNzYWdlcy5pbnZhbGlkUGF0aCxwYXRoKSwgbnVsbCk7Ci0gCQkJfQotIAkJfQotIAkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgQ29yZVBsdWdpbi5QTFVHSU5fSUQsIDAsICIiLCBudWxsKTsKLSAJfQotCXByaXZhdGUgYm9vbGVhbiBwYXRoRXhpc3QoU3RyaW5nIHBhdGgpewotCQlGaWxlIGYgPSBuZXcgRmlsZShwYXRoKTsKLQkJcmV0dXJuIGYuZXhpc3RzKCk7Ci0JfQotIAotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotIAkJTGlzdCBwcm9wcyA9IHRoaXMuZ2V0U2VydmVyRGVmaW5pdGlvbigpLmdldFByb3BlcnR5KCk7Ci0gCQlNYXAgaW5zdGFuY2VQcm9wc01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwcm9wcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVByb3BlcnR5IGVsZW1lbnQgPSAoUHJvcGVydHkpIGl0ZXIubmV4dCgpOwotCQkJaWYoUHJvcGVydHkuQ09OVEVYVF9TRVJWRVIuZXF1YWxzSWdub3JlQ2FzZShlbGVtZW50LmdldENvbnRleHQoKSkpCi0JCQkJaW5zdGFuY2VQcm9wc01hcC5wdXQoZWxlbWVudC5nZXRJZCgpLCBlbGVtZW50LmdldERlZmF1bHQoKSk7Ci0JCX0KLSAJCXNldFNlcnZlckluc3RhbmNlUHJvcGVydGllcyhpbnN0YW5jZVByb3BzTWFwKTsKLSAJfQotIAkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvY29yZS9pbnRlcm5hbC9HZW5lcmljU2VydmVyQmVoYXZpb3VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvY29yZS9pbnRlcm5hbC9HZW5lcmljU2VydmVyQmVoYXZpb3VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2YTc5Y2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2NvcmUvaW50ZXJuYWwvR2VuZXJpY1NlcnZlckJlaGF2aW91ci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTA2ICswLDAgQEAKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkRlYnVnRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5EZWJ1Z1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklEZWJ1Z0V2ZW50U2V0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5JRGVidWdVSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLklKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLklSdW50aW1lQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JVk1JbnN0YWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSmF2YVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5BcmNoaXZlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkFyZ3VtZW50UGFpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkNsYXNzcGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkxhdW5jaENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJQb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5EZWxldGVkTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5TZXJ2ZXJCZWhhdmlvdXJEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuU2VydmVyRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnV0aWwuU29ja2V0VXRpbDsKLQotLyoqCi0gKiBTZXJ2ZXIgYmVoYXZpb3VyIGRlbGVnYXRlIGltcGxlbWVudGF0aW9uIGZvciBnZW5lcmljIHNlcnZlci4KLSAqCi0gKiBAYXV0aG9yIEdvcmtlbSBFcmNhbgotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJpY1NlcnZlckJlaGF2aW91ciBleHRlbmRzIFNlcnZlckJlaGF2aW91ckRlbGVnYXRlIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9TVE9QID0gInN0b3Atc2VydmVyIjsgLy8kTk9OLU5MUy0xJAotICAgIAotCS8vIHRoZSB0aHJlYWQgdXNlZCB0byBwaW5nIHRoZSBzZXJ2ZXIgdG8gY2hlY2sgZm9yIHN0YXJ0dXAKLQlwcm90ZWN0ZWQgdHJhbnNpZW50IFBpbmdUaHJlYWQgcGluZyA9IG51bGw7Ci0gICAgcHJvdGVjdGVkIHRyYW5zaWVudCBJRGVidWdFdmVudFNldExpc3RlbmVyIHByb2Nlc3NMaXN0ZW5lcjsKLSAgICBwcm90ZWN0ZWQgdHJhbnNpZW50IElQcm9jZXNzIHByb2Nlc3M7Ci0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLlNlcnZlckJlaGF2aW91ckRlbGVnYXRlI3B1Ymxpc2hTZXJ2ZXIob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcHVibGlzaFNlcnZlcihpbnQga2luZCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIGRvIG5vdGhpbmcKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuU2VydmVyQmVoYXZpb3VyRGVsZWdhdGUjcHVibGlzaE1vZHVsZShvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZVtdLCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZSwgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcHVibGlzaE1vZHVsZShpbnQga2luZCwgaW50IGRlbHRhS2luZCwgSU1vZHVsZVtdIG1vZHVsZSwKLSAgICAgICAgICAgIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotIAotICAgIAljaGVja0Nsb3NlZChtb2R1bGUpOwotICAgICAgICBpZihSRU1PVkVEID09IGRlbHRhS2luZCl7Ci0gICAgICAgICAgICByZW1vdmVGcm9tU2VydmVyKG1vZHVsZSxtb25pdG9yKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlewotICAgICAgICAgICAgU3RyaW5nIHB1Ymxpc2hlcklkID0gU2VydmVyVHlwZURlZmluaXRpb25VdGlsLmdldFB1Ymxpc2hlcklEKG1vZHVsZVswXSwgZ2V0U2VydmVyRGVmaW5pdGlvbigpKTsKLSAgICAgICAgICAgIEdlbmVyaWNQdWJsaXNoZXIgcHVibGlzaGVyID0gUHVibGlzaE1hbmFnZXIuZ2V0UHVibGlzaGVyKHB1Ymxpc2hlcklkKTsKLSAgICAgICAgICAgIGlmKHB1Ymxpc2hlcj09bnVsbCl7Ci0gICAgICAgICAgICAgICAgSVN0YXR1cyBzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsQ29yZVBsdWdpbi5QTFVHSU5fSUQsMCwgR2VuZXJpY1NlcnZlckNvcmVNZXNzYWdlcy5iaW5kKEdlbmVyaWNTZXJ2ZXJDb3JlTWVzc2FnZXMudW5hYmxlVG9DcmVhdGVQdWJsaXNoZXIscHVibGlzaGVySWQpLG51bGwpOwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb3JlRXhjZXB0aW9uKHN0YXR1cyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwdWJsaXNoZXIuaW5pdGlhbGl6ZShtb2R1bGUsZ2V0U2VydmVyKCkpOwotICAgICAgICAgICAgSVN0YXR1c1tdIHN0YXR1cz0gcHVibGlzaGVyLnB1Ymxpc2gobnVsbCxtb25pdG9yKTsKLSAgICAgICAgICAgIGlmKHN0YXR1cz09bnVsbCl7Ci0gICAgICAgICAgICAgICAgc2V0TW9kdWxlUHVibGlzaFN0YXRlKG1vZHVsZSwgSVNlcnZlci5QVUJMSVNIX1NUQVRFX05PTkUpOwotICAgICAgICAgICAgfWVsc2UgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaSA8IHN0YXR1cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoSVN0YXR1cy5FUlJPUiA9PSBzdGF0dXNbaV0uZ2V0U2V2ZXJpdHkoKSl7Ci0gICAgICAgICAgICAgICAgICAgIAlzZXRNb2R1bGVQdWJsaXNoU3RhdGUobW9kdWxlLCBJU2VydmVyLlBVQkxJU0hfU1RBVEVfVU5LTk9XTik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihzdGF0dXNbaV0pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrQ2xvc2VkKElNb2R1bGVbXSBtb2R1bGUpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgewotICAgIAlmb3IoaW50IGk9MDtpPG1vZHVsZS5sZW5ndGg7aSsrKQotICAgIAl7Ci0gICAgCQlpZihtb2R1bGVbaV0gaW5zdGFuY2VvZiBEZWxldGVkTW9kdWxlKQotICAgIAkJewkKLSAgICAgICAgICAgICAgICBJU3RhdHVzIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUixDb3JlUGx1Z2luLlBMVUdJTl9JRCwwLCBHZW5lcmljU2VydmVyQ29yZU1lc3NhZ2VzLmJpbmQoR2VuZXJpY1NlcnZlckNvcmVNZXNzYWdlcy5jYW5Ob3RQdWJsaXNoRGVsZXRlZE1vZHVsZSxtb2R1bGVbaV0uZ2V0TmFtZSgpKSxudWxsKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihzdGF0dXMpOwotICAgIAkJfQotICAgIAl9Ci0gICAgfQotICAgIHByaXZhdGUgdm9pZCByZW1vdmVGcm9tU2VydmVyKElNb2R1bGVbXSBtb2R1bGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICB7Ci0gICAgCVN0cmluZyBwdWJsaXNoZXJJZCA9IFNlcnZlclR5cGVEZWZpbml0aW9uVXRpbC5nZXRQdWJsaXNoZXJJRChtb2R1bGVbMF0sIGdldFNlcnZlckRlZmluaXRpb24oKSk7Ci0gICAgICAgIEdlbmVyaWNQdWJsaXNoZXIgcHVibGlzaGVyID0gUHVibGlzaE1hbmFnZXIuZ2V0UHVibGlzaGVyKHB1Ymxpc2hlcklkKTsgIAotICAgICAgICBpZihwdWJsaXNoZXI9PW51bGwpewotICAgICAgICAgICAgSVN0YXR1cyBzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsQ29yZVBsdWdpbi5QTFVHSU5fSUQsMCxHZW5lcmljU2VydmVyQ29yZU1lc3NhZ2VzLmJpbmQoR2VuZXJpY1NlcnZlckNvcmVNZXNzYWdlcy51bmFibGVUb0NyZWF0ZVB1Ymxpc2hlcixwdWJsaXNoZXJJZCksbnVsbCk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihzdGF0dXMpOwotICAgICAgICB9Ci0gICAgICAgIHB1Ymxpc2hlci5pbml0aWFsaXplKG1vZHVsZSxnZXRTZXJ2ZXIoKSk7Ci0gICAgICAgIHB1Ymxpc2hlci51bnB1Ymxpc2gobW9uaXRvcik7Ci0gICAgfQotICAgIAotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5TZXJ2ZXJCZWhhdmlvdXJEZWxlZ2F0ZSNzdG9wKGJvb2xlYW4pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc3RvcChib29sZWFuIGZvcmNlKSB7Ci0JCWlmIChmb3JjZSkgewotCQkJdGVybWluYXRlKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpbnQgc3RhdGUgPSBnZXRTZXJ2ZXIoKS5nZXRTZXJ2ZXJTdGF0ZSgpOwotCQlpZiAoc3RhdGUgPT0gSVNlcnZlci5TVEFURV9TVE9QUEVEKQotCQkJcmV0dXJuOwotCQllbHNlIGlmIChzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1NUQVJUSU5HIHx8IHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfU1RPUFBJTkcpIHsKLQkJCXRlcm1pbmF0ZSgpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlzaHV0ZG93bihzdGF0ZSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFNodXRzIGRvd24gdGhlIHNlcnZlciB2aWEgdGhlIGxhdW5jaCBjb25maWd1cmF0aW9uLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNodXRkb3duKGludCBzdGF0ZSkgewotCQlHZW5lcmljU2VydmVyUnVudGltZSBydW50aW1lID0gZ2V0UnVudGltZURlbGVnYXRlKCk7Ci0JCXRyeSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJTdG9wcGluZyBTZXJ2ZXIiKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKHN0YXRlICE9IElTZXJ2ZXIuU1RBVEVfU1RPUFBFRCkKLQkJCQlzZXRTZXJ2ZXJTdGF0ZShJU2VydmVyLlNUQVRFX1NUT1BQSU5HKTsKLQkJCVN0cmluZyBjb25maWdUeXBlSUQgPSBnZXRDb25maWdUeXBlSUQoKTsgCi0JCQlJTGF1bmNoTWFuYWdlciBtZ3IgPSBEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TGF1bmNoTWFuYWdlcigpOwotCQkJSUxhdW5jaENvbmZpZ3VyYXRpb25UeXBlIHR5cGUgPSBtZ3IuZ2V0TGF1bmNoQ29uZmlndXJhdGlvblR5cGUoY29uZmlnVHlwZUlEKTsKLQkJCVN0cmluZyBsYXVuY2hOYW1lID0gZ2V0U3RvcExhdW5jaE5hbWUoKTsKLQkJCVN0cmluZyB1bmlxdWVMYXVuY2hOYW1lID0gbWdyLmdlbmVyYXRlVW5pcXVlTGF1bmNoQ29uZmlndXJhdGlvbk5hbWVGcm9tKGxhdW5jaE5hbWUpOwotCQkJSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZiA9IG51bGw7Ci0JCQlJTGF1bmNoQ29uZmlndXJhdGlvbltdIGxjaCA9IG1nci5nZXRMYXVuY2hDb25maWd1cmF0aW9ucyh0eXBlKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGNoLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGxhdW5jaE5hbWUuZXF1YWxzKGxjaFtpXS5nZXROYW1lKCkpKSB7Ci0JCQkJCWNvbmYgPSBsY2hbaV07Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQotCQkJSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSB3YyA9IG51bGw7Ci0JCQlpZiAoY29uZiAhPSBudWxsKSB7Ci0JCQkJd2MgPSBjb25mLmdldFdvcmtpbmdDb3B5KCk7Ci0JCQl9IGVsc2UgewotCQkJCXdjID0gdHlwZS5uZXdJbnN0YW5jZShudWxsLCB1bmlxdWVMYXVuY2hOYW1lKTsKLQkJCX0KLQkJCQotCQkJLy8gVG8gc3RvcCBmcm9tIGFwcGVhcmluZyBpbiBoaXN0b3J5IGxpc3RzCi0JCQl3Yy5zZXRBdHRyaWJ1dGUoSURlYnVnVUlDb25zdGFudHMuQVRUUl9QUklWQVRFLCB0cnVlKTsJCQotCQkJLy8gU2V0IHRoZSBzdG9wIGF0dHJpYnV0ZSBzbyB0aGF0IHdlIGtub3cgd2UgYXJlIHN0b3BwaW5nCi0JCQl3Yy5zZXRBdHRyaWJ1dGUoQVRUUl9TVE9QLCAidHJ1ZSIpOyAvLyROT04tTkxTLTEkCi0JCQkKLQkJCS8vIFNldHVwIHRoZSBsYXVuY2ggY29uZmlnIGZvciBzdG9wcGluZyB0aGUgc2VydmVyCi0JCQlzZXR1cFN0b3BMYXVuY2hDb25maWd1cmF0aW9uKHJ1bnRpbWUsIHdjKTsKLQkJCQotCQkJLy8gTGF1bmNoIHRoZSBzdG9wIGxhdW5jaCBjb25maWcKLQkJCXdjLmxhdW5jaChJTGF1bmNoTWFuYWdlci5SVU5fTU9ERSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIHN0b3BwaW5nIFNlcnZlciIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBTdHJpbmcgSUQgb2YgdGhlIGxhdW5jaCBjb25maWd1cmF0aW9uIHR5cGUuCi0gICAgICogQHJldHVybgotICAgICAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29uZmlnVHlwZUlEKCkgewotCQlyZXR1cm4gSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLklEX0pBVkFfQVBQTElDQVRJT047Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgU3RyaW5nIG5hbWUgb2YgdGhlIHN0b3AgbGF1bmNoIGNvbmZpZ3VyYXRpb24uCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U3RvcExhdW5jaE5hbWUoKSB7Ci0JCXJldHVybiAiR2VuZXJpY1NlcnZlclN0b3BwZXIiOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBpc1JlbW90ZSgpewotCQlyZXR1cm4gKGdldFNlcnZlcigpLmdldFNlcnZlclR5cGUoKS5zdXBwb3J0c1JlbW90ZUhvc3RzKCkmJiAhU29ja2V0VXRpbC5pc0xvY2FsaG9zdChnZXRTZXJ2ZXIoKS5nZXRIb3N0KCkpICk7Ci0JfQkKLQkvKioKLQkgKiBTZXRzIHVwIHRoZSBsYXVuY2ggY29uZmlndXJhdGlvbiBmb3Igc3RvcHBpbmcgdGhlIHNlcnZlci4KLQkgKiBAcGFyYW0gd29ya2luZ0NvcHkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXR1cFN0b3BMYXVuY2hDb25maWd1cmF0aW9uKEdlbmVyaWNTZXJ2ZXJSdW50aW1lIHJ1bnRpbWUsIElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgd2MpIHsKLQkJaWYoaXNSZW1vdGUoKSkvLyBEbyBub3QgbGF1bmNoIGZvciByZW1vdGUgc2VydmVycy4KLQkJCXJldHVybjsKLQkJCi0JCXdjLnNldEF0dHJpYnV0ZSgKLQkJCQlJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9NQUlOX1RZUEVfTkFNRSwKLQkJCQlnZXRTZXJ2ZXJEZWZpbml0aW9uKCkuZ2V0UmVzb2x2ZXIoKS5yZXNvbHZlUHJvcGVydGllcyh0aGlzLmdldFNlcnZlckRlZmluaXRpb24oKS5nZXRTdG9wKCkuZ2V0TWFpbkNsYXNzKCkpKTsKLQotCQlJVk1JbnN0YWxsIHZtSW5zdGFsbCA9IHJ1bnRpbWUuZ2V0Vk1JbnN0YWxsKCk7Ci0JCXdjLnNldEF0dHJpYnV0ZSgKLQkJCQlJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9WTV9JTlNUQUxMX1RZUEUsIHJ1bnRpbWUKLQkJCQkJCS5nZXRWTUluc3RhbGxUeXBlSWQoKSk7Ci0JCXdjLnNldEF0dHJpYnV0ZSgKLQkJCQlJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9WTV9JTlNUQUxMX05BTUUsCi0JCQkJdm1JbnN0YWxsLmdldE5hbWUoKSk7Ci0KLQkJc2V0dXBMYXVuY2hDbGFzc3BhdGgod2MsIHZtSW5zdGFsbCwgZ2V0U3RvcENsYXNzcGF0aCgpKTsKLQotICAgICAgICBNYXAgZW52aXJvblZhcnMgPSBnZXRFbnZpcm9ubWVudFZhcmlhYmxlcyhnZXRTZXJ2ZXJEZWZpbml0aW9uKCkuZ2V0U3RvcCgpKTsKLSAgICAgICAgaWYoIWVudmlyb25WYXJzLmlzRW1wdHkoKSl7Ci0gICAgICAgIAl3Yy5zZXRBdHRyaWJ1dGUoSUxhdW5jaE1hbmFnZXIuQVRUUl9FTlZJUk9OTUVOVF9WQVJJQUJMRVMsZW52aXJvblZhcnMpOwotICAgICAgICB9Ci0gICAgICAgIAotCQl3Yy5zZXRBdHRyaWJ1dGUoCi0JCQkJSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfV09SS0lOR19ESVJFQ1RPUlksCi0JCQkJZ2V0U2VydmVyRGVmaW5pdGlvbigpLmdldFJlc29sdmVyKCkucmVzb2x2ZVByb3BlcnRpZXMoZ2V0U2VydmVyRGVmaW5pdGlvbigpLmdldFN0b3AoKS5nZXRXb3JraW5nRGlyZWN0b3J5KCkpKTsKLQkJd2Muc2V0QXR0cmlidXRlKAotCQkJCUlKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1BST0dSQU1fQVJHVU1FTlRTLAotCQkJCWdldFNlcnZlckRlZmluaXRpb24oKS5nZXRSZXNvbHZlcigpLnJlc29sdmVQcm9wZXJ0aWVzKGdldFNlcnZlckRlZmluaXRpb24oKS5nZXRTdG9wKCkuZ2V0UHJvZ3JhbUFyZ3VtZW50c0FzU3RyaW5nKCkpKTsKLQkJd2Muc2V0QXR0cmlidXRlKAotCQkJCUlKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1ZNX0FSR1VNRU5UUywKLQkJCQlnZXRTZXJ2ZXJEZWZpbml0aW9uKCkuZ2V0UmVzb2x2ZXIoKS5yZXNvbHZlUHJvcGVydGllcyhnZXRTZXJ2ZXJEZWZpbml0aW9uKCkuZ2V0U3RvcCgpLmdldFZtUGFyYW1ldGVyc0FzU3RyaW5nKCkpKTsJCQkJCi0JfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRTdGFydENsYXNzTmFtZSgpIHsKLSAgICAJcmV0dXJuIGdldFNlcnZlckRlZmluaXRpb24oKS5nZXRSZXNvbHZlcigpLnJlc29sdmVQcm9wZXJ0aWVzKGdldFNlcnZlckRlZmluaXRpb24oKS5nZXRTdGFydCgpLmdldE1haW5DbGFzcygpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2VydmVyUnVudGltZSBnZXRTZXJ2ZXJEZWZpbml0aW9uKCkgewotICAgICAgICBHZW5lcmljU2VydmVyIHNlcnZlciA9IChHZW5lcmljU2VydmVyKWdldFNlcnZlcigpLmxvYWRBZGFwdGVyKFNlcnZlckRlbGVnYXRlLmNsYXNzLCBudWxsKTsKLSAgICAgICAgcmV0dXJuIHNlcnZlci5nZXRTZXJ2ZXJEZWZpbml0aW9uKCk7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBHZW5lcmljU2VydmVyUnVudGltZSBnZXRSdW50aW1lRGVsZWdhdGUoKSB7Ci0gICAgICAgcmV0dXJuIChHZW5lcmljU2VydmVyUnVudGltZSlnZXRTZXJ2ZXIoKS5nZXRSdW50aW1lKCkubG9hZEFkYXB0ZXIoR2VuZXJpY1NlcnZlclJ1bnRpbWUuY2xhc3MsbnVsbCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBMaXN0IGdldFN0YXJ0Q2xhc3NwYXRoKCkgewotICAgIAlTdHJpbmcgY3BSZWYgPSBnZXRTZXJ2ZXJEZWZpbml0aW9uKCkuZ2V0U3RhcnQoKS5nZXRDbGFzc3BhdGhSZWZlcmVuY2UoKTsKLSAgICAJcmV0dXJuIHNlcnZlckNsYXNzcGF0aChjcFJlZik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGNwUmVmCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHByb3RlY3RlZCBMaXN0IHNlcnZlckNsYXNzcGF0aChTdHJpbmcgY3BSZWYpIHsKLSAgICAJQ2xhc3NwYXRoIGNsYXNzcGF0aCA9IGdldFNlcnZlckRlZmluaXRpb24oKS5nZXRDbGFzc3BhdGgoY3BSZWYpOwotICAgIAkKLSAgICAgICAgTGlzdCBjcEVudHJ5TGlzdCA9IG5ldyBBcnJheUxpc3QoY2xhc3NwYXRoLmdldEFyY2hpdmUoKS5zaXplKCkpOwotICAgICAgICBJdGVyYXRvciBpdGVyYXRvcj0gY2xhc3NwYXRoLmdldEFyY2hpdmUoKS5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgICAgIHsKLSAgICAgICAgCUFyY2hpdmVUeXBlIGFyY2hpdmUgPSAoQXJjaGl2ZVR5cGUpaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAJU3RyaW5nIGNwYXRoID0gZ2V0U2VydmVyRGVmaW5pdGlvbigpLmdldFJlc29sdmVyKCkucmVzb2x2ZVByb3BlcnRpZXMoYXJjaGl2ZS5nZXRQYXRoKCkpOwotICAgIAkKLSAgICAJCQljcEVudHJ5TGlzdC5hZGQoSmF2YVJ1bnRpbWUubmV3QXJjaGl2ZVJ1bnRpbWVDbGFzc3BhdGhFbnRyeSgKLSAgICAJCQkJCW5ldyBQYXRoKGNwYXRoKSkpOwotICAgICAgICAgfQotICAgIAlyZXR1cm4gY3BFbnRyeUxpc3Q7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHdjCi0gICAgICogQHBhcmFtIHZtSW5zdGFsbAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldHVwTGF1bmNoQ2xhc3NwYXRoKElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgd2MsIElWTUluc3RhbGwgdm1JbnN0YWxsLCBMaXN0IGNwKSB7Ci0JCS8vbWVyZ2UgZXhpc3RpbmcgY2xhc3NwYXRoIHdpdGggc2VydmVyIGNsYXNzcGF0aAotCQl0cnkgewotCQkJSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeVtdIGV4aXN0aW5nQ3BzID0gSmF2YVJ1bnRpbWUuY29tcHV0ZVVucmVzb2x2ZWRSdW50aW1lQ2xhc3NwYXRoKHdjKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXhpc3RpbmdDcHMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZihjcC5jb250YWlucyhleGlzdGluZ0Nwc1tpXSk9PWZhbHNlKXsgCi0JCQkJCWNwLmFkZChleGlzdGluZ0Nwc1tpXSk7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCQotICAgIAl3Yy5zZXRBdHRyaWJ1dGUoSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfQ0xBU1NQQVRILCBjb252ZXJ0Q1BFbnRyeVRvTWVtZW50byhjcCkpOwotICAgIAl3Yy5zZXRBdHRyaWJ1dGUoSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfREVGQVVMVF9DTEFTU1BBVEgsZmFsc2UpOwotICAgIH0KLQotCXByaXZhdGUgTGlzdCBjb252ZXJ0Q1BFbnRyeVRvTWVtZW50byhMaXN0IGNwRW50cnlMaXN0KQotCXsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdChjcEVudHJ5TGlzdC5zaXplKCkpOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IGNwRW50cnlMaXN0Lml0ZXJhdG9yKCk7Ci0JCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkKLQkJewotCQkJSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IChJUnVudGltZUNsYXNzcGF0aEVudHJ5KWl0ZXJhdG9yLm5leHQoKTsKLQkJCXRyeSB7Ci0JCQkJbGlzdC5hZGQoZW50cnkuZ2V0TWVtZW50bygpKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCS8vIGlnbm9yZQotCQkJfQotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldFdvcmtpbmdEaXJlY3RvcnkoKSB7Ci0gICAgCXJldHVybiBnZXRTZXJ2ZXJEZWZpbml0aW9uKCkuZ2V0UmVzb2x2ZXIoKS5yZXNvbHZlUHJvcGVydGllcyhnZXRTZXJ2ZXJEZWZpbml0aW9uKCkuZ2V0U3RhcnQoKS5nZXRXb3JraW5nRGlyZWN0b3J5KCkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UHJvZ3JhbUFyZ3VtZW50cygpIHsKLSAgICAJcmV0dXJuIGdldFNlcnZlckRlZmluaXRpb24oKS5nZXRSZXNvbHZlcigpLnJlc29sdmVQcm9wZXJ0aWVzKGdldFNlcnZlckRlZmluaXRpb24oKS5nZXRTdGFydCgpLmdldFByb2dyYW1Bcmd1bWVudHNBc1N0cmluZygpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgTWFwIGdldEVudmlyb25tZW50VmFyaWFibGVzKExhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlnKXsKLSAgICAgICAgTGlzdCB2YXJpYWJsZXMgPSBjb25maWcuZ2V0RW52aXJvbm1lbnRWYXJpYWJsZSgpOwotICAgICAgICBNYXAgdmFyc01hcCA9IG5ldyBIYXNoTWFwKHZhcmlhYmxlcy5zaXplKCkpOwotICAgICAgICBJdGVyYXRvciBpdGVyYXRvcj0gdmFyaWFibGVzLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSl7Ci0gICAgICAgIAlBcmd1bWVudFBhaXIgcGFpciA9IChBcmd1bWVudFBhaXIpaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAJdmFyc01hcC5wdXQocGFpci5nZXROYW1lKCksZ2V0U2VydmVyRGVmaW5pdGlvbigpLmdldFJlc29sdmVyKCkucmVzb2x2ZVByb3BlcnRpZXMocGFpci5nZXRWYWx1ZSgpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHZhcnNNYXA7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgU3RyaW5nIGdldFZtQXJndW1lbnRzKCkgewotICAgIAlyZXR1cm4gZ2V0U2VydmVyRGVmaW5pdGlvbigpLmdldFJlc29sdmVyKCkucmVzb2x2ZVByb3BlcnRpZXMoZ2V0U2VydmVyRGVmaW5pdGlvbigpLmdldFN0YXJ0KCkuZ2V0Vm1QYXJhbWV0ZXJzQXNTdHJpbmcoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0dXBMYXVuY2hDb25maWd1cmF0aW9uKElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgd29ya2luZ0NvcHksIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZihpc1JlbW90ZSgpKS8vIE5vIGxhdW5jaCBmb3IgcmVtb3RlIHNlcnZlcnMuCi0JCQlyZXR1cm47Ci0gICAgCQotICAgIAl3b3JraW5nQ29weS5zZXRBdHRyaWJ1dGUoCi0gICAgICAgICAgICAgICAgSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfTUFJTl9UWVBFX05BTUUsCi0gICAgICAgICAgICAgICAgZ2V0U3RhcnRDbGFzc05hbWUoKSk7Ci0KLSAgICAgICAgR2VuZXJpY1NlcnZlclJ1bnRpbWUgcnVudGltZSA9IGdldFJ1bnRpbWVEZWxlZ2F0ZSgpOwotCi0gICAgICAgIElWTUluc3RhbGwgdm1JbnN0YWxsID0gcnVudGltZS5nZXRWTUluc3RhbGwoKTsKLSAgICAgICAgd29ya2luZ0NvcHkuc2V0QXR0cmlidXRlKAotICAgICAgICAgICAgICAgIElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1ZNX0lOU1RBTExfVFlQRSwgcnVudGltZQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldFZNSW5zdGFsbFR5cGVJZCgpKTsKLSAgICAgICAgd29ya2luZ0NvcHkuc2V0QXR0cmlidXRlKAotICAgICAgICAgICAgICAgIElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1ZNX0lOU1RBTExfTkFNRSwKLSAgICAgICAgICAgICAgICB2bUluc3RhbGwuZ2V0TmFtZSgpKTsKLQotICAgICAgICBzZXR1cExhdW5jaENsYXNzcGF0aCh3b3JraW5nQ29weSwgdm1JbnN0YWxsLCBnZXRTdGFydENsYXNzcGF0aCgpKTsKLQotCi0gICAgICAgIHdvcmtpbmdDb3B5LnNldEF0dHJpYnV0ZSgKLSAgICAgICAgICAgICAgICBJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9XT1JLSU5HX0RJUkVDVE9SWSwKLSAgICAgICAgICAgICAgICBnZXRXb3JraW5nRGlyZWN0b3J5KCkpOwotICAgICAgICAKLQotICAgICAgICBNYXAgZW52aXJvblZhcnMgPSBnZXRFbnZpcm9ubWVudFZhcmlhYmxlcyhnZXRTZXJ2ZXJEZWZpbml0aW9uKCkuZ2V0U3RhcnQoKSk7Ci0gICAgICAgIGlmKCFlbnZpcm9uVmFycy5pc0VtcHR5KCkpewotICAgICAgICAJd29ya2luZ0NvcHkuc2V0QXR0cmlidXRlKElMYXVuY2hNYW5hZ2VyLkFUVFJfRU5WSVJPTk1FTlRfVkFSSUFCTEVTLGVudmlyb25WYXJzKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgU3RyaW5nIGV4aXN0aW5nUHJvZ0FyZ3MgID0gd29ya2luZ0NvcHkuZ2V0QXR0cmlidXRlKElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1BST0dSQU1fQVJHVU1FTlRTLCAoU3RyaW5nKW51bGwpOwotICAgICAgICBTdHJpbmcgc2VydmVyUHJvZ0FyZ3MgPSAgZ2V0UHJvZ3JhbUFyZ3VtZW50cygpOwotICAgICAgICBpZihleGlzdGluZ1Byb2dBcmdzPT1udWxsIHx8IGV4aXN0aW5nUHJvZ0FyZ3MuaW5kZXhPZihzZXJ2ZXJQcm9nQXJncyk8MCkgewotICAgICAgICAgICAgd29ya2luZ0NvcHkuc2V0QXR0cmlidXRlKElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1BST0dSQU1fQVJHVU1FTlRTLHNlcnZlclByb2dBcmdzKTsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgZXhpc3RpbmdWTUFyZ3MgPSB3b3JraW5nQ29weS5nZXRBdHRyaWJ1dGUoSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfVk1fQVJHVU1FTlRTLChTdHJpbmcpbnVsbCk7Ci0gICAgICAgIFN0cmluZyBzZXJ2ZXJWTUFyZ3M9IGdldFZtQXJndW1lbnRzKCk7Ci0gICAgICAgIGlmKGV4aXN0aW5nVk1BcmdzPT1udWxsIHx8IGV4aXN0aW5nVk1BcmdzLmluZGV4T2Yoc2VydmVyVk1BcmdzKTwwKSB7Ci0gICAgICAgICAgICB3b3JraW5nQ29weS5zZXRBdHRyaWJ1dGUoSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfVk1fQVJHVU1FTlRTLHNlcnZlclZNQXJncyk7Ci0gICAgICAgIH0KLQl9Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2V0dXAgZm9yIHN0YXJ0aW5nIHRoZSBzZXJ2ZXIuCi0gICAgICogCi0gICAgICogQHBhcmFtIGxhdW5jaCBJTGF1bmNoCi0gICAgICogQHBhcmFtIGxhdW5jaE1vZGUgU3RyaW5nCi0gICAgICogQHBhcmFtIG1vbml0b3IgSVByb2dyZXNzTW9uaXRvcgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldHVwTGF1bmNoKElMYXVuY2ggbGF1bmNoLCBTdHJpbmcgbGF1bmNoTW9kZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgCWlmICgidHJ1ZSIuZXF1YWxzKGxhdW5jaC5nZXRMYXVuY2hDb25maWd1cmF0aW9uKCkuZ2V0QXR0cmlidXRlKEFUVFJfU1RPUCwgImZhbHNlIikpKSAgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgCQlyZXR1cm47Ci0KLSAgICAJU3RyaW5nIGhvc3QgPSBnZXRTZXJ2ZXIoKS5nZXRIb3N0KCk7Ci0gICAgCVNlcnZlclBvcnRbXSBwb3J0cyA9IGdldFNlcnZlcigpLmdldFNlcnZlclBvcnRzKG51bGwpOwotICAgIAlTZXJ2ZXJQb3J0IHNwID0gbnVsbDsKLSAgICAJaWYoZ2V0U2VydmVyKCkuZ2V0U2VydmVyVHlwZSgpLnN1cHBvcnRzUmVtb3RlSG9zdHMoKT09ZmFsc2UgJiYgU29ja2V0VXRpbC5pc0xvY2FsaG9zdChob3N0KSl7Ci0JICAgIAlmb3IoaW50IGk9MDtpPHBvcnRzLmxlbmd0aDtpKyspewotCSAgICAJCXNwPSBwb3J0c1tpXTsKLQkgICAgCQlpZiAoU29ja2V0VXRpbC5pc1BvcnRJblVzZShwb3J0c1tpXS5nZXRQb3J0KCksIDUpKQotCSAgICAJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIENvcmVQbHVnaW4uUExVR0lOX0lELCAwLCBHZW5lcmljU2VydmVyQ29yZU1lc3NhZ2VzLmJpbmQoR2VuZXJpY1NlcnZlckNvcmVNZXNzYWdlcy5lcnJvclBvcnRJblVzZSxJbnRlZ2VyLnRvU3RyaW5nKHNwLmdldFBvcnQoKSksc3AuZ2V0TmFtZSgpKSxudWxsKSk7Ci0JICAgIAl9Ci0gICAgCX0KLSAgICAJc2V0U2VydmVyU3RhdGUoSVNlcnZlci5TVEFURV9TVEFSVElORyk7Ci0gICAgCXNldE1vZGUobGF1bmNoTW9kZSk7Ci0gICAgCQotICAgIAkvLyBwaW5nIHNlcnZlciB0byBjaGVjayBmb3Igc3RhcnR1cAotICAgIAl0cnkgewotICAgIAkJU3RyaW5nIHVybCA9ICJodHRwOi8vIitob3N0OyAvLyROT04tTkxTLTEkCi0gICAgCQlpbnQgcG9ydCA9IHNwLmdldFBvcnQoKTsKLSAgICAJCWlmIChwb3J0ICE9IDgwKQotICAgIAkJCXVybCArPSAiOiIgKyBwb3J0OyAvLyROT04tTkxTLTEkCi0gICAgCQlwaW5nID0gbmV3IFBpbmdUaHJlYWQoZ2V0U2VydmVyKCksIHVybCwgdGhpcyk7Ci0gICAgCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDYW4ndCBwaW5nIGZvciBzZXJ2ZXIgc3RhcnR1cC4iKTsgLy8kTk9OLU5MUy0xJAotICAgIAl9Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIHNldFByb2Nlc3MoZmluYWwgSVByb2Nlc3MgbmV3UHJvY2VzcykgewotICAgIAlpZiAocHJvY2VzcyAhPSBudWxsKQotICAgIAkJcmV0dXJuOwotICAgIAlpZihwcm9jZXNzTGlzdGVuZXIhPW51bGwpCi0gICAgCQlEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCkucmVtb3ZlRGVidWdFdmVudExpc3RlbmVyKHByb2Nlc3NMaXN0ZW5lcik7Ci0gICAgCWlmIChuZXdQcm9jZXNzPT1udWxsKQotICAgIAkJcmV0dXJuOwotICAgIAlwcm9jZXNzID0gbmV3UHJvY2VzczsKLSAgICAJcHJvY2Vzc0xpc3RlbmVyID0gbmV3IElEZWJ1Z0V2ZW50U2V0TGlzdGVuZXIoKSB7Ci0gICAgCQlwdWJsaWMgdm9pZCBoYW5kbGVEZWJ1Z0V2ZW50cyhEZWJ1Z0V2ZW50W10gZXZlbnRzKSB7Ci0gICAgCQkJaWYgKGV2ZW50cyAhPSBudWxsKSB7Ci0gICAgCQkJCWludCBzaXplID0gZXZlbnRzLmxlbmd0aDsKLSAgICAJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAJCQkJCWlmIChwcm9jZXNzIT0gbnVsbCAmJiAgcHJvY2Vzcy5lcXVhbHMoZXZlbnRzW2ldLmdldFNvdXJjZSgpKSAmJiBldmVudHNbaV0uZ2V0S2luZCgpID09IERlYnVnRXZlbnQuVEVSTUlOQVRFKSB7Ci0gICAgCQkJCQkJRGVidWdQbHVnaW4uZ2V0RGVmYXVsdCgpLnJlbW92ZURlYnVnRXZlbnRMaXN0ZW5lcih0aGlzKTsKLSAgICAJCQkJCQlzdG9wSW1wbCgpOwotICAgIAkJCQkJfQotICAgIAkJCQl9Ci0gICAgCQkJfQotICAgIAkJfQotICAgIAl9OwotICAgIAlEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCkuYWRkRGVidWdFdmVudExpc3RlbmVyKHByb2Nlc3NMaXN0ZW5lcik7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc3RvcEltcGwoKSB7Ci0gICAgCWlmIChwaW5nICE9IG51bGwpIHsKLSAgICAJCXBpbmcuc3RvcCgpOwotICAgIAkJcGluZyA9IG51bGw7Ci0gICAgCX0KLSAgICAJaWYgKHByb2Nlc3MgIT0gbnVsbCkgewotICAgIAkJcHJvY2VzcyA9IG51bGw7Ci0gICAgCQlEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCkucmVtb3ZlRGVidWdFdmVudExpc3RlbmVyKHByb2Nlc3NMaXN0ZW5lcik7Ci0gICAgCQlwcm9jZXNzTGlzdGVuZXIgPSBudWxsOwotICAgIAl9Ci0gICAgCXNldFNlcnZlclN0YXRlKElTZXJ2ZXIuU1RBVEVfU1RPUFBFRCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVybWluYXRlcyB0aGUgc2VydmVyLgotICAgICAqIFRoaXMgbWV0aG9kIG1heSBiZSBjYWxsZWQgYmVmb3JlIGEgcHJvY2VzcyBjcmVhdGVkIHdoaWxlIHNldHRpbmcgdXAgdGhlIAotICAgICAqIGxhdW5jaCBjb25maWcuIAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHRlcm1pbmF0ZSgpIHsKLSAgICAJaWYgKGdldFNlcnZlcigpLmdldFNlcnZlclN0YXRlKCkgPT0gSVNlcnZlci5TVEFURV9TVE9QUEVEKQotICAgIAkJcmV0dXJuOwotICAgIAotICAgIAl0cnkgewotICAgIAkJc2V0U2VydmVyU3RhdGUoSVNlcnZlci5TVEFURV9TVE9QUElORyk7Ci0gICAgCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJLaWxsaW5nIHRoZSBTZXJ2ZXIgcHJvY2VzcyIpOyAvLyROT04tTkxTLTEkCi0gICAgCQlpZiAocHJvY2VzcyAhPSBudWxsICYmICFwcm9jZXNzLmlzVGVybWluYXRlZCgpKSB7Ci0gICAgCQkJcHJvY2Vzcy50ZXJtaW5hdGUoKTsKLSAgICAJCQkKLSAgICAJCX0KLSAgICAJCXN0b3BJbXBsKCk7Ci0gICAgCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBraWxsaW5nIHRoZSBwcm9jZXNzIiwgZSk7IC8vJE5PTi1OTFMtMSQKLSAgICAJfQotICAgIH0KLQotICAgIHByaXZhdGUgTGlzdCBnZXRTdG9wQ2xhc3NwYXRoKCkgewotICAgIAlTdHJpbmcgY3BSZWYgPSBnZXRTZXJ2ZXJEZWZpbml0aW9uKCkuZ2V0U3RvcCgpLmdldENsYXNzcGF0aFJlZmVyZW5jZSgpOwotICAgIAlyZXR1cm4gc2VydmVyQ2xhc3NwYXRoKGNwUmVmKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwdWJsaXNoRmluaXNoKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICBJTW9kdWxlW10gbW9kdWxlcyA9IHRoaXMuZ2V0U2VydmVyKCkuZ2V0TW9kdWxlcygpOwotICAgICAgICBib29sZWFuIGFsbHB1Ymxpc2hlZD0gdHJ1ZTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtb2R1bGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgIAlpZih0aGlzLmdldFNlcnZlcigpLmdldE1vZHVsZVB1Ymxpc2hTdGF0ZShuZXcgSU1vZHVsZVtde21vZHVsZXNbaV19KSE9SVNlcnZlci5QVUJMSVNIX1NUQVRFX05PTkUpCi0gICAgICAgICAgICAgICAgYWxscHVibGlzaGVkPWZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGlmKGFsbHB1Ymxpc2hlZCkKLSAgICAgICAgICAgIHNldFNlcnZlclB1Ymxpc2hTdGF0ZShJU2VydmVyLlBVQkxJU0hfU1RBVEVfTk9ORSk7Ci0gICAgfQotICAgIAotIAlwcm90ZWN0ZWQgdm9pZCBzZXRTZXJ2ZXJTdGFydGVkKCkgewotIAkJc2V0U2VydmVyU3RhdGUoSVNlcnZlci5TVEFURV9TVEFSVEVEKTsKLSAJfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9jb3JlL2ludGVybmFsL0dlbmVyaWNTZXJ2ZXJDb3JlTWVzc2FnZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9jb3JlL2ludGVybmFsL0dlbmVyaWNTZXJ2ZXJDb3JlTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNmOWY3Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvY29yZS9pbnRlcm5hbC9HZW5lcmljU2VydmVyQ29yZU1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgRXRlcmF0aW9uIEEuUy4gYW5kIEdvcmtlbSBFcmNhbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBHb3JrZW0gRXJjYW4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAgICAgICAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBIZWxwZXIgY2xhc3MgdG8gZ2V0IG1lc3NhZ2VzCi0gKiAKLSAqIEBhdXRob3IgR29ya2VtIEVyY2FuCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmljU2VydmVyQ29yZU1lc3NhZ2VzIGV4dGVuZHMgTkxTewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU09VUkNFX0JVTkRMRT0gIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsLkdlbmVyaWNTZXJ2ZXJDb3JlTWVzc2FnZXMiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjYW5jZWxOb1B1Ymxpc2g7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgbW9kdWxlTm90Q29tcGF0aWJsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvclBvcnRJblVzZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckpSRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvck5vU2VydmVyVHlwZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvck5vQ2xhc3NwYXRoOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yTWlzc2luZ0NsYXNzcGF0aEVudHJ5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yUmVtb3ZlTW9kdWxlQW50cHVibGlzaGVyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yUHVibGlzaEFudHB1Ymxpc2hlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb21tYW5kbGluZVVuc3BlY2lmaWVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtpbmdkaXJVbnNwZWNpZmllZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckxhdW5jaGluZ0V4ZWN1dGFibGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWlzc2luZ1NlcnZlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleHRlcm5hbFN0b3BMYXVuY2hlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWJ1Z1BvcnRVbnNwZWNpZmllZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvclN0YXJ0aW5nRXh0ZXJuYWxEZWJ1Z2dpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW52YWxpZFBhdGg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcnVuTW9kZU5vdFN1cHBvcnRlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1bmFibGVUb0NyZWF0ZVB1Ymxpc2hlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjYW5Ob3RQdWJsaXNoRGVsZXRlZE1vZHVsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhbnRMYXVuY2hlck1pc3Npbmc7Ci0JCi0Jc3RhdGljewotCQkgIE5MUy5pbml0aWFsaXplTWVzc2FnZXMoUkVTT1VSQ0VfQlVORExFLCBHZW5lcmljU2VydmVyQ29yZU1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci0KLQotCi0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2NvcmUvaW50ZXJuYWwvR2VuZXJpY1NlcnZlckNvcmVNZXNzYWdlcy5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2NvcmUvaW50ZXJuYWwvR2VuZXJpY1NlcnZlckNvcmVNZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmUwODhiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9jb3JlL2ludGVybmFsL0dlbmVyaWNTZXJ2ZXJDb3JlTWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0jIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6IEdvcmtlbSBFcmNhbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyAgICAgICAgICAgICAgIAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotZXJyb3JKUkU9SW52YWxpZCBKUkUKLWVycm9yTm9TZXJ2ZXJUeXBlPU5vIHNlcnZlciB0eXBlIGRlZmluaXRpb24KLWVycm9yTWlzc2luZ0NsYXNzcGF0aEVudHJ5PU1pc3NpbmcgY2xhc3NwYXRoIGVudHJ5IHswfQotZXJyb3JQb3J0SW5Vc2U9U2VydmVyIHBvcnQgSW4gVXNlIHswfS17MX0KLWNhbmNlbE5vUHVibGlzaD1Ob3RoaW5nIHRvIHB1Ymxpc2gKLW1vZHVsZU5vdENvbXBhdGlibGU9TW9kdWxlIHR5cGUgaXMgbm90IGNvbXBhdGlibGUKLWVycm9yTm9DbGFzc3BhdGg9Tm8gY2xhc3NwYXRoIGlzIGRlZmluZWQKLWVycm9yUmVtb3ZlTW9kdWxlQW50cHVibGlzaGVyPSBSZW1vdmUgbW9kdWxlIGZhaWxlZCB1c2luZyBBbnQgcHVibGlzaGVyCi1lcnJvclB1Ymxpc2hBbnRwdWJsaXNoZXI9IFB1Ymxpc2ggZmFpbGVkIHVzaW5nIEFudCBwdWJsaXNoZXIKLWNvbW1hbmRsaW5lVW5zcGVjaWZpZWQ9RXhlY3V0YWJsZSBjb21tYW5kbGluZSBpcyB1bnNwZWNpZmllZAotd29ya2luZ2RpclVuc3BlY2lmaWVkPVdvcmtpbmcgZGlyZWN0b3J5IGlzIHVuc3BlY2lmaWVkIG9yIGludmFsaWQKLWVycm9yTGF1bmNoaW5nRXhlY3V0YWJsZT1FcnJvciBsYXVuY2hpbmcgZXhlY3V0YWJsZQotbWlzc2luZ1NlcnZlcj1TZXJ2ZXIgZG9lcyBub3QgZXhpc3QKLWV4dGVybmFsU3RvcExhdW5jaGVyPUV4dGVybmFsTGF1bmNoU3RvcHBlcgotZGVidWdQb3J0VW5zcGVjaWZpZWQ9RGVidWdnaW5nIHBvcnQgaXMgdW5zcGVjaWZpZWQKLWVycm9yU3RhcnRpbmdFeHRlcm5hbERlYnVnZ2luZz1FcnJvciBsYXVuY2hpbmcgcmVtb3RlIGRlYnVnZ2luZyBmb3IgZXh0ZXJuYWwgc2VydmVyLCBjaGFuZ2luZyB0byBub24tZGVidWdnaW5nIG1vZGUuXG5QbGVhc2UgY2hlY2sgdGhlIGRlYnVnIHBvcnQgc2V0dGluZyBhbmQgZW5zdXJlIHRoYXQgdGhlIHNwZWNpZmllZCAnc3RhcnQnIGV4ZWN1dGFibGUgbGF1bmNoZXMgdGhlIHNlcnZlciB3aXRoIGRlYnVnZ2luZyBlbmFibGVkCi1pbnZhbGlkUGF0aCA9IHswfSBpcyBub3QgdmFsaWQKLXJ1bk1vZGVOb3RTdXBwb3J0ZWQ9IFNlbGVjdGVkIFZNIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBtb2RlCi11bmFibGVUb0NyZWF0ZVB1Ymxpc2hlcj1VbmFibGUgdG8gY3JlYXRlIHB1Ymxpc2hlciB7MH0KLWNhbk5vdFB1Ymxpc2hEZWxldGVkTW9kdWxlPUNhbiBub3QgcHVibGlzaCBiZWNhdXNlIG1vZHVsZSB7MH0gaXMgY2xvc2VkIG9yIGRlbGV0ZWQKLWFudExhdW5jaGVyTWlzc2luZz1BbnQgbGF1bmNoZXIgaXMgbWlzc2luZyBvciBkaXNhYmxlZApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2NvcmUvaW50ZXJuYWwvR2VuZXJpY1NlcnZlckxhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2NvcmUvaW50ZXJuYWwvR2VuZXJpY1NlcnZlckxhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjhkMzFkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9jb3JlL2ludGVybmFsL0dlbmVyaWNTZXJ2ZXJMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgRXRlcmF0aW9uIEEuUy4gYW5kIEdvcmtlbSBFcmNhbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBHb3JrZW0gRXJjYW4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAgICAgICAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkFic3RyYWN0SmF2YUxhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkV4ZWN1dGlvbkFyZ3VtZW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLklKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLklWTUluc3RhbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JVk1SdW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5WTVJ1bm5lckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLlNlcnZlckJlaGF2aW91ckRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsLlNvY2tldFV0aWw7Ci0vKioKLSAqIFNlcnZlckxhdW5jaENvbmZpZ3VyYXRpb24gZm9yIHRoZSBnZW5lcmljIHNlcnZlci4KLSAqCi0gKiBAYXV0aG9yIEdvcmtlbSBFcmNhbgotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJpY1NlcnZlckxhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZSBleHRlbmRzIEFic3RyYWN0SmF2YUxhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZSB7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGUjbGF1bmNoKG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb24sIGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaCwgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgbGF1bmNoKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24sIFN0cmluZyBtb2RlLAotCQkJSUxhdW5jaCBsYXVuY2gsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCUlTZXJ2ZXIgc2VydmVyID0gU2VydmVyVXRpbC5nZXRTZXJ2ZXIoY29uZmlndXJhdGlvbik7Ci0JCWlmIChzZXJ2ZXIgPT0gbnVsbCkgewotCQkJYWJvcnQoR2VuZXJpY1NlcnZlckNvcmVNZXNzYWdlcy5taXNzaW5nU2VydmVyLCBudWxsLAotCQkJCQlJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuRVJSX0lOVEVSTkFMX0VSUk9SKTsKLQkJfQotCQlHZW5lcmljU2VydmVyQmVoYXZpb3VyIGdlbmVyaWNTZXJ2ZXIgPSAoR2VuZXJpY1NlcnZlckJlaGF2aW91cikgc2VydmVyLmxvYWRBZGFwdGVyKFNlcnZlckJlaGF2aW91ckRlbGVnYXRlLmNsYXNzLCBudWxsKTsKLQotCQl0cnkgewotCQkJZ2VuZXJpY1NlcnZlci5zZXR1cExhdW5jaChsYXVuY2gsIG1vZGUsIG1vbml0b3IpOwotCQkJaWYoZ2VuZXJpY1NlcnZlci5nZXRTZXJ2ZXIoKS5nZXRTZXJ2ZXJUeXBlKCkuc3VwcG9ydHNSZW1vdGVIb3N0cygpICYmICFTb2NrZXRVdGlsLmlzTG9jYWxob3N0KGdlbmVyaWNTZXJ2ZXIuZ2V0U2VydmVyKCkuZ2V0SG9zdCgpKSl7Ci0JCQkvLyBubyBsYXVuY2ggZm9yIHJlbW90ZSBzZXJ2ZXJzCi0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlTdHJpbmcgbWFpblR5cGVOYW1lID0gZ2VuZXJpY1NlcnZlci5nZXRTdGFydENsYXNzTmFtZSgpOwotCQkJSVZNSW5zdGFsbCB2bSA9IHZlcmlmeVZNSW5zdGFsbChjb25maWd1cmF0aW9uKTsKLQkJCUlWTVJ1bm5lciBydW5uZXIgPSB2bS5nZXRWTVJ1bm5lcihtb2RlKTsKLQkJCWlmKHJ1bm5lcj09IG51bGwpewotCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUixDb3JlUGx1Z2luLlBMVUdJTl9JRCwwLEdlbmVyaWNTZXJ2ZXJDb3JlTWVzc2FnZXMucnVuTW9kZU5vdFN1cHBvcnRlZCxudWxsKSk7Ci0JCQl9Ci0JCQlGaWxlIHdvcmtpbmdEaXIgPSB2ZXJpZnlXb3JraW5nRGlyZWN0b3J5KGNvbmZpZ3VyYXRpb24pOwotCQkJU3RyaW5nIHdvcmtpbmdEaXJOYW1lID0gbnVsbDsKLQkJCWlmICh3b3JraW5nRGlyICE9IG51bGwpCi0JCQkJd29ya2luZ0Rpck5hbWUgPSB3b3JraW5nRGlyLmdldEFic29sdXRlUGF0aCgpOwotCi0JCQkvLyBQcm9ncmFtICYgVk0gYXJncwotCQkJU3RyaW5nIHBnbUFyZ3MgPSBnZXRQcm9ncmFtQXJndW1lbnRzKGNvbmZpZ3VyYXRpb24pOwotCQkJU3RyaW5nIHZtQXJncyA9IGdldFZNQXJndW1lbnRzKGNvbmZpZ3VyYXRpb24pOwotCi0JCQlFeGVjdXRpb25Bcmd1bWVudHMgZXhlY0FyZ3MgPSBuZXcgRXhlY3V0aW9uQXJndW1lbnRzKHZtQXJncywKLQkJCQkJcGdtQXJncyk7Ci0KLQkJCS8vIFZNLXNwZWNpZmljIGF0dHJpYnV0ZXMKLQkJCU1hcCB2bUF0dHJpYnV0ZXNNYXAgPSBnZXRWTVNwZWNpZmljQXR0cmlidXRlc01hcChjb25maWd1cmF0aW9uKTsKLQotCQkJLy8gQ2xhc3NwYXRoCi0JCQlTdHJpbmdbXSBjbGFzc3BhdGggPSBnZXRDbGFzc3BhdGgoY29uZmlndXJhdGlvbik7Ci0KLQkJCS8vIENyZWF0ZSBWTSBjb25maWcKLQkJCVZNUnVubmVyQ29uZmlndXJhdGlvbiBydW5Db25maWcgPSBuZXcgVk1SdW5uZXJDb25maWd1cmF0aW9uKAotCQkJCQltYWluVHlwZU5hbWUsIGNsYXNzcGF0aCk7Ci0JCQlydW5Db25maWcuc2V0UHJvZ3JhbUFyZ3VtZW50cyhleGVjQXJncy5nZXRQcm9ncmFtQXJndW1lbnRzQXJyYXkoKSk7Ci0JCQlydW5Db25maWcuc2V0Vk1Bcmd1bWVudHMoZXhlY0FyZ3MuZ2V0Vk1Bcmd1bWVudHNBcnJheSgpKTsKLQkJCXJ1bkNvbmZpZy5zZXRXb3JraW5nRGlyZWN0b3J5KHdvcmtpbmdEaXJOYW1lKTsKLQkJCXJ1bkNvbmZpZy5zZXRWTVNwZWNpZmljQXR0cmlidXRlc01hcCh2bUF0dHJpYnV0ZXNNYXApOwotCi0JCQkvLyBCb290cGF0aAotCQkJU3RyaW5nW10gYm9vdHBhdGggPSBnZXRCb290cGF0aChjb25maWd1cmF0aW9uKTsKLQkJCWlmIChib290cGF0aCAhPSBudWxsICYmIGJvb3RwYXRoLmxlbmd0aCA+IDApCi0JCQkJcnVuQ29uZmlnLnNldEJvb3RDbGFzc1BhdGgoYm9vdHBhdGgpOwotCi0JCQlzZXREZWZhdWx0U291cmNlTG9jYXRvcihsYXVuY2gsIGNvbmZpZ3VyYXRpb24pOwotCQkJLy8gTGF1bmNoIHRoZSBjb25maWd1cmF0aW9uCi0JCQlydW5uZXIucnVuKHJ1bkNvbmZpZywgbGF1bmNoLCBtb25pdG9yKTsKLQkJCWdlbmVyaWNTZXJ2ZXIuc2V0UHJvY2VzcyhsYXVuY2guZ2V0UHJvY2Vzc2VzKClbMF0pOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwiZXJyb3IgbGF1bmNoaW5nIGdlbmVyaWMgc2VydmVyIixlKTsgLy8kTk9OLU5MUy0xJAotCQkJZ2VuZXJpY1NlcnZlci50ZXJtaW5hdGUoKTsKLQkJCXRocm93IGU7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaHJvd3MgYSBjb3JlIGV4Y2VwdGlvbiB3aXRoIHRoZSBnaXZlbiBtZXNzYWdlIGFuZCBvcHRpb25hbAotCSAqIGV4Y2VwdGlvbi4gVGhlIGV4Y2VwdGlvbidzIHN0YXR1cyBjb2RlIHdpbGwgaW5kaWNhdGUgYW4gZXJyb3IuCi0JICogCi0JICogQHBhcmFtIG1lc3NhZ2UgZXJyb3IgbWVzc2FnZQotCSAqIEBwYXJhbSBleGNlcHRpb24gY2F1c2Ugb2YgdGhlIGVycm9yLCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbiB3aXRoIHRoZSBnaXZlbiBtZXNzYWdlIGFuZCB1bmRlcmx5aW5nCi0JICogIGV4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFib3J0KFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uLCBpbnQgY29kZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCBjb2RlLCBtZXNzYWdlLCBleGNlcHRpb24pKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvY29yZS9pbnRlcm5hbC9HZW5lcmljU2VydmVyTGF1bmNoYWJsZUFkYXB0ZXJEZWxlZ2F0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2NvcmUvaW50ZXJuYWwvR2VuZXJpY1NlcnZlckxhdW5jaGFibGVBZGFwdGVyRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdiODE5Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvY29yZS9pbnRlcm5hbC9HZW5lcmljU2VydmVyTGF1bmNoYWJsZUFkYXB0ZXJEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBFdGVyYXRpb24gQS5TLiBhbmQgR29ya2VtIEVyY2FuLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IEdvcmtlbSBFcmNhbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgICAgICAgICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnV0aWwuSHR0cExhdW5jaGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnV0aWwuV2ViUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLkVKQkJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLkpuZGlMYXVuY2hhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5KbmRpT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5TZXJ2bGV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uQXJndW1lbnRQYWlyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyUnVudGltZTsKLS8qKgotICogTGF1bmNoYWJsZSBhZGFwdGVyIGRlbGVnYXRlIGZvciBnZW5lcmljIHNlcnZlcnMuCi0gKiBAYXV0aG9yIEdvcmtlbSBFcmNhbiAKLSAqLwotcHVibGljIGNsYXNzIEdlbmVyaWNTZXJ2ZXJMYXVuY2hhYmxlQWRhcHRlckRlbGVnYXRlIGV4dGVuZHMgTGF1bmNoYWJsZUFkYXB0ZXJEZWxlZ2F0ZSB7Ci0JLyoKLQkgKiBAc2VlIElMYXVuY2hhYmxlQWRhcHRlckRlbGVnYXRlI2dldExhdW5jaGFibGUoSVNlcnZlciwgSU1vZHVsZU9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldExhdW5jaGFibGUoSVNlcnZlciBzZXJ2ZXIsIElNb2R1bGVBcnRpZmFjdCBtb2R1bGVPYmplY3QpIHsKLQkJU2VydmVyRGVsZWdhdGUgZGVsZWdhdGUgPSAoU2VydmVyRGVsZWdhdGUpc2VydmVyLmxvYWRBZGFwdGVyKFNlcnZlckRlbGVnYXRlLmNsYXNzLG51bGwpOwotCQlpZiAoIShkZWxlZ2F0ZSBpbnN0YW5jZW9mIEdlbmVyaWNTZXJ2ZXIpKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICgobW9kdWxlT2JqZWN0IGluc3RhbmNlb2YgU2VydmxldCkgfHwobW9kdWxlT2JqZWN0IGluc3RhbmNlb2YgV2ViUmVzb3VyY2UpKQotICAgICAgICAgICAgcmV0dXJuIHByZXBhcmVIdHRwTGF1bmNoYWJsZShtb2R1bGVPYmplY3QsIGRlbGVnYXRlKTsKLQkJCi0gICAgICAgIGlmKChtb2R1bGVPYmplY3QgaW5zdGFuY2VvZiBFSkJCZWFuKSB8fCAobW9kdWxlT2JqZWN0IGluc3RhbmNlb2YgSm5kaU9iamVjdCkpCi0gICAgICAgICAgICByZXR1cm4gcHJlcGFyZUpuZGlMYXVuY2hhYmxlKG1vZHVsZU9iamVjdCxkZWxlZ2F0ZSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotICAgIHByaXZhdGUgT2JqZWN0IHByZXBhcmVKbmRpTGF1bmNoYWJsZShJTW9kdWxlQXJ0aWZhY3QgbW9kdWxlT2JqZWN0LCBTZXJ2ZXJEZWxlZ2F0ZSBkZWxlZ2F0ZSkgewotICAgICAgICBKbmRpTGF1bmNoYWJsZSBsYXVuY2hhYmxlID0gbnVsbDsKLSAgICAgICAgR2VuZXJpY1NlcnZlciBnZW5lcmljU2VydmVyID0gKEdlbmVyaWNTZXJ2ZXIpZGVsZWdhdGU7Ci0gICAgICAgIFNlcnZlclJ1bnRpbWUgZGVmaW5pdGlvbiA9IGdlbmVyaWNTZXJ2ZXIuZ2V0U2VydmVyRGVmaW5pdGlvbigpOwotICAgICAgICBQcm9wZXJ0aWVzIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKLSAgICAgICAgcHJvcHMucHV0KCJqYXZhLm5hbWluZy5mYWN0b3J5LmluaXRpYWwiLGRlZmluaXRpb24uZ2V0Sm5kaUNvbm5lY3Rpb24oKS5nZXRJbml0aWFsQ29udGV4dEZhY3RvcnkoKSk7Ci0gICAgICAgIHByb3BzLnB1dCgiamF2YS5uYW1pbmcucHJvdmlkZXIudXJsIixkZWZpbml0aW9uLmdldEpuZGlDb25uZWN0aW9uKCkuZ2V0UHJvdmlkZXJVcmwoKSk7Ci0gICAgICAgIExpc3QganBzID0gZGVmaW5pdGlvbi5nZXRKbmRpQ29ubmVjdGlvbigpLmdldEpuZGlQcm9wZXJ0eSgpOwotICAgICAgICBJdGVyYXRvciBwcm9wc0l0ID1qcHMuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUocHJvcHNJdC5oYXNOZXh0KCkpewotICAgICAgICAgICAgQXJndW1lbnRQYWlyIHByb3AgPSAoQXJndW1lbnRQYWlyKXByb3BzSXQubmV4dCgpOwotICAgICAgICAgICAgcHJvcHMucHV0KHByb3AuZ2V0TmFtZSgpLHByb3AuZ2V0VmFsdWUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmKG1vZHVsZU9iamVjdCBpbnN0YW5jZW9mIEVKQkJlYW4pCi0gICAgICAgIHsKLSAgICAgICAgICAgIEVKQkJlYW4gYmVhbiA9IChFSkJCZWFuKW1vZHVsZU9iamVjdDsKLSAgICAgICAgICAgIGxhdW5jaGFibGUgPSBuZXcgSm5kaUxhdW5jaGFibGUocHJvcHMsYmVhbi5nZXRKbmRpTmFtZSgpKTsKLSAgICAgICAgfQotICAgICAgICBpZihtb2R1bGVPYmplY3QgaW5zdGFuY2VvZiBKbmRpT2JqZWN0KQotICAgICAgICB7Ci0gICAgICAgICAgICBKbmRpT2JqZWN0IGpuZGkgPSAoSm5kaU9iamVjdCltb2R1bGVPYmplY3Q7Ci0gICAgICAgICAgICBsYXVuY2hhYmxlID0gbmV3IEpuZGlMYXVuY2hhYmxlKHByb3BzLGpuZGkuZ2V0Sm5kaU5hbWUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGxhdW5jaGFibGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG1vZHVsZU9iamVjdAotICAgICAqIEBwYXJhbSBkZWxlZ2F0ZQotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwcml2YXRlIE9iamVjdCBwcmVwYXJlSHR0cExhdW5jaGFibGUoSU1vZHVsZUFydGlmYWN0IG1vZHVsZU9iamVjdCwgU2VydmVyRGVsZWdhdGUgZGVsZWdhdGUpIHsKLSAgICAgICAgdHJ5IHsKLQkJCVVSTCB1cmwgPSAoKElVUkxQcm92aWRlcikgZGVsZWdhdGUpLmdldE1vZHVsZVJvb3RVUkwobW9kdWxlT2JqZWN0LmdldE1vZHVsZSgpKTsKLQkJCQotCQkJVHJhY2UudHJhY2UoInJvb3Q6ICIgKyB1cmwpOwotCi0JCQlpZiAobW9kdWxlT2JqZWN0IGluc3RhbmNlb2YgU2VydmxldCkgewotCQkJCVNlcnZsZXQgc2VydmxldCA9IChTZXJ2bGV0KSBtb2R1bGVPYmplY3Q7Ci0JCQkJaWYgKHNlcnZsZXQuZ2V0QWxpYXMoKSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBwYXRoID0gc2VydmxldC5nZXRBbGlhcygpOwotCQkJCQlpZiAocGF0aC5zdGFydHNXaXRoKCIvIikpCi0JCQkJCQlwYXRoID0gcGF0aC5zdWJzdHJpbmcoMSk7Ci0JCQkJCXVybCA9IG5ldyBVUkwodXJsLCBwYXRoKTsKLQkJCQl9IGVsc2UKLQkJCQkJdXJsID0gbmV3IFVSTCh1cmwsICJzZXJ2bGV0LyIgKyBzZXJ2bGV0LmdldFNlcnZsZXRDbGFzc05hbWUoKSk7Ci0JCQl9IGVsc2UgaWYgKG1vZHVsZU9iamVjdCBpbnN0YW5jZW9mIFdlYlJlc291cmNlKSB7Ci0JCQkJV2ViUmVzb3VyY2UgcmVzb3VyY2UgPSAoV2ViUmVzb3VyY2UpIG1vZHVsZU9iamVjdDsKLQkJCQlTdHJpbmcgcGF0aCA9IHJlc291cmNlLmdldFBhdGgoKS50b1N0cmluZygpOwotCQkJCVRyYWNlLnRyYWNlKCJwYXRoOiAiICsgcGF0aCk7Ci0JCQkJaWYgKHBhdGggIT0gbnVsbCAmJiBwYXRoLnN0YXJ0c1dpdGgoIi8iKSAmJiBwYXRoLmxlbmd0aCgpID4gMCkKLQkJCQkJcGF0aCA9IHBhdGguc3Vic3RyaW5nKDEpOwotCQkJCWlmIChwYXRoICE9IG51bGwgJiYgcGF0aC5sZW5ndGgoKSA+IDApCi0JCQkJCXVybCA9IG5ldyBVUkwodXJsLCBwYXRoKTsKLQkJCX0gCi0JCQlyZXR1cm4gbmV3IEh0dHBMYXVuY2hhYmxlKHVybCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZSgiRXJyb3IgZ2V0dGluZyBVUkwgZm9yICIgKyBtb2R1bGVPYmplY3QsIGUpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvY29yZS9pbnRlcm5hbC9HZW5lcmljU2VydmVyUnVudGltZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2NvcmUvaW50ZXJuYWwvR2VuZXJpY1NlcnZlclJ1bnRpbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmExNmFiYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvY29yZS9pbnRlcm5hbC9HZW5lcmljU2VydmVyUnVudGltZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBFdGVyYXRpb24gQS5TLiBhbmQgR29ya2VtIEVyY2FuLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IEdvcmtlbSBFcmNhbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgICAgICAgICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSVZNSW5zdGFsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLklWTUluc3RhbGxUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSmF2YVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLklKYXZhUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkFyY2hpdmVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uQ2xhc3NwYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5SdW50aW1lRGVsZWdhdGU7Ci0vKioKLSAqIEdlbmVyaWMgc2VydmVyIHJ1bnRpbWUgc3VwcG9ydC4KLSAqCi0gKiBAYXV0aG9yIEdvcmtlbSBFcmNhbgotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJpY1NlcnZlclJ1bnRpbWUgZXh0ZW5kcyBSdW50aW1lRGVsZWdhdGUgaW1wbGVtZW50cyBJSmF2YVJ1bnRpbWUKLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9WTV9JTlNUQUxMX1RZUEVfSUQgPSAidm0taW5zdGFsbC10eXBlLWlkIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9WTV9JTlNUQUxMX0lEID0gInZtLWluc3RhbGwtaWQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZFUl9ERUZJTklUSU9OX0lEID0gInNlcnZlcl9kZWZpbml0aW9uX2lkIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWRVJfSU5TVEFOQ0VfUFJPUEVSVElFUyA9ICJnZW5lcmljX3NlcnZlcl9pbnN0YW5jZV9wcm9wZXJ0aWVzIjsKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5JR2VuZXJpY1J1bnRpbWUjZ2V0Vk1JbnN0YWxsVHlwZUlkKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZNSW5zdGFsbFR5cGVJZCgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZShQUk9QX1ZNX0lOU1RBTExfVFlQRV9JRCwgKFN0cmluZyludWxsKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNVc2luZ0RlZmF1bHRKUkUoKSB7Ci0JCXJldHVybiBnZXRWTUluc3RhbGxUeXBlSWQoKSA9PSBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5JR2VuZXJpY1J1bnRpbWUjZ2V0Vk1JbnN0YWxsSWQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Vk1JbnN0YWxsSWQoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoUFJPUF9WTV9JTlNUQUxMX0lELCAoU3RyaW5nKW51bGwpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5JR2VuZXJpY1J1bnRpbWUjZ2V0Vk1JbnN0YWxsKCkKLQkgKi8KLQlwdWJsaWMgSVZNSW5zdGFsbCBnZXRWTUluc3RhbGwoKSB7Ci0JCWlmIChnZXRWTUluc3RhbGxUeXBlSWQoKSA9PSBudWxsKQotCQkJcmV0dXJuIEphdmFSdW50aW1lLmdldERlZmF1bHRWTUluc3RhbGwoKTsKLQkJdHJ5IHsKLQkJCUlWTUluc3RhbGxUeXBlIHZtSW5zdGFsbFR5cGUgPSBKYXZhUnVudGltZS5nZXRWTUluc3RhbGxUeXBlKGdldFZNSW5zdGFsbFR5cGVJZCgpKTsKLQkJCUlWTUluc3RhbGxbXSB2bUluc3RhbGxzID0gdm1JbnN0YWxsVHlwZS5nZXRWTUluc3RhbGxzKCk7Ci0JCQlpbnQgc2l6ZSA9IHZtSW5zdGFsbHMubGVuZ3RoOwotCQkJU3RyaW5nIGlkID0gZ2V0Vk1JbnN0YWxsSWQoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJaWYgKGlkLmVxdWFscyh2bUluc3RhbGxzW2ldLmdldElkKCkpKQotCQkJCQlyZXR1cm4gdm1JbnN0YWxsc1tpXTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCXJldHVybiBudWxsOwotCQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5JR2VuZXJpY1J1bnRpbWUjdmFsaWRhdGUoKQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKCkgewotCQlpZiAoZ2V0Vk1JbnN0YWxsKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ29yZVBsdWdpbi5QTFVHSU5fSUQsIDAsIEdlbmVyaWNTZXJ2ZXJDb3JlTWVzc2FnZXMuZXJyb3JKUkUsIG51bGwpOwotCQl9Ci0JCVNlcnZlclJ1bnRpbWUgc2VydmVyVHlwZURlZmluaXRpb24gPSBnZXRTZXJ2ZXJUeXBlRGVmaW5pdGlvbigpOwotICAgICAgICBpZihzZXJ2ZXJUeXBlRGVmaW5pdGlvbiA9PSBudWxsKSB7Ci0JCSAgICByZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBDb3JlUGx1Z2luLlBMVUdJTl9JRCwgMCwgR2VuZXJpY1NlcnZlckNvcmVNZXNzYWdlcy5lcnJvck5vU2VydmVyVHlwZSwgbnVsbCk7Ci0gICAgICAgIH0KLQkJaWYoc2VydmVyVHlwZURlZmluaXRpb24uZ2V0Q2xhc3NwYXRoKCk9PSBudWxsIHx8IHNlcnZlclR5cGVEZWZpbml0aW9uLmdldENsYXNzcGF0aCgpLnNpemUoKTwxKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBDb3JlUGx1Z2luLlBMVUdJTl9JRCwgMCAsR2VuZXJpY1NlcnZlckNvcmVNZXNzYWdlcy5lcnJvck5vQ2xhc3NwYXRoLG51bGwpOwotCQl9Ci0gICAgICAgIHJldHVybiB2YWxpZGF0ZUNsYXNzcGF0aHMoc2VydmVyVHlwZURlZmluaXRpb24pOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBhbGwgZGVmaW5lZCBjbGFzc3BhdGhzLgotCSAqLwotCXByb3RlY3RlZCBJU3RhdHVzIHZhbGlkYXRlQ2xhc3NwYXRocyhTZXJ2ZXJSdW50aW1lIHNlcnZlclR5cGVEZWZpbml0aW9uKSB7Ci0JCUl0ZXJhdG9yIGNwTGlzdCAgPSBzZXJ2ZXJUeXBlRGVmaW5pdGlvbi5nZXRDbGFzc3BhdGgoKS5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoY3BMaXN0Lmhhc05leHQoKSkgewotCQkJQ2xhc3NwYXRoIGNwdGggPSAoQ2xhc3NwYXRoKSBjcExpc3QubmV4dCgpOwotCSAgICAgICAgaWYoY3B0aC5nZXRBcmNoaXZlKCk9PSBudWxsIHx8IGNwdGguZ2V0QXJjaGl2ZSgpLnNpemUoKTwxKQotCSAgICAgICAgICAgIHJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIENvcmVQbHVnaW4uUExVR0lOX0lELCAwICxHZW5lcmljU2VydmVyQ29yZU1lc3NhZ2VzLmVycm9yTm9DbGFzc3BhdGgsbnVsbCk7Ci0JCQlJdGVyYXRvciBhcmNoSXRlciA9IGNwdGguZ2V0QXJjaGl2ZSgpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoYXJjaEl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJQXJjaGl2ZVR5cGUgYXJjaCA9IChBcmNoaXZlVHlwZSkgYXJjaEl0ZXIubmV4dCgpOwotCQkJCVN0cmluZyBhcmNQYXRoID0gc2VydmVyVHlwZURlZmluaXRpb24uZ2V0UmVzb2x2ZXIoKS5yZXNvbHZlUHJvcGVydGllcyhhcmNoLmdldFBhdGgoKSk7Ci0JCSAgICAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUoYXJjUGF0aCk7Ci0JCSAgICAgICAgICAgIGlmKGYuZXhpc3RzKCk9PWZhbHNlKQotCQkgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ29yZVBsdWdpbi5QTFVHSU5fSUQsIDAgLEdlbmVyaWNTZXJ2ZXJDb3JlTWVzc2FnZXMuYmluZChHZW5lcmljU2VydmVyQ29yZU1lc3NhZ2VzLmVycm9yTWlzc2luZ0NsYXNzcGF0aEVudHJ5LGYuZ2V0UGF0aCgpKSxudWxsKTsJCi0JCQl9Ci0JCX0KLSAgICAgICAgcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgQ29yZVBsdWdpbi5QTFVHSU5fSUQsIDAsICIiLCBudWxsKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgU2VydmVyVHlwZURlZmluaXRpb24gZm9yIHRoaXMgcnVudGltZS4gCi0JICogUG9wdWxhdGVkIHdpdGggdGhlIHVzZXIgcHJvcGVydGllcyBpZiBleGlzdHMuIAotCSAqIAotCSAqIEByZXR1cm4gcG9wdWxhdGVkIFNlcnZlclR5cGVEZWZpbml0aW9uCi0JICovCi0JcHVibGljIFNlcnZlclJ1bnRpbWUgZ2V0U2VydmVyVHlwZURlZmluaXRpb24oKQotCXsKLQkgICBTdHJpbmcgaWQ9ICBnZXRSdW50aW1lKCkuZ2V0UnVudGltZVR5cGUoKS5nZXRJZCgpOwotCSAgIE1hcCBwcm9wZXJ0aWVzID0gZ2V0QXR0cmlidXRlKFNFUlZFUl9JTlNUQU5DRV9QUk9QRVJUSUVTLChNYXApbnVsbCk7Ci0JICAgaWYoaWQ9PW51bGwpCi0JICAgICAgIHJldHVybiBudWxsOwotCSAgIHJldHVybiBDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTZXJ2ZXJUeXBlRGVmaW5pdGlvbk1hbmFnZXIoKS5nZXRTZXJ2ZXJSdW50aW1lRGVmaW5pdGlvbihpZCxwcm9wZXJ0aWVzKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0Vk1JbnN0YWxsKElWTUluc3RhbGwgdm1JbnN0YWxsKSB7Ci0JCWlmICh2bUluc3RhbGwgPT0gbnVsbCkgewotCQkJc2V0Vk1JbnN0YWxsKG51bGwsIG51bGwpOwotCQl9IGVsc2UKLQkJCXNldFZNSW5zdGFsbCh2bUluc3RhbGwuZ2V0Vk1JbnN0YWxsVHlwZSgpLmdldElkKCksIHZtSW5zdGFsbC5nZXRJZCgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNldFZNSW5zdGFsbChTdHJpbmcgdHlwZUlkLCBTdHJpbmcgaWQpIHsKLQkJaWYgKHR5cGVJZCA9PSBudWxsKQotCQkJc2V0QXR0cmlidXRlKFBST1BfVk1fSU5TVEFMTF9UWVBFX0lELCAoU3RyaW5nKW51bGwpOwotCQllbHNlCi0JCQlzZXRBdHRyaWJ1dGUoUFJPUF9WTV9JTlNUQUxMX1RZUEVfSUQsIHR5cGVJZCk7Ci0JCQotCQlpZiAoaWQgPT0gbnVsbCkKLQkJCXNldEF0dHJpYnV0ZShQUk9QX1ZNX0lOU1RBTExfSUQsIChTdHJpbmcpbnVsbCk7Ci0JCWVsc2UKLQkJCXNldEF0dHJpYnV0ZShQUk9QX1ZNX0lOU1RBTExfSUQsIGlkKTsKLQl9Ci0JCi0JCi0JcHVibGljIE1hcCBnZXRTZXJ2ZXJJbnN0YW5jZVByb3BlcnRpZXMoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoU0VSVkVSX0lOU1RBTkNFX1BST1BFUlRJRVMsIG5ldyBIYXNoTWFwKCkpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFNlcnZlckRlZmluaXRpb25JZCgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZShTRVJWRVJfREVGSU5JVElPTl9JRCwgKFN0cmluZykgbnVsbCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFNlcnZlckluc3RhbmNlUHJvcGVydGllcyhNYXAgbWFwKSB7Ci0JCXNldEF0dHJpYnV0ZShTRVJWRVJfSU5TVEFOQ0VfUFJPUEVSVElFUywgbWFwKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U2VydmVyRGVmaW5pdGlvbklkKFN0cmluZyBzKSB7Ci0JCXNldEF0dHJpYnV0ZShTRVJWRVJfREVGSU5JVElPTl9JRCwgcyk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlMaXN0IHByb3BzID0gdGhpcy5nZXRTZXJ2ZXJUeXBlRGVmaW5pdGlvbigpLmdldFByb3BlcnR5KCk7Ci0gCQlNYXAgaW5zdGFuY2VQcm9wc01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwcm9wcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVByb3BlcnR5IGVsZW1lbnQgPSAoUHJvcGVydHkpIGl0ZXIubmV4dCgpOwotCQkJaWYoUHJvcGVydHkuQ09OVEVYVF9SVU5USU1FLmVxdWFsc0lnbm9yZUNhc2UoZWxlbWVudC5nZXRDb250ZXh0KCkpKQotCQkJCWluc3RhbmNlUHJvcHNNYXAucHV0KGVsZW1lbnQuZ2V0SWQoKSwgZWxlbWVudC5nZXREZWZhdWx0KCkpOwotCQl9Ci0gCQlzZXRTZXJ2ZXJJbnN0YW5jZVByb3BlcnRpZXMoaW5zdGFuY2VQcm9wc01hcCk7Ci0KLQkJCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9jb3JlL2ludGVybmFsL0dlbmVyaWNTZXJ2ZXJSdW50aW1lVGFyZ2V0SGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2NvcmUvaW50ZXJuYWwvR2VuZXJpY1NlcnZlclJ1bnRpbWVUYXJnZXRIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzY2U5ZDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2NvcmUvaW50ZXJuYWwvR2VuZXJpY1NlcnZlclJ1bnRpbWVUYXJnZXRIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgRXRlcmF0aW9uIEEuUy4gYW5kIEdvcmtlbSBFcmNhbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBHb3JrZW0gRXJjYW4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAgICAgICAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSVZNSW5zdGFsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkphdmFSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5SdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lOwotLyoqCi0gKiBQcm92aWRlcyB0aGUgQ2xhc3NwYXRoIGNvbnRhaW5lcnMgdG8gYmUgYWRkZWQgaW50byBwcm9qZWN0IGNsYXNzcGF0aHMuCi0gKgotICogQGF1dGhvciBHb3JrZW0gRXJjYW4KLSAqLwotcHVibGljIGNsYXNzIEdlbmVyaWNTZXJ2ZXJSdW50aW1lVGFyZ2V0SGFuZGxlciBleHRlbmRzIFJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlckRlbGVnYXRlIHsKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIENsYXNzcGF0aFJ1bnRpbWVUYXJnZXRIYW5kbGVyI2dldENsYXNzcGF0aENvbnRhaW5lckxhYmVsKElSdW50aW1lLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NwYXRoQ29udGFpbmVyTGFiZWwoSVJ1bnRpbWUgcnVudGltZSwgU3RyaW5nIGlkKSB7Ci0JCVNlcnZlclJ1bnRpbWUgZGVmaW5pdGlvbj0gU2VydmVyVHlwZURlZmluaXRpb25VdGlsLmdldFNlcnZlclR5cGVEZWZpbml0aW9uKHJ1bnRpbWUpOwotCQlyZXR1cm4gZGVmaW5pdGlvbi5nZXROYW1lKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgQ2xhc3NwYXRoUnVudGltZVRhcmdldEhhbmRsZXIjcmVzb2x2ZUNsYXNzcGF0aENvbnRhaW5lcihJUnVudGltZSwgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgSUNsYXNzcGF0aEVudHJ5W10gcmVzb2x2ZUNsYXNzcGF0aENvbnRhaW5lcihJUnVudGltZSBydW50aW1lLFN0cmluZyBpZCl7CQkKLQkJcmV0dXJuIHJlc29sdmVDbGFzc3BhdGhDb250YWluZXIocnVudGltZSk7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIENsYXNzcGF0aFJ1bnRpbWVUYXJnZXRIYW5kbGVyI3Jlc29sdmVDbGFzc3BhdGhDb250YWluZXIoSVJ1bnRpbWUpCi0JICovCi0JcHVibGljIElDbGFzc3BhdGhFbnRyeVtdIHJlc29sdmVDbGFzc3BhdGhDb250YWluZXIoSVJ1bnRpbWUgcnVudGltZSl7CQkKLQkJcmV0dXJuIFNlcnZlclR5cGVEZWZpbml0aW9uVXRpbC5nZXRTZXJ2ZXJDbGFzc1BhdGhFbnRyeShydW50aW1lKTsKLQl9Ci0gICAgCi0JLyoKLSAgICAgKiBAc2VlIENsYXNzcGF0aFJ1bnRpbWVUYXJnZXRIYW5kbGVyI2dldERlbGVnYXRlQ2xhc3NwYXRoRW50cmllcyhJUnVudGltZSBydW50aW1lLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JICovCi0JcHVibGljIElDbGFzc3BhdGhFbnRyeVtdIGdldERlbGVnYXRlQ2xhc3NwYXRoRW50cmllcyhJUnVudGltZSBydW50aW1lLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJR2VuZXJpY1NlcnZlclJ1bnRpbWUgZ2VuZXJpY1J1bnRpbWUgPSAoR2VuZXJpY1NlcnZlclJ1bnRpbWUpcnVudGltZS5sb2FkQWRhcHRlcihHZW5lcmljU2VydmVyUnVudGltZS5jbGFzcywgbW9uaXRvcik7Ci0JCWlmIChnZW5lcmljUnVudGltZSA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBJQ2xhc3NwYXRoRW50cnlbMF07Ci0JCUlWTUluc3RhbGwgdm1JbnN0YWxsID0gZ2VuZXJpY1J1bnRpbWUuZ2V0Vk1JbnN0YWxsKCk7Ci0JCWlmICh2bUluc3RhbGwgIT0gbnVsbCkgewotCQkJU3RyaW5nIG5hbWUgPSB2bUluc3RhbGwuZ2V0TmFtZSgpOwotCQkJU3RyaW5nIHR5cGVJZCA9IHZtSW5zdGFsbC5nZXRWTUluc3RhbGxUeXBlKCkuZ2V0SWQoKTsKLQkJCXJldHVybiBuZXcgSUNsYXNzcGF0aEVudHJ5W10geyBKYXZhQ29yZS5uZXdDb250YWluZXJFbnRyeShuZXcgUGF0aChKYXZhUnVudGltZS5KUkVfQ09OVEFJTkVSKS5hcHBlbmQodHlwZUlkKS5hcHBlbmQobmFtZSkpIH07Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2NvcmUvaW50ZXJuYWwvR2VuZXJpY1NlcnZlclNvdXJjZVBhdGhDb21wdXRlckRlbGVnYXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvY29yZS9pbnRlcm5hbC9HZW5lcmljU2VydmVyU291cmNlUGF0aENvbXB1dGVyRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTVmYTU5NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvY29yZS9pbnRlcm5hbC9HZW5lcmljU2VydmVyU291cmNlUGF0aENvbXB1dGVyRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBFdGVyYXRpb24gQS5TLiBhbmQgR29ya2VtIEVyY2FuLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IEdvcmtlbSBFcmNhbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgICAgICAgICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLnNvdXJjZWxvb2t1cC5JU291cmNlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuc291cmNlbG9va3VwLklTb3VyY2VQYXRoQ29tcHV0ZXJEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLnNvdXJjZWxvb2t1cC5jb250YWluZXJzLkZvbGRlclNvdXJjZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JUnVudGltZUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSmF2YVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclV0aWw7Ci0vKioKLSAqIFNvdXJjZVBhdGhDb21wdXRlciBmb3IgdGhlIEdlbmVyaWNMYXVuY2hDb25maWd1cmF0aW9uLgotICogCi0gKiBAYXV0aG9yIEdvcmtlbSBFcmNhbgotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJpY1NlcnZlclNvdXJjZVBhdGhDb21wdXRlckRlbGVnYXRlIGltcGxlbWVudHMgSVNvdXJjZVBhdGhDb21wdXRlckRlbGVnYXRlICB7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLnNvdXJjZWxvb2t1cC5JU291cmNlUGF0aENvbXB1dGVyRGVsZWdhdGUjY29tcHV0ZVNvdXJjZUNvbnRhaW5lcnMob3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbiwgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIElTb3VyY2VDb250YWluZXJbXSBjb21wdXRlU291cmNlQ29udGFpbmVycyhJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCi0JCUlSdW50aW1lQ2xhc3NwYXRoRW50cnlbXSB1bnJlc29sdmVkRW50cmllcyA9IEphdmFSdW50aW1lLmNvbXB1dGVVbnJlc29sdmVkU291cmNlTG9va3VwUGF0aChjb25maWd1cmF0aW9uKTsKLQkJTGlzdCBzb3VyY2Vmb2xkZXJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkKLQkJSVNlcnZlciBzZXJ2ZXIgPSAgU2VydmVyVXRpbC5nZXRTZXJ2ZXIoY29uZmlndXJhdGlvbik7Ci0JCUlNb2R1bGVbXSBtb2R1bGVzID0gc2VydmVyLmdldE1vZHVsZXMoKTsKLQkJTGlzdCBqYXZhUHJvamVjdExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQotCQlmb3IgKGludCBpID0gMDsgaSA8IG1vZHVsZXMubGVuZ3RoOyBpKyspIHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBtb2R1bGVzW2ldLmdldFByb2plY3QoKTsKLQkJCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKLQkJCQlJRm9sZGVyIG1vZHVsZUZvbGRlciA9IHByb2plY3QuZ2V0Rm9sZGVyKG1vZHVsZXNbaV0uZ2V0TmFtZSgpKTsKLQkJCQlpZiAobW9kdWxlRm9sZGVyLmV4aXN0cygpKSB7Ci0JCQkJCXNvdXJjZWZvbGRlckxpc3QuYWRkKG5ldyBGb2xkZXJTb3VyY2VDb250YWluZXIobW9kdWxlRm9sZGVyLCB0cnVlKSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWlmIChwcm9qZWN0Lmhhc05hdHVyZShKYXZhQ29yZS5OQVRVUkVfSUQpKSB7Ci0JCQkJCQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gKElKYXZhUHJvamVjdCkgcHJvamVjdC5nZXROYXR1cmUoSmF2YUNvcmUuTkFUVVJFX0lEKTsKLQkJCQkJCQlqYXZhUHJvamVjdExpc3QuYWRkKGphdmFQcm9qZWN0KTsKLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIGlnbm9yZQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeVtdIHByb2plY3RFbnRyaWVzID0gbmV3IElSdW50aW1lQ2xhc3NwYXRoRW50cnlbamF2YVByb2plY3RMaXN0LnNpemUoKV07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgamF2YVByb2plY3RMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlwcm9qZWN0RW50cmllc1tpXSA9IEphdmFSdW50aW1lLm5ld1Byb2plY3RSdW50aW1lQ2xhc3NwYXRoRW50cnkoKElKYXZhUHJvamVjdClqYXZhUHJvamVjdExpc3QuZ2V0KGkpKTsgCi0JCX0KLQkJSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMgPSAgbmV3IElSdW50aW1lQ2xhc3NwYXRoRW50cnlbcHJvamVjdEVudHJpZXMubGVuZ3RoK3VucmVzb2x2ZWRFbnRyaWVzLmxlbmd0aF07IAotCQlTeXN0ZW0uYXJyYXljb3B5KHVucmVzb2x2ZWRFbnRyaWVzLDAsZW50cmllcywwLHVucmVzb2x2ZWRFbnRyaWVzLmxlbmd0aCk7Ci0JCVN5c3RlbS5hcnJheWNvcHkocHJvamVjdEVudHJpZXMsMCxlbnRyaWVzLHVucmVzb2x2ZWRFbnRyaWVzLmxlbmd0aCxwcm9qZWN0RW50cmllcy5sZW5ndGgpOwotCQkKLQkJSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeVtdIHJlc29sdmVkID0gSmF2YVJ1bnRpbWUucmVzb2x2ZVNvdXJjZUxvb2t1cFBhdGgoZW50cmllcywgY29uZmlndXJhdGlvbik7Ci0JCUlTb3VyY2VDb250YWluZXJbXSBqYXZhU291cmNlQ29udGFpbmVycyA9IEphdmFSdW50aW1lLmdldFNvdXJjZUNvbnRhaW5lcnMocmVzb2x2ZWQpOwotCQkKLQkJaWYgKCFzb3VyY2Vmb2xkZXJMaXN0LmlzRW1wdHkoKSkgewotCQkJSVNvdXJjZUNvbnRhaW5lcltdIGNvbWJpbmVkU291cmNlQ29udGFpbmVycyA9IG5ldyBJU291cmNlQ29udGFpbmVyW2phdmFTb3VyY2VDb250YWluZXJzLmxlbmd0aCArIHNvdXJjZWZvbGRlckxpc3Quc2l6ZSgpXTsKLQkJCXNvdXJjZWZvbGRlckxpc3QudG9BcnJheShjb21iaW5lZFNvdXJjZUNvbnRhaW5lcnMpOwotCQkJU3lzdGVtLmFycmF5Y29weShqYXZhU291cmNlQ29udGFpbmVycywgMCwgY29tYmluZWRTb3VyY2VDb250YWluZXJzLCBzb3VyY2Vmb2xkZXJMaXN0LnNpemUoKSwgamF2YVNvdXJjZUNvbnRhaW5lcnMubGVuZ3RoKTsKLQkJCWphdmFTb3VyY2VDb250YWluZXJzID0gY29tYmluZWRTb3VyY2VDb250YWluZXJzOwotCQl9Ci0JCQotCQlyZXR1cm4gamF2YVNvdXJjZUNvbnRhaW5lcnM7Ci0JCQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9jb3JlL2ludGVybmFsL1BpbmdUaHJlYWQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9jb3JlL2ludGVybmFsL1BpbmdUaHJlYWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWYzOTIyNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvY29yZS9pbnRlcm5hbC9QaW5nVGhyZWFkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lkh0dHBVUkxDb25uZWN0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5VUkxDb25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5TZXJ2ZXJUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsLlNvY2tldFV0aWw7Ci0KLS8qKgotICogVGhyZWFkIHVzZWQgdG8gcGluZyBzZXJ2ZXIgdG8gdGVzdCB3aGVuIGl0IGlzIHN0YXJ0ZWQuCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFBpbmdUaHJlYWQgewotCS8vIGRlbGF5IGJlZm9yZSBwaW5naW5nIHN0YXJ0cwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQSU5HX0RFTEFZID0gMjAwMDsKLQotCS8vIGRlbGF5IGJldHdlZW4gcGluZ3MKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUElOR19JTlRFUlZBTCA9IDI1MDsKLQotCS8vIG1heGltdW0gbnVtYmVyIG9mIHBpbmdzIGJlZm9yZSBnaXZpbmcgdXAKLQlwcml2YXRlIGludCBtYXhQaW5ncyA9IDU2OyAvLyB0b3RhbDogMTYgc2Vjb25kcyArIGNvbm5lY3Rpb24gdGltZQotCi0JcHJpdmF0ZSBib29sZWFuIHN0b3AgPSBmYWxzZTsKLQlwcml2YXRlIFN0cmluZyB1cmw7Ci0JcHJpdmF0ZSBJU2VydmVyIHNlcnZlcjsKLQlwcml2YXRlIEdlbmVyaWNTZXJ2ZXJCZWhhdmlvdXIgZ2VuZXJpY1NlcnZlcjsKLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBQaW5nVGhyZWFkLgotCSAqIAotCSAqIEBwYXJhbSBzZXJ2ZXIKLQkgKiBAcGFyYW0gdXJsCi0JICogQHBhcmFtIG1heFBpbmdzCi0JICogQHBhcmFtIGdlbmVyaWNTZXJ2ZXIKLQkgKi8KLQlwdWJsaWMgUGluZ1RocmVhZChJU2VydmVyIHNlcnZlciwgU3RyaW5nIHVybCwgR2VuZXJpY1NlcnZlckJlaGF2aW91ciBnZW5lcmljU2VydmVyKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuc2VydmVyID0gc2VydmVyOwotCQl0aGlzLnVybCA9IHVybDsKLQkJdGhpcy5tYXhQaW5ncyA9IGd1ZXNzTWF4UGluZ3MoZ2VuZXJpY1NlcnZlcik7Ci0JCXRoaXMuZ2VuZXJpY1NlcnZlciA9IGdlbmVyaWNTZXJ2ZXI7Ci0JCVRocmVhZCB0ID0gbmV3IFRocmVhZCgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlwaW5nKCk7Ci0JCQl9Ci0JCX07Ci0JCXQuc2V0RGFlbW9uKHRydWUpOwotCQl0LnN0YXJ0KCk7Ci0JfQotICAgIAotCXByaXZhdGUgaW50IGd1ZXNzTWF4UGluZ3MoR2VuZXJpY1NlcnZlckJlaGF2aW91ciBzZXJ2ZXIpCi0gICAgewotICAgIAlpbnQgbWF4cGluZ3M9NjA7Ci0gICAgCWludCBzdGFydFRpbWVvdXQgPSAoKFNlcnZlclR5cGUpc2VydmVyLmdldFNlcnZlcigpLmdldFNlcnZlclR5cGUoKSkuZ2V0U3RhcnRUaW1lb3V0KCk7Ci0gICAgCWlmKHN0YXJ0VGltZW91dD4wKQotICAgIAkJbWF4cGluZ3M9c3RhcnRUaW1lb3V0L1BJTkdfSU5URVJWQUw7Ci0gICAgCXJldHVybiBtYXhwaW5nczsKLSAgICB9Ci0JcHJpdmF0ZSBib29sZWFuIGlzUmVtb3RlKCl7Ci0JCXJldHVybiAoc2VydmVyLmdldFNlcnZlclR5cGUoKS5zdXBwb3J0c1JlbW90ZUhvc3RzKCkmJiAhU29ja2V0VXRpbC5pc0xvY2FsaG9zdChzZXJ2ZXIuZ2V0SG9zdCgpKSApOwotCX0KLQkvKioKLQkgKiBQaW5nIHRoZSBzZXJ2ZXIgdW50aWwgaXQgaXMgc3RhcnRlZC4gVGhlbiBzZXQgdGhlIHNlcnZlcgotCSAqIHN0YXRlIHRvIFNUQVRFX1NUQVJURUQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGluZygpIHsKLQkJaW50IGNvdW50ID0gMDsKLQkJdHJ5IHsKLQkJCVRocmVhZC5zbGVlcChQSU5HX0RFTEFZKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCXdoaWxlICghc3RvcCkgewotCQkJdHJ5IHsKLQkJCQlpZiAoY291bnQgPT0gbWF4UGluZ3MgJiYgIWlzUmVtb3RlKCkpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCXNlcnZlci5zdG9wKGZhbHNlKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIlBpbmc6IGNvdWxkIG5vdCBzdG9wIHNlcnZlciIpOwotCQkJCQl9Ci0JCQkJCXN0b3AgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaWYoIWlzUmVtb3RlKCkpCi0JCQkJCWNvdW50Kys7Ci0JCQkJCi0JCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiUGluZzogcGluZ2luZyIpOwotCQkJCVVSTCBwaW5nVXJsID0gbmV3IFVSTCh1cmwpOwotCQkJCVVSTENvbm5lY3Rpb24gY29ubiA9IHBpbmdVcmwub3BlbkNvbm5lY3Rpb24oKTsKLQkJCQkoKEh0dHBVUkxDb25uZWN0aW9uKWNvbm4pLmdldFJlc3BvbnNlQ29kZSgpOwotCQotCQkJCS8vIHBpbmcgd29ya2VkIC0gc2VydmVyIGlzIHVwCi0JCQkJaWYgKCFzdG9wKSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIlBpbmc6IHN1Y2Nlc3MiKTsKLQkJCQkJVGhyZWFkLnNsZWVwKDIwMCk7Ci0JCQkJCWdlbmVyaWNTZXJ2ZXIuc2V0U2VydmVyU3RhcnRlZCgpOwotCQkJCX0KLQkJCQlpZighaXNSZW1vdGUoKSkKLQkJCQkJc3RvcCA9IHRydWU7Ci0JCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZmUpIHsKLQkJCQl0cnkgewotCQkJCQlUaHJlYWQuc2xlZXAoMjAwKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkvLyBpZ25vcmUKLQkJCQl9Ci0JCQkJZ2VuZXJpY1NlcnZlci5zZXRTZXJ2ZXJTdGFydGVkKCk7Ci0JCQkJaWYoIWlzUmVtb3RlKCkpCi0JCQkJCXN0b3AgPSB0cnVlOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJQaW5nOiBmYWlsZWQiKTsKLQkJCQkvLyBwaW5naW5nIGZhaWxlZAotCQkJCWlmICghc3RvcCkgewotCQkJCQl0cnkgewotCQkJCQkJVGhyZWFkLnNsZWVwKFBJTkdfSU5URVJWQUwpOwotCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlMikgewotCQkJCQkJLy8gaWdub3JlCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUZWxsIHRoZSBwaW5naW5nIHRvIHN0b3AuCi0JICovCi0JcHVibGljIHZvaWQgc3RvcCgpIHsKLQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiUGluZzogc3RvcHBpbmciKTsKLQkJc3RvcCA9IHRydWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2NvcmUvaW50ZXJuYWwvUHVibGlzaE1hbmFnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9jb3JlL2ludGVybmFsL1B1Ymxpc2hNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5ZThhODAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2NvcmUvaW50ZXJuYWwvUHVibGlzaE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBFdGVyYXRpb24gQS5TLiBhbmQgR29ya2VtIEVyY2FuLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IEdvcmtlbSBFcmNhbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgICAgICAgICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5jb3JlLnV0aWwuRXh0ZW5zaW9uUG9pbnRVdGlsOwotCi0vKioKLSAqIAotICoKLSAqIEBhdXRob3IgR29ya2VtIEVyY2FuCi0gKi8KLXB1YmxpYyBjbGFzcyBQdWJsaXNoTWFuYWdlciAKLXsKLSAgICAgcHVibGljIHN0YXRpYyBHZW5lcmljUHVibGlzaGVyIGdldFB1Ymxpc2hlcihTdHJpbmcgaWQpIAotICAgIHsKLSAgICAgICAgSUV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSBFeHRlbnNpb25Qb2ludFV0aWwuZ2V0R2VuZXJpY1B1Ymxpc2hlckV4dGVuc2lvbigpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY29uZmlncyA9IEV4dGVuc2lvblBvaW50VXRpbC5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoZXh0ZW5zaW9uc1tpXSk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBjb25maWdzLmxlbmd0aDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGNvbmZpZ3Nbal0uZ2V0QXR0cmlidXRlKCJpZCIpLmVxdWFscyhpZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoR2VuZXJpY1B1Ymxpc2hlciljb25maWdzW2pdLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7Ci0gICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfWNhdGNoKENvcmVFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgICAvL2lnbm9yZWQKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAgCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9jb3JlL2ludGVybmFsL1NlcnZlclR5cGVEZWZpbml0aW9uTWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2NvcmUvaW50ZXJuYWwvU2VydmVyVHlwZURlZmluaXRpb25NYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwODcxZDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2NvcmUvaW50ZXJuYWwvU2VydmVyVHlwZURlZmluaXRpb25NYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgRXRlcmF0aW9uIEEuUy4gYW5kIEdvcmtlbSBFcmNhbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBHb3JrZW0gRXJjYW4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAgICAgICAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbkRlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUmVnaXN0cnlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVJlZ2lzdHJ5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLmNvcmUudXRpbC5FeHRlbnNpb25Qb2ludFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnhtbC5YTUxVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclJ1bnRpbWU7Ci0vKioKLSAqIE1hbmFnZXMgdGhlIHJldHJpZWF2YWwgb2YgU2VydmVyVHlwZURlZmluaXRpb25zLgotICogCi0gKiBAYXV0aG9yIEdvcmtlbSBFcmNhbgotICovCi0KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJUeXBlRGVmaW5pdGlvbk1hbmFnZXIgCi17Ci0JcHJpdmF0ZSBYTUxVdGlscyBmWG1sVXRpbHM7Ci0JCi0JcHJpdmF0ZSBjbGFzcyBSZWdpc3RyeUNoYW5nZUxpc3RlbmVyIGltcGxlbWVudHMgSVJlZ2lzdHJ5Q2hhbmdlTGlzdGVuZXJ7Ci0JCXB1YmxpYyB2b2lkIHJlZ2lzdHJ5Q2hhbmdlZChJUmVnaXN0cnlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJSUV4dGVuc2lvbkRlbHRhW10gZGVsdGFzID0gZXZlbnQuZ2V0RXh0ZW5zaW9uRGVsdGFzKENvcmVQbHVnaW4uUExVR0lOX0lELCBFeHRlbnNpb25Qb2ludFV0aWwuU0VSVkVSREVGSU5JVElPTl9FWFRFTlNJT05fSUQpOwotCQkJaWYoZGVsdGFzIT1udWxsICYmIGRlbHRhcy5sZW5ndGg+MCl7Ci0JCQkJaGFuZGxlU2VydmVyRGVmaW5pdGlvbnNDaGFuZ2VkKCk7Ci0JCQl9Ci0JCX0JCQotCX0KLQkKLQlwcm90ZWN0ZWQgU2VydmVyVHlwZURlZmluaXRpb25NYW5hZ2VyKFVSTCBzZXJ2ZXJEZWZpbml0aW9uVVJMKXsKLQkJc3VwZXIoKTsKLQkJZlhtbFV0aWxzID0gbmV3IFhNTFV0aWxzKCk7Ci0JCUV4dGVuc2lvblBvaW50VXRpbC5hZGRSZWdpc3RyeUxpc3RlbmVyKG5ldyBSZWdpc3RyeUNoYW5nZUxpc3RlbmVyKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIFNlcnZlclJ1bnRpbWUgdGhhdCByZXByZXNlbnRzIHRoZSAuc2VydmVyZGVmIGZpbGUKLQkgKiBmb3IgYSBnaXZlbiBydW50aW1lIHR5cGUuCi0JICogQHBhcmFtIGlkIHJ1bnRpbWUgdHlwZSBpZAotCSAqIEBwYXJhbSBwcm9wZXJ0aWVzIHVzZXIgcHJvdmlkZWQgcHJvcGVydGllcwotCSAqIEByZXR1cm4gc2VydmVyIHJ1bnRpbWUgdGhhdCBpcyBpbml0aWFsaXplZCB3aXRoIHVzZXIgcHJvcGVydGllcyAKLQkgKi8KLQlwdWJsaWMgU2VydmVyUnVudGltZSBnZXRTZXJ2ZXJSdW50aW1lRGVmaW5pdGlvbihTdHJpbmcgaWQsIE1hcCBwcm9wZXJ0aWVzKXsKLQkJU2VydmVyUnVudGltZSBkZWZpbml0aW9uID0gIGZYbWxVdGlscy5nZXRTZXJ2ZXJUeXBlRGVmaW5pdGlvbihpZCk7Ci0JCWlmKGRlZmluaXRpb24gIT1udWxsKQotICAgICAgICAgICAgZGVmaW5pdGlvbi5zZXRQcm9wZXJ0eVZhbHVlcyhwcm9wZXJ0aWVzKTsKLQkJcmV0dXJuIGRlZmluaXRpb247Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYWxsIHRoZSBTZXJ2ZXJSdW50aW1lcyByZWdpc3RlcmVkIGEgLnNlcnZlcmRlZi4KLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFNlcnZlclJ1bnRpbWVbXSBnZXRTZXJ2ZXJUeXBlRGVmaW5pdGlvbnMoKXsKLQkJIExpc3QgZGVmaW5pdGlvbkxpc3QgPSBmWG1sVXRpbHMuZ2V0U2VydmVyVHlwZURlZmluaXRpb25zKCk7Ci0JCSByZXR1cm4gKFNlcnZlclJ1bnRpbWVbXSlkZWZpbml0aW9uTGlzdC50b0FycmF5KG5ldyBTZXJ2ZXJSdW50aW1lW2RlZmluaXRpb25MaXN0LnNpemUoKV0pOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgaGFuZGxlU2VydmVyRGVmaW5pdGlvbnNDaGFuZ2VkKCl7CQotCQlYTUxVdGlscyB1dGlscyA9IG5ldyBYTUxVdGlscygpOwotCQlmWG1sVXRpbHMgPSB1dGlsczsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvY29yZS9pbnRlcm5hbC9TZXJ2ZXJUeXBlRGVmaW5pdGlvblV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9jb3JlL2ludGVybmFsL1NlcnZlclR5cGVEZWZpbml0aW9uVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjViYmQ0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9jb3JlL2ludGVybmFsL1NlcnZlclR5cGVEZWZpbml0aW9uVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5BcmNoaXZlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkNsYXNzcGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lOwotCi0vKioKLSAqIFV0aWxpdGllcyBmb3IgU2VydmVyUnVudGltZSBkZWZpbml0aW9uIGZpbGVzLgotICoKLSAqIEBhdXRob3IgR29ya2VtIEVyY2FuCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJUeXBlRGVmaW5pdGlvblV0aWwgCi17Ci0JLyoqCi0JICogCi0JICogQHBhcmFtIHJ1bnRpbWUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBTZXJ2ZXJSdW50aW1lIGdldFNlcnZlclR5cGVEZWZpbml0aW9uKElSdW50aW1lIHJ1bnRpbWUpCi0JewotCQlpZihydW50aW1lPT1udWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JICAgIEdlbmVyaWNTZXJ2ZXJSdW50aW1lIGRlbGVnYXRlID0gKEdlbmVyaWNTZXJ2ZXJSdW50aW1lKXJ1bnRpbWUubG9hZEFkYXB0ZXIoR2VuZXJpY1NlcnZlclJ1bnRpbWUuY2xhc3MsbnVsbCk7Ci0JICAgIGlmKGRlbGVnYXRlPT1udWxsKQotCSAgICAJcmV0dXJuIG51bGw7Ci0JCVN0cmluZyBzZXJ2ZXJUeXBlID0gZGVsZWdhdGUuZ2V0UnVudGltZSgpLmdldFJ1bnRpbWVUeXBlKCkuZ2V0SWQoKTsKLQkJTWFwIHByb3BlcnRpZXMgPSBkZWxlZ2F0ZS5nZXRTZXJ2ZXJJbnN0YW5jZVByb3BlcnRpZXMoKTsKLQkJU2VydmVyUnVudGltZSBkZWZpbml0aW9uID0gCi0JCQlDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTZXJ2ZXJUeXBlRGVmaW5pdGlvbk1hbmFnZXIoKS5nZXRTZXJ2ZXJSdW50aW1lRGVmaW5pdGlvbihzZXJ2ZXJUeXBlLHByb3BlcnRpZXMpOwotCQlyZXR1cm4gZGVmaW5pdGlvbjsKLQl9Ci0JLyoqCi0JICogCi0JICogQHBhcmFtIHJ1bnRpbWUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBJQ2xhc3NwYXRoRW50cnlbXSBnZXRTZXJ2ZXJDbGFzc1BhdGhFbnRyeShJUnVudGltZSBydW50aW1lKQotCXsKLQkJU2VydmVyUnVudGltZSBkZWZpbml0aW9uID0gZ2V0U2VydmVyVHlwZURlZmluaXRpb24ocnVudGltZSk7Ci0JCWlmKGRlZmluaXRpb249PW51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nIHJlZiA9IGRlZmluaXRpb24uZ2V0UHJvamVjdCgpLmdldENsYXNzcGF0aFJlZmVyZW5jZSgpOwotCQlDbGFzc3BhdGggY3AgPSBkZWZpbml0aW9uLmdldENsYXNzcGF0aChyZWYpOwotCQlJdGVyYXRvciBhcmNoaXZlcyA9IGNwLmdldEFyY2hpdmUoKS5pdGVyYXRvcigpOwotCQlBcnJheUxpc3QgZW50cnlMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQl3aGlsZSAoYXJjaGl2ZXMuaGFzTmV4dCgpKSB7Ci0JCQlBcmNoaXZlVHlwZSBhcmNoaXZlID0gKEFyY2hpdmVUeXBlKSBhcmNoaXZlcy5uZXh0KCk7Ci0JCQlTdHJpbmcgaXRlbSA9IGRlZmluaXRpb24uZ2V0UmVzb2x2ZXIoKS5yZXNvbHZlUHJvcGVydGllcyhhcmNoaXZlLmdldFBhdGgoKSk7Ci0JCQlJQ2xhc3NwYXRoRW50cnkgZW50cnkgPSBKYXZhQ29yZS5uZXdMaWJyYXJ5RW50cnkobmV3IFBhdGgoaXRlbSksbnVsbCxudWxsICk7Ci0JCQllbnRyeUxpc3QuYWRkKGVudHJ5KTsKLQkJfQotCQlyZXR1cm4gKElDbGFzc3BhdGhFbnRyeVtdKWVudHJ5TGlzdC50b0FycmF5KG5ldyBJQ2xhc3NwYXRoRW50cnlbZW50cnlMaXN0LnNpemUoKV0pOwotCX0KLQkvKioKLQkgKiBHaXZlbiB0aGUgc2VydmVyRGVmaW5pdGlvbiBhbmQgbW9kdWxlIHJldHVybnMgdGhlIHB1Ymxpc2hlciBpZCAKLQkgKiB0aGF0IGhhbmRsZXMgdGhlIHB1Ymxpc2hpbmcgb2YgbW9kdWxlIHR5cGUgZm9yIHRoaXMgc2VydmVyRGVmaW5pdGlvbi4KLQkgKiBAcGFyYW0gbW9kdWxlCi0JICogQHBhcmFtIHNlcnZlckRlZmluaXRpb24KLQkgKiBAcmV0dXJuIHB1Ymxpc2hlciBpZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFB1Ymxpc2hlcklEKElNb2R1bGUgbW9kdWxlLCBTZXJ2ZXJSdW50aW1lIHNlcnZlckRlZmluaXRpb24pCi0JewotCQlpZihtb2R1bGU9PW51bGwgfHwgbW9kdWxlLmdldE1vZHVsZVR5cGUoKT09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJTW9kdWxlIG0gPSBzZXJ2ZXJEZWZpbml0aW9uLmdldE1vZHVsZShtb2R1bGUuZ2V0TW9kdWxlVHlwZSgpLmdldElkKCkpOwotCQlyZXR1cm4gbS5nZXRQdWJsaXNoZXJSZWZlcmVuY2UoKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvY29yZS9pbnRlcm5hbC9UcmFjZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2NvcmUvaW50ZXJuYWwvVHJhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQwZWYzYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvY29yZS9pbnRlcm5hbC9UcmFjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5pbnRlcm5hbDsKLQotCi0vKioKLSAqIEhlbHBlciBjbGFzcyB0byByb3V0ZSB0cmFjZSBvdXRwdXQuCi0gKi8KLXB1YmxpYyBjbGFzcyBUcmFjZSB7Ci0JcHVibGljIHN0YXRpYyBieXRlIENPTkZJRyA9IDA7Ci0JcHVibGljIHN0YXRpYyBieXRlIFdBUk5JTkcgPSAxOwotCXB1YmxpYyBzdGF0aWMgYnl0ZSBTRVZFUkUgPSAyOwotCXB1YmxpYyBzdGF0aWMgYnl0ZSBGSU5FU1QgPSAzOwotCXB1YmxpYyBzdGF0aWMgYnl0ZSBGSU5FUiA9IDQ7Ci0JCi0JLyoqCi0JICogVHJhY2UgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwcml2YXRlIFRyYWNlKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkvKioKLQkgKiBUcmFjZSB0aGUgZ2l2ZW4gdGV4dC4KLQkgKgotCSAqIEBwYXJhbSBzIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2UoYnl0ZSBsZXZlbCwgU3RyaW5nIHMpIHsKLQkJVHJhY2UudHJhY2UobGV2ZWwsIHMsIG51bGwpOwotCX0KLQkKLQkvKioKLQkgKiBUcmFjZSB0aGUgZ2l2ZW4gbWVzc2FnZSBhbmQgZXhjZXB0aW9uLgotCSAqCi0JICogQHBhcmFtIHMgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSB0IGphdmEubGFuZy5UaHJvd2FibGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2UoYnl0ZSBsZXZlbCwgU3RyaW5nIHMsIFRocm93YWJsZSB0KSB7Ci0JCWlmICghQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuaXNEZWJ1Z2dpbmcoKSkKLQkJCXJldHVybjsKLQotCQlTeXN0ZW0ub3V0LnByaW50bG4ocyk7Ci0JCWlmICh0ICE9IG51bGwpCi0JCQl0LnByaW50U3RhY2tUcmFjZSgpOwotCX0KLQkKLQkvKioKLQkgKiBUcmFjZSB0aGUgZ2l2ZW4gdGV4dC4KLQkgKgotCSAqIEBwYXJhbSBzIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2UoU3RyaW5nIHMpIHsKLQkJdHJhY2UocywgbnVsbCk7Ci0JfQotCQotCS8qKgotCSAqIFRyYWNlIHRoZSBnaXZlbiBleGNlcHRpb24uCi0JICoKLQkgKiBAcGFyYW0gcyBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGUgamF2YS5sYW5nLlRocm93YWJsZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZShTdHJpbmcgcywgVGhyb3dhYmxlIHQpIHsKLQkJdHJhY2UoRklORVNULCBzLCB0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvY29yZS9pbnRlcm5hbC9wdWJsaXNoZXJzL0Fic3RyYWN0TW9kdWxlQXNzZW1ibGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvY29yZS9pbnRlcm5hbC9wdWJsaXNoZXJzL0Fic3RyYWN0TW9kdWxlQXNzZW1ibGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxNzg1NmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2NvcmUvaW50ZXJuYWwvcHVibGlzaGVycy9BYnN0cmFjdE1vZHVsZUFzc2VtYmxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBFdGVyYXRpb24gQS5TLiBhbmQgR29ya2VtIEVyY2FuLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IEdvcmtlbSBFcmNhbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgICAgICAgICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuaW50ZXJuYWwucHVibGlzaGVyczsKLQkJCQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5JV2ViTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5QdWJsaXNoVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5pbnRlcm5hbC5Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsLkdlbmVyaWNTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuU2VydmVyUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5JTW9kdWxlRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5JTW9kdWxlUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnV0aWwuUHJvamVjdE1vZHVsZTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0TW9kdWxlQXNzZW1ibGVyIHsKLQotCXByb3RlY3RlZCBTZXJ2ZXJSdW50aW1lIGZTZXJ2ZXJkZWZpbml0aW9uOwotCXByb3RlY3RlZCBJTW9kdWxlIGZNb2R1bGU7IAotCXByb3RlY3RlZCBHZW5lcmljU2VydmVyIGZTZXJ2ZXI7Ci0JCi0JLyoqCi0JICogQXNzZW1ibGUgdGhlIG1vZHVsZS4KLQkgKiAKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGFzc2VtYmxlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQkKLQlwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3RvcnkgewkJCi0JCXB1YmxpYyBzdGF0aWMgQWJzdHJhY3RNb2R1bGVBc3NlbWJsZXIgZ2V0TW9kdWxlQXNzZW1ibGVyKElNb2R1bGUgbW9kdWxlLCBHZW5lcmljU2VydmVyIHNlcnZlcikKLQkJewotCQkJCi0JCQlpZihpc01vZHVsZVR5cGUobW9kdWxlLCAianN0LndlYiIpKQotCQkJCXJldHVybiBuZXcgV2FyTW9kdWxlQXNzZW1ibGVyKG1vZHVsZSxzZXJ2ZXIpOwotCQkJaWYoaXNNb2R1bGVUeXBlKG1vZHVsZSwgImpzdC5lYXIiKSkKLQkJCQlyZXR1cm4gbmV3IEVhck1vZHVsZUFzc2VtYmxlcihtb2R1bGUsc2VydmVyKTsKLQkJCXJldHVybiBuZXcgRGVmYXVsdE1vZHVsZUFzc2VtYmxlcihtb2R1bGUsc2VydmVyKTsKLQkJfQotCQkKLQkJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc01vZHVsZVR5cGUoSU1vZHVsZSBtb2R1bGUsIFN0cmluZyBtb2R1bGVUeXBlSWQpewkKLQkJCWlmKG1vZHVsZS5nZXRNb2R1bGVUeXBlKCkhPW51bGwgJiYgbW9kdWxlVHlwZUlkLmVxdWFscyhtb2R1bGUuZ2V0TW9kdWxlVHlwZSgpLmdldElkKCkpKQotCQkJCXJldHVybiB0cnVlOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHBhY2tNb2R1bGUoSU1vZHVsZSBtb2R1bGUsIElQYXRoIGRlc3RpbmF0aW9uKXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJU3RyaW5nIG5hbWUgPSBnZXREVU5hbWUobW9kdWxlKTsKLQkKLQkJU3RyaW5nIGRlc3QgPSBkZXN0aW5hdGlvbi5hcHBlbmQobmFtZSkudG9TdHJpbmcoKTsKLQkJTW9kdWxlUGFja2FnZXIgcGFja2FnZXIgPSBudWxsOwotCQl0cnkgewotCQkJcGFja2FnZXIgPSBuZXcgTW9kdWxlUGFja2FnZXIoZGVzdCwgZmFsc2UpOwotCQkJUHJvamVjdE1vZHVsZSBwbSA9IChQcm9qZWN0TW9kdWxlKSBtb2R1bGUubG9hZEFkYXB0ZXIoUHJvamVjdE1vZHVsZS5jbGFzcywgbnVsbCk7Ci0JCQlJTW9kdWxlUmVzb3VyY2VbXSByZXNvdXJjZXMgPSBwbS5tZW1iZXJzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc291cmNlcy5sZW5ndGg7IGkrKykgewotCQkJCWRvUGFja01vZHVsZShyZXNvdXJjZXNbaV0sIHBhY2thZ2VyKTsKLQkJCX0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJSVN0YXR1cyBzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIENvcmVQbHVnaW4uUExVR0lOX0lELCAwLAotCQkJCQkidW5hYmxlIHRvIGFzc2VtYmxlIG1vZHVsZSIsIGUpOwotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oc3RhdHVzKTsKLQkJfQotCQlmaW5hbGx5ewotCQkJdHJ5ewotCQkJCXBhY2thZ2VyLmZpbmlzaGVkKCk7Ci0JCQl9Ci0JCQljYXRjaChJT0V4Y2VwdGlvbiBlKXsKLQkJCQkvL3VuaGFuZGxlZAotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RFVOYW1lKElNb2R1bGUgbW9kdWxlKXsKLQkJSU1vZHVsZVR5cGUgbW9kdWxlVHlwZSA9IG1vZHVsZS5nZXRNb2R1bGVUeXBlKCk7Ci0JCWlmKG1vZHVsZVR5cGU9PW51bGwpCi0JCQlyZXR1cm4gbW9kdWxlLmdldE5hbWUoKSsiLmphciI7CQkKLQkJaWYoImpzdC53ZWIiLmVxdWFscyhtb2R1bGVUeXBlLmdldElkKCkpKXsKLQkJCUlXZWJNb2R1bGUgd2VibW9kdWxlID0gKElXZWJNb2R1bGUpbW9kdWxlLmxvYWRBZGFwdGVyKElXZWJNb2R1bGUuY2xhc3MsIG51bGwpOwotCQkJcmV0dXJuIHdlYm1vZHVsZS5nZXRVUkkobW9kdWxlKTsKLQkJfQotCQlpZigianN0LmVhciIuZXF1YWxzKG1vZHVsZVR5cGUuZ2V0SWQoKSkpCi0JCQlyZXR1cm4gbW9kdWxlLmdldE5hbWUoKSsiLmVhciI7Ci0JCWlmKCJqc3QuY29ubmVjdG9yIi5lcXVhbHMobW9kdWxlVHlwZS5nZXRJZCgpKSkKLQkJCXJldHVybiBtb2R1bGUuZ2V0TmFtZSgpKyIucmFyIjsKLQkJCi0JCXJldHVybiBtb2R1bGUuZ2V0TmFtZSgpKyIuamFyIjsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZG9QYWNrTW9kdWxlKElNb2R1bGVSZXNvdXJjZSByZXNvdXJjZSwgTW9kdWxlUGFja2FnZXIgcGFja2FnZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbnsKLQkJCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElNb2R1bGVGb2xkZXIpIHsKLQkJCQlJTW9kdWxlRm9sZGVyIG1Gb2xkZXIgPSAoSU1vZHVsZUZvbGRlcilyZXNvdXJjZTsKLQkJCQlJTW9kdWxlUmVzb3VyY2VbXSByZXNvdXJjZXMgPSBtRm9sZGVyLm1lbWJlcnMoKTsKLQkJCQlpZihyZXNvdXJjZXM9PW51bGwgfHwgcmVzb3VyY2VzLmxlbmd0aD09MCl7Ci0JCQkJCXBhY2thZ2VyLndyaXRlRm9sZGVyKHJlc291cmNlLmdldE1vZHVsZVJlbGF0aXZlUGF0aCgpLmFwcGVuZChyZXNvdXJjZS5nZXROYW1lKCkpLnRvUG9ydGFibGVTdHJpbmcoKSk7Ci0JCQkJfQotCQkJCWZvciAoaW50IGkgPSAwOyByZXNvdXJjZXMhPSBudWxsICYmIGkgPCByZXNvdXJjZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJZG9QYWNrTW9kdWxlKHJlc291cmNlc1tpXSwgcGFja2FnZXIpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJU3RyaW5nIGRlc3RpbmF0aW9uID0gcmVzb3VyY2UuZ2V0TW9kdWxlUmVsYXRpdmVQYXRoKCkuYXBwZW5kKHJlc291cmNlLmdldE5hbWUoKSkudG9Qb3J0YWJsZVN0cmluZygpOwotCQkJCUlGaWxlIGZpbGUgPSAoSUZpbGUpIHJlc291cmNlLmdldEFkYXB0ZXIoSUZpbGUuY2xhc3MpOwotCQkJCWlmIChmaWxlICE9IG51bGwpCi0JCQkJCXBhY2thZ2VyLndyaXRlKGZpbGUsIGRlc3RpbmF0aW9uKTsKLQkJCQllbHNlIHsKLQkJCQkJRmlsZSBmaWxlMiA9IChGaWxlKSByZXNvdXJjZS5nZXRBZGFwdGVyKEZpbGUuY2xhc3MpOwotCQkJCQlwYWNrYWdlci53cml0ZShmaWxlMiwgZGVzdGluYXRpb24pOwotCQkJCX0KLQkJCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgSVBhdGggY29weU1vZHVsZShJTW9kdWxlIG1vZHVsZSxJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpdGhyb3dzIENvcmVFeGNlcHRpb257Ci0JCVByb2plY3RNb2R1bGUgcG0gPShQcm9qZWN0TW9kdWxlKW1vZHVsZS5sb2FkQWRhcHRlcihQcm9qZWN0TW9kdWxlLmNsYXNzLCBtb25pdG9yKTsKLQkJSVBhdGggdG8gPSBnZXRQcm9qZWN0V29ya2luZ0xvY2F0aW9uKCkuYXBwZW5kKHBtLmdldElkKCkpOwotCQlQdWJsaXNoVXRpbC5zbWFydENvcHkocG0ubWVtYmVycygpLCB0bywgbW9uaXRvcik7Ci0JCXJldHVybiB0bzsKLQl9Ci0JCi0JcHJpdmF0ZSBJUGF0aCBnZXRQcm9qZWN0V29ya2luZ0xvY2F0aW9uKCl7Ci0JCXJldHVybiBTZXJ2ZXJQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRUZW1wRGlyZWN0b3J5KGZTZXJ2ZXIuZ2V0U2VydmVyKCkuZ2V0SWQoKSk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2NvcmUvaW50ZXJuYWwvcHVibGlzaGVycy9BbnRQdWJsaXNoZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9jb3JlL2ludGVybmFsL3B1Ymxpc2hlcnMvQW50UHVibGlzaGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4ZTViM2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2NvcmUvaW50ZXJuYWwvcHVibGlzaGVycy9BbnRQdWJsaXNoZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgRXRlcmF0aW9uIEEuUy4gYW5kIEdvcmtlbSBFcmNhbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBHb3JrZW0gRXJjYW4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAgICAgICAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsLnB1Ymxpc2hlcnM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLmphci5KYXJFbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuamFyLkphckZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLklBbnRVSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkubGF1bmNoQ29uZmlndXJhdGlvbnMuSUFudExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5JRGVidWdVSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLklKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuSVdlYk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5pbnRlcm5hbC5Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsLkdlbmVyaWNQdWJsaXNoZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuaW50ZXJuYWwuR2VuZXJpY1NlcnZlckNvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuY29yZS51dGlsLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUHVibGlzaGVyRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLmludGVybmFsLm1vZGVsLklFeHRlcm5hbFRvb2xDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGVBcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuU2VydmVyUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0vKioKLSAqIEFudCBiYXNlZCBwdWJsaXNoZXIuCi0gKiBBbGwgdGhlIHByb3BlcnRpZXMgZGVmaW5lZCBpbiB0aGUgc2VydmVyIGRlZmluaXRpb24gZmlsZSBhcmUKLSAqIHBhc3NlZCBpbnRvIHRoZSBBTlQgYnVpbGQgZmlsZSBhcyBwcm9wZXJ0aWVzLgotICogSW4gYWRkaXRpb24gdG8gdGhlIHByb3BlcnRpZXMgZGVmaW5lZCBpbiB0aGUgc2VydmVyIGRlZmluaXRpb24KLSAqIDxJPm1vZHVsZS5kaXI8L0k+LCA8ST5tb2R1bGUubmFtZSw8L0k+IGFuZCA8ST5zZXJ2ZXIucHVibGlzaC5kaXI8L0k+IGFyZSBjb21wdXRlZCBhbmQgcGFzc2VkIHRvIHRoZSAKLSAqIGRlZmluaXRpb24gZmlsZS4KLSAqIDx1bD4KLSAqIDxsaT5tb2R1bGUuZGlyOiBpbmNsdWRlcyB0aGUgcm9vdCBvZiB0aGUgbW9kdWxlIHByb2plY3QgZmlsZTwvbGk+Ci0gKiA8bGk+bW9kdWxlLm5hbWU6IHRoZSBuYW1lIG9mIHRoZSBtb2R1bGU8L2xpPgotICogPGxpPnNlcnZlci5wdWJsaXNoLmRpcjogdGhlIGRpcmVjdG9yeSB0byBwdXQgdGhlIGRlcGxveW1lbnQgdW5pdHM8L2xpPgotICogPGxpPnByb2plY3Qud29ya2luZy5kaXI6IHRoZSB3b3JraW5nIGRpciBvZiB0aGUgcHJvamVjdCB0aGF0IGRlcGxveWVkIG1vZHVsZSBpcyBpbjwvbGk+Ci0gKiA8L3VsPgotICoKLSAqIEBhdXRob3IgR29ya2VtIEVyY2FuCi0gKi8KLQotcHVibGljIGNsYXNzIEFudFB1Ymxpc2hlciBleHRlbmRzIEdlbmVyaWNQdWJsaXNoZXJ7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpBUl9QUk9UT0NPTF9QUkVGSVggPSAiamFyIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogcHVibGlzaGVyIGlkIGZvciBBTlQgcHVibGlzaGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJU0hFUl9JRD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmFudHB1Ymxpc2hlciI7IC8vJE5PTi1OTFMtMSQKLSAgICAKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9TRVJWRVJfUFVCTElTSF9ESVIgPSAic2VydmVyLnB1Ymxpc2guZGlyIjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfUFJPSkVDVF9XT1JLSU5HX0RJUj0gInByb2plY3Qud29ya2luZy5kaXIiOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9NT0RVTEVfRElSID0gIm1vZHVsZS5kaXIiOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9NT0RVTEVfTkFNRSA9ICJtb2R1bGUubmFtZSI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX1BST0pFQ1RfTkFNRSA9ICJwcm9qZWN0Lm5hbWUiOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9EVUxFX1BVQkxJU0hfVEFSR0VUX1BSRUZJWCA9ICJ0YXJnZXQucHVibGlzaC4iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1PRFVMRV9VTlBVQkxJU0hfVEFSR0VUX1BSRUZJWCA9ICJ0YXJnZXQudW5wdWJsaXNoLiI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRBX05BTUVfQlVJTERfRklMRT0iYnVpbGQuZmlsZSI7Ly8kTk9OLU5MUy0xJAotCQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3RwLnNlcnZlci5jb3JlLm1vZGVsLklQdWJsaXNoZXIjcHVibGlzaChvcmcuZWNsaXBzZS53dHAuc2VydmVyLmNvcmUucmVzb3VyY2VzLklNb2R1bGVSZXNvdXJjZVtdLCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgSVN0YXR1c1tdIHB1Ymxpc2goSU1vZHVsZUFydGlmYWN0W10gcmVzb3VyY2UsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcil7Ci0JCWlmKGdldE1vZHVsZSgpLmxlbmd0aD4xKS8vIG9ubHkgcmVzcG9uZCB0byByb290IG1vZHVsZSBjYWxscy4gCi0JCQlyZXR1cm4gbnVsbDsKLQkJdHJ5ewotCQkJYXNzZW1ibGVNb2R1bGUobW9uaXRvcik7Ci0gICAgICAgIAlGaWxlIGZpbGUgPSBjb21wdXRlQnVpbGRGaWxlKCk7Ci0gICAgICAgIAlydW5BbnQoZmlsZS50b1N0cmluZygpLGdldFB1Ymxpc2hUYXJnZXRzRm9yTW9kdWxlKCksZ2V0UHVibGlzaFByb3BlcnRpZXMoKSxtb25pdG9yKTsKLSAgICAgICAgfWNhdGNoKENvcmVFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgICBJU3RhdHVzIHMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsQ29yZVBsdWdpbi5QTFVHSU5fSUQsMCxHZW5lcmljU2VydmVyQ29yZU1lc3NhZ2VzLmVycm9yUHVibGlzaEFudHB1Ymxpc2hlcixlKTsKLSAgICAgICAgICAgIENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyhzKTsKLSAgICAgICAgICAgIHJldHVybiBuZXcgSVN0YXR1c1tdIHtzfTsKLSAgICAgICAgfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYXNzZW1ibGVNb2R1bGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKXRocm93cyBDb3JlRXhjZXB0aW9uewotCQlBYnN0cmFjdE1vZHVsZUFzc2VtYmxlciBhc3NlbWJsZXI9IEFic3RyYWN0TW9kdWxlQXNzZW1ibGVyLkZhY3RvcnkuZ2V0TW9kdWxlQXNzZW1ibGVyKGdldE1vZHVsZSgpWzBdLCBnZXRTZXJ2ZXIoKSk7Ci0JCWFzc2VtYmxlci5hc3NlbWJsZShtb25pdG9yKTsKLQl9Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuCi0gICAgICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSBGaWxlIGNvbXB1dGVCdWlsZEZpbGUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIEJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoZ2V0U2VydmVyUnVudGltZSgpLmdldFNlcnZlclR5cGVEZWZpbml0aW9uKCkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnROYW1lc3BhY2UoKSk7Ci0gICAgICAgIFVSTCBidW5kbGVVcmwgPWJ1bmRsZS5nZXRFbnRyeShnZXRCdWlsZEZpbGUoKSk7Ci0gICAgICAgIFVSTCBmaWxlVVJMID0gRmlsZVV0aWwucmVzb2x2ZVVSTChidW5kbGVVcmwpOwotICAgICAgICBpZihmaWxlVVJMLmdldFByb3RvY29sKCkuZXF1YWxzKEpBUl9QUk9UT0NPTF9QUkVGSVgpKXsKLSAgICAgICAgCU91dHB1dFN0cmVhbSBvcz1udWxsOwotICAgICAgICAJSW5wdXRTdHJlYW0gaXM9bnVsbDsgCi0gICAgICAgIAl0cnl7Ci0gICAgICAgIAkJU3RyaW5nIGZpbGVuYW1lID1maWxlVVJMLmdldFBhdGgoKTsKLSAgICAgICAgCQlTdHJpbmcgamFybmFtZT0gZmlsZVVSTC5nZXRGaWxlKCkuc3Vic3RyaW5nKDAsZmlsZW5hbWUuaW5kZXhPZignIScpKTsKLSAgICAgICAgCQkKLSAgICAgICAgCQlGaWxlIGphckZpbGUgPSBuZXcgRmlsZShuZXcgVVJMKGphcm5hbWUpLmdldEZpbGUoKSk7Ci0gICAgICAgIAkJSmFyRmlsZSBqYXIgPSBuZXcgSmFyRmlsZShqYXJGaWxlKTsKLSAgICAgICAgCQlGaWxlIHRtcEZpbGUgPSBGaWxlVXRpbC5jcmVhdGVUZW1wRmlsZShnZXRCdWlsZEZpbGUoKSxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTdGF0ZUxvY2F0aW9uKCkudG9PU1N0cmluZygpKTsKLSAgICAgICAgCQlvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRtcEZpbGUpOwotICAgICAgICAJCVN0cmluZyBlbnRyeW5hbWU9IGdldEJ1aWxkRmlsZSgpOwotICAgICAgICAJCWlmIChlbnRyeW5hbWUuc3RhcnRzV2l0aCgiLyIpKS8vJE5PTi1OTFMtMSQKLSAgICAgICAgCQkJZW50cnluYW1lPSBlbnRyeW5hbWUuc3Vic3RyaW5nKDEpOwotICAgICAgICAJCUphckVudHJ5IGVudHJ5ID0gamFyLmdldEphckVudHJ5KGVudHJ5bmFtZSk7Ci0gICAgICAgIAkJaXMgPWphci5nZXRJbnB1dFN0cmVhbShlbnRyeSk7Ci0gICAgICAgIAkJRmlsZVV0aWwuY29weShpcyxvcyk7Ci0gICAgICAgIAkJcmV0dXJuIHRtcEZpbGU7Ci0gICAgICAgICAJfQotICAgICAgICAJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgCQlJU3RhdHVzIHMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsQ29yZVBsdWdpbi5QTFVHSU5fSUQsMCwiZXJyb3IgY3JlYXRpbmcgdGVtcG9yYXJ5IGJ1aWxkIGZpbGUiLGUpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2coKS5sb2cocyk7Ci0JCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24ocyk7Ci0JCQl9Ci0gICAgICAgIAlmaW5hbGx5ewotICAgICAgICAJCXRyeSB7Ci0gICAgICAgIAkJCWlmKGlzIT1udWxsKQotICAgICAgICAJCQkJaXMuY2xvc2UoKTsKLQkJCQkJaWYob3MhPW51bGwpCi0JCQkJCQlvcy5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy9pZ25vcmUKLQkJCQl9Ci0gICAgICAgIAl9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZXsKLSAgICAgICAgCXJldHVybiBGaWxlVXRpbC5yZXNvbHZlRmlsZShmaWxlVVJMKTsKLSAgICAgICAgfSAJCi0gICAgfQotICAgCi0gICAgLyoqCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGdldFB1Ymxpc2hUYXJnZXRzRm9yTW9kdWxlKCkgewotICAgIAlyZXR1cm4gZG9HZXRUYXJnZXRzKE1PRFVMRV9QVUJMSVNIX1RBUkdFVF9QUkVGSVgrZ2V0TW9kdWxlVHlwZUlkKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBnZXRVbnB1Ymxpc2hUYXJnZXRzRm9yTW9kdWxlKCkgewotICAgICAgICByZXR1cm4gZG9HZXRUYXJnZXRzKE1PRFVMRV9VTlBVQkxJU0hfVEFSR0VUX1BSRUZJWCtnZXRNb2R1bGVUeXBlSWQoKSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEBwYXJhbSBkYXRhbmFtZQotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBkb0dldFRhcmdldHMoU3RyaW5nIGRhdGFuYW1lKSB7Ci0gICAgCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZ2V0U2VydmVyUnVudGltZSgpLmdldFNlcnZlclR5cGVEZWZpbml0aW9uKCkuZ2V0UHVibGlzaGVyKFBVQkxJU0hFUl9JRCkuZ2V0UHVibGlzaGVyZGF0YSgpLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSl7Ci0gICAgICAgICAgICBQdWJsaXNoZXJEYXRhIGRhdGEgPSAoUHVibGlzaGVyRGF0YSlpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICBpZihkYXRhbmFtZS5lcXVhbHMoZGF0YS5nZXREYXRhbmFtZSgpKSkgewotICAgICAgICAgICAgICAgIGlmKGJ1ZmZlci5sZW5ndGgoKT4wKQotICAgICAgICAgICAgICAgIAlidWZmZXIuYXBwZW5kKCIsIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICAgICAgCWJ1ZmZlci5hcHBlbmQoZGF0YS5nZXREYXRhdmFsdWUoKSk7Ci0gICAgICAgICAgICB9ICAgCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldE1vZHVsZVR5cGVJZCgpewotICAgICAgICByZXR1cm4gZ2V0TW9kdWxlKClbMF0uZ2V0TW9kdWxlVHlwZSgpLmdldElkKCk7Ci0gICAgfQotICAgIAotCXByaXZhdGUgU3RyaW5nIGdldEJ1aWxkRmlsZSgpCi0gICAgewotICAgICAgICBJdGVyYXRvciBpdGVyYXRvciA9IGdldFNlcnZlclJ1bnRpbWUoKS5nZXRTZXJ2ZXJUeXBlRGVmaW5pdGlvbigpLmdldFB1Ymxpc2hlcihQVUJMSVNIRVJfSUQpLmdldFB1Ymxpc2hlcmRhdGEoKS5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFB1Ymxpc2hlckRhdGEgZGF0YSA9IChQdWJsaXNoZXJEYXRhKWl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgIGlmKERBVEFfTkFNRV9CVUlMRF9GSUxFLmVxdWFscyhkYXRhLmdldERhdGFuYW1lKCkpKQotICAgICAgICAgICAgICAgIHJldHVybiBnZXRTZXJ2ZXJSdW50aW1lKCkuZ2V0U2VydmVyVHlwZURlZmluaXRpb24oKS5nZXRSZXNvbHZlcigpLnJlc29sdmVQcm9wZXJ0aWVzKGRhdGEuZ2V0RGF0YXZhbHVlKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQkKLQlwcml2YXRlIE1hcCBnZXRQdWJsaXNoUHJvcGVydGllcygpCi0JewotICAgICAgICBNYXAgcHJvcHMgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICAvLyBwYXNzIGFsbCBwcm9wZXJ0aWVzIHRvIGJ1aWxkIGZpbGUuCi0gICAgICAgIE1hcCBzZXJ2ZXJQcm9wZXJ0aWVzID0gZ2V0U2VydmVyKCkuZ2V0U2VydmVySW5zdGFuY2VQcm9wZXJ0aWVzKCk7Ci0gICAgICAgIE1hcCBwcm9wZXJ0aWVzID0gZ2V0U2VydmVyUnVudGltZSgpLmdldFNlcnZlckluc3RhbmNlUHJvcGVydGllcygpOwotICAgICAgICBwcm9wZXJ0aWVzLnB1dEFsbChzZXJ2ZXJQcm9wZXJ0aWVzKTsKLSAgICAgICAgSXRlcmF0b3IgcHJvcGVydHlJdGVyYXRvciA9IHByb3BlcnRpZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUocHJvcGVydHlJdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBwcm9wZXJ0eSA9IChTdHJpbmcpcHJvcGVydHlJdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKXByb3BlcnRpZXMuZ2V0KHByb3BlcnR5KTsKLSAgICAgICAgICAgIGlmKHZhbHVlIT1udWxsICYmIHZhbHVlLnRyaW0oKS5sZW5ndGgoKT4wKQotICAgICAgICAgICAgCXByb3BzLnB1dChwcm9wZXJ0eSxwcm9wZXJ0aWVzLmdldChwcm9wZXJ0eSkpOwotICAgICAgICB9Ci0gICAgICAgIE1vZHVsZSBtb2R1bGUgPSAgZ2V0U2VydmVyUnVudGltZSgpLmdldFNlcnZlclR5cGVEZWZpbml0aW9uKCkuZ2V0TW9kdWxlKGdldE1vZHVsZVR5cGVJZCgpKTsKLQkJU3RyaW5nIG1vZERpciA9IG1vZHVsZS5nZXRQdWJsaXNoRGlyKCk7Ci0JCW1vZERpciA9IGdldFNlcnZlclJ1bnRpbWUoKS5nZXRTZXJ2ZXJUeXBlRGVmaW5pdGlvbigpLmdldFJlc29sdmVyKCkucmVzb2x2ZVByb3BlcnRpZXMobW9kRGlyKTsKLQkJSU1vZHVsZSB3ZWJNb2R1bGUgPSBnZXRNb2R1bGUoKVswXTsKLQkJCi0gICAgICAgIFN0cmluZyBtb2R1bGVOYW1lPWd1ZXNzTW9kdWxlTmFtZSh3ZWJNb2R1bGUpOwotICAgICAgICBwcm9wcy5wdXQoUFJPUF9QUk9KRUNUX1dPUktJTkdfRElSLGdldFByb2plY3RXb3JraW5nTG9jYXRpb24oKS50b1N0cmluZygpKTsKLQkJcHJvcHMucHV0KFBST1BfTU9EVUxFX05BTUUsbW9kdWxlTmFtZSk7Ci0JCXByb3BzLnB1dChQUk9QX01PRFVMRV9ESVIsZ2V0TW9kdWxlV29ya2luZ0RpcigpLnRvU3RyaW5nKCkpOwotCQlwcm9wcy5wdXQoUFJPUF9QUk9KRUNUX05BTUUsd2ViTW9kdWxlLmdldFByb2plY3QoKS5nZXROYW1lKCkpOwotCi0JCXByb3BzLnB1dChQUk9QX1NFUlZFUl9QVUJMSVNIX0RJUixtb2REaXIpOwotCQlyZXR1cm4gcHJvcHM7Ci0JfQotCQotCXByaXZhdGUgSVBhdGggZ2V0TW9kdWxlV29ya2luZ0RpcigpewotCQlyZXR1cm4gZ2V0UHJvamVjdFdvcmtpbmdMb2NhdGlvbigpLmFwcGVuZChnZXRNb2R1bGUoKVswXS5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwcml2YXRlIElQYXRoIGdldFByb2plY3RXb3JraW5nTG9jYXRpb24oKXsKLQkJcmV0dXJuIFNlcnZlclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFRlbXBEaXJlY3RvcnkoZ2V0U2VydmVyKCkuZ2V0U2VydmVyKCkuZ2V0SWQoKSk7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGd1ZXNzTW9kdWxlTmFtZShJTW9kdWxlIG1vZHVsZSkgewotCQlTdHJpbmcgbW9kdWxlTmFtZSA9IG1vZHVsZS5nZXROYW1lKCk7IAotCQlpZigianN0LndlYiIuZXF1YWxzKGdldE1vZHVsZVR5cGVJZCgpKSl7IC8vJE5PTi1OTFMtMSQKLQkJCUlXZWJNb2R1bGUgd2ViTW9kdWxlID0gKElXZWJNb2R1bGUpZ2V0TW9kdWxlKClbMF0ubG9hZEFkYXB0ZXIoSVdlYk1vZHVsZS5jbGFzcyxudWxsKTsKLQkJCVN0cmluZyBjb250ZXh0Um9vdCA9IHdlYk1vZHVsZS5nZXRVUkkobW9kdWxlKTsKLQkJCS8vVE9ETyB3ZSBzaG91bGQgcmVhbGx5IHBhc3MgdGhlIGZ1bGwgdXJpIGluY2x1ZGluZyB0aGUgZmlsZSBleHRlbnNpb24gaW4gdGhlIGZ1dHVyZQotCQkJbW9kdWxlTmFtZSA9IGNvbnRleHRSb290LnN1YnN0cmluZygwLGNvbnRleHRSb290Lmxhc3RJbmRleE9mKCcuJykpOwotCQkJfQotCQlyZXR1cm4gbW9kdWxlTmFtZTsKLQkJfQotCi0KLQotCXByaXZhdGUgdm9pZCBydW5BbnQoU3RyaW5nIGJ1aWxkRmlsZSxTdHJpbmcgdGFyZ2V0cyxNYXAgcHJvcGVydGllcyAsSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKXRocm93cyBDb3JlRXhjZXB0aW9uewotCQlJTGF1bmNoTWFuYWdlciBsYXVuY2hNYW5hZ2VyID0gRGVidWdQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExhdW5jaE1hbmFnZXIoKTsKLQkJSUxhdW5jaENvbmZpZ3VyYXRpb25UeXBlIHR5cGUgPSBsYXVuY2hNYW5hZ2VyLmdldExhdW5jaENvbmZpZ3VyYXRpb25UeXBlKElBbnRMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLklEX0FOVF9MQVVOQ0hfQ09ORklHVVJBVElPTl9UWVBFKTsKLQkJaWYodHlwZT09bnVsbCl7Ci0JCQlJU3RhdHVzIHMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsQ29yZVBsdWdpbi5QTFVHSU5fSUQsMCxHZW5lcmljU2VydmVyQ29yZU1lc3NhZ2VzLmFudExhdW5jaGVyTWlzc2luZyxudWxsKTsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKHMpOwotCQl9Ci0JCUlMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgd2M9IHR5cGUubmV3SW5zdGFuY2UobnVsbCxwcm9wZXJ0aWVzLmdldChQUk9QX01PRFVMRV9OQU1FKSsiIG1vZHVsZSBwdWJsaXNoZXIiKTsgLy8kTk9OLU5MUy0xJAotCQl3Yy5zZXRDb250YWluZXIobnVsbCk7Ci0JCXdjLnNldEF0dHJpYnV0ZShJRXh0ZXJuYWxUb29sQ29uc3RhbnRzLkFUVFJfTE9DQVRJT04sIGJ1aWxkRmlsZSk7Ci0JCXdjLnNldEF0dHJpYnV0ZShJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9DTEFTU1BBVEhfUFJPVklERVIsIm9yZy5lY2xpcHNlLmFudC51aS5BbnRDbGFzc3BhdGhQcm92aWRlciIpOyAvLyROT04tTkxTLTEkCi0JCXdjLnNldEF0dHJpYnV0ZShJQW50TGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX0FOVF9UQVJHRVRTLHRhcmdldHMpOwotCQl3Yy5zZXRBdHRyaWJ1dGUoSUFudExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9BTlRfUFJPUEVSVElFUyxwcm9wZXJ0aWVzKTsKLQkJd2Muc2V0QXR0cmlidXRlKElEZWJ1Z1VJQ29uc3RhbnRzLkFUVFJfTEFVTkNIX0lOX0JBQ0tHUk9VTkQsZmFsc2UpOwotCQl3Yy5zZXRBdHRyaWJ1dGUoSURlYnVnVUlDb25zdGFudHMuQVRUUl9DQVBUVVJFX0lOX0NPTlNPTEUsdHJ1ZSk7Ci0JCXdjLnNldEF0dHJpYnV0ZShJRGVidWdVSUNvbnN0YW50cy5BVFRSX1BSSVZBVEUsdHJ1ZSk7Ci0JCQotCQl3Yy5zZXRBdHRyaWJ1dGUoSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfU09VUkNFX1BBVEhfUFJPVklERVIsICJvcmcuZWNsaXBzZS5hbnQudWkuQW50Q2xhc3NwYXRoUHJvdmlkZXIiKTsgIC8vJE5PTi1OTFMtMSQKLQkJd2Muc2V0QXR0cmlidXRlKElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1ZNX0lOU1RBTExfTkFNRSxnZXRTZXJ2ZXJSdW50aW1lKCkuZ2V0Vk1JbnN0YWxsKCkuZ2V0TmFtZSgpKTsKLQkJd2Muc2V0QXR0cmlidXRlKElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1ZNX0lOU1RBTExfVFlQRSxnZXRTZXJ2ZXJSdW50aW1lKCkuZ2V0Vk1JbnN0YWxsKCkuZ2V0Vk1JbnN0YWxsVHlwZSgpLmdldElkKCkpOwotCQl3Yy5zZXRBdHRyaWJ1dGUoSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfTUFJTl9UWVBFX05BTUUsICJvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuYW50c3VwcG9ydC5JbnRlcm5hbEFudFJ1bm5lciIpOyAvLyROT04tTkxTLTEkCi0JCXdjLnNldEF0dHJpYnV0ZShEZWJ1Z1BsdWdpbi5BVFRSX1BST0NFU1NfRkFDVE9SWV9JRCwgSUFudFVJQ29uc3RhbnRzLlJFTU9URV9BTlRfUFJPQ0VTU19GQUNUT1JZX0lEKTsKLQkJCi0JCXNldHVwQW50TGF1bmNoQ29uZmlndXJhdGlvbih3Yyk7Ci0JCQotCQkKLQkJSUxhdW5jaENvbmZpZ3VyYXRpb24gbGF1bmNoQ29uZmlnID0gd2MuZG9TYXZlKCk7Ci0gICAgICAgIGxhdW5jaENvbmZpZy5sYXVuY2goInJ1biIsbW9uaXRvcik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQotCi0gIC8qKgotICAgKiBIb29rIG1ldGhvZCBmb3Igc3ViY2xhc3Nlcy4KLSAgICogCi0gICAqIEBwYXJhbSB3YwotICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXR1cEFudExhdW5jaENvbmZpZ3VyYXRpb24oSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSB3YykgewkJCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLmNvcmUuR2VuZXJpY1B1Ymxpc2hlciN1bnB1Ymxpc2gob3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGUsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotICAgICAqLwotICAgIHB1YmxpYyBJU3RhdHVzW10gdW5wdWJsaXNoKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCi0gICAgCWlmKGdldE1vZHVsZSgpLmxlbmd0aD4xKS8vIG9ubHkgcmVzcG9uZCB0byByb290IG1vZHVsZSBjYWxscy4gCi0JCQlyZXR1cm4gbnVsbDsKLSAgICAJdHJ5IHsKLSAgICAgICAgCSBGaWxlIGZpbGUgPSBjb21wdXRlQnVpbGRGaWxlKCk7Ci0gICAgICAgICAgICBydW5BbnQoZmlsZS50b1N0cmluZygpLGdldFVucHVibGlzaFRhcmdldHNGb3JNb2R1bGUoKSxnZXRQdWJsaXNoUHJvcGVydGllcygpLG1vbml0b3IpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIElTdGF0dXMgcyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUixDb3JlUGx1Z2luLlBMVUdJTl9JRCwwLEdlbmVyaWNTZXJ2ZXJDb3JlTWVzc2FnZXMuZXJyb3JSZW1vdmVNb2R1bGVBbnRwdWJsaXNoZXIsZSk7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IElTdGF0dXNbXSB7c307Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2NvcmUvaW50ZXJuYWwvcHVibGlzaGVycy9EZWZhdWx0TW9kdWxlQXNzZW1ibGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvY29yZS9pbnRlcm5hbC9wdWJsaXNoZXJzL0RlZmF1bHRNb2R1bGVBc3NlbWJsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ4ZTgyZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvY29yZS9pbnRlcm5hbC9wdWJsaXNoZXJzL0RlZmF1bHRNb2R1bGVBc3NlbWJsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuaW50ZXJuYWwucHVibGlzaGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsLkdlbmVyaWNTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7Ci0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0TW9kdWxlQXNzZW1ibGVyIGV4dGVuZHMgQWJzdHJhY3RNb2R1bGVBc3NlbWJsZXIgewotCQotCXByb3RlY3RlZCBEZWZhdWx0TW9kdWxlQXNzZW1ibGVyKElNb2R1bGUgbW9kdWxlLCBHZW5lcmljU2VydmVyIHNlcnZlcikKLQl7Ci0JCWZNb2R1bGU9bW9kdWxlOwotCQlmU2VydmVyZGVmaW5pdGlvbj1zZXJ2ZXIuZ2V0U2VydmVyRGVmaW5pdGlvbigpOwotCQlmU2VydmVyPXNlcnZlcjsKLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIHZvaWQgYXNzZW1ibGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWNvcHlNb2R1bGUoZk1vZHVsZSxtb25pdG9yKTsJCQotCX0KLQotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9jb3JlL2ludGVybmFsL3B1Ymxpc2hlcnMvRWFyTW9kdWxlQXNzZW1ibGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvY29yZS9pbnRlcm5hbC9wdWJsaXNoZXJzL0Vhck1vZHVsZUFzc2VtYmxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWUzZDkxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9jb3JlL2ludGVybmFsL3B1Ymxpc2hlcnMvRWFyTW9kdWxlQXNzZW1ibGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgRXRlcmF0aW9uIEEuUy4gYW5kIEdvcmtlbSBFcmNhbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBHb3JrZW0gRXJjYW4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAgICAgICAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsLnB1Ymxpc2hlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLklFbnRlcnByaXNlQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuaW50ZXJuYWwuR2VuZXJpY1NlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKLQotcHVibGljIGNsYXNzIEVhck1vZHVsZUFzc2VtYmxlciBleHRlbmRzIEFic3RyYWN0TW9kdWxlQXNzZW1ibGVyIHsKLQotCXByb3RlY3RlZCBFYXJNb2R1bGVBc3NlbWJsZXIoSU1vZHVsZSBtb2R1bGUsIEdlbmVyaWNTZXJ2ZXIgc2VydmVyKQotCXsKLQkJZk1vZHVsZT1tb2R1bGU7Ci0JCWZTZXJ2ZXJkZWZpbml0aW9uPXNlcnZlci5nZXRTZXJ2ZXJEZWZpbml0aW9uKCk7Ci0JCWZTZXJ2ZXI9c2VydmVyOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFzc2VtYmxlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb257Ci0JCUlQYXRoIHBhcmVudCA9Y29weU1vZHVsZShmTW9kdWxlLG1vbml0b3IpOwotCQlJRW50ZXJwcmlzZUFwcGxpY2F0aW9uIGVhck1vZHVsZSA9IChJRW50ZXJwcmlzZUFwcGxpY2F0aW9uKWZNb2R1bGUubG9hZEFkYXB0ZXIoSUVudGVycHJpc2VBcHBsaWNhdGlvbi5jbGFzcywgbW9uaXRvcik7Ci0JCUlNb2R1bGVbXSBjaGlsZE1vZHVsZXMgPSBlYXJNb2R1bGUuZ2V0TW9kdWxlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkTW9kdWxlcy5sZW5ndGg7IGkrKykgewotCQkJSU1vZHVsZSBtb2R1bGUgPSBjaGlsZE1vZHVsZXNbaV07Ci0JCQlwYWNrTW9kdWxlKG1vZHVsZSwgcGFyZW50KTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9jb3JlL2ludGVybmFsL3B1Ymxpc2hlcnMvTW9kdWxlUGFja2FnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9jb3JlL2ludGVybmFsL3B1Ymxpc2hlcnMvTW9kdWxlUGFja2FnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRiZmQwMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvY29yZS9pbnRlcm5hbC9wdWJsaXNoZXJzL01vZHVsZVBhY2thZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDUgRXRlcmF0aW9uIEEuUy4gYW5kIEdvcmtlbSBFcmNhbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSogCi0qIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qICAgICAgICAgICAgICAgCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuaW50ZXJuYWwucHVibGlzaGVyczsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC56aXAuQ1JDMzI7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcE91dHB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotCi0vKioKLSAqIFBhY2thZ2VzIHJlc291cmNlcyB0byBhIC56aXAgZmlsZQotICovCi1wdWJsaWMgY2xhc3MgTW9kdWxlUGFja2FnZXIgewotCXByaXZhdGUgWmlwT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbTsKLS8vCXByaXZhdGUgU3RyaW5nQnVmZmVyIG1hbmlmZXN0Q29udGVudHM7Ci0KLQlwcml2YXRlIGJvb2xlYW4gdXNlQ29tcHJlc3Npb24gPSB0cnVlOwotCi0JLyoqCi0JICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuCi0JICogCi0JICogQHBhcmFtIGZpbGVuYW1lIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gY29tcHJlc3MgYm9vbGVhbgotCSAqIEBleGNlcHRpb24gamF2YS5pby5JT0V4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBNb2R1bGVQYWNrYWdlcihTdHJpbmcgZmlsZW5hbWUsIGJvb2xlYW4gY29tcHJlc3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVBhdGggZGlyZWN0b3J5UGF0aCA9IG5ldyBQYXRoKGZpbGVuYW1lKTsKLQkJZGlyZWN0b3J5UGF0aCA9IChQYXRoKSBkaXJlY3RvcnlQYXRoLnJlbW92ZUxhc3RTZWdtZW50cygxKTsKLQkJRmlsZSBuZXdaaXBGaWxlID0gbmV3IEZpbGUoZGlyZWN0b3J5UGF0aC50b1N0cmluZygpKTsKLQkJbmV3WmlwRmlsZS5ta2RpcnMoKTsKLQkJb3V0cHV0U3RyZWFtID0gbmV3IFppcE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlbmFtZSkpOwotCQl1c2VDb21wcmVzc2lvbiA9IGNvbXByZXNzOwotCX0KLQotCS8qKgotCSAqIERvIGFsbCByZXF1aXJlZCBjbGVhbnVwIG5vdyB0aGF0IHdlJ3JlIGZpbmlzaGVkIHdpdGggdGhlIGN1cnJlbnRseS1vcGVuIC56aXAKLQkgKiAKLQkgKiBAZXhjZXB0aW9uIGphdmEuaW8uSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaW5pc2hlZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCW91dHB1dFN0cmVhbS5jbG9zZSgpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBaaXBFbnRyeSB3aXRoIHRoZSBwYXNzZWQgcGF0aG5hbWUgYW5kIGNvbnRlbnRzLCBhbmQgd3JpdGUgaXQgdG8gdGhlIGN1cnJlbnQKLQkgKiBhcmNoaXZlCi0JICogCi0JICogQHBhcmFtIHBhdGhuYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGNvbnRlbnRzCi0JICogICAgICAgICAgICBieXRlW10KLQkgKiBAZXhjZXB0aW9uIGphdmEuaW8uSU9FeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB3cml0ZShTdHJpbmcgcGF0aG5hbWUsIGJ5dGVbXSBjb250ZW50cykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJWmlwRW50cnkgbmV3RW50cnkgPSBuZXcgWmlwRW50cnkocGF0aG5hbWUpOwotCi0JCS8vIGlmIHRoZSBjb250ZW50cyBhcmUgYmVpbmcgY29tcHJlc3NlZCB0aGVuIHdlIGdldCB0aGUgYmVsb3cgZm9yIGZyZWUuCi0JCWlmICghdXNlQ29tcHJlc3Npb24pIHsKLQkJCW5ld0VudHJ5LnNldE1ldGhvZChaaXBFbnRyeS5TVE9SRUQpOwotCQkJbmV3RW50cnkuc2V0U2l6ZShjb250ZW50cy5sZW5ndGgpOwotCQkJQ1JDMzIgY2hlY2tzdW1DYWxjdWxhdG9yID0gbmV3IENSQzMyKCk7Ci0JCQljaGVja3N1bUNhbGN1bGF0b3IudXBkYXRlKGNvbnRlbnRzKTsKLQkJCW5ld0VudHJ5LnNldENyYyhjaGVja3N1bUNhbGN1bGF0b3IuZ2V0VmFsdWUoKSk7Ci0JCX0KLQotCQlvdXRwdXRTdHJlYW0ucHV0TmV4dEVudHJ5KG5ld0VudHJ5KTsKLQkJb3V0cHV0U3RyZWFtLndyaXRlKGNvbnRlbnRzKTsKLQkJb3V0cHV0U3RyZWFtLmNsb3NlRW50cnkoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB3cml0ZUZvbGRlcihTdHJpbmcgZGVzdGluYXRpb25QYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoIWRlc3RpbmF0aW9uUGF0aC5lbmRzV2l0aCgiLyIpKQotCQkJZGVzdGluYXRpb25QYXRoID0gZGVzdGluYXRpb25QYXRoICsgJy8nOwotCQlaaXBFbnRyeSBuZXdFbnRyeSA9IG5ldyBaaXBFbnRyeShkZXN0aW5hdGlvblBhdGgpOwotCQlvdXRwdXRTdHJlYW0ucHV0TmV4dEVudHJ5KG5ld0VudHJ5KTsKLQkJb3V0cHV0U3RyZWFtLmNsb3NlRW50cnkoKTsKLQl9Ci0KLQkvKioKLQkgKiBXcml0ZSB0aGUgcGFzc2VkIHJlc291cmNlIHRvIHRoZSBjdXJyZW50IGFyY2hpdmUKLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlCi0JICogQHBhcmFtIGRlc3RpbmF0aW9uUGF0aAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBleGNlcHRpb24gamF2YS5pby5JT0V4Y2VwdGlvbgotCSAqIEBleGNlcHRpb24gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCB3cml0ZShJRmlsZSByZXNvdXJjZSwgU3RyaW5nIGRlc3RpbmF0aW9uUGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJSW5wdXRTdHJlYW0gY29udGVudFN0cmVhbSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQljb250ZW50U3RyZWFtID0gcmVzb3VyY2UuZ2V0Q29udGVudHMoZmFsc2UpOwotCQkJd3JpdGUoY29udGVudFN0cmVhbSwgZGVzdGluYXRpb25QYXRoKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChjb250ZW50U3RyZWFtICE9IG51bGwpCi0JCQkJY29udGVudFN0cmVhbS5jbG9zZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogV3JpdGUgdGhlIHBhc3NlZCByZXNvdXJjZSB0byB0aGUgY3VycmVudCBhcmNoaXZlCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogICAgICAgICAgICBqYXZhLmlvLklGaWxlCi0JICogQHBhcmFtIGRlc3RpbmF0aW9uUGF0aAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBleGNlcHRpb24gamF2YS5pby5JT0V4Y2VwdGlvbgotCSAqIEBleGNlcHRpb24gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCB3cml0ZShGaWxlIHJlc291cmNlLCBTdHJpbmcgZGVzdGluYXRpb25QYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlJbnB1dFN0cmVhbSBjb250ZW50U3RyZWFtID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWNvbnRlbnRTdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHJlc291cmNlKTsKLQkJCXdyaXRlKGNvbnRlbnRTdHJlYW0sIGRlc3RpbmF0aW9uUGF0aCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoY29udGVudFN0cmVhbSAhPSBudWxsKQotCQkJCWNvbnRlbnRTdHJlYW0uY2xvc2UoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHdyaXRlKElucHV0U3RyZWFtIGNvbnRlbnRTdHJlYW0sIFN0cmluZyBkZXN0aW5hdGlvblBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXRwdXQgPSBudWxsOwotCi0JCXRyeSB7Ci0JCQlvdXRwdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCQlpbnQgY2h1bmtTaXplID0gY29udGVudFN0cmVhbS5hdmFpbGFibGUoKTsKLQkJCWJ5dGVbXSByZWFkQnVmZmVyID0gbmV3IGJ5dGVbY2h1bmtTaXplXTsKLQkJCWludCBuID0gY29udGVudFN0cmVhbS5yZWFkKHJlYWRCdWZmZXIpOwotCi0JCQl3aGlsZSAobiA+IDApIHsKLQkJCQlvdXRwdXQud3JpdGUocmVhZEJ1ZmZlcik7Ci0JCQkJbiA9IGNvbnRlbnRTdHJlYW0ucmVhZChyZWFkQnVmZmVyKTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChvdXRwdXQgIT0gbnVsbCkKLQkJCQlvdXRwdXQuY2xvc2UoKTsKLQkJfQotCi0JCXdyaXRlKGRlc3RpbmF0aW9uUGF0aCwgb3V0cHV0LnRvQnl0ZUFycmF5KCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2NvcmUvaW50ZXJuYWwvcHVibGlzaGVycy9XYXJNb2R1bGVBc3NlbWJsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9jb3JlL2ludGVybmFsL3B1Ymxpc2hlcnMvV2FyTW9kdWxlQXNzZW1ibGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyZjQwYTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2NvcmUvaW50ZXJuYWwvcHVibGlzaGVycy9XYXJNb2R1bGVBc3NlbWJsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBFdGVyYXRpb24gQS5TLiBhbmQgR29ya2VtIEVyY2FuLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IEdvcmtlbSBFcmNhbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgICAgICAgICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuaW50ZXJuYWwucHVibGlzaGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuSVdlYk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5pbnRlcm5hbC5HZW5lcmljU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotCi1wdWJsaWMgY2xhc3MgV2FyTW9kdWxlQXNzZW1ibGVyIGV4dGVuZHMgQWJzdHJhY3RNb2R1bGVBc3NlbWJsZXIgewotCQotCXByb3RlY3RlZCBXYXJNb2R1bGVBc3NlbWJsZXIoSU1vZHVsZSBtb2R1bGUsIEdlbmVyaWNTZXJ2ZXIgc2VydmVyKQotCXsKLQkJZk1vZHVsZT1tb2R1bGU7Ci0JCWZTZXJ2ZXJkZWZpbml0aW9uPXNlcnZlci5nZXRTZXJ2ZXJEZWZpbml0aW9uKCk7Ci0JCWZTZXJ2ZXI9c2VydmVyOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFzc2VtYmxlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb257Ci0JCUlQYXRoIHBhcmVudCA9Y29weU1vZHVsZShmTW9kdWxlLG1vbml0b3IpOwotCQlJV2ViTW9kdWxlIHdlYk1vZHVsZSA9IChJV2ViTW9kdWxlKWZNb2R1bGUubG9hZEFkYXB0ZXIoSVdlYk1vZHVsZS5jbGFzcywgbW9uaXRvcik7Ci0JCUlNb2R1bGVbXSBjaGlsZE1vZHVsZXMgPSB3ZWJNb2R1bGUuZ2V0TW9kdWxlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkTW9kdWxlcy5sZW5ndGg7IGkrKykgewotCQkJSU1vZHVsZSBtb2R1bGUgPSBjaGlsZE1vZHVsZXNbaV07Ci0JCQlwYWNrTW9kdWxlKG1vZHVsZSwgcGFyZW50LmFwcGVuZCgiV0VCLUlORiIpLmFwcGVuZCgibGliIikpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL2NvcmUvdXRpbC9FeHRlbnNpb25Qb2ludFV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9pbnRlcm5hbC9jb3JlL3V0aWwvRXh0ZW5zaW9uUG9pbnRVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzYzk0ZjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL2NvcmUvdXRpbC9FeHRlbnNpb25Qb2ludFV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBFdGVyYXRpb24gQS5TLiBhbmQgR29ya2VtIEVyY2FuLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IEdvcmtlbSBFcmNhbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgICAgICAgICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLmNvcmUudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUmVnaXN0cnlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuaW50ZXJuYWwuQ29yZVBsdWdpbjsKLQotLyoqCi0gKiBVdGlsaXRpZXMgZm9yIGhhbmRsaW5nIHRoZSBleHRlbnNpb24gcG9pbnRzLgotICoKLSAqIEBhdXRob3IgR29ya2VtIEVyY2FuCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHRlbnNpb25Qb2ludFV0aWwgewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZFUkRFRklOSVRJT05fRVhURU5TSU9OX0lEID0gInNlcnZlcmRlZmluaXRpb24iOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUklDUFVCTElTSEVSX0VYVEVOU0lPTl9JRCA9ICJnZW5lcmljcHVibGlzaGVyIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgSUV4dGVuc2lvbltdIGdldEdlbmVyaWNTZXJ2ZXJEZWZpbml0aW9uRXh0ZW5zaW9ucygpewotICAgICAgICByZXR1cm4gZ2V0RXh0ZW5zaW9ucyhDb3JlUGx1Z2luLlBMVUdJTl9JRCsiLiIrU0VSVkVSREVGSU5JVElPTl9FWFRFTlNJT05fSUQpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIElFeHRlbnNpb25bXSBnZXRHZW5lcmljUHVibGlzaGVyRXh0ZW5zaW9uKCl7Ci0gICAgICAgIHJldHVybiBnZXRFeHRlbnNpb25zKENvcmVQbHVnaW4uUExVR0lOX0lEKyIuIitHRU5FUklDUFVCTElTSEVSX0VYVEVOU0lPTl9JRCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgSUV4dGVuc2lvbltdIGdldEV4dGVuc2lvbnMoU3RyaW5nIGV4dGVuc2lvbklkKXsKLSAgICAgICAgSUV4dGVuc2lvblBvaW50IGV4dGVuc2lvblBvaW50PWdldEV4dGVuc2lvblBvaW50KGV4dGVuc2lvbklkKTsKLSAgICAgICAgSUV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSBleHRlbnNpb25Qb2ludC5nZXRFeHRlbnNpb25zKCk7Ci0gICAgICAgIHJldHVybiBleHRlbnNpb25zOwotICAgIH0KLSAKLSAgICBwcml2YXRlIHN0YXRpYyBJRXh0ZW5zaW9uUG9pbnQgZ2V0RXh0ZW5zaW9uUG9pbnQoU3RyaW5nIGlkKQotICAgIHsKLSAgICAgICAgSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLSAgICAgICAgSUV4dGVuc2lvblBvaW50IGV4dGVuc2lvblBvaW50PSByZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludChpZCk7Ci0gICAgICAgIHJldHVybiBleHRlbnNpb25Qb2ludDsKLSAgICB9Ci0gICAgCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBnZXRDb25maWd1cmF0aW9uRWxlbWVudHMoSUV4dGVuc2lvbiBleHRlbnNpb24pewotICAgICAgICByZXR1cm4gZXh0ZW5zaW9uIT1udWxsP2V4dGVuc2lvbi5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTpudWxsOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkUmVnaXN0cnlMaXN0ZW5lcihJUmVnaXN0cnlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcil7Ci0JCUlFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCXJlZ2lzdHJ5LmFkZFJlZ2lzdHJ5Q2hhbmdlTGlzdGVuZXIobGlzdGVuZXIsIENvcmVQbHVnaW4uUExVR0lOX0lEKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvaW50ZXJuYWwvY29yZS91dGlsL0ZpbGVVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvaW50ZXJuYWwvY29yZS91dGlsL0ZpbGVVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5ZTczMTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL2NvcmUvdXRpbC9GaWxlVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuY29yZS51dGlsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci0KLS8qKgotICogVXRpbGl0aWVzIGZvciBmaWxlIG9wZXJhdGlvbnMuCi0gKiAKLSAqIEBhdXRob3IgR29ya2VtIEVyY2FuCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWxlVXRpbCB7Ci0KLQkKLQkKLQlwdWJsaWMgc3RhdGljIFVSTCByZXNvbHZlVVJMKFVSTCB1cmwpewotCQl0cnl7Ci0JCQlyZXR1cm4gUGxhdGZvcm0ucmVzb2x2ZSh1cmwpOwotCQl9Y2F0Y2goSU9FeGNlcHRpb24gZSl7Ci0JCQkvL2lnbm9yZQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkKLQkKLQlwdWJsaWMgc3RhdGljIEZpbGUgY3JlYXRlVGVtcEZpbGUoU3RyaW5nIG5hbWUsIFN0cmluZyBkaXIpewotCQlpZihuYW1lPT1udWxsIHx8IGRpciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlGaWxlIHRlbXA9bnVsbDsKLQkJU3RyaW5nIGZpbGVQYXRoOwotCQlmaWxlUGF0aCA9IG5hbWUucmVwbGFjZSgnLycsIEZpbGUuc2VwYXJhdG9yQ2hhcik7Ci0JCWlmIChmaWxlUGF0aC5zdGFydHNXaXRoKEZpbGUuc2VwYXJhdG9yKSkKLQkJCWZpbGVQYXRoID0gZmlsZVBhdGguc3Vic3RyaW5nKDEpOwotCQl0ZW1wID0gbmV3IEZpbGUoZGlyLCBmaWxlUGF0aCk7Ci0JCXZlcmlmeVBhdGgodGVtcCx0cnVlKTsKLQkJdGVtcC5kZWxldGVPbkV4aXQoKTsKLQkJcmV0dXJuIHRlbXA7Ci0JCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb3B5KElucHV0U3RyZWFtIGlucHV0LCBPdXRwdXRTdHJlYW0gb3V0cHV0KSB0aHJvd3MgSU9FeGNlcHRpb257Ci0JCWJ5dGVbXSBidWYgPSBuZXcgYnl0ZVs0MDk2XTsKLQkJaW50IGxlbiA9IGlucHV0LnJlYWQoYnVmKTsKLQkJd2hpbGUobGVuIT0tMSl7Ci0JCQlvdXRwdXQud3JpdGUoYnVmLDAsbGVuKTsKLQkJCWxlbj0gaW5wdXQucmVhZChidWYpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgdmVyaWZ5UGF0aChGaWxlIHBhdGgsIGJvb2xlYW4gaXNGaWxlKSB7Ci0JCS8vIGlmIHdlIGFyZSBleHBlY3RpbmcgYSBmaWxlIGJhY2sgb2ZmIDEgcGF0aCBlbGVtZW50Ci0JCWlmIChpc0ZpbGUpIHsKLQkJCWlmIChwYXRoLmdldEFic29sdXRlUGF0aCgpLmVuZHNXaXRoKEZpbGUuc2VwYXJhdG9yKSkgewotCQkJCS8vIG1ha2Ugc3VyZSB0aGlzIGlzIGEgZmlsZQotCQkJCXBhdGggPSBwYXRoLmdldFBhcmVudEZpbGUoKTsKLQkJCQlpc0ZpbGUgPSBmYWxzZTsKLQkJCX0KLQkJfQotCQkvLyBhbHJlYWR5IGV4aXN0cyAuLi4ganVzdCByZXR1cm4KLQkJaWYgKHBhdGguZXhpc3RzKCkpCi0JCQlyZXR1cm47Ci0JCS8vIGRvZXMgbm90IGV4aXN0IC4uLiBlbnN1cmUgcGFyZW50IGV4aXN0cwotCQlGaWxlIHBhcmVudCA9IHBhdGguZ2V0UGFyZW50RmlsZSgpOwotCQl2ZXJpZnlQYXRoKHBhcmVudCwgZmFsc2UpOwotCQkvLyBlbnN1cmUgZGlyZWN0b3JpZXMgYXJlIG1hZGUuIE1hcmsgZmlsZXMgb3IgZGlyZWN0b3JpZXMgZm9yIGRlbGV0aW9uCi0JCWlmICghaXNGaWxlKQotCQkJcGF0aC5ta2RpcigpOwotCQlwYXRoLmRlbGV0ZU9uRXhpdCgpOwotCX0KLQotICAgIHB1YmxpYyBzdGF0aWMgRmlsZSByZXNvbHZlRmlsZShVUkwgdXJsKXsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFVSTCByZXNvbHZlZFVybCA9IHJlc29sdmVVUkwodXJsKTsKLSAgICAgICAgICAgICAgVVJJIHVyaSA9IG5ldyBVUkkocmVzb2x2ZWRVcmwuZ2V0UHJvdG9jb2woKSwgcmVzb2x2ZWRVcmwuZ2V0SG9zdCgpLHJlc29sdmVkVXJsLmdldFBhdGgoKSwgcmVzb2x2ZWRVcmwuZ2V0UXVlcnkoKSk7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEZpbGUodXJpKTsKLSAgICAgICAgfSAKLSAgICAgICAgY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIAkvL2lnbm9yZQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9pbnRlcm5hbC9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vU2VydmVyVHlwZVBhY2thZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9pbnRlcm5hbC9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vU2VydmVyVHlwZVBhY2thZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjcyZmE2YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvaW50ZXJuYWwvc2VydmVydHlwZS9kZWZpbml0aW9uL1NlcnZlclR5cGVQYWNrYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkwICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogU2VydmVyVHlwZVBhY2thZ2UuamF2YSx2IDEuNiAyMDA1LzA4LzMwIDIxOjQ3OjI5IGdlcmNhbiBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVGYWN0b3J5OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IGNvbnRhaW5zIGFjY2Vzc29ycyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0byByZXByZXNlbnQKLSAqIDx1bD4KLSAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KLSAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+Ci0gKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KLSAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+Ci0gKiA8L3VsPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZUZhY3RvcnkKLSAqIEBtb2RlbCBraW5kPSJwYWNrYWdlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNlcnZlclR5cGVQYWNrYWdlIGV4dGVuZHMgRVBhY2thZ2UgewotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOQU1FID0gImRlZmluaXRpb24iOwotCi0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIFVSSS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZU5TX1VSSSA9ICJodHRwOi8vZWNsaXBzZS5vcmcvanN0L3NlcnZlci9nZW5lcmljL1NlcnZlclR5cGVEZWZpbml0aW9uIjsKLQotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTlNfUFJFRklYID0gImRlZmluaXRpb24iOwotCi0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgcGFja2FnZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTZXJ2ZXJUeXBlUGFja2FnZSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuU2VydmVyVHlwZVBhY2thZ2VJbXBsLmluaXQoKTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLkFyY2hpdmVUeXBlSW1wbCA8ZW0+QXJjaGl2ZSBUeXBlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLkFyY2hpdmVUeXBlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLlNlcnZlclR5cGVQYWNrYWdlSW1wbCNnZXRBcmNoaXZlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBBUkNISVZFX1RZUEUgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBhdGg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUkNISVZFX1RZUEVfX1BBVEggPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5BcmNoaXZlIFR5cGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJDSElWRV9UWVBFX0ZFQVRVUkVfQ09VTlQgPSAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuQXJndW1lbnRQYWlySW1wbCA8ZW0+QXJndW1lbnQgUGFpcjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5Bcmd1bWVudFBhaXJJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuU2VydmVyVHlwZVBhY2thZ2VJbXBsI2dldEFyZ3VtZW50UGFpcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBBUkdVTUVOVF9QQUlSID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJHVU1FTlRfUEFJUl9fTkFNRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUkdVTUVOVF9QQUlSX19WQUxVRSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkFyZ3VtZW50IFBhaXI8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJHVU1FTlRfUEFJUl9GRUFUVVJFX0NPVU5UID0gMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLkNsYXNzcGF0aEltcGwgPGVtPkNsYXNzcGF0aDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5DbGFzc3BhdGhJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuU2VydmVyVHlwZVBhY2thZ2VJbXBsI2dldENsYXNzcGF0aCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBDTEFTU1BBVEggPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDTEFTU1BBVEhfX0dST1VQID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BcmNoaXZlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDTEFTU1BBVEhfX0FSQ0hJVkUgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0xBU1NQQVRIX19JRCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkNsYXNzcGF0aDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDTEFTU1BBVEhfRkVBVFVSRV9DT1VOVCA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5FeHRlcm5hbEltcGwgPGVtPkV4dGVybmFsPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLkV4dGVybmFsSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLlNlcnZlclR5cGVQYWNrYWdlSW1wbCNnZXRFeHRlcm5hbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBFWFRFUk5BTCA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWFRFUk5BTF9fVkFMVUUgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9zPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhURVJOQUxfX09TID0gMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+RXh0ZXJuYWw8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhURVJOQUxfRkVBVFVSRV9DT1VOVCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5KbmRpQ29ubmVjdGlvbkltcGwgPGVtPkpuZGkgQ29ubmVjdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5KbmRpQ29ubmVjdGlvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5TZXJ2ZXJUeXBlUGFja2FnZUltcGwjZ2V0Sm5kaUNvbm5lY3Rpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgSk5ESV9DT05ORUNUSU9OID0gNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm92aWRlciBVcmw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKTkRJX0NPTk5FQ1RJT05fX1BST1ZJREVSX1VSTCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpORElfQ09OTkVDVElPTl9fR1JPVVAgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkpuZGkgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpORElfQ09OTkVDVElPTl9fSk5ESV9QUk9QRVJUWSA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5pdGlhbCBDb250ZXh0IEZhY3Rvcnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKTkRJX0NPTk5FQ1RJT05fX0lOSVRJQUxfQ09OVEVYVF9GQUNUT1JZID0gMzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+Sm5kaSBDb25uZWN0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpORElfQ09OTkVDVElPTl9GRUFUVVJFX0NPVU5UID0gNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLkxhdW5jaENvbmZpZ3VyYXRpb25JbXBsIDxlbT5MYXVuY2ggQ29uZmlndXJhdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5MYXVuY2hDb25maWd1cmF0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLlNlcnZlclR5cGVQYWNrYWdlSW1wbCNnZXRMYXVuY2hDb25maWd1cmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IExBVU5DSF9DT05GSUdVUkFUSU9OID0gNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTEFVTkNIX0NPTkZJR1VSQVRJT05fX0dST1VQID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbnZpcm9ubWVudCBWYXJpYWJsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTEFVTkNIX0NPTkZJR1VSQVRJT05fX0VOVklST05NRU5UX1ZBUklBQkxFID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExBVU5DSF9DT05GSUdVUkFUSU9OX19HUk9VUDEgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb2dyYW0gQXJndW1lbnRzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBMQVVOQ0hfQ09ORklHVVJBVElPTl9fUFJPR1JBTV9BUkdVTUVOVFMgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldvcmtpbmcgRGlyZWN0b3J5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTEFVTkNIX0NPTkZJR1VSQVRJT05fX1dPUktJTkdfRElSRUNUT1JZID0gNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYWluIENsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTEFVTkNIX0NPTkZJR1VSQVRJT05fX01BSU5fQ0xBU1MgPSA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTEFVTkNIX0NPTkZJR1VSQVRJT05fX0dST1VQMiA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Vm0gUGFyYW1ldGVyczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTEFVTkNIX0NPTkZJR1VSQVRJT05fX1ZNX1BBUkFNRVRFUlMgPSA3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNsYXNzcGF0aCBSZWZlcmVuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBMQVVOQ0hfQ09ORklHVVJBVElPTl9fQ0xBU1NQQVRIX1JFRkVSRU5DRSA9IDg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVidWcgUG9ydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExBVU5DSF9DT05GSUdVUkFUSU9OX19ERUJVR19QT1JUID0gOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExBVU5DSF9DT05GSUdVUkFUSU9OX19HUk9VUDMgPSAxMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHRlcm5hbDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTEFVTkNIX0NPTkZJR1VSQVRJT05fX0VYVEVSTkFMID0gMTE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkxhdW5jaCBDb25maWd1cmF0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExBVU5DSF9DT05GSUdVUkFUSU9OX0ZFQVRVUkVfQ09VTlQgPSAxMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLk1vZHVsZUltcGwgPGVtPk1vZHVsZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5Nb2R1bGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuU2VydmVyVHlwZVBhY2thZ2VJbXBsI2dldE1vZHVsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBNT0RVTEUgPSA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNT0RVTEVfX1RZUEUgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlB1Ymxpc2ggRGlyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTU9EVUxFX19QVUJMSVNIX0RJUiA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHVibGlzaGVyIFJlZmVyZW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1PRFVMRV9fUFVCTElTSEVSX1JFRkVSRU5DRSA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPk1vZHVsZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNT0RVTEVfRkVBVFVSRV9DT1VOVCA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5Qb3J0SW1wbCA8ZW0+UG9ydDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5Qb3J0SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLlNlcnZlclR5cGVQYWNrYWdlSW1wbCNnZXRQb3J0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBPUlQgPSA3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUE9SVF9fTk8gPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQT1JUX19OQU1FID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm90b2NvbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBPUlRfX1BST1RPQ09MID0gMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+UG9ydDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQT1JUX0ZFQVRVUkVfQ09VTlQgPSAzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuUHJvamVjdEltcGwgPGVtPlByb2plY3Q8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuUHJvamVjdEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5TZXJ2ZXJUeXBlUGFja2FnZUltcGwjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQUk9KRUNUID0gODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DbGFzc3BhdGggUmVmZXJlbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fQ0xBU1NQQVRIX1JFRkVSRU5DRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlByb2plY3Q8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9GRUFUVVJFX0NPVU5UID0gMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLlByb3BlcnR5SW1wbCA8ZW0+UHJvcGVydHk8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuUHJvcGVydHlJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuU2VydmVyVHlwZVBhY2thZ2VJbXBsI2dldFByb3BlcnR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBST1BFUlRZID0gOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db250ZXh0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPUEVSVFlfX0NPTlRFWFQgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9QRVJUWV9fREVGQVVMVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9QRVJUWV9fSUQgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxhYmVsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPUEVSVFlfX0xBQkVMID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPUEVSVFlfX1RZUEUgPSA0OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5Qcm9wZXJ0eTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9QRVJUWV9GRUFUVVJFX0NPVU5UID0gNTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLlB1Ymxpc2hlckltcGwgPGVtPlB1Ymxpc2hlcjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5QdWJsaXNoZXJJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuU2VydmVyVHlwZVBhY2thZ2VJbXBsI2dldFB1Ymxpc2hlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQVUJMSVNIRVIgPSAxMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFVCTElTSEVSX19HUk9VUCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHVibGlzaGVyZGF0YTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFVCTElTSEVSX19QVUJMSVNIRVJEQVRBID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBVQkxJU0hFUl9fSUQgPSAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5QdWJsaXNoZXI8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFVCTElTSEVSX0ZFQVRVUkVfQ09VTlQgPSAzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuUHVibGlzaGVyRGF0YUltcGwgPGVtPlB1Ymxpc2hlciBEYXRhPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLlB1Ymxpc2hlckRhdGFJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuU2VydmVyVHlwZVBhY2thZ2VJbXBsI2dldFB1Ymxpc2hlckRhdGEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFVCTElTSEVSX0RBVEEgPSAxMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EYXRhbmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBVQkxJU0hFUl9EQVRBX19EQVRBTkFNRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGF0YXZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFVCTElTSEVSX0RBVEFfX0RBVEFWQUxVRSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlB1Ymxpc2hlciBEYXRhPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBVQkxJU0hFUl9EQVRBX0ZFQVRVUkVfQ09VTlQgPSAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuU2VydmVyUnVudGltZUltcGwgPGVtPlNlcnZlciBSdW50aW1lPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLlNlcnZlclJ1bnRpbWVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuU2VydmVyVHlwZVBhY2thZ2VJbXBsI2dldFNlcnZlclJ1bnRpbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgU0VSVkVSX1JVTlRJTUUgPSAxMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VSVkVSX1JVTlRJTUVfX0dST1VQID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VSVkVSX1JVTlRJTUVfX1BST1BFUlRZID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFUlZFUl9SVU5USU1FX19HUk9VUDEgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvcnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFUlZFUl9SVU5USU1FX19QT1JUID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFUlZFUl9SVU5USU1FX19HUk9VUDIgPSA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1vZHVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VSVkVSX1JVTlRJTUVfX01PRFVMRSA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvamVjdDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFUlZFUl9SVU5USU1FX19QUk9KRUNUID0gNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdGFydDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFUlZFUl9SVU5USU1FX19TVEFSVCA9IDc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3RvcDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFUlZFUl9SVU5USU1FX19TVE9QID0gODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFUlZFUl9SVU5USU1FX19HUk9VUDMgPSA5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlB1Ymxpc2hlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VSVkVSX1JVTlRJTUVfX1BVQkxJU0hFUiA9IDEwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwNDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VSVkVSX1JVTlRJTUVfX0dST1VQNCA9IDExOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNsYXNzcGF0aDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VSVkVSX1JVTlRJTUVfX0NMQVNTUEFUSCA9IDEyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkpuZGkgQ29ubmVjdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFUlZFUl9SVU5USU1FX19KTkRJX0NPTk5FQ1RJT04gPSAxMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VSVkVSX1JVTlRJTUVfX05BTUUgPSAxNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VSVkVSX1JVTlRJTUVfX1ZFUlNJT04gPSAxNTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+U2VydmVyIFJ1bnRpbWU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VSVkVSX1JVTlRJTUVfRkVBVFVSRV9DT1VOVCA9IDE2OwotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkFyY2hpdmVUeXBlIDxlbT5BcmNoaXZlIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QXJjaGl2ZSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5BcmNoaXZlVHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0QXJjaGl2ZVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5BcmNoaXZlVHlwZSNnZXRQYXRoIDxlbT5QYXRoPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UGF0aDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uQXJjaGl2ZVR5cGUjZ2V0UGF0aCgpCi0JICogQHNlZSAjZ2V0QXJjaGl2ZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFyY2hpdmVUeXBlX1BhdGgoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uQXJndW1lbnRQYWlyIDxlbT5Bcmd1bWVudCBQYWlyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkFyZ3VtZW50IFBhaXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkFyZ3VtZW50UGFpcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0QXJndW1lbnRQYWlyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uQXJndW1lbnRQYWlyI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Bcmd1bWVudFBhaXIjZ2V0TmFtZSgpCi0JICogQHNlZSAjZ2V0QXJndW1lbnRQYWlyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBcmd1bWVudFBhaXJfTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkFyZ3VtZW50UGFpciNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WYWx1ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uQXJndW1lbnRQYWlyI2dldFZhbHVlKCkKLQkgKiBAc2VlICNnZXRBcmd1bWVudFBhaXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFyZ3VtZW50UGFpcl9WYWx1ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5DbGFzc3BhdGggPGVtPkNsYXNzcGF0aDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5DbGFzc3BhdGg8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkNsYXNzcGF0aAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0Q2xhc3NwYXRoKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5DbGFzc3BhdGgjZ2V0R3JvdXAgPGVtPkdyb3VwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Hcm91cDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uQ2xhc3NwYXRoI2dldEdyb3VwKCkKLQkgKiBAc2VlICNnZXRDbGFzc3BhdGgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldENsYXNzcGF0aF9Hcm91cCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uQ2xhc3NwYXRoI2dldEFyY2hpdmUgPGVtPkFyY2hpdmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkFyY2hpdmU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkNsYXNzcGF0aCNnZXRBcmNoaXZlKCkKLQkgKiBAc2VlICNnZXRDbGFzc3BhdGgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldENsYXNzcGF0aF9BcmNoaXZlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uQ2xhc3NwYXRoI2dldElkIDxlbT5JZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5DbGFzc3BhdGgjZ2V0SWQoKQotCSAqIEBzZWUgI2dldENsYXNzcGF0aCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Q2xhc3NwYXRoX0lkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkV4dGVybmFsIDxlbT5FeHRlcm5hbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5FeHRlcm5hbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uRXh0ZXJuYWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEV4dGVybmFsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uRXh0ZXJuYWwjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmFsdWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkV4dGVybmFsI2dldFZhbHVlKCkKLQkgKiBAc2VlICNnZXRFeHRlcm5hbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RXh0ZXJuYWxfVmFsdWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5FeHRlcm5hbCNnZXRPcyA8ZW0+T3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5PczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uRXh0ZXJuYWwjZ2V0T3MoKQotCSAqIEBzZWUgI2dldEV4dGVybmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFeHRlcm5hbF9PcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5KbmRpQ29ubmVjdGlvbiA8ZW0+Sm5kaSBDb25uZWN0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkpuZGkgQ29ubmVjdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uSm5kaUNvbm5lY3Rpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEpuZGlDb25uZWN0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uSm5kaUNvbm5lY3Rpb24jZ2V0UHJvdmlkZXJVcmwgPGVtPlByb3ZpZGVyIFVybDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlByb3ZpZGVyIFVybDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uSm5kaUNvbm5lY3Rpb24jZ2V0UHJvdmlkZXJVcmwoKQotCSAqIEBzZWUgI2dldEpuZGlDb25uZWN0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRKbmRpQ29ubmVjdGlvbl9Qcm92aWRlclVybCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uSm5kaUNvbm5lY3Rpb24jZ2V0R3JvdXAgPGVtPkdyb3VwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Hcm91cDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uSm5kaUNvbm5lY3Rpb24jZ2V0R3JvdXAoKQotCSAqIEBzZWUgI2dldEpuZGlDb25uZWN0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRKbmRpQ29ubmVjdGlvbl9Hcm91cCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uSm5kaUNvbm5lY3Rpb24jZ2V0Sm5kaVByb3BlcnR5IDxlbT5KbmRpIFByb3BlcnR5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5KbmRpIFByb3BlcnR5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5KbmRpQ29ubmVjdGlvbiNnZXRKbmRpUHJvcGVydHkoKQotCSAqIEBzZWUgI2dldEpuZGlDb25uZWN0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRKbmRpQ29ubmVjdGlvbl9KbmRpUHJvcGVydHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5KbmRpQ29ubmVjdGlvbiNnZXRJbml0aWFsQ29udGV4dEZhY3RvcnkgPGVtPkluaXRpYWwgQ29udGV4dCBGYWN0b3J5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SW5pdGlhbCBDb250ZXh0IEZhY3Rvcnk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkpuZGlDb25uZWN0aW9uI2dldEluaXRpYWxDb250ZXh0RmFjdG9yeSgpCi0JICogQHNlZSAjZ2V0Sm5kaUNvbm5lY3Rpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEpuZGlDb25uZWN0aW9uX0luaXRpYWxDb250ZXh0RmFjdG9yeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5MYXVuY2hDb25maWd1cmF0aW9uIDxlbT5MYXVuY2ggQ29uZmlndXJhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5MYXVuY2ggQ29uZmlndXJhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uTGF1bmNoQ29uZmlndXJhdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0TGF1bmNoQ29uZmlndXJhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uTGF1bmNoQ29uZmlndXJhdGlvbiNnZXRHcm91cCA8ZW0+R3JvdXA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkdyb3VwPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5MYXVuY2hDb25maWd1cmF0aW9uI2dldEdyb3VwKCkKLQkgKiBAc2VlICNnZXRMYXVuY2hDb25maWd1cmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRMYXVuY2hDb25maWd1cmF0aW9uX0dyb3VwKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5MYXVuY2hDb25maWd1cmF0aW9uI2dldEVudmlyb25tZW50VmFyaWFibGUgPGVtPkVudmlyb25tZW50IFZhcmlhYmxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5FbnZpcm9ubWVudCBWYXJpYWJsZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uTGF1bmNoQ29uZmlndXJhdGlvbiNnZXRFbnZpcm9ubWVudFZhcmlhYmxlKCkKLQkgKiBAc2VlICNnZXRMYXVuY2hDb25maWd1cmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRMYXVuY2hDb25maWd1cmF0aW9uX0Vudmlyb25tZW50VmFyaWFibGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkxhdW5jaENvbmZpZ3VyYXRpb24jZ2V0R3JvdXAxIDxlbT5Hcm91cDE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkdyb3VwMTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uTGF1bmNoQ29uZmlndXJhdGlvbiNnZXRHcm91cDEoKQotCSAqIEBzZWUgI2dldExhdW5jaENvbmZpZ3VyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldExhdW5jaENvbmZpZ3VyYXRpb25fR3JvdXAxKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5MYXVuY2hDb25maWd1cmF0aW9uI2dldFByb2dyYW1Bcmd1bWVudHMgPGVtPlByb2dyYW0gQXJndW1lbnRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Qcm9ncmFtIEFyZ3VtZW50czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uTGF1bmNoQ29uZmlndXJhdGlvbiNnZXRQcm9ncmFtQXJndW1lbnRzKCkKLQkgKiBAc2VlICNnZXRMYXVuY2hDb25maWd1cmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRMYXVuY2hDb25maWd1cmF0aW9uX1Byb2dyYW1Bcmd1bWVudHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5MYXVuY2hDb25maWd1cmF0aW9uI2dldFdvcmtpbmdEaXJlY3RvcnkgPGVtPldvcmtpbmcgRGlyZWN0b3J5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+V29ya2luZyBEaXJlY3Rvcnk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkxhdW5jaENvbmZpZ3VyYXRpb24jZ2V0V29ya2luZ0RpcmVjdG9yeSgpCi0JICogQHNlZSAjZ2V0TGF1bmNoQ29uZmlndXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TGF1bmNoQ29uZmlndXJhdGlvbl9Xb3JraW5nRGlyZWN0b3J5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uTGF1bmNoQ29uZmlndXJhdGlvbiNnZXRNYWluQ2xhc3MgPGVtPk1haW4gQ2xhc3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5NYWluIENsYXNzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5MYXVuY2hDb25maWd1cmF0aW9uI2dldE1haW5DbGFzcygpCi0JICogQHNlZSAjZ2V0TGF1bmNoQ29uZmlndXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TGF1bmNoQ29uZmlndXJhdGlvbl9NYWluQ2xhc3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkxhdW5jaENvbmZpZ3VyYXRpb24jZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkdyb3VwMjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uTGF1bmNoQ29uZmlndXJhdGlvbiNnZXRHcm91cDIoKQotCSAqIEBzZWUgI2dldExhdW5jaENvbmZpZ3VyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldExhdW5jaENvbmZpZ3VyYXRpb25fR3JvdXAyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5MYXVuY2hDb25maWd1cmF0aW9uI2dldFZtUGFyYW1ldGVycyA8ZW0+Vm0gUGFyYW1ldGVyczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+Vm0gUGFyYW1ldGVyczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uTGF1bmNoQ29uZmlndXJhdGlvbiNnZXRWbVBhcmFtZXRlcnMoKQotCSAqIEBzZWUgI2dldExhdW5jaENvbmZpZ3VyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldExhdW5jaENvbmZpZ3VyYXRpb25fVm1QYXJhbWV0ZXJzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uTGF1bmNoQ29uZmlndXJhdGlvbiNnZXRDbGFzc3BhdGhSZWZlcmVuY2UgPGVtPkNsYXNzcGF0aCBSZWZlcmVuY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5DbGFzc3BhdGggUmVmZXJlbmNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5MYXVuY2hDb25maWd1cmF0aW9uI2dldENsYXNzcGF0aFJlZmVyZW5jZSgpCi0JICogQHNlZSAjZ2V0TGF1bmNoQ29uZmlndXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TGF1bmNoQ29uZmlndXJhdGlvbl9DbGFzc3BhdGhSZWZlcmVuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5MYXVuY2hDb25maWd1cmF0aW9uI2dldERlYnVnUG9ydCA8ZW0+RGVidWcgUG9ydDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRlYnVnIFBvcnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkxhdW5jaENvbmZpZ3VyYXRpb24jZ2V0RGVidWdQb3J0KCkKLQkgKiBAc2VlICNnZXRMYXVuY2hDb25maWd1cmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRMYXVuY2hDb25maWd1cmF0aW9uX0RlYnVnUG9ydCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uTGF1bmNoQ29uZmlndXJhdGlvbiNnZXRHcm91cDMgPGVtPkdyb3VwMzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+R3JvdXAzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5MYXVuY2hDb25maWd1cmF0aW9uI2dldEdyb3VwMygpCi0JICogQHNlZSAjZ2V0TGF1bmNoQ29uZmlndXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TGF1bmNoQ29uZmlndXJhdGlvbl9Hcm91cDMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkxhdW5jaENvbmZpZ3VyYXRpb24jZ2V0RXh0ZXJuYWwgPGVtPkV4dGVybmFsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5FeHRlcm5hbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uTGF1bmNoQ29uZmlndXJhdGlvbiNnZXRFeHRlcm5hbCgpCi0JICogQHNlZSAjZ2V0TGF1bmNoQ29uZmlndXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TGF1bmNoQ29uZmlndXJhdGlvbl9FeHRlcm5hbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Nb2R1bGUgPGVtPk1vZHVsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Nb2R1bGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLk1vZHVsZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0TW9kdWxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uTW9kdWxlI2dldFR5cGUgPGVtPlR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Nb2R1bGUjZ2V0VHlwZSgpCi0JICogQHNlZSAjZ2V0TW9kdWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNb2R1bGVfVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLk1vZHVsZSNnZXRQdWJsaXNoRGlyIDxlbT5QdWJsaXNoIERpcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlB1Ymxpc2ggRGlyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Nb2R1bGUjZ2V0UHVibGlzaERpcigpCi0JICogQHNlZSAjZ2V0TW9kdWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNb2R1bGVfUHVibGlzaERpcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLk1vZHVsZSNnZXRQdWJsaXNoZXJSZWZlcmVuY2UgPGVtPlB1Ymxpc2hlciBSZWZlcmVuY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QdWJsaXNoZXIgUmVmZXJlbmNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Nb2R1bGUjZ2V0UHVibGlzaGVyUmVmZXJlbmNlKCkKLQkgKiBAc2VlICNnZXRNb2R1bGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1vZHVsZV9QdWJsaXNoZXJSZWZlcmVuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUG9ydCA8ZW0+UG9ydDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Qb3J0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Qb3J0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQb3J0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUG9ydCNnZXRObyA8ZW0+Tm88L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5ObzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUG9ydCNnZXRObygpCi0JICogQHNlZSAjZ2V0UG9ydCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UG9ydF9ObygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlBvcnQjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlBvcnQjZ2V0TmFtZSgpCi0JICogQHNlZSAjZ2V0UG9ydCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UG9ydF9OYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUG9ydCNnZXRQcm90b2NvbCA8ZW0+UHJvdG9jb2w8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Qcm90b2NvbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUG9ydCNnZXRQcm90b2NvbCgpCi0JICogQHNlZSAjZ2V0UG9ydCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UG9ydF9Qcm90b2NvbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Qcm9qZWN0IDxlbT5Qcm9qZWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlByb2plY3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlByb2plY3QKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFByb2plY3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Qcm9qZWN0I2dldENsYXNzcGF0aFJlZmVyZW5jZSA8ZW0+Q2xhc3NwYXRoIFJlZmVyZW5jZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNsYXNzcGF0aCBSZWZlcmVuY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlByb2plY3QjZ2V0Q2xhc3NwYXRoUmVmZXJlbmNlKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0NsYXNzcGF0aFJlZmVyZW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Qcm9wZXJ0eSA8ZW0+UHJvcGVydHk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UHJvcGVydHk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlByb3BlcnR5Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQcm9wZXJ0eSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlByb3BlcnR5I2dldENvbnRleHQgPGVtPkNvbnRleHQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Db250ZXh0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Qcm9wZXJ0eSNnZXRDb250ZXh0KCkKLQkgKiBAc2VlICNnZXRQcm9wZXJ0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvcGVydHlfQ29udGV4dCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlByb3BlcnR5I2dldERlZmF1bHQgPGVtPkRlZmF1bHQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EZWZhdWx0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Qcm9wZXJ0eSNnZXREZWZhdWx0KCkKLQkgKiBAc2VlICNnZXRQcm9wZXJ0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvcGVydHlfRGVmYXVsdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlByb3BlcnR5I2dldElkIDxlbT5JZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Qcm9wZXJ0eSNnZXRJZCgpCi0JICogQHNlZSAjZ2V0UHJvcGVydHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb3BlcnR5X0lkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUHJvcGVydHkjZ2V0TGFiZWwgPGVtPkxhYmVsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TGFiZWw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlByb3BlcnR5I2dldExhYmVsKCkKLQkgKiBAc2VlICNnZXRQcm9wZXJ0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvcGVydHlfTGFiZWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Qcm9wZXJ0eSNnZXRUeXBlIDxlbT5UeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUHJvcGVydHkjZ2V0VHlwZSgpCi0JICogQHNlZSAjZ2V0UHJvcGVydHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb3BlcnR5X1R5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUHVibGlzaGVyIDxlbT5QdWJsaXNoZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UHVibGlzaGVyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5QdWJsaXNoZXIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFB1Ymxpc2hlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUHVibGlzaGVyI2dldEdyb3VwIDxlbT5Hcm91cDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+R3JvdXA8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlB1Ymxpc2hlciNnZXRHcm91cCgpCi0JICogQHNlZSAjZ2V0UHVibGlzaGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQdWJsaXNoZXJfR3JvdXAoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlB1Ymxpc2hlciNnZXRQdWJsaXNoZXJkYXRhIDxlbT5QdWJsaXNoZXJkYXRhPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5QdWJsaXNoZXJkYXRhPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5QdWJsaXNoZXIjZ2V0UHVibGlzaGVyZGF0YSgpCi0JICogQHNlZSAjZ2V0UHVibGlzaGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRQdWJsaXNoZXJfUHVibGlzaGVyZGF0YSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlB1Ymxpc2hlciNnZXRJZCA8ZW0+SWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUHVibGlzaGVyI2dldElkKCkKLQkgKiBAc2VlICNnZXRQdWJsaXNoZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFB1Ymxpc2hlcl9JZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5QdWJsaXNoZXJEYXRhIDxlbT5QdWJsaXNoZXIgRGF0YTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5QdWJsaXNoZXIgRGF0YTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUHVibGlzaGVyRGF0YQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UHVibGlzaGVyRGF0YSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlB1Ymxpc2hlckRhdGEjZ2V0RGF0YW5hbWUgPGVtPkRhdGFuYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGF0YW5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlB1Ymxpc2hlckRhdGEjZ2V0RGF0YW5hbWUoKQotCSAqIEBzZWUgI2dldFB1Ymxpc2hlckRhdGEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFB1Ymxpc2hlckRhdGFfRGF0YW5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5QdWJsaXNoZXJEYXRhI2dldERhdGF2YWx1ZSA8ZW0+RGF0YXZhbHVlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGF0YXZhbHVlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5QdWJsaXNoZXJEYXRhI2dldERhdGF2YWx1ZSgpCi0JICogQHNlZSAjZ2V0UHVibGlzaGVyRGF0YSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHVibGlzaGVyRGF0YV9EYXRhdmFsdWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyUnVudGltZSA8ZW0+U2VydmVyIFJ1bnRpbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+U2VydmVyIFJ1bnRpbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclJ1bnRpbWUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFNlcnZlclJ1bnRpbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclJ1bnRpbWUjZ2V0R3JvdXAgPGVtPkdyb3VwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Hcm91cDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyUnVudGltZSNnZXRHcm91cCgpCi0JICogQHNlZSAjZ2V0U2VydmVyUnVudGltZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0U2VydmVyUnVudGltZV9Hcm91cCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyUnVudGltZSNnZXRQcm9wZXJ0eSA8ZW0+UHJvcGVydHk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlByb3BlcnR5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJSdW50aW1lI2dldFByb3BlcnR5KCkKLQkgKiBAc2VlICNnZXRTZXJ2ZXJSdW50aW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRTZXJ2ZXJSdW50aW1lX1Byb3BlcnR5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJSdW50aW1lI2dldEdyb3VwMSA8ZW0+R3JvdXAxPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Hcm91cDE8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclJ1bnRpbWUjZ2V0R3JvdXAxKCkKLQkgKiBAc2VlICNnZXRTZXJ2ZXJSdW50aW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRTZXJ2ZXJSdW50aW1lX0dyb3VwMSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyUnVudGltZSNnZXRQb3J0IDxlbT5Qb3J0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Qb3J0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJSdW50aW1lI2dldFBvcnQoKQotCSAqIEBzZWUgI2dldFNlcnZlclJ1bnRpbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFNlcnZlclJ1bnRpbWVfUG9ydCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyUnVudGltZSNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+R3JvdXAyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJSdW50aW1lI2dldEdyb3VwMigpCi0JICogQHNlZSAjZ2V0U2VydmVyUnVudGltZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0U2VydmVyUnVudGltZV9Hcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclJ1bnRpbWUjZ2V0TW9kdWxlIDxlbT5Nb2R1bGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPk1vZHVsZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyUnVudGltZSNnZXRNb2R1bGUoKQotCSAqIEBzZWUgI2dldFNlcnZlclJ1bnRpbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFNlcnZlclJ1bnRpbWVfTW9kdWxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyUnVudGltZSNnZXRQcm9qZWN0IDxlbT5Qcm9qZWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+UHJvamVjdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyUnVudGltZSNnZXRQcm9qZWN0KCkKLQkgKiBAc2VlICNnZXRTZXJ2ZXJSdW50aW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRTZXJ2ZXJSdW50aW1lX1Byb2plY3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJSdW50aW1lI2dldFN0YXJ0IDxlbT5TdGFydDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlN0YXJ0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJSdW50aW1lI2dldFN0YXJ0KCkKLQkgKiBAc2VlICNnZXRTZXJ2ZXJSdW50aW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRTZXJ2ZXJSdW50aW1lX1N0YXJ0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyUnVudGltZSNnZXRTdG9wIDxlbT5TdG9wPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+U3RvcDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyUnVudGltZSNnZXRTdG9wKCkKLQkgKiBAc2VlICNnZXRTZXJ2ZXJSdW50aW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRTZXJ2ZXJSdW50aW1lX1N0b3AoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclJ1bnRpbWUjZ2V0R3JvdXAzIDxlbT5Hcm91cDM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkdyb3VwMzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyUnVudGltZSNnZXRHcm91cDMoKQotCSAqIEBzZWUgI2dldFNlcnZlclJ1bnRpbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFNlcnZlclJ1bnRpbWVfR3JvdXAzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJSdW50aW1lI2dldFB1Ymxpc2hlciA8ZW0+UHVibGlzaGVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5QdWJsaXNoZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclJ1bnRpbWUjZ2V0UHVibGlzaGVyKCkKLQkgKiBAc2VlICNnZXRTZXJ2ZXJSdW50aW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRTZXJ2ZXJSdW50aW1lX1B1Ymxpc2hlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyUnVudGltZSNnZXRHcm91cDQgPGVtPkdyb3VwNDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+R3JvdXA0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJSdW50aW1lI2dldEdyb3VwNCgpCi0JICogQHNlZSAjZ2V0U2VydmVyUnVudGltZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0U2VydmVyUnVudGltZV9Hcm91cDQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclJ1bnRpbWUjZ2V0Q2xhc3NwYXRoIDxlbT5DbGFzc3BhdGg8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkNsYXNzcGF0aDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyUnVudGltZSNnZXRDbGFzc3BhdGgoKQotCSAqIEBzZWUgI2dldFNlcnZlclJ1bnRpbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFNlcnZlclJ1bnRpbWVfQ2xhc3NwYXRoKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyUnVudGltZSNnZXRKbmRpQ29ubmVjdGlvbiA8ZW0+Sm5kaSBDb25uZWN0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+Sm5kaSBDb25uZWN0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJSdW50aW1lI2dldEpuZGlDb25uZWN0aW9uKCkKLQkgKiBAc2VlICNnZXRTZXJ2ZXJSdW50aW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRTZXJ2ZXJSdW50aW1lX0puZGlDb25uZWN0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyUnVudGltZSNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyUnVudGltZSNnZXROYW1lKCkKLQkgKiBAc2VlICNnZXRTZXJ2ZXJSdW50aW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRTZXJ2ZXJSdW50aW1lX05hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJSdW50aW1lI2dldFZlcnNpb24gPGVtPlZlcnNpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WZXJzaW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJSdW50aW1lI2dldFZlcnNpb24oKQotCSAqIEBzZWUgI2dldFNlcnZlclJ1bnRpbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFNlcnZlclJ1bnRpbWVfVmVyc2lvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU2VydmVyVHlwZUZhY3RvcnkgZ2V0U2VydmVyVHlwZUZhY3RvcnkoKTsKLQotfSAvL1NlcnZlclR5cGVQYWNrYWdlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvaW50ZXJuYWwvc2VydmVydHlwZS9kZWZpbml0aW9uL2ltcGwvQXJjaGl2ZVR5cGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvaW50ZXJuYWwvc2VydmVydHlwZS9kZWZpbml0aW9uL2ltcGwvQXJjaGl2ZVR5cGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmMjhlNDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9pbXBsL0FyY2hpdmVUeXBlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkxICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgRXRlcmF0aW9uIEJpbGlzaW0gQS5TLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4goCBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEVURVJBVElPTiBBLlMuIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgRXRlcmF0aW9uIEJpbGlzaW0gQS5TLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIGV0ZXJhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuZXRlcmF0aW9uLmNvbS8+LgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBBcmNoaXZlVHlwZUltcGwuamF2YSx2IDEuNCAyMDA1LzA4LzMwIDIxOjQ1OjE5IGdlcmNhbiBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJUeXBlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkFyY2hpdmVUeXBlOwotCi0KLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QXJjaGl2ZSBUeXBlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuQXJjaGl2ZVR5cGVJbXBsI2dldFBhdGggPGVtPlBhdGg8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBcmNoaXZlVHlwZUltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEFyY2hpdmVUeXBlIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGF0aCgpIDxlbT5QYXRoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQYXRoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQQVRIX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhdGgoKSA8ZW0+UGF0aDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGF0aCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwYXRoID0gUEFUSF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBcmNoaXZlVHlwZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBTZXJ2ZXJUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXJjaGl2ZVR5cGUoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhdGgoKSB7Ci0JCXJldHVybiBwYXRoOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhdGgoU3RyaW5nIG5ld1BhdGgpIHsKLQkJU3RyaW5nIG9sZFBhdGggPSBwYXRoOwotCQlwYXRoID0gbmV3UGF0aDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgU2VydmVyVHlwZVBhY2thZ2UuQVJDSElWRV9UWVBFX19QQVRILCBvbGRQYXRoLCBwYXRoKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5BUkNISVZFX1RZUEVfX1BBVEg6Ci0JCQkJcmV0dXJuIGdldFBhdGgoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkFSQ0hJVkVfVFlQRV9fUEFUSDoKLQkJCQlzZXRQYXRoKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkFSQ0hJVkVfVFlQRV9fUEFUSDoKLQkJCQlzZXRQYXRoKFBBVEhfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5BUkNISVZFX1RZUEVfX1BBVEg6Ci0JCQkJcmV0dXJuIFBBVEhfRURFRkFVTFQgPT0gbnVsbCA/IHBhdGggIT0gbnVsbCA6ICFQQVRIX0VERUZBVUxULmVxdWFscyhwYXRoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHBhdGg6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHBhdGgpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9BcmNoaXZlVHlwZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9pbnRlcm5hbC9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vaW1wbC9Bcmd1bWVudFBhaXJJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvaW50ZXJuYWwvc2VydmVydHlwZS9kZWZpbml0aW9uL2ltcGwvQXJndW1lbnRQYWlySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWU0NTBiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9pbnRlcm5hbC9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vaW1wbC9Bcmd1bWVudFBhaXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTcgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBBcmd1bWVudFBhaXJJbXBsLmphdmEsdiAxLjEgMjAwNS8wOC8zMCAyMTo0NToxOSBnZXJjYW4gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Bcmd1bWVudFBhaXI7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFyZ3VtZW50IFBhaXI8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5Bcmd1bWVudFBhaXJJbXBsI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5Bcmd1bWVudFBhaXJJbXBsI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFyZ3VtZW50UGFpckltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEFyZ3VtZW50UGFpciB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZSgpIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdmFsdWUgPSBWQUxVRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBcmd1bWVudFBhaXJJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gU2VydmVyVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEFyZ3VtZW50UGFpcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQlTdHJpbmcgb2xkTmFtZSA9IG5hbWU7Ci0JCW5hbWUgPSBuZXdOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTZXJ2ZXJUeXBlUGFja2FnZS5BUkdVTUVOVF9QQUlSX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuZXdWYWx1ZSkgewotCQlTdHJpbmcgb2xkVmFsdWUgPSB2YWx1ZTsKLQkJdmFsdWUgPSBuZXdWYWx1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgU2VydmVyVHlwZVBhY2thZ2UuQVJHVU1FTlRfUEFJUl9fVkFMVUUsIG9sZFZhbHVlLCB2YWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuQVJHVU1FTlRfUEFJUl9fTkFNRToKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5BUkdVTUVOVF9QQUlSX19WQUxVRToKLQkJCQlyZXR1cm4gZ2V0VmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkFSR1VNRU5UX1BBSVJfX05BTUU6Ci0JCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkFSR1VNRU5UX1BBSVJfX1ZBTFVFOgotCQkJCXNldFZhbHVlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkFSR1VNRU5UX1BBSVJfX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkFSR1VNRU5UX1BBSVJfX1ZBTFVFOgotCQkJCXNldFZhbHVlKFZBTFVFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuQVJHVU1FTlRfUEFJUl9fTkFNRToKLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5BUkdVTUVOVF9QQUlSX19WQUxVRToKLQkJCQlyZXR1cm4gVkFMVUVfRURFRkFVTFQgPT0gbnVsbCA/IHZhbHVlICE9IG51bGwgOiAhVkFMVUVfRURFRkFVTFQuZXF1YWxzKHZhbHVlKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHZhbHVlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh2YWx1ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0FyZ3VtZW50UGFpckltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9pbnRlcm5hbC9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vaW1wbC9DbGFzc3BhdGhJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvaW50ZXJuYWwvc2VydmVydHlwZS9kZWZpbml0aW9uL2ltcGwvQ2xhc3NwYXRoSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWQ5ZjUwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9pbnRlcm5hbC9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vaW1wbC9DbGFzc3BhdGhJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzMgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBFdGVyYXRpb24gQmlsaXNpbSBBLlMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiCgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgRVRFUkFUSU9OIEEuUy4gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBFdGVyYXRpb24gQmlsaXNpbSBBLlMuICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gZXRlcmF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5ldGVyYXRpb24uY29tLz4uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IENsYXNzcGF0aEltcGwuamF2YSx2IDEuNiAyMDA1LzA4LzMwIDIxOjQ1OjE5IGdlcmNhbiBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNGZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uQ2xhc3NwYXRoOwotCi0KLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q2xhc3NwYXRoPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuQ2xhc3NwYXRoSW1wbCNnZXRHcm91cCA8ZW0+R3JvdXA8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5DbGFzc3BhdGhJbXBsI2dldEFyY2hpdmUgPGVtPkFyY2hpdmU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5DbGFzc3BhdGhJbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENsYXNzcGF0aEltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIENsYXNzcGF0aCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3JvdXAoKSA8ZW0+R3JvdXA8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R3JvdXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICAgIHByb3RlY3RlZCBGZWF0dXJlTWFwIGdyb3VwID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBpZCA9IElEX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENsYXNzcGF0aEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBTZXJ2ZXJUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q2xhc3NwYXRoKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIEZlYXR1cmVNYXAgZ2V0R3JvdXAoKSB7Ci0JCWlmIChncm91cCA9PSBudWxsKSB7Ci0JCQlncm91cCA9IG5ldyBCYXNpY0ZlYXR1cmVNYXAodGhpcywgU2VydmVyVHlwZVBhY2thZ2UuQ0xBU1NQQVRIX19HUk9VUCk7Ci0JCX0KLQkJcmV0dXJuIGdyb3VwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEFyY2hpdmUoKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXApZ2V0R3JvdXAoKSkubGlzdChTZXJ2ZXJUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q2xhc3NwYXRoX0FyY2hpdmUoKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBuZXdJZCkgewotCQlTdHJpbmcgb2xkSWQgPSBpZDsKLQkJaWQgPSBuZXdJZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgU2VydmVyVHlwZVBhY2thZ2UuQ0xBU1NQQVRIX19JRCwgb2xkSWQsIGlkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5DTEFTU1BBVEhfX0dST1VQOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEdyb3VwKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkNMQVNTUEFUSF9fQVJDSElWRToKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRBcmNoaXZlKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuQ0xBU1NQQVRIX19HUk9VUDoKLQkJCQlyZXR1cm4gZ2V0R3JvdXAoKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuQ0xBU1NQQVRIX19BUkNISVZFOgotCQkJCXJldHVybiBnZXRBcmNoaXZlKCk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkNMQVNTUEFUSF9fSUQ6Ci0JCQkJcmV0dXJuIGdldElkKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5DTEFTU1BBVEhfX0dST1VQOgotCQkJCWdldEdyb3VwKCkuY2xlYXIoKTsKLQkJCQlnZXRHcm91cCgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5DTEFTU1BBVEhfX0FSQ0hJVkU6Ci0JCQkJZ2V0QXJjaGl2ZSgpLmNsZWFyKCk7Ci0JCQkJZ2V0QXJjaGl2ZSgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5DTEFTU1BBVEhfX0lEOgotCQkJCXNldElkKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkNMQVNTUEFUSF9fR1JPVVA6Ci0JCQkJZ2V0R3JvdXAoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuQ0xBU1NQQVRIX19BUkNISVZFOgotCQkJCWdldEFyY2hpdmUoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuQ0xBU1NQQVRIX19JRDoKLQkJCQlzZXRJZChJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkNMQVNTUEFUSF9fR1JPVVA6Ci0JCQkJcmV0dXJuIGdyb3VwICE9IG51bGwgJiYgIWdyb3VwLmlzRW1wdHkoKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuQ0xBU1NQQVRIX19BUkNISVZFOgotCQkJCXJldHVybiAhZ2V0QXJjaGl2ZSgpLmlzRW1wdHkoKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuQ0xBU1NQQVRIX19JRDoKLQkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGdyb3VwOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChncm91cCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaWQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGlkKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vQ2xhc3NwYXRoSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9pbXBsL0V4dGVybmFsSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9pbXBsL0V4dGVybmFsSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzBiNzg5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9pbnRlcm5hbC9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vaW1wbC9FeHRlcm5hbEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxOCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEV4dGVybmFsSW1wbC5qYXZhLHYgMS4yIDIwMDUvMDgvMzAgMjE6NDU6MTkgZ2VyY2FuIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uRXh0ZXJuYWw7Ci0KLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RXh0ZXJuYWw8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5FeHRlcm5hbEltcGwjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuRXh0ZXJuYWxJbXBsI2dldE9zIDxlbT5PczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEV4dGVybmFsSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgRXh0ZXJuYWwgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZSgpIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlKCkgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB2YWx1ZSA9IFZBTFVFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE9zKCkgPGVtPk9zPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1NfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3MoKSA8ZW0+T3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE9zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG9zID0gT1NfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRXh0ZXJuYWxJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gU2VydmVyVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEV4dGVybmFsKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuZXdWYWx1ZSkgewotCQlTdHJpbmcgb2xkVmFsdWUgPSB2YWx1ZTsKLQkJdmFsdWUgPSBuZXdWYWx1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgU2VydmVyVHlwZVBhY2thZ2UuRVhURVJOQUxfX1ZBTFVFLCBvbGRWYWx1ZSwgdmFsdWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE9zKCkgewotCQlyZXR1cm4gb3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3MoU3RyaW5nIG5ld09zKSB7Ci0JCVN0cmluZyBvbGRPcyA9IG9zOwotCQlvcyA9IG5ld09zOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTZXJ2ZXJUeXBlUGFja2FnZS5FWFRFUk5BTF9fT1MsIG9sZE9zLCBvcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuRVhURVJOQUxfX1ZBTFVFOgotCQkJCXJldHVybiBnZXRWYWx1ZSgpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5FWFRFUk5BTF9fT1M6Ci0JCQkJcmV0dXJuIGdldE9zKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5FWFRFUk5BTF9fVkFMVUU6Ci0JCQkJc2V0VmFsdWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5FWFRFUk5BTF9fT1M6Ci0JCQkJc2V0T3MoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuRVhURVJOQUxfX1ZBTFVFOgotCQkJCXNldFZhbHVlKFZBTFVFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkVYVEVSTkFMX19PUzoKLQkJCQlzZXRPcyhPU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkVYVEVSTkFMX19WQUxVRToKLQkJCQlyZXR1cm4gVkFMVUVfRURFRkFVTFQgPT0gbnVsbCA/IHZhbHVlICE9IG51bGwgOiAhVkFMVUVfRURFRkFVTFQuZXF1YWxzKHZhbHVlKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuRVhURVJOQUxfX09TOgotCQkJCXJldHVybiBPU19FREVGQVVMVCA9PSBudWxsID8gb3MgIT0gbnVsbCA6ICFPU19FREVGQVVMVC5lcXVhbHMob3MpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodmFsdWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHZhbHVlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBvczogIik7Ci0JCXJlc3VsdC5hcHBlbmQob3MpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9FeHRlcm5hbEltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9pbnRlcm5hbC9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vaW1wbC9KbmRpQ29ubmVjdGlvbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9pbnRlcm5hbC9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vaW1wbC9KbmRpQ29ubmVjdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA5MDk2OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvaW50ZXJuYWwvc2VydmVydHlwZS9kZWZpbml0aW9uL2ltcGwvSm5kaUNvbm5lY3Rpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDQgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBKbmRpQ29ubmVjdGlvbkltcGwuamF2YSx2IDEuNCAyMDA1LzA4LzMwIDIxOjQ1OjE4IGdlcmNhbiBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uSm5kaUNvbm5lY3Rpb247Ci0KLQotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5KbmRpIENvbm5lY3Rpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5KbmRpQ29ubmVjdGlvbkltcGwjZ2V0UHJvdmlkZXJVcmwgPGVtPlByb3ZpZGVyIFVybDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLkpuZGlDb25uZWN0aW9uSW1wbCNnZXRHcm91cCA8ZW0+R3JvdXA8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5KbmRpQ29ubmVjdGlvbkltcGwjZ2V0Sm5kaVByb3BlcnR5IDxlbT5KbmRpIFByb3BlcnR5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuSm5kaUNvbm5lY3Rpb25JbXBsI2dldEluaXRpYWxDb250ZXh0RmFjdG9yeSA8ZW0+SW5pdGlhbCBDb250ZXh0IEZhY3Rvcnk8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBKbmRpQ29ubmVjdGlvbkltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEpuZGlDb25uZWN0aW9uIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJvdmlkZXJVcmwoKSA8ZW0+UHJvdmlkZXIgVXJsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcm92aWRlclVybCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPVklERVJfVVJMX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb3ZpZGVyVXJsKCkgPGVtPlByb3ZpZGVyIFVybDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJvdmlkZXJVcmwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgcHJvdmlkZXJVcmwgPSBQUk9WSURFUl9VUkxfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cCgpIDxlbT5Hcm91cDwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHcm91cCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gICAgcHJvdGVjdGVkIEZlYXR1cmVNYXAgZ3JvdXAgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEluaXRpYWxDb250ZXh0RmFjdG9yeSgpIDxlbT5Jbml0aWFsIENvbnRleHQgRmFjdG9yeTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SW5pdGlhbENvbnRleHRGYWN0b3J5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJTklUSUFMX0NPTlRFWFRfRkFDVE9SWV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbml0aWFsQ29udGV4dEZhY3RvcnkoKSA8ZW0+SW5pdGlhbCBDb250ZXh0IEZhY3Rvcnk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEluaXRpYWxDb250ZXh0RmFjdG9yeSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBpbml0aWFsQ29udGV4dEZhY3RvcnkgPSBJTklUSUFMX0NPTlRFWFRfRkFDVE9SWV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHByb3RlY3RlZCBKbmRpQ29ubmVjdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBTZXJ2ZXJUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Sm5kaUNvbm5lY3Rpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb3ZpZGVyVXJsKCkgewotCQlyZXR1cm4gcHJvdmlkZXJVcmw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIHZvaWQgc2V0UHJvdmlkZXJVcmwoU3RyaW5nIG5ld1Byb3ZpZGVyVXJsKSB7Ci0JCVN0cmluZyBvbGRQcm92aWRlclVybCA9IHByb3ZpZGVyVXJsOwotCQlwcm92aWRlclVybCA9IG5ld1Byb3ZpZGVyVXJsOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTZXJ2ZXJUeXBlUGFja2FnZS5KTkRJX0NPTk5FQ1RJT05fX1BST1ZJREVSX1VSTCwgb2xkUHJvdmlkZXJVcmwsIHByb3ZpZGVyVXJsKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIEZlYXR1cmVNYXAgZ2V0R3JvdXAoKSB7Ci0JCWlmIChncm91cCA9PSBudWxsKSB7Ci0JCQlncm91cCA9IG5ldyBCYXNpY0ZlYXR1cmVNYXAodGhpcywgU2VydmVyVHlwZVBhY2thZ2UuSk5ESV9DT05ORUNUSU9OX19HUk9VUCk7Ci0JCX0KLQkJcmV0dXJuIGdyb3VwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBMaXN0IGdldEpuZGlQcm9wZXJ0eSgpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcClnZXRHcm91cCgpKS5saXN0KFNlcnZlclR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRKbmRpQ29ubmVjdGlvbl9KbmRpUHJvcGVydHkoKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIFN0cmluZyBnZXRJbml0aWFsQ29udGV4dEZhY3RvcnkoKSB7Ci0JCXJldHVybiBpbml0aWFsQ29udGV4dEZhY3Rvcnk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIHZvaWQgc2V0SW5pdGlhbENvbnRleHRGYWN0b3J5KFN0cmluZyBuZXdJbml0aWFsQ29udGV4dEZhY3RvcnkpIHsKLQkJU3RyaW5nIG9sZEluaXRpYWxDb250ZXh0RmFjdG9yeSA9IGluaXRpYWxDb250ZXh0RmFjdG9yeTsKLQkJaW5pdGlhbENvbnRleHRGYWN0b3J5ID0gbmV3SW5pdGlhbENvbnRleHRGYWN0b3J5OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTZXJ2ZXJUeXBlUGFja2FnZS5KTkRJX0NPTk5FQ1RJT05fX0lOSVRJQUxfQ09OVEVYVF9GQUNUT1JZLCBvbGRJbml0aWFsQ29udGV4dEZhY3RvcnksIGluaXRpYWxDb250ZXh0RmFjdG9yeSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuSk5ESV9DT05ORUNUSU9OX19HUk9VUDoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRHcm91cCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5KTkRJX0NPTk5FQ1RJT05fX0pORElfUFJPUEVSVFk6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0Sm5kaVByb3BlcnR5KCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuSk5ESV9DT05ORUNUSU9OX19QUk9WSURFUl9VUkw6Ci0JCQkJcmV0dXJuIGdldFByb3ZpZGVyVXJsKCk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkpORElfQ09OTkVDVElPTl9fR1JPVVA6Ci0JCQkJcmV0dXJuIGdldEdyb3VwKCk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkpORElfQ09OTkVDVElPTl9fSk5ESV9QUk9QRVJUWToKLQkJCQlyZXR1cm4gZ2V0Sm5kaVByb3BlcnR5KCk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkpORElfQ09OTkVDVElPTl9fSU5JVElBTF9DT05URVhUX0ZBQ1RPUlk6Ci0JCQkJcmV0dXJuIGdldEluaXRpYWxDb250ZXh0RmFjdG9yeSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuSk5ESV9DT05ORUNUSU9OX19QUk9WSURFUl9VUkw6Ci0JCQkJc2V0UHJvdmlkZXJVcmwoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5KTkRJX0NPTk5FQ1RJT05fX0dST1VQOgotCQkJCWdldEdyb3VwKCkuY2xlYXIoKTsKLQkJCQlnZXRHcm91cCgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5KTkRJX0NPTk5FQ1RJT05fX0pORElfUFJPUEVSVFk6Ci0JCQkJZ2V0Sm5kaVByb3BlcnR5KCkuY2xlYXIoKTsKLQkJCQlnZXRKbmRpUHJvcGVydHkoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuSk5ESV9DT05ORUNUSU9OX19JTklUSUFMX0NPTlRFWFRfRkFDVE9SWToKLQkJCQlzZXRJbml0aWFsQ29udGV4dEZhY3RvcnkoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuSk5ESV9DT05ORUNUSU9OX19QUk9WSURFUl9VUkw6Ci0JCQkJc2V0UHJvdmlkZXJVcmwoUFJPVklERVJfVVJMX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkpORElfQ09OTkVDVElPTl9fR1JPVVA6Ci0JCQkJZ2V0R3JvdXAoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuSk5ESV9DT05ORUNUSU9OX19KTkRJX1BST1BFUlRZOgotCQkJCWdldEpuZGlQcm9wZXJ0eSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5KTkRJX0NPTk5FQ1RJT05fX0lOSVRJQUxfQ09OVEVYVF9GQUNUT1JZOgotCQkJCXNldEluaXRpYWxDb250ZXh0RmFjdG9yeShJTklUSUFMX0NPTlRFWFRfRkFDVE9SWV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkpORElfQ09OTkVDVElPTl9fUFJPVklERVJfVVJMOgotCQkJCXJldHVybiBQUk9WSURFUl9VUkxfRURFRkFVTFQgPT0gbnVsbCA/IHByb3ZpZGVyVXJsICE9IG51bGwgOiAhUFJPVklERVJfVVJMX0VERUZBVUxULmVxdWFscyhwcm92aWRlclVybCk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkpORElfQ09OTkVDVElPTl9fR1JPVVA6Ci0JCQkJcmV0dXJuIGdyb3VwICE9IG51bGwgJiYgIWdyb3VwLmlzRW1wdHkoKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuSk5ESV9DT05ORUNUSU9OX19KTkRJX1BST1BFUlRZOgotCQkJCXJldHVybiAhZ2V0Sm5kaVByb3BlcnR5KCkuaXNFbXB0eSgpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5KTkRJX0NPTk5FQ1RJT05fX0lOSVRJQUxfQ09OVEVYVF9GQUNUT1JZOgotCQkJCXJldHVybiBJTklUSUFMX0NPTlRFWFRfRkFDVE9SWV9FREVGQVVMVCA9PSBudWxsID8gaW5pdGlhbENvbnRleHRGYWN0b3J5ICE9IG51bGwgOiAhSU5JVElBTF9DT05URVhUX0ZBQ1RPUllfRURFRkFVTFQuZXF1YWxzKGluaXRpYWxDb250ZXh0RmFjdG9yeSk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChwcm92aWRlclVybDogIik7Ci0JCXJlc3VsdC5hcHBlbmQocHJvdmlkZXJVcmwpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGdyb3VwOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChncm91cCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaW5pdGlhbENvbnRleHRGYWN0b3J5OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChpbml0aWFsQ29udGV4dEZhY3RvcnkpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9KbmRpQ29ubmVjdGlvbkltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9pbnRlcm5hbC9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vaW1wbC9MYXVuY2hDb25maWd1cmF0aW9uSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9pbXBsL0xhdW5jaENvbmZpZ3VyYXRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3YzM3Y2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9pbXBsL0xhdW5jaENvbmZpZ3VyYXRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NjAgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBFdGVyYXRpb24gQmlsaXNpbSBBLlMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiCgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgRVRFUkFUSU9OIEEuUy4gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBFdGVyYXRpb24gQmlsaXNpbSBBLlMuICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gZXRlcmF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5ldGVyYXRpb24uY29tLz4uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IExhdW5jaENvbmZpZ3VyYXRpb25JbXBsLmphdmEsdiAxLjcgMjAwNS8wOC8zMCAyMTo0NToxOSBnZXJjYW4gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uTGF1bmNoQ29uZmlndXJhdGlvbjsKLQotCi0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkxhdW5jaCBDb25maWd1cmF0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuTGF1bmNoQ29uZmlndXJhdGlvbkltcGwjZ2V0R3JvdXAgPGVtPkdyb3VwPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuTGF1bmNoQ29uZmlndXJhdGlvbkltcGwjZ2V0RW52aXJvbm1lbnRWYXJpYWJsZSA8ZW0+RW52aXJvbm1lbnQgVmFyaWFibGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5MYXVuY2hDb25maWd1cmF0aW9uSW1wbCNnZXRHcm91cDEgPGVtPkdyb3VwMTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLkxhdW5jaENvbmZpZ3VyYXRpb25JbXBsI2dldFByb2dyYW1Bcmd1bWVudHMgPGVtPlByb2dyYW0gQXJndW1lbnRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuTGF1bmNoQ29uZmlndXJhdGlvbkltcGwjZ2V0V29ya2luZ0RpcmVjdG9yeSA8ZW0+V29ya2luZyBEaXJlY3Rvcnk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5MYXVuY2hDb25maWd1cmF0aW9uSW1wbCNnZXRNYWluQ2xhc3MgPGVtPk1haW4gQ2xhc3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5MYXVuY2hDb25maWd1cmF0aW9uSW1wbCNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLkxhdW5jaENvbmZpZ3VyYXRpb25JbXBsI2dldFZtUGFyYW1ldGVycyA8ZW0+Vm0gUGFyYW1ldGVyczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLkxhdW5jaENvbmZpZ3VyYXRpb25JbXBsI2dldENsYXNzcGF0aFJlZmVyZW5jZSA8ZW0+Q2xhc3NwYXRoIFJlZmVyZW5jZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLkxhdW5jaENvbmZpZ3VyYXRpb25JbXBsI2dldERlYnVnUG9ydCA8ZW0+RGVidWcgUG9ydDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLkxhdW5jaENvbmZpZ3VyYXRpb25JbXBsI2dldEdyb3VwMyA8ZW0+R3JvdXAzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuTGF1bmNoQ29uZmlndXJhdGlvbkltcGwjZ2V0RXh0ZXJuYWwgPGVtPkV4dGVybmFsPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTGF1bmNoQ29uZmlndXJhdGlvbkltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIExhdW5jaENvbmZpZ3VyYXRpb24gewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdyb3VwKCkgPGVtPkdyb3VwPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdyb3VwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRmVhdHVyZU1hcCBncm91cCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cDEoKSA8ZW0+R3JvdXAxPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdyb3VwMSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgZ3JvdXAxID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXb3JraW5nRGlyZWN0b3J5KCkgPGVtPldvcmtpbmcgRGlyZWN0b3J5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXb3JraW5nRGlyZWN0b3J5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBXT1JLSU5HX0RJUkVDVE9SWV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXb3JraW5nRGlyZWN0b3J5KCkgPGVtPldvcmtpbmcgRGlyZWN0b3J5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXb3JraW5nRGlyZWN0b3J5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHdvcmtpbmdEaXJlY3RvcnkgPSBXT1JLSU5HX0RJUkVDVE9SWV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYWluQ2xhc3MoKSA8ZW0+TWFpbiBDbGFzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWFpbkNsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBNQUlOX0NMQVNTX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1haW5DbGFzcygpIDxlbT5NYWluIENsYXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNYWluQ2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgbWFpbkNsYXNzID0gTUFJTl9DTEFTU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdyb3VwMigpIDxlbT5Hcm91cDI8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R3JvdXAyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRmVhdHVyZU1hcCBncm91cDIgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENsYXNzcGF0aFJlZmVyZW5jZSgpIDxlbT5DbGFzc3BhdGggUmVmZXJlbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDbGFzc3BhdGhSZWZlcmVuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTUEFUSF9SRUZFUkVOQ0VfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2xhc3NwYXRoUmVmZXJlbmNlKCkgPGVtPkNsYXNzcGF0aCBSZWZlcmVuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENsYXNzcGF0aFJlZmVyZW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjbGFzc3BhdGhSZWZlcmVuY2UgPSBDTEFTU1BBVEhfUkVGRVJFTkNFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlYnVnUG9ydCgpIDxlbT5EZWJ1ZyBQb3J0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZWJ1Z1BvcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFQlVHX1BPUlRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVidWdQb3J0KCkgPGVtPkRlYnVnIFBvcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlYnVnUG9ydCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBkZWJ1Z1BvcnQgPSBERUJVR19QT1JUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3JvdXAzKCkgPGVtPkdyb3VwMzwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHcm91cDMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBGZWF0dXJlTWFwIGdyb3VwMyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGF1bmNoQ29uZmlndXJhdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBTZXJ2ZXJUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TGF1bmNoQ29uZmlndXJhdGlvbigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWFpbkNsYXNzKCkgewotCQlyZXR1cm4gbWFpbkNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyB2b2lkIHNldE1haW5DbGFzcyhTdHJpbmcgbmV3TWFpbkNsYXNzKSB7Ci0JCVN0cmluZyBvbGRNYWluQ2xhc3MgPSBtYWluQ2xhc3M7Ci0JCW1haW5DbGFzcyA9IG5ld01haW5DbGFzczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgU2VydmVyVHlwZVBhY2thZ2UuTEFVTkNIX0NPTkZJR1VSQVRJT05fX01BSU5fQ0xBU1MsIG9sZE1haW5DbGFzcywgbWFpbkNsYXNzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZlYXR1cmVNYXAgZ2V0R3JvdXAyKCkgewotCQlpZiAoZ3JvdXAyID09IG51bGwpIHsKLQkJCWdyb3VwMiA9IG5ldyBCYXNpY0ZlYXR1cmVNYXAodGhpcywgU2VydmVyVHlwZVBhY2thZ2UuTEFVTkNIX0NPTkZJR1VSQVRJT05fX0dST1VQMik7Ci0JCX0KLQkJcmV0dXJuIGdyb3VwMjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFdvcmtpbmdEaXJlY3RvcnkoKSB7Ci0JCXJldHVybiB3b3JraW5nRGlyZWN0b3J5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdvcmtpbmdEaXJlY3RvcnkoU3RyaW5nIG5ld1dvcmtpbmdEaXJlY3RvcnkpIHsKLQkJU3RyaW5nIG9sZFdvcmtpbmdEaXJlY3RvcnkgPSB3b3JraW5nRGlyZWN0b3J5OwotCQl3b3JraW5nRGlyZWN0b3J5ID0gbmV3V29ya2luZ0RpcmVjdG9yeTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgU2VydmVyVHlwZVBhY2thZ2UuTEFVTkNIX0NPTkZJR1VSQVRJT05fX1dPUktJTkdfRElSRUNUT1JZLCBvbGRXb3JraW5nRGlyZWN0b3J5LCB3b3JraW5nRGlyZWN0b3J5KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvZ3JhbUFyZ3VtZW50cygpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcClnZXRHcm91cDEoKSkubGlzdChTZXJ2ZXJUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TGF1bmNoQ29uZmlndXJhdGlvbl9Qcm9ncmFtQXJndW1lbnRzKCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgTk9UCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGNsZWFuV2hpdGVTcGFjZShTdHJpbmcgc3RyaW5nKQotCXsKLQkJaWYoc3RyaW5nPT1udWxsKQotCQkJcmV0dXJuIG51bGw7Ci0gICAgICAgIGNoYXJbXSBjaGFycyA9IHN0cmluZy50b0NoYXJBcnJheSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoYXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZihDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGNoYXJzW2ldKSkKLQkJCQljaGFyc1tpXT0nICc7Ci0JCX0KLQkJcmV0dXJuIChuZXcgU3RyaW5nKGNoYXJzKSkudHJpbSgpOwotCQkKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0Vm1QYXJhbWV0ZXJzKCkgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwKWdldEdyb3VwMigpKS5saXN0KFNlcnZlclR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRMYXVuY2hDb25maWd1cmF0aW9uX1ZtUGFyYW1ldGVycygpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENsYXNzcGF0aFJlZmVyZW5jZSgpIHsKLQkJcmV0dXJuIGNsYXNzcGF0aFJlZmVyZW5jZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDbGFzc3BhdGhSZWZlcmVuY2UoU3RyaW5nIG5ld0NsYXNzcGF0aFJlZmVyZW5jZSkgewotCQlTdHJpbmcgb2xkQ2xhc3NwYXRoUmVmZXJlbmNlID0gY2xhc3NwYXRoUmVmZXJlbmNlOwotCQljbGFzc3BhdGhSZWZlcmVuY2UgPSBuZXdDbGFzc3BhdGhSZWZlcmVuY2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFNlcnZlclR5cGVQYWNrYWdlLkxBVU5DSF9DT05GSUdVUkFUSU9OX19DTEFTU1BBVEhfUkVGRVJFTkNFLCBvbGRDbGFzc3BhdGhSZWZlcmVuY2UsIGNsYXNzcGF0aFJlZmVyZW5jZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEV4dGVybmFsKCkgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwKWdldEdyb3VwMygpKS5saXN0KFNlcnZlclR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRMYXVuY2hDb25maWd1cmF0aW9uX0V4dGVybmFsKCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuTEFVTkNIX0NPTkZJR1VSQVRJT05fX0dST1VQOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEdyb3VwKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkxBVU5DSF9DT05GSUdVUkFUSU9OX19FTlZJUk9OTUVOVF9WQVJJQUJMRToKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFbnZpcm9ubWVudFZhcmlhYmxlKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkxBVU5DSF9DT05GSUdVUkFUSU9OX19HUk9VUDE6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0R3JvdXAxKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkxBVU5DSF9DT05GSUdVUkFUSU9OX19HUk9VUDI6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0R3JvdXAyKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkxBVU5DSF9DT05GSUdVUkFUSU9OX19HUk9VUDM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0R3JvdXAzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkxBVU5DSF9DT05GSUdVUkFUSU9OX19FWFRFUk5BTDoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFeHRlcm5hbCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlYnVnUG9ydCgpIHsKLQkJcmV0dXJuIGRlYnVnUG9ydDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWJ1Z1BvcnQoU3RyaW5nIG5ld0RlYnVnUG9ydCkgewotCQlTdHJpbmcgb2xkRGVidWdQb3J0ID0gZGVidWdQb3J0OwotCQlkZWJ1Z1BvcnQgPSBuZXdEZWJ1Z1BvcnQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFNlcnZlclR5cGVQYWNrYWdlLkxBVU5DSF9DT05GSUdVUkFUSU9OX19ERUJVR19QT1JULCBvbGREZWJ1Z1BvcnQsIGRlYnVnUG9ydCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGZWF0dXJlTWFwIGdldEdyb3VwMygpIHsKLQkJaWYgKGdyb3VwMyA9PSBudWxsKSB7Ci0JCQlncm91cDMgPSBuZXcgQmFzaWNGZWF0dXJlTWFwKHRoaXMsIFNlcnZlclR5cGVQYWNrYWdlLkxBVU5DSF9DT05GSUdVUkFUSU9OX19HUk9VUDMpOwotCQl9Ci0JCXJldHVybiBncm91cDM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZlYXR1cmVNYXAgZ2V0R3JvdXAoKSB7Ci0JCWlmIChncm91cCA9PSBudWxsKSB7Ci0JCQlncm91cCA9IG5ldyBCYXNpY0ZlYXR1cmVNYXAodGhpcywgU2VydmVyVHlwZVBhY2thZ2UuTEFVTkNIX0NPTkZJR1VSQVRJT05fX0dST1VQKTsKLQkJfQotCQlyZXR1cm4gZ3JvdXA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0RW52aXJvbm1lbnRWYXJpYWJsZSgpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcClnZXRHcm91cCgpKS5saXN0KFNlcnZlclR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRMYXVuY2hDb25maWd1cmF0aW9uX0Vudmlyb25tZW50VmFyaWFibGUoKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZlYXR1cmVNYXAgZ2V0R3JvdXAxKCkgewotCQlpZiAoZ3JvdXAxID09IG51bGwpIHsKLQkJCWdyb3VwMSA9IG5ldyBCYXNpY0ZlYXR1cmVNYXAodGhpcywgU2VydmVyVHlwZVBhY2thZ2UuTEFVTkNIX0NPTkZJR1VSQVRJT05fX0dST1VQMSk7Ci0JCX0KLQkJcmV0dXJuIGdyb3VwMTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkxBVU5DSF9DT05GSUdVUkFUSU9OX19HUk9VUDoKLQkJCQlyZXR1cm4gZ2V0R3JvdXAoKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuTEFVTkNIX0NPTkZJR1VSQVRJT05fX0VOVklST05NRU5UX1ZBUklBQkxFOgotCQkJCXJldHVybiBnZXRFbnZpcm9ubWVudFZhcmlhYmxlKCk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkxBVU5DSF9DT05GSUdVUkFUSU9OX19HUk9VUDE6Ci0JCQkJcmV0dXJuIGdldEdyb3VwMSgpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5MQVVOQ0hfQ09ORklHVVJBVElPTl9fUFJPR1JBTV9BUkdVTUVOVFM6Ci0JCQkJcmV0dXJuIGdldFByb2dyYW1Bcmd1bWVudHMoKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuTEFVTkNIX0NPTkZJR1VSQVRJT05fX1dPUktJTkdfRElSRUNUT1JZOgotCQkJCXJldHVybiBnZXRXb3JraW5nRGlyZWN0b3J5KCk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkxBVU5DSF9DT05GSUdVUkFUSU9OX19NQUlOX0NMQVNTOgotCQkJCXJldHVybiBnZXRNYWluQ2xhc3MoKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuTEFVTkNIX0NPTkZJR1VSQVRJT05fX0dST1VQMjoKLQkJCQlyZXR1cm4gZ2V0R3JvdXAyKCk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkxBVU5DSF9DT05GSUdVUkFUSU9OX19WTV9QQVJBTUVURVJTOgotCQkJCXJldHVybiBnZXRWbVBhcmFtZXRlcnMoKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuTEFVTkNIX0NPTkZJR1VSQVRJT05fX0NMQVNTUEFUSF9SRUZFUkVOQ0U6Ci0JCQkJcmV0dXJuIGdldENsYXNzcGF0aFJlZmVyZW5jZSgpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5MQVVOQ0hfQ09ORklHVVJBVElPTl9fREVCVUdfUE9SVDoKLQkJCQlyZXR1cm4gZ2V0RGVidWdQb3J0KCk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkxBVU5DSF9DT05GSUdVUkFUSU9OX19HUk9VUDM6Ci0JCQkJcmV0dXJuIGdldEdyb3VwMygpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5MQVVOQ0hfQ09ORklHVVJBVElPTl9fRVhURVJOQUw6Ci0JCQkJcmV0dXJuIGdldEV4dGVybmFsKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5MQVVOQ0hfQ09ORklHVVJBVElPTl9fR1JPVVA6Ci0JCQkJZ2V0R3JvdXAoKS5jbGVhcigpOwotCQkJCWdldEdyb3VwKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkxBVU5DSF9DT05GSUdVUkFUSU9OX19FTlZJUk9OTUVOVF9WQVJJQUJMRToKLQkJCQlnZXRFbnZpcm9ubWVudFZhcmlhYmxlKCkuY2xlYXIoKTsKLQkJCQlnZXRFbnZpcm9ubWVudFZhcmlhYmxlKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkxBVU5DSF9DT05GSUdVUkFUSU9OX19HUk9VUDE6Ci0JCQkJZ2V0R3JvdXAxKCkuY2xlYXIoKTsKLQkJCQlnZXRHcm91cDEoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuTEFVTkNIX0NPTkZJR1VSQVRJT05fX1BST0dSQU1fQVJHVU1FTlRTOgotCQkJCWdldFByb2dyYW1Bcmd1bWVudHMoKS5jbGVhcigpOwotCQkJCWdldFByb2dyYW1Bcmd1bWVudHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuTEFVTkNIX0NPTkZJR1VSQVRJT05fX1dPUktJTkdfRElSRUNUT1JZOgotCQkJCXNldFdvcmtpbmdEaXJlY3RvcnkoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5MQVVOQ0hfQ09ORklHVVJBVElPTl9fTUFJTl9DTEFTUzoKLQkJCQlzZXRNYWluQ2xhc3MoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5MQVVOQ0hfQ09ORklHVVJBVElPTl9fR1JPVVAyOgotCQkJCWdldEdyb3VwMigpLmNsZWFyKCk7Ci0JCQkJZ2V0R3JvdXAyKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkxBVU5DSF9DT05GSUdVUkFUSU9OX19WTV9QQVJBTUVURVJTOgotCQkJCWdldFZtUGFyYW1ldGVycygpLmNsZWFyKCk7Ci0JCQkJZ2V0Vm1QYXJhbWV0ZXJzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkxBVU5DSF9DT05GSUdVUkFUSU9OX19DTEFTU1BBVEhfUkVGRVJFTkNFOgotCQkJCXNldENsYXNzcGF0aFJlZmVyZW5jZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkxBVU5DSF9DT05GSUdVUkFUSU9OX19ERUJVR19QT1JUOgotCQkJCXNldERlYnVnUG9ydCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkxBVU5DSF9DT05GSUdVUkFUSU9OX19HUk9VUDM6Ci0JCQkJZ2V0R3JvdXAzKCkuY2xlYXIoKTsKLQkJCQlnZXRHcm91cDMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuTEFVTkNIX0NPTkZJR1VSQVRJT05fX0VYVEVSTkFMOgotCQkJCWdldEV4dGVybmFsKCkuY2xlYXIoKTsKLQkJCQlnZXRFeHRlcm5hbCgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuTEFVTkNIX0NPTkZJR1VSQVRJT05fX0dST1VQOgotCQkJCWdldEdyb3VwKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkxBVU5DSF9DT05GSUdVUkFUSU9OX19FTlZJUk9OTUVOVF9WQVJJQUJMRToKLQkJCQlnZXRFbnZpcm9ubWVudFZhcmlhYmxlKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkxBVU5DSF9DT05GSUdVUkFUSU9OX19HUk9VUDE6Ci0JCQkJZ2V0R3JvdXAxKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkxBVU5DSF9DT05GSUdVUkFUSU9OX19QUk9HUkFNX0FSR1VNRU5UUzoKLQkJCQlnZXRQcm9ncmFtQXJndW1lbnRzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkxBVU5DSF9DT05GSUdVUkFUSU9OX19XT1JLSU5HX0RJUkVDVE9SWToKLQkJCQlzZXRXb3JraW5nRGlyZWN0b3J5KFdPUktJTkdfRElSRUNUT1JZX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkxBVU5DSF9DT05GSUdVUkFUSU9OX19NQUlOX0NMQVNTOgotCQkJCXNldE1haW5DbGFzcyhNQUlOX0NMQVNTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkxBVU5DSF9DT05GSUdVUkFUSU9OX19HUk9VUDI6Ci0JCQkJZ2V0R3JvdXAyKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkxBVU5DSF9DT05GSUdVUkFUSU9OX19WTV9QQVJBTUVURVJTOgotCQkJCWdldFZtUGFyYW1ldGVycygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5MQVVOQ0hfQ09ORklHVVJBVElPTl9fQ0xBU1NQQVRIX1JFRkVSRU5DRToKLQkJCQlzZXRDbGFzc3BhdGhSZWZlcmVuY2UoQ0xBU1NQQVRIX1JFRkVSRU5DRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5MQVVOQ0hfQ09ORklHVVJBVElPTl9fREVCVUdfUE9SVDoKLQkJCQlzZXREZWJ1Z1BvcnQoREVCVUdfUE9SVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5MQVVOQ0hfQ09ORklHVVJBVElPTl9fR1JPVVAzOgotCQkJCWdldEdyb3VwMygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5MQVVOQ0hfQ09ORklHVVJBVElPTl9fRVhURVJOQUw6Ci0JCQkJZ2V0RXh0ZXJuYWwoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5MQVVOQ0hfQ09ORklHVVJBVElPTl9fR1JPVVA6Ci0JCQkJcmV0dXJuIGdyb3VwICE9IG51bGwgJiYgIWdyb3VwLmlzRW1wdHkoKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuTEFVTkNIX0NPTkZJR1VSQVRJT05fX0VOVklST05NRU5UX1ZBUklBQkxFOgotCQkJCXJldHVybiAhZ2V0RW52aXJvbm1lbnRWYXJpYWJsZSgpLmlzRW1wdHkoKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuTEFVTkNIX0NPTkZJR1VSQVRJT05fX0dST1VQMToKLQkJCQlyZXR1cm4gZ3JvdXAxICE9IG51bGwgJiYgIWdyb3VwMS5pc0VtcHR5KCk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkxBVU5DSF9DT05GSUdVUkFUSU9OX19QUk9HUkFNX0FSR1VNRU5UUzoKLQkJCQlyZXR1cm4gIWdldFByb2dyYW1Bcmd1bWVudHMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkxBVU5DSF9DT05GSUdVUkFUSU9OX19XT1JLSU5HX0RJUkVDVE9SWToKLQkJCQlyZXR1cm4gV09SS0lOR19ESVJFQ1RPUllfRURFRkFVTFQgPT0gbnVsbCA/IHdvcmtpbmdEaXJlY3RvcnkgIT0gbnVsbCA6ICFXT1JLSU5HX0RJUkVDVE9SWV9FREVGQVVMVC5lcXVhbHMod29ya2luZ0RpcmVjdG9yeSk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkxBVU5DSF9DT05GSUdVUkFUSU9OX19NQUlOX0NMQVNTOgotCQkJCXJldHVybiBNQUlOX0NMQVNTX0VERUZBVUxUID09IG51bGwgPyBtYWluQ2xhc3MgIT0gbnVsbCA6ICFNQUlOX0NMQVNTX0VERUZBVUxULmVxdWFscyhtYWluQ2xhc3MpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5MQVVOQ0hfQ09ORklHVVJBVElPTl9fR1JPVVAyOgotCQkJCXJldHVybiBncm91cDIgIT0gbnVsbCAmJiAhZ3JvdXAyLmlzRW1wdHkoKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuTEFVTkNIX0NPTkZJR1VSQVRJT05fX1ZNX1BBUkFNRVRFUlM6Ci0JCQkJcmV0dXJuICFnZXRWbVBhcmFtZXRlcnMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkxBVU5DSF9DT05GSUdVUkFUSU9OX19DTEFTU1BBVEhfUkVGRVJFTkNFOgotCQkJCXJldHVybiBDTEFTU1BBVEhfUkVGRVJFTkNFX0VERUZBVUxUID09IG51bGwgPyBjbGFzc3BhdGhSZWZlcmVuY2UgIT0gbnVsbCA6ICFDTEFTU1BBVEhfUkVGRVJFTkNFX0VERUZBVUxULmVxdWFscyhjbGFzc3BhdGhSZWZlcmVuY2UpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5MQVVOQ0hfQ09ORklHVVJBVElPTl9fREVCVUdfUE9SVDoKLQkJCQlyZXR1cm4gREVCVUdfUE9SVF9FREVGQVVMVCA9PSBudWxsID8gZGVidWdQb3J0ICE9IG51bGwgOiAhREVCVUdfUE9SVF9FREVGQVVMVC5lcXVhbHMoZGVidWdQb3J0KTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuTEFVTkNIX0NPTkZJR1VSQVRJT05fX0dST1VQMzoKLQkJCQlyZXR1cm4gZ3JvdXAzICE9IG51bGwgJiYgIWdyb3VwMy5pc0VtcHR5KCk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkxBVU5DSF9DT05GSUdVUkFUSU9OX19FWFRFUk5BTDoKLQkJCQlyZXR1cm4gIWdldEV4dGVybmFsKCkuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZ3JvdXA6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGdyb3VwKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBncm91cDE6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGdyb3VwMSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgd29ya2luZ0RpcmVjdG9yeTogIik7Ci0JCXJlc3VsdC5hcHBlbmQod29ya2luZ0RpcmVjdG9yeSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbWFpbkNsYXNzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChtYWluQ2xhc3MpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGdyb3VwMjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZ3JvdXAyKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjbGFzc3BhdGhSZWZlcmVuY2U6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNsYXNzcGF0aFJlZmVyZW5jZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZGVidWdQb3J0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkZWJ1Z1BvcnQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGdyb3VwMzogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZ3JvdXAzKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBOT1QKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByb2dyYW1Bcmd1bWVudHNBc1N0cmluZygpIHsKLQkJcmV0dXJuIGNvbmNhdExpc3QoZ2V0UHJvZ3JhbUFyZ3VtZW50cygpKTsKLQl9Ci0JCi0JLyoqCi0JICogQGdlbmVyYXRlZCBOT1QKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZtUGFyYW1ldGVyc0FzU3RyaW5nKCkgewotCQlyZXR1cm4gY29uY2F0TGlzdChnZXRWbVBhcmFtZXRlcnMoKSk7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGNvbmNhdExpc3QoTGlzdCBsaXN0KXsKLQkJU3RyaW5nQnVmZmVyIGNvbmNhdFN0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7Ci0JCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSl7Ci0JCQljb25jYXRTdHJpbmcuYXBwZW5kKGl0ZXJhdG9yLm5leHQoKSk7Ci0JCQljb25jYXRTdHJpbmcuYXBwZW5kKCIgIik7Ci0JCX0KLQkJcmV0dXJuIGNvbmNhdFN0cmluZy50b1N0cmluZygpOwotCX0KLQkKLX0gLy9MYXVuY2hDb25maWd1cmF0aW9uSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9pbXBsL01vZHVsZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9pbnRlcm5hbC9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vaW1wbC9Nb2R1bGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhNzk0ZWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9pbXBsL01vZHVsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5OSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IEV0ZXJhdGlvbiBCaWxpc2ltIEEuUy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIKAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBFVEVSQVRJT04gQS5TLiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEV0ZXJhdGlvbiBCaWxpc2ltIEEuUy4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiBldGVyYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmV0ZXJhdGlvbi5jb20vPi4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogTW9kdWxlSW1wbC5qYXZhLHYgMS40IDIwMDUvMDgvMzAgMjE6NDU6MTkgZ2VyY2FuIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uTW9kdWxlOwotCi0KLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TW9kdWxlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuTW9kdWxlSW1wbCNnZXRUeXBlIDxlbT5UeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuTW9kdWxlSW1wbCNnZXRQdWJsaXNoRGlyIDxlbT5QdWJsaXNoIERpcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLk1vZHVsZUltcGwjZ2V0UHVibGlzaGVyUmVmZXJlbmNlIDxlbT5QdWJsaXNoZXIgUmVmZXJlbmNlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTW9kdWxlSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgTW9kdWxlIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZSgpIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGUoKSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB0eXBlID0gVFlQRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQdWJsaXNoRGlyKCkgPGVtPlB1Ymxpc2ggRGlyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQdWJsaXNoRGlyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSVNIX0RJUl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQdWJsaXNoRGlyKCkgPGVtPlB1Ymxpc2ggRGlyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQdWJsaXNoRGlyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHB1Ymxpc2hEaXIgPSBQVUJMSVNIX0RJUl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQdWJsaXNoZXJSZWZlcmVuY2UoKSA8ZW0+UHVibGlzaGVyIFJlZmVyZW5jZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHVibGlzaGVyUmVmZXJlbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSVNIRVJfUkVGRVJFTkNFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFB1Ymxpc2hlclJlZmVyZW5jZSgpIDxlbT5QdWJsaXNoZXIgUmVmZXJlbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQdWJsaXNoZXJSZWZlcmVuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcHVibGlzaGVyUmVmZXJlbmNlID0gUFVCTElTSEVSX1JFRkVSRU5DRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNb2R1bGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gU2VydmVyVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldE1vZHVsZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgbmV3VHlwZSkgewotCQlTdHJpbmcgb2xkVHlwZSA9IHR5cGU7Ci0JCXR5cGUgPSBuZXdUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTZXJ2ZXJUeXBlUGFja2FnZS5NT0RVTEVfX1RZUEUsIG9sZFR5cGUsIHR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFB1Ymxpc2hEaXIoKSB7Ci0JCXJldHVybiBwdWJsaXNoRGlyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFB1Ymxpc2hEaXIoU3RyaW5nIG5ld1B1Ymxpc2hEaXIpIHsKLQkJU3RyaW5nIG9sZFB1Ymxpc2hEaXIgPSBwdWJsaXNoRGlyOwotCQlwdWJsaXNoRGlyID0gbmV3UHVibGlzaERpcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgU2VydmVyVHlwZVBhY2thZ2UuTU9EVUxFX19QVUJMSVNIX0RJUiwgb2xkUHVibGlzaERpciwgcHVibGlzaERpcikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHVibGlzaGVyUmVmZXJlbmNlKCkgewotCQlyZXR1cm4gcHVibGlzaGVyUmVmZXJlbmNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFB1Ymxpc2hlclJlZmVyZW5jZShTdHJpbmcgbmV3UHVibGlzaGVyUmVmZXJlbmNlKSB7Ci0JCVN0cmluZyBvbGRQdWJsaXNoZXJSZWZlcmVuY2UgPSBwdWJsaXNoZXJSZWZlcmVuY2U7Ci0JCXB1Ymxpc2hlclJlZmVyZW5jZSA9IG5ld1B1Ymxpc2hlclJlZmVyZW5jZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgU2VydmVyVHlwZVBhY2thZ2UuTU9EVUxFX19QVUJMSVNIRVJfUkVGRVJFTkNFLCBvbGRQdWJsaXNoZXJSZWZlcmVuY2UsIHB1Ymxpc2hlclJlZmVyZW5jZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuTU9EVUxFX19UWVBFOgotCQkJCXJldHVybiBnZXRUeXBlKCk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLk1PRFVMRV9fUFVCTElTSF9ESVI6Ci0JCQkJcmV0dXJuIGdldFB1Ymxpc2hEaXIoKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuTU9EVUxFX19QVUJMSVNIRVJfUkVGRVJFTkNFOgotCQkJCXJldHVybiBnZXRQdWJsaXNoZXJSZWZlcmVuY2UoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLk1PRFVMRV9fVFlQRToKLQkJCQlzZXRUeXBlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuTU9EVUxFX19QVUJMSVNIX0RJUjoKLQkJCQlzZXRQdWJsaXNoRGlyKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuTU9EVUxFX19QVUJMSVNIRVJfUkVGRVJFTkNFOgotCQkJCXNldFB1Ymxpc2hlclJlZmVyZW5jZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5NT0RVTEVfX1RZUEU6Ci0JCQkJc2V0VHlwZShUWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLk1PRFVMRV9fUFVCTElTSF9ESVI6Ci0JCQkJc2V0UHVibGlzaERpcihQVUJMSVNIX0RJUl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5NT0RVTEVfX1BVQkxJU0hFUl9SRUZFUkVOQ0U6Ci0JCQkJc2V0UHVibGlzaGVyUmVmZXJlbmNlKFBVQkxJU0hFUl9SRUZFUkVOQ0VfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5NT0RVTEVfX1RZUEU6Ci0JCQkJcmV0dXJuIFRZUEVfRURFRkFVTFQgPT0gbnVsbCA/IHR5cGUgIT0gbnVsbCA6ICFUWVBFX0VERUZBVUxULmVxdWFscyh0eXBlKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuTU9EVUxFX19QVUJMSVNIX0RJUjoKLQkJCQlyZXR1cm4gUFVCTElTSF9ESVJfRURFRkFVTFQgPT0gbnVsbCA/IHB1Ymxpc2hEaXIgIT0gbnVsbCA6ICFQVUJMSVNIX0RJUl9FREVGQVVMVC5lcXVhbHMocHVibGlzaERpcik7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLk1PRFVMRV9fUFVCTElTSEVSX1JFRkVSRU5DRToKLQkJCQlyZXR1cm4gUFVCTElTSEVSX1JFRkVSRU5DRV9FREVGQVVMVCA9PSBudWxsID8gcHVibGlzaGVyUmVmZXJlbmNlICE9IG51bGwgOiAhUFVCTElTSEVSX1JFRkVSRU5DRV9FREVGQVVMVC5lcXVhbHMocHVibGlzaGVyUmVmZXJlbmNlKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHR5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHB1Ymxpc2hEaXI6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHB1Ymxpc2hEaXIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHB1Ymxpc2hlclJlZmVyZW5jZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQocHVibGlzaGVyUmVmZXJlbmNlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vTW9kdWxlSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9pbXBsL1BvcnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvaW50ZXJuYWwvc2VydmVydHlwZS9kZWZpbml0aW9uL2ltcGwvUG9ydEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY0ZmY0YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvaW50ZXJuYWwvc2VydmVydHlwZS9kZWZpbml0aW9uL2ltcGwvUG9ydEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5OSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IEV0ZXJhdGlvbiBCaWxpc2ltIEEuUy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIKAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBFVEVSQVRJT04gQS5TLiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEV0ZXJhdGlvbiBCaWxpc2ltIEEuUy4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiBldGVyYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmV0ZXJhdGlvbi5jb20vPi4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUG9ydEltcGwuamF2YSx2IDEuNCAyMDA1LzA4LzMwIDIxOjQ1OjE5IGdlcmNhbiBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJUeXBlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlBvcnQ7Ci0KLQotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qb3J0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuUG9ydEltcGwjZ2V0Tm8gPGVtPk5vPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuUG9ydEltcGwjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLlBvcnRJbXBsI2dldFByb3RvY29sIDxlbT5Qcm90b2NvbDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBvcnRJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBQb3J0IHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Tm8oKSA8ZW0+Tm88L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5vKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOT19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRObygpIDxlbT5ObzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Tm8oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbm8gPSBOT19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb3RvY29sKCkgPGVtPlByb3RvY29sPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcm90b2NvbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPVE9DT0xfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJvdG9jb2woKSA8ZW0+UHJvdG9jb2w8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByb3RvY29sKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHByb3RvY29sID0gUFJPVE9DT0xfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUG9ydEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBTZXJ2ZXJUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UG9ydCgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Tm8oKSB7Ci0JCXJldHVybiBubzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRObyhTdHJpbmcgbmV3Tm8pIHsKLQkJU3RyaW5nIG9sZE5vID0gbm87Ci0JCW5vID0gbmV3Tm87Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFNlcnZlclR5cGVQYWNrYWdlLlBPUlRfX05PLCBvbGRObywgbm8pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotCQluYW1lID0gbmV3TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgU2VydmVyVHlwZVBhY2thZ2UuUE9SVF9fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvdG9jb2woKSB7Ci0JCXJldHVybiBwcm90b2NvbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm90b2NvbChTdHJpbmcgbmV3UHJvdG9jb2wpIHsKLQkJU3RyaW5nIG9sZFByb3RvY29sID0gcHJvdG9jb2w7Ci0JCXByb3RvY29sID0gbmV3UHJvdG9jb2w7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFNlcnZlclR5cGVQYWNrYWdlLlBPUlRfX1BST1RPQ09MLCBvbGRQcm90b2NvbCwgcHJvdG9jb2wpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlBPUlRfX05POgotCQkJCXJldHVybiBnZXRObygpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5QT1JUX19OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlBPUlRfX1BST1RPQ09MOgotCQkJCXJldHVybiBnZXRQcm90b2NvbCgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuUE9SVF9fTk86Ci0JCQkJc2V0Tm8oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5QT1JUX19OQU1FOgotCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5QT1JUX19QUk9UT0NPTDoKLQkJCQlzZXRQcm90b2NvbCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5QT1JUX19OTzoKLQkJCQlzZXRObyhOT19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5QT1JUX19OQU1FOgotCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5QT1JUX19QUk9UT0NPTDoKLQkJCQlzZXRQcm90b2NvbChQUk9UT0NPTF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlBPUlRfX05POgotCQkJCXJldHVybiBOT19FREVGQVVMVCA9PSBudWxsID8gbm8gIT0gbnVsbCA6ICFOT19FREVGQVVMVC5lcXVhbHMobm8pOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5QT1JUX19OQU1FOgotCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlBPUlRfX1BST1RPQ09MOgotCQkJCXJldHVybiBQUk9UT0NPTF9FREVGQVVMVCA9PSBudWxsID8gcHJvdG9jb2wgIT0gbnVsbCA6ICFQUk9UT0NPTF9FREVGQVVMVC5lcXVhbHMocHJvdG9jb2wpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobm86ICIpOwotCQlyZXN1bHQuYXBwZW5kKG5vKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBuYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChuYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwcm90b2NvbDogIik7Ci0JCXJlc3VsdC5hcHBlbmQocHJvdG9jb2wpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Qb3J0SW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9pbXBsL1Byb2plY3RJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvaW50ZXJuYWwvc2VydmVydHlwZS9kZWZpbml0aW9uL2ltcGwvUHJvamVjdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTE2OGYzZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvaW50ZXJuYWwvc2VydmVydHlwZS9kZWZpbml0aW9uL2ltcGwvUHJvamVjdEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IEV0ZXJhdGlvbiBCaWxpc2ltIEEuUy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIKAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBFVEVSQVRJT04gQS5TLiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEV0ZXJhdGlvbiBCaWxpc2ltIEEuUy4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiBldGVyYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmV0ZXJhdGlvbi5jb20vPi4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUHJvamVjdEltcGwuamF2YSx2IDEuNCAyMDA1LzA4LzMwIDIxOjQ1OjE5IGdlcmNhbiBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJUeXBlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlByb2plY3Q7Ci0KLQotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qcm9qZWN0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuUHJvamVjdEltcGwjZ2V0Q2xhc3NwYXRoUmVmZXJlbmNlIDxlbT5DbGFzc3BhdGggUmVmZXJlbmNlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUHJvamVjdEltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFByb2plY3QgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDbGFzc3BhdGhSZWZlcmVuY2UoKSA8ZW0+Q2xhc3NwYXRoIFJlZmVyZW5jZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2xhc3NwYXRoUmVmZXJlbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU1BBVEhfUkVGRVJFTkNFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENsYXNzcGF0aFJlZmVyZW5jZSgpIDxlbT5DbGFzc3BhdGggUmVmZXJlbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDbGFzc3BhdGhSZWZlcmVuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY2xhc3NwYXRoUmVmZXJlbmNlID0gQ0xBU1NQQVRIX1JFRkVSRU5DRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQcm9qZWN0SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFNlcnZlclR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRQcm9qZWN0KCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDbGFzc3BhdGhSZWZlcmVuY2UoKSB7Ci0JCXJldHVybiBjbGFzc3BhdGhSZWZlcmVuY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2xhc3NwYXRoUmVmZXJlbmNlKFN0cmluZyBuZXdDbGFzc3BhdGhSZWZlcmVuY2UpIHsKLQkJU3RyaW5nIG9sZENsYXNzcGF0aFJlZmVyZW5jZSA9IGNsYXNzcGF0aFJlZmVyZW5jZTsKLQkJY2xhc3NwYXRoUmVmZXJlbmNlID0gbmV3Q2xhc3NwYXRoUmVmZXJlbmNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTZXJ2ZXJUeXBlUGFja2FnZS5QUk9KRUNUX19DTEFTU1BBVEhfUkVGRVJFTkNFLCBvbGRDbGFzc3BhdGhSZWZlcmVuY2UsIGNsYXNzcGF0aFJlZmVyZW5jZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuUFJPSkVDVF9fQ0xBU1NQQVRIX1JFRkVSRU5DRToKLQkJCQlyZXR1cm4gZ2V0Q2xhc3NwYXRoUmVmZXJlbmNlKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5QUk9KRUNUX19DTEFTU1BBVEhfUkVGRVJFTkNFOgotCQkJCXNldENsYXNzcGF0aFJlZmVyZW5jZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5QUk9KRUNUX19DTEFTU1BBVEhfUkVGRVJFTkNFOgotCQkJCXNldENsYXNzcGF0aFJlZmVyZW5jZShDTEFTU1BBVEhfUkVGRVJFTkNFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuUFJPSkVDVF9fQ0xBU1NQQVRIX1JFRkVSRU5DRToKLQkJCQlyZXR1cm4gQ0xBU1NQQVRIX1JFRkVSRU5DRV9FREVGQVVMVCA9PSBudWxsID8gY2xhc3NwYXRoUmVmZXJlbmNlICE9IG51bGwgOiAhQ0xBU1NQQVRIX1JFRkVSRU5DRV9FREVGQVVMVC5lcXVhbHMoY2xhc3NwYXRoUmVmZXJlbmNlKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGNsYXNzcGF0aFJlZmVyZW5jZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY2xhc3NwYXRoUmVmZXJlbmNlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vUHJvamVjdEltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9pbnRlcm5hbC9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vaW1wbC9Qcm9wZXJ0eUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9pbnRlcm5hbC9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vaW1wbC9Qcm9wZXJ0eUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzYwOGZkZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvaW50ZXJuYWwvc2VydmVydHlwZS9kZWZpbml0aW9uL2ltcGwvUHJvcGVydHlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTcgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBFdGVyYXRpb24gQmlsaXNpbSBBLlMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiCgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgRVRFUkFUSU9OIEEuUy4gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBFdGVyYXRpb24gQmlsaXNpbSBBLlMuICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gZXRlcmF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5ldGVyYXRpb24uY29tLz4uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFByb3BlcnR5SW1wbC5qYXZhLHYgMS41IDIwMDUvMDgvMzAgMjE6NDU6MTkgZ2VyY2FuIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJUeXBlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlByb3BlcnR5OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyUnVudGltZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJvcGVydHk8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5Qcm9wZXJ0eUltcGwjZ2V0Q29udGV4dCA8ZW0+Q29udGV4dDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLlByb3BlcnR5SW1wbCNnZXREZWZhdWx0IDxlbT5EZWZhdWx0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuUHJvcGVydHlJbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLlByb3BlcnR5SW1wbCNnZXRMYWJlbCA8ZW0+TGFiZWw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5Qcm9wZXJ0eUltcGwjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFByb3BlcnR5SW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgUHJvcGVydHkgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb250ZXh0KCkgPGVtPkNvbnRleHQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvbnRleHQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFWFRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29udGV4dCgpIDxlbT5Db250ZXh0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb250ZXh0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbnRleHQgPSBDT05URVhUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlZmF1bHQoKSA8ZW0+RGVmYXVsdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVmYXVsdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZWZhdWx0KCkgPGVtPkRlZmF1bHQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlZmF1bHQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdF8gPSBERUZBVUxUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGlkID0gSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGFiZWwoKSA8ZW0+TGFiZWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExhYmVsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMQUJFTF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMYWJlbCgpIDxlbT5MYWJlbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGFiZWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbGFiZWwgPSBMQUJFTF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlKCkgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZSgpIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHR5cGUgPSBUWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFByb3BlcnR5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFNlcnZlclR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRQcm9wZXJ0eSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGV4dCgpIHsKLQkJcmV0dXJuIGNvbnRleHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29udGV4dChTdHJpbmcgbmV3Q29udGV4dCkgewotCQlTdHJpbmcgb2xkQ29udGV4dCA9IGNvbnRleHQ7Ci0JCWNvbnRleHQgPSBuZXdDb250ZXh0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTZXJ2ZXJUeXBlUGFja2FnZS5QUk9QRVJUWV9fQ09OVEVYVCwgb2xkQ29udGV4dCwgY29udGV4dCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIGRlZmF1bHRfOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHQoU3RyaW5nIG5ld0RlZmF1bHQpIHsKLQkJU3RyaW5nIG9sZERlZmF1bHQgPSBkZWZhdWx0XzsKLQkJZGVmYXVsdF8gPSBuZXdEZWZhdWx0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTZXJ2ZXJUeXBlUGFja2FnZS5QUk9QRVJUWV9fREVGQVVMVCwgb2xkRGVmYXVsdCwgZGVmYXVsdF8pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKSB7Ci0JCVN0cmluZyBvbGRJZCA9IGlkOwotCQlpZCA9IG5ld0lkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTZXJ2ZXJUeXBlUGFja2FnZS5QUk9QRVJUWV9fSUQsIG9sZElkLCBpZCkpOwotCX0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogbGFiZWxzIHN1cHBvcnQgIiUiIG5scyBzdXBwb3J0IGZyb20gdGhlIHBsdWdpbi54bWwKLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgICAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCWlmKGxhYmVsLnN0YXJ0c1dpdGgoIiUiLDApKQotCQl7Ci0JCQlTZXJ2ZXJSdW50aW1lIHJ0ID0gKFNlcnZlclJ1bnRpbWUpZVJlc291cmNlKCkuZ2V0Q29udGVudHMoKS5nZXQoMCk7Ci0JCQlCdW5kbGUgYnVuZGxlID1QbGF0Zm9ybS5nZXRCdW5kbGUocnQuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnROYW1lc3BhY2UoKSk7Ci0JCQlyZXR1cm4gUGxhdGZvcm0uZ2V0UmVzb3VyY2VTdHJpbmcoYnVuZGxlLGxhYmVsKTsKLQkJfQotCQlyZXR1cm4gbGFiZWw7Ci0gICAgfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoU3RyaW5nIG5ld0xhYmVsKSB7Ci0JCVN0cmluZyBvbGRMYWJlbCA9IGxhYmVsOwotCQlsYWJlbCA9IG5ld0xhYmVsOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTZXJ2ZXJUeXBlUGFja2FnZS5QUk9QRVJUWV9fTEFCRUwsIG9sZExhYmVsLCBsYWJlbCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgbmV3VHlwZSkgewotCQlTdHJpbmcgb2xkVHlwZSA9IHR5cGU7Ci0JCXR5cGUgPSBuZXdUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTZXJ2ZXJUeXBlUGFja2FnZS5QUk9QRVJUWV9fVFlQRSwgb2xkVHlwZSwgdHlwZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuUFJPUEVSVFlfX0NPTlRFWFQ6Ci0JCQkJcmV0dXJuIGdldENvbnRleHQoKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuUFJPUEVSVFlfX0RFRkFVTFQ6Ci0JCQkJcmV0dXJuIGdldERlZmF1bHQoKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuUFJPUEVSVFlfX0lEOgotCQkJCXJldHVybiBnZXRJZCgpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5QUk9QRVJUWV9fTEFCRUw6Ci0JCQkJcmV0dXJuIGdldExhYmVsKCk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlBST1BFUlRZX19UWVBFOgotCQkJCXJldHVybiBnZXRUeXBlKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5QUk9QRVJUWV9fQ09OVEVYVDoKLQkJCQlzZXRDb250ZXh0KChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuUFJPUEVSVFlfX0RFRkFVTFQ6Ci0JCQkJc2V0RGVmYXVsdCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlBST1BFUlRZX19JRDoKLQkJCQlzZXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlBST1BFUlRZX19MQUJFTDoKLQkJCQlzZXRMYWJlbCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlBST1BFUlRZX19UWVBFOgotCQkJCXNldFR5cGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuUFJPUEVSVFlfX0NPTlRFWFQ6Ci0JCQkJc2V0Q29udGV4dChDT05URVhUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlBST1BFUlRZX19ERUZBVUxUOgotCQkJCXNldERlZmF1bHQoREVGQVVMVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5QUk9QRVJUWV9fSUQ6Ci0JCQkJc2V0SWQoSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuUFJPUEVSVFlfX0xBQkVMOgotCQkJCXNldExhYmVsKExBQkVMX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlBST1BFUlRZX19UWVBFOgotCQkJCXNldFR5cGUoVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlBST1BFUlRZX19DT05URVhUOgotCQkJCXJldHVybiBDT05URVhUX0VERUZBVUxUID09IG51bGwgPyBjb250ZXh0ICE9IG51bGwgOiAhQ09OVEVYVF9FREVGQVVMVC5lcXVhbHMoY29udGV4dCk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlBST1BFUlRZX19ERUZBVUxUOgotCQkJCXJldHVybiBERUZBVUxUX0VERUZBVUxUID09IG51bGwgPyBkZWZhdWx0XyAhPSBudWxsIDogIURFRkFVTFRfRURFRkFVTFQuZXF1YWxzKGRlZmF1bHRfKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuUFJPUEVSVFlfX0lEOgotCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaWQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaWQpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5QUk9QRVJUWV9fTEFCRUw6Ci0JCQkJcmV0dXJuIExBQkVMX0VERUZBVUxUID09IG51bGwgPyBsYWJlbCAhPSBudWxsIDogIUxBQkVMX0VERUZBVUxULmVxdWFscyhsYWJlbCk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlBST1BFUlRZX19UWVBFOgotCQkJCXJldHVybiBUWVBFX0VERUZBVUxUID09IG51bGwgPyB0eXBlICE9IG51bGwgOiAhVFlQRV9FREVGQVVMVC5lcXVhbHModHlwZSk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChjb250ZXh0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjb250ZXh0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkZWZhdWx0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkZWZhdWx0Xyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaWQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGlkKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBsYWJlbDogIik7Ci0JCXJlc3VsdC5hcHBlbmQobGFiZWwpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHR5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Qcm9wZXJ0eUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9pbnRlcm5hbC9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vaW1wbC9QdWJsaXNoZXJEYXRhSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9pbXBsL1B1Ymxpc2hlckRhdGFJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmNDI4NGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9pbXBsL1B1Ymxpc2hlckRhdGFJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTkgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBQdWJsaXNoZXJEYXRhSW1wbC5qYXZhLHYgMS40IDIwMDUvMDgvMzAgMjE6NDU6MTkgZ2VyY2FuIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUHVibGlzaGVyRGF0YTsKLQotCi0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlB1Ymxpc2hlciBEYXRhPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuUHVibGlzaGVyRGF0YUltcGwjZ2V0RGF0YW5hbWUgPGVtPkRhdGFuYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuUHVibGlzaGVyRGF0YUltcGwjZ2V0RGF0YXZhbHVlIDxlbT5EYXRhdmFsdWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQdWJsaXNoZXJEYXRhSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgUHVibGlzaGVyRGF0YSB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERhdGFuYW1lKCkgPGVtPkRhdGFuYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREYXRhbmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFUQU5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGF0YW5hbWUoKSA8ZW0+RGF0YW5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERhdGFuYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGRhdGFuYW1lID0gREFUQU5BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGF0YXZhbHVlKCkgPGVtPkRhdGF2YWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGF0YXZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRBVkFMVUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGF0YXZhbHVlKCkgPGVtPkRhdGF2YWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGF0YXZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGRhdGF2YWx1ZSA9IERBVEFWQUxVRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHByb3RlY3RlZCBQdWJsaXNoZXJEYXRhSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFNlcnZlclR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRQdWJsaXNoZXJEYXRhKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIFN0cmluZyBnZXREYXRhbmFtZSgpIHsKLQkJcmV0dXJuIGRhdGFuYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyB2b2lkIHNldERhdGFuYW1lKFN0cmluZyBuZXdEYXRhbmFtZSkgewotCQlTdHJpbmcgb2xkRGF0YW5hbWUgPSBkYXRhbmFtZTsKLQkJZGF0YW5hbWUgPSBuZXdEYXRhbmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgU2VydmVyVHlwZVBhY2thZ2UuUFVCTElTSEVSX0RBVEFfX0RBVEFOQU1FLCBvbGREYXRhbmFtZSwgZGF0YW5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldERhdGF2YWx1ZSgpIHsKLQkJcmV0dXJuIGRhdGF2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREYXRhdmFsdWUoU3RyaW5nIG5ld0RhdGF2YWx1ZSkgewotCQlTdHJpbmcgb2xkRGF0YXZhbHVlID0gZGF0YXZhbHVlOwotCQlkYXRhdmFsdWUgPSBuZXdEYXRhdmFsdWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFNlcnZlclR5cGVQYWNrYWdlLlBVQkxJU0hFUl9EQVRBX19EQVRBVkFMVUUsIG9sZERhdGF2YWx1ZSwgZGF0YXZhbHVlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5QVUJMSVNIRVJfREFUQV9fREFUQU5BTUU6Ci0JCQkJcmV0dXJuIGdldERhdGFuYW1lKCk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlBVQkxJU0hFUl9EQVRBX19EQVRBVkFMVUU6Ci0JCQkJcmV0dXJuIGdldERhdGF2YWx1ZSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuUFVCTElTSEVSX0RBVEFfX0RBVEFOQU1FOgotCQkJCXNldERhdGFuYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuUFVCTElTSEVSX0RBVEFfX0RBVEFWQUxVRToKLQkJCQlzZXREYXRhdmFsdWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuUFVCTElTSEVSX0RBVEFfX0RBVEFOQU1FOgotCQkJCXNldERhdGFuYW1lKERBVEFOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlBVQkxJU0hFUl9EQVRBX19EQVRBVkFMVUU6Ci0JCQkJc2V0RGF0YXZhbHVlKERBVEFWQUxVRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlBVQkxJU0hFUl9EQVRBX19EQVRBTkFNRToKLQkJCQlyZXR1cm4gREFUQU5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IGRhdGFuYW1lICE9IG51bGwgOiAhREFUQU5BTUVfRURFRkFVTFQuZXF1YWxzKGRhdGFuYW1lKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuUFVCTElTSEVSX0RBVEFfX0RBVEFWQUxVRToKLQkJCQlyZXR1cm4gREFUQVZBTFVFX0VERUZBVUxUID09IG51bGwgPyBkYXRhdmFsdWUgIT0gbnVsbCA6ICFEQVRBVkFMVUVfRURFRkFVTFQuZXF1YWxzKGRhdGF2YWx1ZSk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChkYXRhbmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGF0YW5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGRhdGF2YWx1ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGF0YXZhbHVlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vUHVibGlzaGVyRGF0YUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9pbnRlcm5hbC9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vaW1wbC9QdWJsaXNoZXJJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvaW50ZXJuYWwvc2VydmVydHlwZS9kZWZpbml0aW9uL2ltcGwvUHVibGlzaGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTQzOWE3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9pbnRlcm5hbC9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vaW1wbC9QdWJsaXNoZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzEgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBFdGVyYXRpb24gQmlsaXNpbSBBLlMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiCgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgRVRFUkFUSU9OIEEuUy4gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBFdGVyYXRpb24gQmlsaXNpbSBBLlMuICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gZXRlcmF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5ldGVyYXRpb24uY29tLz4uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFB1Ymxpc2hlckltcGwuamF2YSx2IDEuNiAyMDA1LzA4LzMwIDIxOjQ1OjE3IGdlcmNhbiBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5CYXNpY0ZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5QdWJsaXNoZXI7Ci0KLQotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QdWJsaXNoZXI8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5QdWJsaXNoZXJJbXBsI2dldEdyb3VwIDxlbT5Hcm91cDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLlB1Ymxpc2hlckltcGwjZ2V0UHVibGlzaGVyZGF0YSA8ZW0+UHVibGlzaGVyZGF0YTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLlB1Ymxpc2hlckltcGwjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUHVibGlzaGVySW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgUHVibGlzaGVyIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cCgpIDxlbT5Hcm91cDwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHcm91cCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gICAgcHJvdGVjdGVkIEZlYXR1cmVNYXAgZ3JvdXAgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGlkID0gSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUHVibGlzaGVySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFNlcnZlclR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRQdWJsaXNoZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgRmVhdHVyZU1hcCBnZXRHcm91cCgpIHsKLQkJaWYgKGdyb3VwID09IG51bGwpIHsKLQkJCWdyb3VwID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBTZXJ2ZXJUeXBlUGFja2FnZS5QVUJMSVNIRVJfX0dST1VQKTsKLQkJfQotCQlyZXR1cm4gZ3JvdXA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIExpc3QgZ2V0UHVibGlzaGVyZGF0YSgpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcClnZXRHcm91cCgpKS5saXN0KFNlcnZlclR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRQdWJsaXNoZXJfUHVibGlzaGVyZGF0YSgpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKSB7Ci0JCVN0cmluZyBvbGRJZCA9IGlkOwotCQlpZCA9IG5ld0lkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTZXJ2ZXJUeXBlUGFja2FnZS5QVUJMSVNIRVJfX0lELCBvbGRJZCwgaWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlBVQkxJU0hFUl9fR1JPVVA6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0R3JvdXAoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuUFVCTElTSEVSX19QVUJMSVNIRVJEQVRBOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFB1Ymxpc2hlcmRhdGEoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5QVUJMSVNIRVJfX0dST1VQOgotCQkJCXJldHVybiBnZXRHcm91cCgpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5QVUJMSVNIRVJfX1BVQkxJU0hFUkRBVEE6Ci0JCQkJcmV0dXJuIGdldFB1Ymxpc2hlcmRhdGEoKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuUFVCTElTSEVSX19JRDoKLQkJCQlyZXR1cm4gZ2V0SWQoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlBVQkxJU0hFUl9fR1JPVVA6Ci0JCQkJZ2V0R3JvdXAoKS5jbGVhcigpOwotCQkJCWdldEdyb3VwKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlBVQkxJU0hFUl9fUFVCTElTSEVSREFUQToKLQkJCQlnZXRQdWJsaXNoZXJkYXRhKCkuY2xlYXIoKTsKLQkJCQlnZXRQdWJsaXNoZXJkYXRhKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlBVQkxJU0hFUl9fSUQ6Ci0JCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuUFVCTElTSEVSX19HUk9VUDoKLQkJCQlnZXRHcm91cCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5QVUJMSVNIRVJfX1BVQkxJU0hFUkRBVEE6Ci0JCQkJZ2V0UHVibGlzaGVyZGF0YSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5QVUJMSVNIRVJfX0lEOgotCQkJCXNldElkKElEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuUFVCTElTSEVSX19HUk9VUDoKLQkJCQlyZXR1cm4gZ3JvdXAgIT0gbnVsbCAmJiAhZ3JvdXAuaXNFbXB0eSgpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5QVUJMSVNIRVJfX1BVQkxJU0hFUkRBVEE6Ci0JCQkJcmV0dXJuICFnZXRQdWJsaXNoZXJkYXRhKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5QVUJMSVNIRVJfX0lEOgotCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaWQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaWQpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZ3JvdXA6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGdyb3VwKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpZDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoaWQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9QdWJsaXNoZXJJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvaW50ZXJuYWwvc2VydmVydHlwZS9kZWZpbml0aW9uL2ltcGwvU2VydmVyUnVudGltZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9pbnRlcm5hbC9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vaW1wbC9TZXJ2ZXJSdW50aW1lSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDk4YmY5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9pbnRlcm5hbC9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vaW1wbC9TZXJ2ZXJSdW50aW1lSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTY5ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgRXRlcmF0aW9uIEJpbGlzaW0gQS5TLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4goCBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEVURVJBVElPTiBBLlMuIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgRXRlcmF0aW9uIEJpbGlzaW0gQS5TLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIGV0ZXJhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuZXRlcmF0aW9uLmNvbS8+LgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBTZXJ2ZXJSdW50aW1lSW1wbC5qYXZhLHYgMS42IDIwMDUvMDgvMzAgMjE6NDU6MTkgZ2VyY2FuIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5KbmRpQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC54bWwuUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5DbGFzc3BhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5MYXVuY2hDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlB1Ymxpc2hlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclJ1bnRpbWU7Ci0KLQotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TZXJ2ZXIgUnVudGltZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLlNlcnZlclJ1bnRpbWVJbXBsI2dldEdyb3VwIDxlbT5Hcm91cDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLlNlcnZlclJ1bnRpbWVJbXBsI2dldFByb3BlcnR5IDxlbT5Qcm9wZXJ0eTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLlNlcnZlclJ1bnRpbWVJbXBsI2dldEdyb3VwMSA8ZW0+R3JvdXAxPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuU2VydmVyUnVudGltZUltcGwjZ2V0UG9ydCA8ZW0+UG9ydDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLlNlcnZlclJ1bnRpbWVJbXBsI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuU2VydmVyUnVudGltZUltcGwjZ2V0TW9kdWxlIDxlbT5Nb2R1bGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5TZXJ2ZXJSdW50aW1lSW1wbCNnZXRQcm9qZWN0IDxlbT5Qcm9qZWN0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuU2VydmVyUnVudGltZUltcGwjZ2V0U3RhcnQgPGVtPlN0YXJ0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuU2VydmVyUnVudGltZUltcGwjZ2V0U3RvcCA8ZW0+U3RvcDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLlNlcnZlclJ1bnRpbWVJbXBsI2dldEdyb3VwMyA8ZW0+R3JvdXAzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuU2VydmVyUnVudGltZUltcGwjZ2V0UHVibGlzaGVyIDxlbT5QdWJsaXNoZXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5TZXJ2ZXJSdW50aW1lSW1wbCNnZXRHcm91cDQgPGVtPkdyb3VwNDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLlNlcnZlclJ1bnRpbWVJbXBsI2dldENsYXNzcGF0aCA8ZW0+Q2xhc3NwYXRoPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLmltcGwuU2VydmVyUnVudGltZUltcGwjZ2V0Sm5kaUNvbm5lY3Rpb24gPGVtPkpuZGkgQ29ubmVjdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLlNlcnZlclJ1bnRpbWVJbXBsI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbC5TZXJ2ZXJSdW50aW1lSW1wbCNnZXRWZXJzaW9uIDxlbT5WZXJzaW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU2VydmVyUnVudGltZUltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFNlcnZlclJ1bnRpbWUgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdyb3VwKCkgPGVtPkdyb3VwPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdyb3VwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICBwcm90ZWN0ZWQgRmVhdHVyZU1hcCBncm91cCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cDEoKSA8ZW0+R3JvdXAxPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdyb3VwMSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gICAgcHJvdGVjdGVkIEZlYXR1cmVNYXAgZ3JvdXAxID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdyb3VwMigpIDxlbT5Hcm91cDI8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R3JvdXAyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICBwcm90ZWN0ZWQgRmVhdHVyZU1hcCBncm91cDIgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJvamVjdCgpIDxlbT5Qcm9qZWN0PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUHJvamVjdCBwcm9qZWN0ID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0YXJ0KCkgPGVtPlN0YXJ0PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdGFydCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIExhdW5jaENvbmZpZ3VyYXRpb24gc3RhcnQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RvcCgpIDxlbT5TdG9wPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdG9wKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGF1bmNoQ29uZmlndXJhdGlvbiBzdG9wID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdyb3VwMygpIDxlbT5Hcm91cDM8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R3JvdXAzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICBwcm90ZWN0ZWQgRmVhdHVyZU1hcCBncm91cDMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3JvdXA0KCkgPGVtPkdyb3VwNDwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHcm91cDQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICAgIHByb3RlY3RlZCBGZWF0dXJlTWFwIGdyb3VwNCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRKbmRpQ29ubmVjdGlvbigpIDxlbT5KbmRpIENvbm5lY3Rpb248L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEpuZGlDb25uZWN0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICBwcm90ZWN0ZWQgSm5kaUNvbm5lY3Rpb24gam5kaUNvbm5lY3Rpb24gPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmVyc2lvbigpIDxlbT5WZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWZXJzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZlcnNpb24oKSA8ZW0+VmVyc2lvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmVyc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB2ZXJzaW9uID0gVkVSU0lPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdyb3VwKCkgPGVtPkdyb3VwPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdyb3VwKCkKLQkgKiBAZ2VuZXJhdGVkIE5PVAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBmaWxlbmFtZSA9IG51bGw7Ci0JCi0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cCgpIDxlbT5Hcm91cDwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHcm91cCgpCi0JICogQGdlbmVyYXRlZCBOT1QKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBSZXNvbHZlciByZXNvbHZlciA9IG5ldyBSZXNvbHZlcih0aGlzKTsKLQlwcml2YXRlIFN0cmluZyBkZWNsYXJpbmdDb25maWd1cmF0aW9uRWxlbWVudE5hbWVzcGFjZTsKLSAgICBwcml2YXRlIFN0cmluZyBpZCA9bnVsbDsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU2VydmVyUnVudGltZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBTZXJ2ZXJUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmVyUnVudGltZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBGZWF0dXJlTWFwIGdldEdyb3VwKCkgewotCQlpZiAoZ3JvdXAgPT0gbnVsbCkgewotCQkJZ3JvdXAgPSBuZXcgQmFzaWNGZWF0dXJlTWFwKHRoaXMsIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19HUk9VUCk7Ci0JCX0KLQkJcmV0dXJuIGdyb3VwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBMaXN0IGdldFByb3BlcnR5KCkgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwKWdldEdyb3VwKCkpLmxpc3QoU2VydmVyVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZlclJ1bnRpbWVfUHJvcGVydHkoKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIEZlYXR1cmVNYXAgZ2V0R3JvdXAxKCkgewotCQlpZiAoZ3JvdXAxID09IG51bGwpIHsKLQkJCWdyb3VwMSA9IG5ldyBCYXNpY0ZlYXR1cmVNYXAodGhpcywgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX0dST1VQMSk7Ci0JCX0KLQkJcmV0dXJuIGdyb3VwMTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgTGlzdCBnZXRQb3J0KCkgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwKWdldEdyb3VwMSgpKS5saXN0KFNlcnZlclR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2ZXJSdW50aW1lX1BvcnQoKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIEZlYXR1cmVNYXAgZ2V0R3JvdXAyKCkgewotCQlpZiAoZ3JvdXAyID09IG51bGwpIHsKLQkJCWdyb3VwMiA9IG5ldyBCYXNpY0ZlYXR1cmVNYXAodGhpcywgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX0dST1VQMik7Ci0JCX0KLQkJcmV0dXJuIGdyb3VwMjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgTGlzdCBnZXRNb2R1bGUoKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXApZ2V0R3JvdXAyKCkpLmxpc3QoU2VydmVyVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZlclJ1bnRpbWVfTW9kdWxlKCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0JCXJldHVybiBwcm9qZWN0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFByb2plY3QoUHJvamVjdCBuZXdQcm9qZWN0LCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCVByb2plY3Qgb2xkUHJvamVjdCA9IHByb2plY3Q7Ci0JCXByb2plY3QgPSBuZXdQcm9qZWN0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fUFJPSkVDVCwgb2xkUHJvamVjdCwgbmV3UHJvamVjdCk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvamVjdChQcm9qZWN0IG5ld1Byb2plY3QpIHsKLQkJaWYgKG5ld1Byb2plY3QgIT0gcHJvamVjdCkgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocHJvamVjdCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClwcm9qZWN0KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX1BST0pFQ1QsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1Byb2plY3QgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3UHJvamVjdCkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19QUk9KRUNULCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFByb2plY3QobmV3UHJvamVjdCwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fUFJPSkVDVCwgbmV3UHJvamVjdCwgbmV3UHJvamVjdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMYXVuY2hDb25maWd1cmF0aW9uIGdldFN0YXJ0KCkgewotCQlyZXR1cm4gc3RhcnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0U3RhcnQoTGF1bmNoQ29uZmlndXJhdGlvbiBuZXdTdGFydCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlMYXVuY2hDb25maWd1cmF0aW9uIG9sZFN0YXJ0ID0gc3RhcnQ7Ci0JCXN0YXJ0ID0gbmV3U3RhcnQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19TVEFSVCwgb2xkU3RhcnQsIG5ld1N0YXJ0KTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdGFydChMYXVuY2hDb25maWd1cmF0aW9uIG5ld1N0YXJ0KSB7Ci0JCWlmIChuZXdTdGFydCAhPSBzdGFydCkgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoc3RhcnQgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3Qpc3RhcnQpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fU1RBUlQsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1N0YXJ0ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1N0YXJ0KS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX1NUQVJULCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFN0YXJ0KG5ld1N0YXJ0LCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19TVEFSVCwgbmV3U3RhcnQsIG5ld1N0YXJ0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExhdW5jaENvbmZpZ3VyYXRpb24gZ2V0U3RvcCgpIHsKLQkJcmV0dXJuIHN0b3A7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0U3RvcChMYXVuY2hDb25maWd1cmF0aW9uIG5ld1N0b3AsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJTGF1bmNoQ29uZmlndXJhdGlvbiBvbGRTdG9wID0gc3RvcDsKLQkJc3RvcCA9IG5ld1N0b3A7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19TVE9QLCBvbGRTdG9wLCBuZXdTdG9wKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdG9wKExhdW5jaENvbmZpZ3VyYXRpb24gbmV3U3RvcCkgewotCQlpZiAobmV3U3RvcCAhPSBzdG9wKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChzdG9wICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXN0b3ApLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fU1RPUCwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3U3RvcCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdTdG9wKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX1NUT1AsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0U3RvcChuZXdTdG9wLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19TVE9QLCBuZXdTdG9wLCBuZXdTdG9wKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIEZlYXR1cmVNYXAgZ2V0R3JvdXAzKCkgewotCQlpZiAoZ3JvdXAzID09IG51bGwpIHsKLQkJCWdyb3VwMyA9IG5ldyBCYXNpY0ZlYXR1cmVNYXAodGhpcywgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX0dST1VQMyk7Ci0JCX0KLQkJcmV0dXJuIGdyb3VwMzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgTGlzdCBnZXRQdWJsaXNoZXIoKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXApZ2V0R3JvdXAzKCkpLmxpc3QoU2VydmVyVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZlclJ1bnRpbWVfUHVibGlzaGVyKCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBGZWF0dXJlTWFwIGdldEdyb3VwNCgpIHsKLQkJaWYgKGdyb3VwNCA9PSBudWxsKSB7Ci0JCQlncm91cDQgPSBuZXcgQmFzaWNGZWF0dXJlTWFwKHRoaXMsIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19HUk9VUDQpOwotCQl9Ci0JCXJldHVybiBncm91cDQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIExpc3QgZ2V0Q2xhc3NwYXRoKCkgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwKWdldEdyb3VwNCgpKS5saXN0KFNlcnZlclR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2ZXJSdW50aW1lX0NsYXNzcGF0aCgpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgSm5kaUNvbm5lY3Rpb24gZ2V0Sm5kaUNvbm5lY3Rpb24oKSB7Ci0JCXJldHVybiBqbmRpQ29ubmVjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRKbmRpQ29ubmVjdGlvbihKbmRpQ29ubmVjdGlvbiBuZXdKbmRpQ29ubmVjdGlvbiwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlKbmRpQ29ubmVjdGlvbiBvbGRKbmRpQ29ubmVjdGlvbiA9IGpuZGlDb25uZWN0aW9uOwotCQlqbmRpQ29ubmVjdGlvbiA9IG5ld0puZGlDb25uZWN0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fSk5ESV9DT05ORUNUSU9OLCBvbGRKbmRpQ29ubmVjdGlvbiwgbmV3Sm5kaUNvbm5lY3Rpb24pOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyB2b2lkIHNldEpuZGlDb25uZWN0aW9uKEpuZGlDb25uZWN0aW9uIG5ld0puZGlDb25uZWN0aW9uKSB7Ci0JCWlmIChuZXdKbmRpQ29ubmVjdGlvbiAhPSBqbmRpQ29ubmVjdGlvbikgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoam5kaUNvbm5lY3Rpb24gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3Qpam5kaUNvbm5lY3Rpb24pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fSk5ESV9DT05ORUNUSU9OLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdKbmRpQ29ubmVjdGlvbiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdKbmRpQ29ubmVjdGlvbikuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19KTkRJX0NPTk5FQ1RJT04sIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0Sm5kaUNvbm5lY3Rpb24obmV3Sm5kaUNvbm5lY3Rpb24sIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX0pORElfQ09OTkVDVElPTiwgbmV3Sm5kaUNvbm5lY3Rpb24sIG5ld0puZGlDb25uZWN0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCVN0cmluZyBvbGROYW1lID0gbmFtZTsKLQkJbmFtZSA9IG5ld05hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCkgewotCQlyZXR1cm4gdmVyc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWZXJzaW9uKFN0cmluZyBuZXdWZXJzaW9uKSB7Ci0JCVN0cmluZyBvbGRWZXJzaW9uID0gdmVyc2lvbjsKLQkJdmVyc2lvbiA9IG5ld1ZlcnNpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19WRVJTSU9OLCBvbGRWZXJzaW9uLCB2ZXJzaW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fR1JPVVA6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0R3JvdXAoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX1BST1BFUlRZOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFByb3BlcnR5KCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19HUk9VUDE6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0R3JvdXAxKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19QT1JUOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFBvcnQoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX0dST1VQMjoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRHcm91cDIoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX01PRFVMRToKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRNb2R1bGUoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX1BST0pFQ1Q6Ci0JCQkJCXJldHVybiBiYXNpY1NldFByb2plY3QobnVsbCwgbXNncyk7Ci0JCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fU1RBUlQ6Ci0JCQkJCXJldHVybiBiYXNpY1NldFN0YXJ0KG51bGwsIG1zZ3MpOwotCQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX1NUT1A6Ci0JCQkJCXJldHVybiBiYXNpY1NldFN0b3AobnVsbCwgbXNncyk7Ci0JCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fR1JPVVAzOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEdyb3VwMygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fUFVCTElTSEVSOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFB1Ymxpc2hlcigpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fR1JPVVA0OgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEdyb3VwNCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fQ0xBU1NQQVRIOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldENsYXNzcGF0aCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fSk5ESV9DT05ORUNUSU9OOgotCQkJCQlyZXR1cm4gYmFzaWNTZXRKbmRpQ29ubmVjdGlvbihudWxsLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX0dST1VQOgotCQkJCXJldHVybiBnZXRHcm91cCgpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fUFJPUEVSVFk6Ci0JCQkJcmV0dXJuIGdldFByb3BlcnR5KCk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19HUk9VUDE6Ci0JCQkJcmV0dXJuIGdldEdyb3VwMSgpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fUE9SVDoKLQkJCQlyZXR1cm4gZ2V0UG9ydCgpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fR1JPVVAyOgotCQkJCXJldHVybiBnZXRHcm91cDIoKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX01PRFVMRToKLQkJCQlyZXR1cm4gZ2V0TW9kdWxlKCk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19QUk9KRUNUOgotCQkJCXJldHVybiBnZXRQcm9qZWN0KCk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19TVEFSVDoKLQkJCQlyZXR1cm4gZ2V0U3RhcnQoKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX1NUT1A6Ci0JCQkJcmV0dXJuIGdldFN0b3AoKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX0dST1VQMzoKLQkJCQlyZXR1cm4gZ2V0R3JvdXAzKCk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19QVUJMSVNIRVI6Ci0JCQkJcmV0dXJuIGdldFB1Ymxpc2hlcigpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fR1JPVVA0OgotCQkJCXJldHVybiBnZXRHcm91cDQoKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX0NMQVNTUEFUSDoKLQkJCQlyZXR1cm4gZ2V0Q2xhc3NwYXRoKCk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19KTkRJX0NPTk5FQ1RJT046Ci0JCQkJcmV0dXJuIGdldEpuZGlDb25uZWN0aW9uKCk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19WRVJTSU9OOgotCQkJCXJldHVybiBnZXRWZXJzaW9uKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fR1JPVVA6Ci0JCQkJZ2V0R3JvdXAoKS5jbGVhcigpOwotCQkJCWdldEdyb3VwKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19QUk9QRVJUWToKLQkJCQlnZXRQcm9wZXJ0eSgpLmNsZWFyKCk7Ci0JCQkJZ2V0UHJvcGVydHkoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX0dST1VQMToKLQkJCQlnZXRHcm91cDEoKS5jbGVhcigpOwotCQkJCWdldEdyb3VwMSgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fUE9SVDoKLQkJCQlnZXRQb3J0KCkuY2xlYXIoKTsKLQkJCQlnZXRQb3J0KCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19HUk9VUDI6Ci0JCQkJZ2V0R3JvdXAyKCkuY2xlYXIoKTsKLQkJCQlnZXRHcm91cDIoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX01PRFVMRToKLQkJCQlnZXRNb2R1bGUoKS5jbGVhcigpOwotCQkJCWdldE1vZHVsZSgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fUFJPSkVDVDoKLQkJCQlzZXRQcm9qZWN0KChQcm9qZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19TVEFSVDoKLQkJCQlzZXRTdGFydCgoTGF1bmNoQ29uZmlndXJhdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fU1RPUDoKLQkJCQlzZXRTdG9wKChMYXVuY2hDb25maWd1cmF0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19HUk9VUDM6Ci0JCQkJZ2V0R3JvdXAzKCkuY2xlYXIoKTsKLQkJCQlnZXRHcm91cDMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX1BVQkxJU0hFUjoKLQkJCQlnZXRQdWJsaXNoZXIoKS5jbGVhcigpOwotCQkJCWdldFB1Ymxpc2hlcigpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fR1JPVVA0OgotCQkJCWdldEdyb3VwNCgpLmNsZWFyKCk7Ci0JCQkJZ2V0R3JvdXA0KCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19DTEFTU1BBVEg6Ci0JCQkJZ2V0Q2xhc3NwYXRoKCkuY2xlYXIoKTsKLQkJCQlnZXRDbGFzc3BhdGgoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX0pORElfQ09OTkVDVElPTjoKLQkJCQlzZXRKbmRpQ29ubmVjdGlvbigoSm5kaUNvbm5lY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX05BTUU6Ci0JCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19WRVJTSU9OOgotCQkJCXNldFZlcnNpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX0dST1VQOgotCQkJCWdldEdyb3VwKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19QUk9QRVJUWToKLQkJCQlnZXRQcm9wZXJ0eSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fR1JPVVAxOgotCQkJCWdldEdyb3VwMSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fUE9SVDoKLQkJCQlnZXRQb3J0KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19HUk9VUDI6Ci0JCQkJZ2V0R3JvdXAyKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19NT0RVTEU6Ci0JCQkJZ2V0TW9kdWxlKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19QUk9KRUNUOgotCQkJCXNldFByb2plY3QoKFByb2plY3QpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fU1RBUlQ6Ci0JCQkJc2V0U3RhcnQoKExhdW5jaENvbmZpZ3VyYXRpb24pbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fU1RPUDoKLQkJCQlzZXRTdG9wKChMYXVuY2hDb25maWd1cmF0aW9uKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX0dST1VQMzoKLQkJCQlnZXRHcm91cDMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX1BVQkxJU0hFUjoKLQkJCQlnZXRQdWJsaXNoZXIoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX0dST1VQNDoKLQkJCQlnZXRHcm91cDQoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX0NMQVNTUEFUSDoKLQkJCQlnZXRDbGFzc3BhdGgoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX0pORElfQ09OTkVDVElPTjoKLQkJCQlzZXRKbmRpQ29ubmVjdGlvbigoSm5kaUNvbm5lY3Rpb24pbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fTkFNRToKLQkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX1ZFUlNJT046Ci0JCQkJc2V0VmVyc2lvbihWRVJTSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX0dST1VQOgotCQkJCXJldHVybiBncm91cCAhPSBudWxsICYmICFncm91cC5pc0VtcHR5KCk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19QUk9QRVJUWToKLQkJCQlyZXR1cm4gIWdldFByb3BlcnR5KCkuaXNFbXB0eSgpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fR1JPVVAxOgotCQkJCXJldHVybiBncm91cDEgIT0gbnVsbCAmJiAhZ3JvdXAxLmlzRW1wdHkoKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX1BPUlQ6Ci0JCQkJcmV0dXJuICFnZXRQb3J0KCkuaXNFbXB0eSgpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fR1JPVVAyOgotCQkJCXJldHVybiBncm91cDIgIT0gbnVsbCAmJiAhZ3JvdXAyLmlzRW1wdHkoKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX01PRFVMRToKLQkJCQlyZXR1cm4gIWdldE1vZHVsZSgpLmlzRW1wdHkoKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX1BST0pFQ1Q6Ci0JCQkJcmV0dXJuIHByb2plY3QgIT0gbnVsbDsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX1NUQVJUOgotCQkJCXJldHVybiBzdGFydCAhPSBudWxsOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fU1RPUDoKLQkJCQlyZXR1cm4gc3RvcCAhPSBudWxsOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5TRVJWRVJfUlVOVElNRV9fR1JPVVAzOgotCQkJCXJldHVybiBncm91cDMgIT0gbnVsbCAmJiAhZ3JvdXAzLmlzRW1wdHkoKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX1BVQkxJU0hFUjoKLQkJCQlyZXR1cm4gIWdldFB1Ymxpc2hlcigpLmlzRW1wdHkoKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUVfX0dST1VQNDoKLQkJCQlyZXR1cm4gZ3JvdXA0ICE9IG51bGwgJiYgIWdyb3VwNC5pc0VtcHR5KCk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19DTEFTU1BBVEg6Ci0JCQkJcmV0dXJuICFnZXRDbGFzc3BhdGgoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19KTkRJX0NPTk5FQ1RJT046Ci0JCQkJcmV0dXJuIGpuZGlDb25uZWN0aW9uICE9IG51bGw7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19OQU1FOgotCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FX19WRVJTSU9OOgotCQkJCXJldHVybiBWRVJTSU9OX0VERUZBVUxUID09IG51bGwgPyB2ZXJzaW9uICE9IG51bGwgOiAhVkVSU0lPTl9FREVGQVVMVC5lcXVhbHModmVyc2lvbik7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChncm91cDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZ3JvdXApOwotCQlyZXN1bHQuYXBwZW5kKCIsIGdyb3VwMTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZ3JvdXAxKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBncm91cDI6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGdyb3VwMik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZ3JvdXAzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChncm91cDMpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGdyb3VwNDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZ3JvdXA0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBuYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChuYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB2ZXJzaW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh2ZXJzaW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkIE5PVAotCSAqLwotCXB1YmxpYyBQdWJsaXNoZXIgZ2V0UHVibGlzaGVyKFN0cmluZyBpZCkgewotCQlJdGVyYXRvciBpdGVyYXRvciA9IHRoaXMuZ2V0UHVibGlzaGVyKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJUHVibGlzaGVyIHB1Ymxpc2hlciA9IChQdWJsaXNoZXIpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmKGlkLmVxdWFscyhwdWJsaXNoZXIuZ2V0SWQoKSkpCi0JCQkJcmV0dXJuIHB1Ymxpc2hlcjsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQgTk9UCi0JICovCi0JcHVibGljIE1vZHVsZSBnZXRNb2R1bGUoU3RyaW5nIHR5cGUpIHsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSB0aGlzLmdldE1vZHVsZSgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCU1vZHVsZSBtb2R1bGUgPSAoTW9kdWxlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZih0eXBlLmVxdWFscyhtb2R1bGUuZ2V0VHlwZSgpKSkKLQkJCQlyZXR1cm4gbW9kdWxlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZCBOT1QKLQkgKi8KLQlwdWJsaWMgQ2xhc3NwYXRoIGdldENsYXNzcGF0aChTdHJpbmcgcmVmKSB7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gdGhpcy5nZXRDbGFzc3BhdGgoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlDbGFzc3BhdGggY3AgPSAoQ2xhc3NwYXRoKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZihyZWYuZXF1YWxzKGNwLmdldElkKCkpKQotCQkJCXJldHVybiBjcDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQgTk9UCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGaWxlbmFtZSgpIHsKLQkJcmV0dXJuIGZpbGVuYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZCBOT1QKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWxlbmFtZShTdHJpbmcgZm4pIHsKLQkJdGhpcy5maWxlbmFtZSA9IGZuOwkJCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkIE5PVAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb3BlcnR5VmFsdWVzKE1hcCBwcm9wZXJ0aWVzKSB7Ci0JCXRoaXMucmVzb2x2ZXIuc2V0UHJvcGVydHlWYWx1ZXMocHJvcGVydGllcyk7Ci0JCQotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQgTk9UCi0JICovCi0JcHVibGljIFJlc29sdmVyIGdldFJlc29sdmVyKCkgewotCQlyZXR1cm4gdGhpcy5yZXNvbHZlcjsKLQl9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclJ1bnRpbWUjZ2V0RGVjbGFyaW5nQnVuZGxlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldENvbmZpZ3VyYXRpb25FbGVtZW50TmFtZXNwYWNlKCkgewotICAgICAgICAgICByZXR1cm4gZGVjbGFyaW5nQ29uZmlndXJhdGlvbkVsZW1lbnROYW1lc3BhY2U7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJSdW50aW1lI3NldENvbmZpZ3VyYXRpb25FbGVtZW50TmFtZXNwYWNlKGphdmEubGFuZy5TdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q29uZmlndXJhdGlvbkVsZW1lbnROYW1lc3BhY2UoU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICB0aGlzLmRlY2xhcmluZ0NvbmZpZ3VyYXRpb25FbGVtZW50TmFtZXNwYWNlPW5hbWVzcGFjZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldElkKCkgewotICAgICAgICByZXR1cm4gaWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIGlkKSB7Ci0gICAgICAgIHRoaXMuaWQgPSBpZDsKLSAgICAgICAgCi0gICAgfQotCQotCQotfSAvL1NlcnZlclJ1bnRpbWVJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvaW50ZXJuYWwvc2VydmVydHlwZS9kZWZpbml0aW9uL2ltcGwvU2VydmVyVHlwZUZhY3RvcnlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvaW50ZXJuYWwvc2VydmVydHlwZS9kZWZpbml0aW9uL2ltcGwvU2VydmVyVHlwZUZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmZWQ0MTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9pbXBsL1NlcnZlclR5cGVGYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM0ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgRXRlcmF0aW9uIEJpbGlzaW0gQS5TLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4goCBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEVURVJBVElPTiBBLlMuIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgRXRlcmF0aW9uIEJpbGlzaW0gQS5TLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIGV0ZXJhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuZXRlcmF0aW9uLmNvbS8+LgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBTZXJ2ZXJUeXBlRmFjdG9yeUltcGwuamF2YSx2IDEuNyAyMDA1LzA4LzMwIDIxOjQ1OjE5IGdlcmNhbiBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FRmFjdG9yeUltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uKjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIDxiPkZhY3Rvcnk8L2I+LgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJUeXBlRmFjdG9yeUltcGwgZXh0ZW5kcyBFRmFjdG9yeUltcGwgaW1wbGVtZW50cyBTZXJ2ZXJUeXBlRmFjdG9yeSB7Ci0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU2VydmVyVHlwZUZhY3RvcnlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZShFQ2xhc3MgZUNsYXNzKSB7Ci0JCXN3aXRjaCAoZUNsYXNzLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkFSQ0hJVkVfVFlQRTogcmV0dXJuIGNyZWF0ZUFyY2hpdmVUeXBlKCk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkFSR1VNRU5UX1BBSVI6IHJldHVybiBjcmVhdGVBcmd1bWVudFBhaXIoKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuQ0xBU1NQQVRIOiByZXR1cm4gY3JlYXRlQ2xhc3NwYXRoKCk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkVYVEVSTkFMOiByZXR1cm4gY3JlYXRlRXh0ZXJuYWwoKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuSk5ESV9DT05ORUNUSU9OOiByZXR1cm4gY3JlYXRlSm5kaUNvbm5lY3Rpb24oKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuTEFVTkNIX0NPTkZJR1VSQVRJT046IHJldHVybiBjcmVhdGVMYXVuY2hDb25maWd1cmF0aW9uKCk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLk1PRFVMRTogcmV0dXJuIGNyZWF0ZU1vZHVsZSgpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5QT1JUOiByZXR1cm4gY3JlYXRlUG9ydCgpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5QUk9KRUNUOiByZXR1cm4gY3JlYXRlUHJvamVjdCgpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5QUk9QRVJUWTogcmV0dXJuIGNyZWF0ZVByb3BlcnR5KCk7Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlBVQkxJU0hFUjogcmV0dXJuIGNyZWF0ZVB1Ymxpc2hlcigpOwotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5QVUJMSVNIRVJfREFUQTogcmV0dXJuIGNyZWF0ZVB1Ymxpc2hlckRhdGEoKTsKLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuU0VSVkVSX1JVTlRJTUU6IHJldHVybiBjcmVhdGVTZXJ2ZXJSdW50aW1lKCk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBjbGFzcyAnIiArIGVDbGFzcy5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQXJjaGl2ZVR5cGUgY3JlYXRlQXJjaGl2ZVR5cGUoKSB7Ci0JCUFyY2hpdmVUeXBlSW1wbCBhcmNoaXZlVHlwZSA9IG5ldyBBcmNoaXZlVHlwZUltcGwoKTsKLQkJcmV0dXJuIGFyY2hpdmVUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBcmd1bWVudFBhaXIgY3JlYXRlQXJndW1lbnRQYWlyKCkgewotCQlBcmd1bWVudFBhaXJJbXBsIGFyZ3VtZW50UGFpciA9IG5ldyBBcmd1bWVudFBhaXJJbXBsKCk7Ci0JCXJldHVybiBhcmd1bWVudFBhaXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENsYXNzcGF0aCBjcmVhdGVDbGFzc3BhdGgoKSB7Ci0JCUNsYXNzcGF0aEltcGwgY2xhc3NwYXRoID0gbmV3IENsYXNzcGF0aEltcGwoKTsKLQkJcmV0dXJuIGNsYXNzcGF0aDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRXh0ZXJuYWwgY3JlYXRlRXh0ZXJuYWwoKSB7Ci0JCUV4dGVybmFsSW1wbCBleHRlcm5hbCA9IG5ldyBFeHRlcm5hbEltcGwoKTsKLQkJcmV0dXJuIGV4dGVybmFsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBKbmRpQ29ubmVjdGlvbiBjcmVhdGVKbmRpQ29ubmVjdGlvbigpIHsKLQkJSm5kaUNvbm5lY3Rpb25JbXBsIGpuZGlDb25uZWN0aW9uID0gbmV3IEpuZGlDb25uZWN0aW9uSW1wbCgpOwotCQlyZXR1cm4gam5kaUNvbm5lY3Rpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExhdW5jaENvbmZpZ3VyYXRpb24gY3JlYXRlTGF1bmNoQ29uZmlndXJhdGlvbigpIHsKLQkJTGF1bmNoQ29uZmlndXJhdGlvbkltcGwgbGF1bmNoQ29uZmlndXJhdGlvbiA9IG5ldyBMYXVuY2hDb25maWd1cmF0aW9uSW1wbCgpOwotCQlyZXR1cm4gbGF1bmNoQ29uZmlndXJhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTW9kdWxlIGNyZWF0ZU1vZHVsZSgpIHsKLQkJTW9kdWxlSW1wbCBtb2R1bGUgPSBuZXcgTW9kdWxlSW1wbCgpOwotCQlyZXR1cm4gbW9kdWxlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQb3J0IGNyZWF0ZVBvcnQoKSB7Ci0JCVBvcnRJbXBsIHBvcnQgPSBuZXcgUG9ydEltcGwoKTsKLQkJcmV0dXJuIHBvcnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFByb2plY3QgY3JlYXRlUHJvamVjdCgpIHsKLQkJUHJvamVjdEltcGwgcHJvamVjdCA9IG5ldyBQcm9qZWN0SW1wbCgpOwotCQlyZXR1cm4gcHJvamVjdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUHJvcGVydHkgY3JlYXRlUHJvcGVydHkoKSB7Ci0JCVByb3BlcnR5SW1wbCBwcm9wZXJ0eSA9IG5ldyBQcm9wZXJ0eUltcGwoKTsKLQkJcmV0dXJuIHByb3BlcnR5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQdWJsaXNoZXIgY3JlYXRlUHVibGlzaGVyKCkgewotCQlQdWJsaXNoZXJJbXBsIHB1Ymxpc2hlciA9IG5ldyBQdWJsaXNoZXJJbXBsKCk7Ci0JCXJldHVybiBwdWJsaXNoZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIFB1Ymxpc2hlckRhdGEgY3JlYXRlUHVibGlzaGVyRGF0YSgpIHsKLQkJUHVibGlzaGVyRGF0YUltcGwgcHVibGlzaGVyRGF0YSA9IG5ldyBQdWJsaXNoZXJEYXRhSW1wbCgpOwotCQlyZXR1cm4gcHVibGlzaGVyRGF0YTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU2VydmVyUnVudGltZSBjcmVhdGVTZXJ2ZXJSdW50aW1lKCkgewotCQlTZXJ2ZXJSdW50aW1lSW1wbCBzZXJ2ZXJSdW50aW1lID0gbmV3IFNlcnZlclJ1bnRpbWVJbXBsKCk7Ci0JCXJldHVybiBzZXJ2ZXJSdW50aW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTZXJ2ZXJUeXBlUGFja2FnZSBnZXRTZXJ2ZXJUeXBlUGFja2FnZSgpIHsKLQkJcmV0dXJuIChTZXJ2ZXJUeXBlUGFja2FnZSlnZXRFUGFja2FnZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGRlcHJlY2F0ZWQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTZXJ2ZXJUeXBlUGFja2FnZSBnZXRQYWNrYWdlKCkgewotCQlyZXR1cm4gU2VydmVyVHlwZVBhY2thZ2UuZUlOU1RBTkNFOwotCX0KLQotfSAvL1NlcnZlclR5cGVGYWN0b3J5SW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9pbXBsL1NlcnZlclR5cGVQYWNrYWdlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9pbXBsL1NlcnZlclR5cGVQYWNrYWdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWYxOGI3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9pbnRlcm5hbC9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vaW1wbC9TZXJ2ZXJUeXBlUGFja2FnZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MDggKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBFdGVyYXRpb24gQmlsaXNpbSBBLlMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiCgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgRVRFUkFUSU9OIEEuUy4gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBFdGVyYXRpb24gQmlsaXNpbSBBLlMuICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gZXRlcmF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5ldGVyYXRpb24uY29tLz4uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFNlcnZlclR5cGVQYWNrYWdlSW1wbC5qYXZhLHYgMS43IDIwMDUvMDgvMzAgMjE6NDU6MTggZ2VyY2FuIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FUGFja2FnZUltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuWE1MVHlwZVBhY2thZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuaW1wbC5YTUxUeXBlUGFja2FnZUltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uQXJjaGl2ZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Bcmd1bWVudFBhaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5DbGFzc3BhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5FeHRlcm5hbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkpuZGlDb25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uTGF1bmNoQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Qcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5QdWJsaXNoZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5QdWJsaXNoZXJEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVGYWN0b3J5OwotCi0KLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFNlcnZlclR5cGVQYWNrYWdlSW1wbCBleHRlbmRzIEVQYWNrYWdlSW1wbCBpbXBsZW1lbnRzIFNlcnZlclR5cGVQYWNrYWdlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBhcmNoaXZlVHlwZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBhcmd1bWVudFBhaXJFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgY2xhc3NwYXRoRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGV4dGVybmFsRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHByaXZhdGUgRUNsYXNzIGpuZGlDb25uZWN0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGxhdW5jaENvbmZpZ3VyYXRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbW9kdWxlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHBvcnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHJvamVjdEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwcm9wZXJ0eUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwdWJsaXNoZXJFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHJpdmF0ZSBFQ2xhc3MgcHVibGlzaGVyRGF0YUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBzZXJ2ZXJSdW50aW1lRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LCByZWdpc3RlcmVkIHdpdGgKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5IEVQYWNrYWdlLlJlZ2lzdHJ5fSBieSB0aGUgcGFja2FnZQotCSAqIHBhY2thZ2UgVVJJIHZhbHVlLgotCSAqIDxwPk5vdGU6IHRoZSBjb3JyZWN0IHdheSB0byBjcmVhdGUgdGhlIHBhY2thZ2UgaXMgdmlhIHRoZSBzdGF0aWMKLQkgKiBmYWN0b3J5IG1ldGhvZCB7QGxpbmsgI2luaXQgaW5pdCgpfSwgd2hpY2ggYWxzbyBwZXJmb3JtcwotCSAqIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlLCBvciByZXR1cm5zIHRoZSByZWdpc3RlcmVkIHBhY2thZ2UsCi0JICogaWYgb25lIGFscmVhZHkgZXhpc3RzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2UjZU5TX1VSSQotCSAqIEBzZWUgI2luaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFNlcnZlclR5cGVQYWNrYWdlSW1wbCgpIHsKLQkJc3VwZXIoZU5TX1VSSSwgU2VydmVyVHlwZUZhY3RvcnkuZUlOU1RBTkNFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzLCByZWdpc3RlcnMsIGFuZCBpbml0aWFsaXplcyB0aGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoaXMKLQkgKiBtb2RlbCwgYW5kIGZvciBhbnkgb3RoZXJzIHVwb24gd2hpY2ggaXQgZGVwZW5kcy4gIFNpbXBsZQotCSAqIGRlcGVuZGVuY2llcyBhcmUgc2F0aXNmaWVkIGJ5IGNhbGxpbmcgdGhpcyBtZXRob2Qgb24gYWxsCi0JICogZGVwZW5kZW50IHBhY2thZ2VzIGJlZm9yZSBkb2luZyBhbnl0aGluZyBlbHNlLiAgVGhpcyBtZXRob2QgZHJpdmVzCi0JICogaW5pdGlhbGl6YXRpb24gZm9yIGludGVyZGVwZW5kZW50IHBhY2thZ2VzIGRpcmVjdGx5LCBpbiBwYXJhbGxlbAotCSAqIHdpdGggdGhpcyBwYWNrYWdlLCBpdHNlbGYuCi0JICogPHA+T2YgdGhpcyBwYWNrYWdlIGFuZCBpdHMgaW50ZXJkZXBlbmRlbmNpZXMsIGFsbCBwYWNrYWdlcyB3aGljaAotCSAqIGhhdmUgbm90IHlldCBiZWVuIHJlZ2lzdGVyZWQgYnkgdGhlaXIgVVJJIHZhbHVlcyBhcmUgZmlyc3QgY3JlYXRlZAotCSAqIGFuZCByZWdpc3RlcmVkLiAgVGhlIHBhY2thZ2VzIGFyZSB0aGVuIGluaXRpYWxpemVkIGluIHR3byBzdGVwczoKLQkgKiBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIGFsbCBvZiB0aGUgcGFja2FnZXMgYXJlIGNyZWF0ZWQgYmVmb3JlIGFueQotCSAqIGFyZSBpbml0aWFsaXplZCwgc2luY2Ugb25lIHBhY2thZ2UncyBtZXRhLW1vZGVsIG9iamVjdHMgbWF5IHJlZmVyIHRvCi0JICogdGhvc2Ugb2YgYW5vdGhlci4KLQkgKiA8cD5JbnZvY2F0aW9uIG9mIHRoaXMgbWV0aG9kIHdpbGwgbm90IGFmZmVjdCBhbnkgcGFja2FnZXMgdGhhdCBoYXZlCi0JICogYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZU5TX1VSSQotCSAqIEBzZWUgI2NyZWF0ZVBhY2thZ2VDb250ZW50cygpCi0JICogQHNlZSAjaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU2VydmVyVHlwZVBhY2thZ2UgaW5pdCgpIHsKLQkJaWYgKGlzSW5pdGVkKSByZXR1cm4gKFNlcnZlclR5cGVQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFNlcnZlclR5cGVQYWNrYWdlLmVOU19VUkkpOwotCi0JCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIHBhY2thZ2UKLQkJU2VydmVyVHlwZVBhY2thZ2VJbXBsIHRoZVNlcnZlclR5cGVQYWNrYWdlID0gKFNlcnZlclR5cGVQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgaW5zdGFuY2VvZiBTZXJ2ZXJUeXBlUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSA6IG5ldyBTZXJ2ZXJUeXBlUGFja2FnZUltcGwoKSk7Ci0KLQkJaXNJbml0ZWQgPSB0cnVlOwotCi0JCS8vIEluaXRpYWxpemUgc2ltcGxlIGRlcGVuZGVuY2llcwotCQlYTUxUeXBlUGFja2FnZUltcGwuaW5pdCgpOwotCi0JCS8vIENyZWF0ZSBwYWNrYWdlIG1ldGEtZGF0YSBvYmplY3RzCi0JCXRoZVNlcnZlclR5cGVQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIEluaXRpYWxpemUgY3JlYXRlZCBtZXRhLWRhdGEKLQkJdGhlU2VydmVyVHlwZVBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIE1hcmsgbWV0YS1kYXRhIHRvIGluZGljYXRlIGl0IGNhbid0IGJlIGNoYW5nZWQKLQkJdGhlU2VydmVyVHlwZVBhY2thZ2UuZnJlZXplKCk7Ci0KLQkJcmV0dXJuIHRoZVNlcnZlclR5cGVQYWNrYWdlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0QXJjaGl2ZVR5cGUoKSB7Ci0JCXJldHVybiBhcmNoaXZlVHlwZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBcmNoaXZlVHlwZV9QYXRoKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYXJjaGl2ZVR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEFyZ3VtZW50UGFpcigpIHsKLQkJcmV0dXJuIGFyZ3VtZW50UGFpckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBcmd1bWVudFBhaXJfTmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWFyZ3VtZW50UGFpckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFyZ3VtZW50UGFpcl9WYWx1ZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWFyZ3VtZW50UGFpckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Q2xhc3NwYXRoKCkgewotCQlyZXR1cm4gY2xhc3NwYXRoRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldENsYXNzcGF0aF9Hcm91cCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWNsYXNzcGF0aEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldENsYXNzcGF0aF9BcmNoaXZlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpY2xhc3NwYXRoRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q2xhc3NwYXRoX0lkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY2xhc3NwYXRoRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRFeHRlcm5hbCgpIHsKLQkJcmV0dXJuIGV4dGVybmFsRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEV4dGVybmFsX1ZhbHVlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZXh0ZXJuYWxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFeHRlcm5hbF9PcygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWV4dGVybmFsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIEVDbGFzcyBnZXRKbmRpQ29ubmVjdGlvbigpIHsKLQkJcmV0dXJuIGpuZGlDb25uZWN0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldEpuZGlDb25uZWN0aW9uX1Byb3ZpZGVyVXJsKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpam5kaUNvbm5lY3Rpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRKbmRpQ29ubmVjdGlvbl9Hcm91cCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWpuZGlDb25uZWN0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIEVSZWZlcmVuY2UgZ2V0Sm5kaUNvbm5lY3Rpb25fSm5kaVByb3BlcnR5KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upam5kaUNvbm5lY3Rpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRKbmRpQ29ubmVjdGlvbl9Jbml0aWFsQ29udGV4dEZhY3RvcnkoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlqbmRpQ29ubmVjdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TGF1bmNoQ29uZmlndXJhdGlvbigpIHsKLQkJcmV0dXJuIGxhdW5jaENvbmZpZ3VyYXRpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0TGF1bmNoQ29uZmlndXJhdGlvbl9NYWluQ2xhc3MoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlsYXVuY2hDb25maWd1cmF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TGF1bmNoQ29uZmlndXJhdGlvbl9Hcm91cDIoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlsYXVuY2hDb25maWd1cmF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TGF1bmNoQ29uZmlndXJhdGlvbl9Xb3JraW5nRGlyZWN0b3J5KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbGF1bmNoQ29uZmlndXJhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldExhdW5jaENvbmZpZ3VyYXRpb25fUHJvZ3JhbUFyZ3VtZW50cygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWxhdW5jaENvbmZpZ3VyYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRMYXVuY2hDb25maWd1cmF0aW9uX1ZtUGFyYW1ldGVycygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWxhdW5jaENvbmZpZ3VyYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRMYXVuY2hDb25maWd1cmF0aW9uX0NsYXNzcGF0aFJlZmVyZW5jZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWxhdW5jaENvbmZpZ3VyYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRMYXVuY2hDb25maWd1cmF0aW9uX0V4dGVybmFsKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpbGF1bmNoQ29uZmlndXJhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDExKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRMYXVuY2hDb25maWd1cmF0aW9uX0RlYnVnUG9ydCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWxhdW5jaENvbmZpZ3VyYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg5KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRMYXVuY2hDb25maWd1cmF0aW9uX0dyb3VwMygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWxhdW5jaENvbmZpZ3VyYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TGF1bmNoQ29uZmlndXJhdGlvbl9Hcm91cCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWxhdW5jaENvbmZpZ3VyYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRMYXVuY2hDb25maWd1cmF0aW9uX0Vudmlyb25tZW50VmFyaWFibGUoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlsYXVuY2hDb25maWd1cmF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TGF1bmNoQ29uZmlndXJhdGlvbl9Hcm91cDEoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlsYXVuY2hDb25maWd1cmF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRNb2R1bGUoKSB7Ci0JCXJldHVybiBtb2R1bGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TW9kdWxlX1R5cGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltb2R1bGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNb2R1bGVfUHVibGlzaERpcigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1vZHVsZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1vZHVsZV9QdWJsaXNoZXJSZWZlcmVuY2UoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltb2R1bGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFBvcnQoKSB7Ci0JCXJldHVybiBwb3J0RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFBvcnRfTm8oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwb3J0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UG9ydF9OYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcG9ydEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFBvcnRfUHJvdG9jb2woKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwb3J0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gcHJvamVjdEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0NsYXNzcGF0aFJlZmVyZW5jZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXByb2plY3RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFByb3BlcnR5KCkgewotCQlyZXR1cm4gcHJvcGVydHlFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvcGVydHlfQ29udGV4dCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXByb3BlcnR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvcGVydHlfRGVmYXVsdCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXByb3BlcnR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvcGVydHlfSWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwcm9wZXJ0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb3BlcnR5X0xhYmVsKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHJvcGVydHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9wZXJ0eV9UeXBlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHJvcGVydHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFB1Ymxpc2hlcigpIHsKLQkJcmV0dXJuIHB1Ymxpc2hlckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQdWJsaXNoZXJfR3JvdXAoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwdWJsaXNoZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRQdWJsaXNoZXJfUHVibGlzaGVyZGF0YSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXB1Ymxpc2hlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFB1Ymxpc2hlcl9JZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXB1Ymxpc2hlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0UHVibGlzaGVyRGF0YSgpIHsKLQkJcmV0dXJuIHB1Ymxpc2hlckRhdGFFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHVibGlzaGVyRGF0YV9EYXRhbmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXB1Ymxpc2hlckRhdGFFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQdWJsaXNoZXJEYXRhX0RhdGF2YWx1ZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXB1Ymxpc2hlckRhdGFFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFNlcnZlclJ1bnRpbWUoKSB7Ci0JCXJldHVybiBzZXJ2ZXJSdW50aW1lRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldFNlcnZlclJ1bnRpbWVfR3JvdXAoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlzZXJ2ZXJSdW50aW1lRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIEVSZWZlcmVuY2UgZ2V0U2VydmVyUnVudGltZV9Qcm9wZXJ0eSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXNlcnZlclJ1bnRpbWVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZXJ2ZXJSdW50aW1lX0dyb3VwMSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXNlcnZlclJ1bnRpbWVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZXJ2ZXJSdW50aW1lX1BvcnQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlzZXJ2ZXJSdW50aW1lRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2VydmVyUnVudGltZV9Hcm91cDIoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlzZXJ2ZXJSdW50aW1lRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIEVSZWZlcmVuY2UgZ2V0U2VydmVyUnVudGltZV9Nb2R1bGUoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlzZXJ2ZXJSdW50aW1lRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0U2VydmVyUnVudGltZV9Qcm9qZWN0KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2VydmVyUnVudGltZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlcnZlclJ1bnRpbWVfU3RhcnQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlzZXJ2ZXJSdW50aW1lRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0U2VydmVyUnVudGltZV9TdG9wKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2VydmVyUnVudGltZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldFNlcnZlclJ1bnRpbWVfR3JvdXAzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc2VydmVyUnVudGltZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldFNlcnZlclJ1bnRpbWVfUHVibGlzaGVyKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2VydmVyUnVudGltZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZXJ2ZXJSdW50aW1lX0dyb3VwNCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXNlcnZlclJ1bnRpbWVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIEVSZWZlcmVuY2UgZ2V0U2VydmVyUnVudGltZV9DbGFzc3BhdGgoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlzZXJ2ZXJSdW50aW1lRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldFNlcnZlclJ1bnRpbWVfSm5kaUNvbm5lY3Rpb24oKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlzZXJ2ZXJSdW50aW1lRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFNlcnZlclJ1bnRpbWVfTmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXNlcnZlclJ1bnRpbWVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2VydmVyUnVudGltZV9WZXJzaW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc2VydmVyUnVudGltZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU2VydmVyVHlwZUZhY3RvcnkgZ2V0U2VydmVyVHlwZUZhY3RvcnkoKSB7Ci0JCXJldHVybiAoU2VydmVyVHlwZUZhY3RvcnkpZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0NyZWF0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgdGhlIHBhY2thZ2UuICBUaGlzIG1ldGhvZCBpcwotCSAqIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYWNrYWdlQ29udGVudHMoKSB7Ci0JCWlmIChpc0NyZWF0ZWQpIHJldHVybjsKLQkJaXNDcmVhdGVkID0gdHJ1ZTsKLQotCQkvLyBDcmVhdGUgY2xhc3NlcyBhbmQgdGhlaXIgZmVhdHVyZXMKLQkJYXJjaGl2ZVR5cGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQVJDSElWRV9UWVBFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShhcmNoaXZlVHlwZUVDbGFzcywgQVJDSElWRV9UWVBFX19QQVRIKTsKLQotCQlhcmd1bWVudFBhaXJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQVJHVU1FTlRfUEFJUik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYXJndW1lbnRQYWlyRUNsYXNzLCBBUkdVTUVOVF9QQUlSX19OQU1FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShhcmd1bWVudFBhaXJFQ2xhc3MsIEFSR1VNRU5UX1BBSVJfX1ZBTFVFKTsKLQotCQljbGFzc3BhdGhFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ0xBU1NQQVRIKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShjbGFzc3BhdGhFQ2xhc3MsIENMQVNTUEFUSF9fR1JPVVApOwotCQljcmVhdGVFUmVmZXJlbmNlKGNsYXNzcGF0aEVDbGFzcywgQ0xBU1NQQVRIX19BUkNISVZFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShjbGFzc3BhdGhFQ2xhc3MsIENMQVNTUEFUSF9fSUQpOwotCi0JCWV4dGVybmFsRUNsYXNzID0gY3JlYXRlRUNsYXNzKEVYVEVSTkFMKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShleHRlcm5hbEVDbGFzcywgRVhURVJOQUxfX1ZBTFVFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShleHRlcm5hbEVDbGFzcywgRVhURVJOQUxfX09TKTsKLQotCQlqbmRpQ29ubmVjdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhKTkRJX0NPTk5FQ1RJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKGpuZGlDb25uZWN0aW9uRUNsYXNzLCBKTkRJX0NPTk5FQ1RJT05fX1BST1ZJREVSX1VSTCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoam5kaUNvbm5lY3Rpb25FQ2xhc3MsIEpORElfQ09OTkVDVElPTl9fR1JPVVApOwotCQljcmVhdGVFUmVmZXJlbmNlKGpuZGlDb25uZWN0aW9uRUNsYXNzLCBKTkRJX0NPTk5FQ1RJT05fX0pORElfUFJPUEVSVFkpOwotCQljcmVhdGVFQXR0cmlidXRlKGpuZGlDb25uZWN0aW9uRUNsYXNzLCBKTkRJX0NPTk5FQ1RJT05fX0lOSVRJQUxfQ09OVEVYVF9GQUNUT1JZKTsKLQotCQlsYXVuY2hDb25maWd1cmF0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKExBVU5DSF9DT05GSUdVUkFUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShsYXVuY2hDb25maWd1cmF0aW9uRUNsYXNzLCBMQVVOQ0hfQ09ORklHVVJBVElPTl9fR1JPVVApOwotCQljcmVhdGVFUmVmZXJlbmNlKGxhdW5jaENvbmZpZ3VyYXRpb25FQ2xhc3MsIExBVU5DSF9DT05GSUdVUkFUSU9OX19FTlZJUk9OTUVOVF9WQVJJQUJMRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobGF1bmNoQ29uZmlndXJhdGlvbkVDbGFzcywgTEFVTkNIX0NPTkZJR1VSQVRJT05fX0dST1VQMSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobGF1bmNoQ29uZmlndXJhdGlvbkVDbGFzcywgTEFVTkNIX0NPTkZJR1VSQVRJT05fX1BST0dSQU1fQVJHVU1FTlRTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShsYXVuY2hDb25maWd1cmF0aW9uRUNsYXNzLCBMQVVOQ0hfQ09ORklHVVJBVElPTl9fV09SS0lOR19ESVJFQ1RPUlkpOwotCQljcmVhdGVFQXR0cmlidXRlKGxhdW5jaENvbmZpZ3VyYXRpb25FQ2xhc3MsIExBVU5DSF9DT05GSUdVUkFUSU9OX19NQUlOX0NMQVNTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShsYXVuY2hDb25maWd1cmF0aW9uRUNsYXNzLCBMQVVOQ0hfQ09ORklHVVJBVElPTl9fR1JPVVAyKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShsYXVuY2hDb25maWd1cmF0aW9uRUNsYXNzLCBMQVVOQ0hfQ09ORklHVVJBVElPTl9fVk1fUEFSQU1FVEVSUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobGF1bmNoQ29uZmlndXJhdGlvbkVDbGFzcywgTEFVTkNIX0NPTkZJR1VSQVRJT05fX0NMQVNTUEFUSF9SRUZFUkVOQ0UpOwotCQljcmVhdGVFQXR0cmlidXRlKGxhdW5jaENvbmZpZ3VyYXRpb25FQ2xhc3MsIExBVU5DSF9DT05GSUdVUkFUSU9OX19ERUJVR19QT1JUKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShsYXVuY2hDb25maWd1cmF0aW9uRUNsYXNzLCBMQVVOQ0hfQ09ORklHVVJBVElPTl9fR1JPVVAzKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShsYXVuY2hDb25maWd1cmF0aW9uRUNsYXNzLCBMQVVOQ0hfQ09ORklHVVJBVElPTl9fRVhURVJOQUwpOwotCi0JCW1vZHVsZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhNT0RVTEUpOwotCQljcmVhdGVFQXR0cmlidXRlKG1vZHVsZUVDbGFzcywgTU9EVUxFX19UWVBFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtb2R1bGVFQ2xhc3MsIE1PRFVMRV9fUFVCTElTSF9ESVIpOwotCQljcmVhdGVFQXR0cmlidXRlKG1vZHVsZUVDbGFzcywgTU9EVUxFX19QVUJMSVNIRVJfUkVGRVJFTkNFKTsKLQotCQlwb3J0RUNsYXNzID0gY3JlYXRlRUNsYXNzKFBPUlQpOwotCQljcmVhdGVFQXR0cmlidXRlKHBvcnRFQ2xhc3MsIFBPUlRfX05PKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwb3J0RUNsYXNzLCBQT1JUX19OQU1FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwb3J0RUNsYXNzLCBQT1JUX19QUk9UT0NPTCk7Ci0KLQkJcHJvamVjdEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQUk9KRUNUKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwcm9qZWN0RUNsYXNzLCBQUk9KRUNUX19DTEFTU1BBVEhfUkVGRVJFTkNFKTsKLQotCQlwcm9wZXJ0eUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQUk9QRVJUWSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHJvcGVydHlFQ2xhc3MsIFBST1BFUlRZX19DT05URVhUKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwcm9wZXJ0eUVDbGFzcywgUFJPUEVSVFlfX0RFRkFVTFQpOwotCQljcmVhdGVFQXR0cmlidXRlKHByb3BlcnR5RUNsYXNzLCBQUk9QRVJUWV9fSUQpOwotCQljcmVhdGVFQXR0cmlidXRlKHByb3BlcnR5RUNsYXNzLCBQUk9QRVJUWV9fTEFCRUwpOwotCQljcmVhdGVFQXR0cmlidXRlKHByb3BlcnR5RUNsYXNzLCBQUk9QRVJUWV9fVFlQRSk7Ci0KLQkJcHVibGlzaGVyRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBVQkxJU0hFUik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHVibGlzaGVyRUNsYXNzLCBQVUJMSVNIRVJfX0dST1VQKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwdWJsaXNoZXJFQ2xhc3MsIFBVQkxJU0hFUl9fUFVCTElTSEVSREFUQSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHVibGlzaGVyRUNsYXNzLCBQVUJMSVNIRVJfX0lEKTsKLQotCQlwdWJsaXNoZXJEYXRhRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBVQkxJU0hFUl9EQVRBKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwdWJsaXNoZXJEYXRhRUNsYXNzLCBQVUJMSVNIRVJfREFUQV9fREFUQU5BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKHB1Ymxpc2hlckRhdGFFQ2xhc3MsIFBVQkxJU0hFUl9EQVRBX19EQVRBVkFMVUUpOwotCi0JCXNlcnZlclJ1bnRpbWVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU0VSVkVSX1JVTlRJTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKHNlcnZlclJ1bnRpbWVFQ2xhc3MsIFNFUlZFUl9SVU5USU1FX19HUk9VUCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoc2VydmVyUnVudGltZUVDbGFzcywgU0VSVkVSX1JVTlRJTUVfX1BST1BFUlRZKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShzZXJ2ZXJSdW50aW1lRUNsYXNzLCBTRVJWRVJfUlVOVElNRV9fR1JPVVAxKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShzZXJ2ZXJSdW50aW1lRUNsYXNzLCBTRVJWRVJfUlVOVElNRV9fUE9SVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoc2VydmVyUnVudGltZUVDbGFzcywgU0VSVkVSX1JVTlRJTUVfX0dST1VQMik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoc2VydmVyUnVudGltZUVDbGFzcywgU0VSVkVSX1JVTlRJTUVfX01PRFVMRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoc2VydmVyUnVudGltZUVDbGFzcywgU0VSVkVSX1JVTlRJTUVfX1BST0pFQ1QpOwotCQljcmVhdGVFUmVmZXJlbmNlKHNlcnZlclJ1bnRpbWVFQ2xhc3MsIFNFUlZFUl9SVU5USU1FX19TVEFSVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoc2VydmVyUnVudGltZUVDbGFzcywgU0VSVkVSX1JVTlRJTUVfX1NUT1ApOwotCQljcmVhdGVFQXR0cmlidXRlKHNlcnZlclJ1bnRpbWVFQ2xhc3MsIFNFUlZFUl9SVU5USU1FX19HUk9VUDMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHNlcnZlclJ1bnRpbWVFQ2xhc3MsIFNFUlZFUl9SVU5USU1FX19QVUJMSVNIRVIpOwotCQljcmVhdGVFQXR0cmlidXRlKHNlcnZlclJ1bnRpbWVFQ2xhc3MsIFNFUlZFUl9SVU5USU1FX19HUk9VUDQpOwotCQljcmVhdGVFUmVmZXJlbmNlKHNlcnZlclJ1bnRpbWVFQ2xhc3MsIFNFUlZFUl9SVU5USU1FX19DTEFTU1BBVEgpOwotCQljcmVhdGVFUmVmZXJlbmNlKHNlcnZlclJ1bnRpbWVFQ2xhc3MsIFNFUlZFUl9SVU5USU1FX19KTkRJX0NPTk5FQ1RJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKHNlcnZlclJ1bnRpbWVFQ2xhc3MsIFNFUlZFUl9SVU5USU1FX19OQU1FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShzZXJ2ZXJSdW50aW1lRUNsYXNzLCBTRVJWRVJfUlVOVElNRV9fVkVSU0lPTik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSBhbmQgaXRzIG1ldGEtbW9kZWwuICBUaGlzCi0JICogbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNJbml0aWFsaXplZCkgcmV0dXJuOwotCQlpc0luaXRpYWxpemVkID0gdHJ1ZTsKLQotCQkvLyBJbml0aWFsaXplIHBhY2thZ2UKLQkJc2V0TmFtZShlTkFNRSk7Ci0JCXNldE5zUHJlZml4KGVOU19QUkVGSVgpOwotCQlzZXROc1VSSShlTlNfVVJJKTsKLQotCQkvLyBPYnRhaW4gb3RoZXIgZGVwZW5kZW50IHBhY2thZ2VzCi0JCVhNTFR5cGVQYWNrYWdlSW1wbCB0aGVYTUxUeXBlUGFja2FnZSA9IChYTUxUeXBlUGFja2FnZUltcGwpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoWE1MVHlwZVBhY2thZ2UuZU5TX1VSSSk7Ci0KLQkJLy8gQWRkIHN1cGVydHlwZXMgdG8gY2xhc3NlcwotCi0JCS8vIEluaXRpYWxpemUgY2xhc3NlcyBhbmQgZmVhdHVyZXM7IGFkZCBvcGVyYXRpb25zIGFuZCBwYXJhbWV0ZXJzCi0JCWluaXRFQ2xhc3MoYXJjaGl2ZVR5cGVFQ2xhc3MsIEFyY2hpdmVUeXBlLmNsYXNzLCAiQXJjaGl2ZVR5cGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEFyY2hpdmVUeXBlX1BhdGgoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJwYXRoIiwgbnVsbCwgMCwgMSwgQXJjaGl2ZVR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoYXJndW1lbnRQYWlyRUNsYXNzLCBBcmd1bWVudFBhaXIuY2xhc3MsICJBcmd1bWVudFBhaXIiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEFyZ3VtZW50UGFpcl9OYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAibmFtZSIsIG51bGwsIDEsIDEsIEFyZ3VtZW50UGFpci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEFyZ3VtZW50UGFpcl9WYWx1ZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInZhbHVlIiwgbnVsbCwgMSwgMSwgQXJndW1lbnRQYWlyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGNsYXNzcGF0aEVDbGFzcywgQ2xhc3NwYXRoLmNsYXNzLCAiQ2xhc3NwYXRoIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRDbGFzc3BhdGhfR3JvdXAoKSwgZWNvcmVQYWNrYWdlLmdldEVGZWF0dXJlTWFwRW50cnkoKSwgImdyb3VwIiwgbnVsbCwgMCwgLTEsIENsYXNzcGF0aC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldENsYXNzcGF0aF9BcmNoaXZlKCksIHRoaXMuZ2V0QXJjaGl2ZVR5cGUoKSwgbnVsbCwgImFyY2hpdmUiLCBudWxsLCAxLCAtMSwgQ2xhc3NwYXRoLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRDbGFzc3BhdGhfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJpZCIsIG51bGwsIDAsIDEsIENsYXNzcGF0aC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhleHRlcm5hbEVDbGFzcywgRXh0ZXJuYWwuY2xhc3MsICJFeHRlcm5hbCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RXh0ZXJuYWxfVmFsdWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJ2YWx1ZSIsIG51bGwsIDAsIDEsIEV4dGVybmFsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RXh0ZXJuYWxfT3MoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJvcyIsIG51bGwsIDAsIDEsIEV4dGVybmFsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGpuZGlDb25uZWN0aW9uRUNsYXNzLCBKbmRpQ29ubmVjdGlvbi5jbGFzcywgIkpuZGlDb25uZWN0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRKbmRpQ29ubmVjdGlvbl9Qcm92aWRlclVybCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInByb3ZpZGVyVXJsIiwgbnVsbCwgMSwgMSwgSm5kaUNvbm5lY3Rpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRKbmRpQ29ubmVjdGlvbl9Hcm91cCgpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAiZ3JvdXAiLCBudWxsLCAwLCAtMSwgSm5kaUNvbm5lY3Rpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRKbmRpQ29ubmVjdGlvbl9KbmRpUHJvcGVydHkoKSwgdGhpcy5nZXRBcmd1bWVudFBhaXIoKSwgbnVsbCwgImpuZGlQcm9wZXJ0eSIsIG51bGwsIDAsIC0xLCBKbmRpQ29ubmVjdGlvbi5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Sm5kaUNvbm5lY3Rpb25fSW5pdGlhbENvbnRleHRGYWN0b3J5KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiaW5pdGlhbENvbnRleHRGYWN0b3J5IiwgbnVsbCwgMSwgMSwgSm5kaUNvbm5lY3Rpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MobGF1bmNoQ29uZmlndXJhdGlvbkVDbGFzcywgTGF1bmNoQ29uZmlndXJhdGlvbi5jbGFzcywgIkxhdW5jaENvbmZpZ3VyYXRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldExhdW5jaENvbmZpZ3VyYXRpb25fR3JvdXAoKSwgZWNvcmVQYWNrYWdlLmdldEVGZWF0dXJlTWFwRW50cnkoKSwgImdyb3VwIiwgbnVsbCwgMCwgLTEsIExhdW5jaENvbmZpZ3VyYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRMYXVuY2hDb25maWd1cmF0aW9uX0Vudmlyb25tZW50VmFyaWFibGUoKSwgdGhpcy5nZXRBcmd1bWVudFBhaXIoKSwgbnVsbCwgImVudmlyb25tZW50VmFyaWFibGUiLCBudWxsLCAwLCAtMSwgTGF1bmNoQ29uZmlndXJhdGlvbi5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TGF1bmNoQ29uZmlndXJhdGlvbl9Hcm91cDEoKSwgZWNvcmVQYWNrYWdlLmdldEVGZWF0dXJlTWFwRW50cnkoKSwgImdyb3VwMSIsIG51bGwsIDAsIC0xLCBMYXVuY2hDb25maWd1cmF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TGF1bmNoQ29uZmlndXJhdGlvbl9Qcm9ncmFtQXJndW1lbnRzKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicHJvZ3JhbUFyZ3VtZW50cyIsIG51bGwsIDAsIC0xLCBMYXVuY2hDb25maWd1cmF0aW9uLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TGF1bmNoQ29uZmlndXJhdGlvbl9Xb3JraW5nRGlyZWN0b3J5KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAid29ya2luZ0RpcmVjdG9yeSIsIG51bGwsIDEsIDEsIExhdW5jaENvbmZpZ3VyYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRMYXVuY2hDb25maWd1cmF0aW9uX01haW5DbGFzcygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm1haW5DbGFzcyIsIG51bGwsIDAsIDEsIExhdW5jaENvbmZpZ3VyYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRMYXVuY2hDb25maWd1cmF0aW9uX0dyb3VwMigpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAiZ3JvdXAyIiwgbnVsbCwgMCwgLTEsIExhdW5jaENvbmZpZ3VyYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRMYXVuY2hDb25maWd1cmF0aW9uX1ZtUGFyYW1ldGVycygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInZtUGFyYW1ldGVycyIsIG51bGwsIDAsIC0xLCBMYXVuY2hDb25maWd1cmF0aW9uLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TGF1bmNoQ29uZmlndXJhdGlvbl9DbGFzc3BhdGhSZWZlcmVuY2UoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJjbGFzc3BhdGhSZWZlcmVuY2UiLCBudWxsLCAwLCAxLCBMYXVuY2hDb25maWd1cmF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TGF1bmNoQ29uZmlndXJhdGlvbl9EZWJ1Z1BvcnQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJkZWJ1Z1BvcnQiLCBudWxsLCAwLCAxLCBMYXVuY2hDb25maWd1cmF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TGF1bmNoQ29uZmlndXJhdGlvbl9Hcm91cDMoKSwgZWNvcmVQYWNrYWdlLmdldEVGZWF0dXJlTWFwRW50cnkoKSwgImdyb3VwMyIsIG51bGwsIDAsIC0xLCBMYXVuY2hDb25maWd1cmF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TGF1bmNoQ29uZmlndXJhdGlvbl9FeHRlcm5hbCgpLCB0aGlzLmdldEV4dGVybmFsKCksIG51bGwsICJleHRlcm5hbCIsIG51bGwsIDAsIC0xLCBMYXVuY2hDb25maWd1cmF0aW9uLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MobW9kdWxlRUNsYXNzLCBNb2R1bGUuY2xhc3MsICJNb2R1bGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE1vZHVsZV9UeXBlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAidHlwZSIsIG51bGwsIDEsIDEsIE1vZHVsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE1vZHVsZV9QdWJsaXNoRGlyKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicHVibGlzaERpciIsIG51bGwsIDEsIDEsIE1vZHVsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE1vZHVsZV9QdWJsaXNoZXJSZWZlcmVuY2UoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJwdWJsaXNoZXJSZWZlcmVuY2UiLCBudWxsLCAxLCAxLCBNb2R1bGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MocG9ydEVDbGFzcywgUG9ydC5jbGFzcywgIlBvcnQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFBvcnRfTm8oKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJubyIsIG51bGwsIDEsIDEsIFBvcnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQb3J0X05hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMSwgMSwgUG9ydC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFBvcnRfUHJvdG9jb2woKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJwcm90b2NvbCIsIG51bGwsIDEsIDEsIFBvcnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MocHJvamVjdEVDbGFzcywgUHJvamVjdC5jbGFzcywgIlByb2plY3QiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFByb2plY3RfQ2xhc3NwYXRoUmVmZXJlbmNlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiY2xhc3NwYXRoUmVmZXJlbmNlIiwgbnVsbCwgMSwgMSwgUHJvamVjdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhwcm9wZXJ0eUVDbGFzcywgUHJvcGVydHkuY2xhc3MsICJQcm9wZXJ0eSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UHJvcGVydHlfQ29udGV4dCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImNvbnRleHQiLCBudWxsLCAwLCAxLCBQcm9wZXJ0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFByb3BlcnR5X0RlZmF1bHQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJkZWZhdWx0IiwgbnVsbCwgMCwgMSwgUHJvcGVydHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQcm9wZXJ0eV9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImlkIiwgbnVsbCwgMCwgMSwgUHJvcGVydHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQcm9wZXJ0eV9MYWJlbCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImxhYmVsIiwgbnVsbCwgMCwgMSwgUHJvcGVydHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQcm9wZXJ0eV9UeXBlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAidHlwZSIsIG51bGwsIDAsIDEsIFByb3BlcnR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHB1Ymxpc2hlckVDbGFzcywgUHVibGlzaGVyLmNsYXNzLCAiUHVibGlzaGVyIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQdWJsaXNoZXJfR3JvdXAoKSwgZWNvcmVQYWNrYWdlLmdldEVGZWF0dXJlTWFwRW50cnkoKSwgImdyb3VwIiwgbnVsbCwgMCwgLTEsIFB1Ymxpc2hlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFB1Ymxpc2hlcl9QdWJsaXNoZXJkYXRhKCksIHRoaXMuZ2V0UHVibGlzaGVyRGF0YSgpLCBudWxsLCAicHVibGlzaGVyZGF0YSIsIG51bGwsIDEsIC0xLCBQdWJsaXNoZXIuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFB1Ymxpc2hlcl9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImlkIiwgbnVsbCwgMCwgMSwgUHVibGlzaGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHB1Ymxpc2hlckRhdGFFQ2xhc3MsIFB1Ymxpc2hlckRhdGEuY2xhc3MsICJQdWJsaXNoZXJEYXRhIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQdWJsaXNoZXJEYXRhX0RhdGFuYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiZGF0YW5hbWUiLCBudWxsLCAxLCAxLCBQdWJsaXNoZXJEYXRhLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UHVibGlzaGVyRGF0YV9EYXRhdmFsdWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJkYXRhdmFsdWUiLCBudWxsLCAxLCAxLCBQdWJsaXNoZXJEYXRhLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHNlcnZlclJ1bnRpbWVFQ2xhc3MsIFNlcnZlclJ1bnRpbWUuY2xhc3MsICJTZXJ2ZXJSdW50aW1lIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRTZXJ2ZXJSdW50aW1lX0dyb3VwKCksIGVjb3JlUGFja2FnZS5nZXRFRmVhdHVyZU1hcEVudHJ5KCksICJncm91cCIsIG51bGwsIDAsIC0xLCBTZXJ2ZXJSdW50aW1lLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VydmVyUnVudGltZV9Qcm9wZXJ0eSgpLCB0aGlzLmdldFByb3BlcnR5KCksIG51bGwsICJwcm9wZXJ0eSIsIG51bGwsIDAsIC0xLCBTZXJ2ZXJSdW50aW1lLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRTZXJ2ZXJSdW50aW1lX0dyb3VwMSgpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAiZ3JvdXAxIiwgbnVsbCwgMCwgLTEsIFNlcnZlclJ1bnRpbWUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRTZXJ2ZXJSdW50aW1lX1BvcnQoKSwgdGhpcy5nZXRQb3J0KCksIG51bGwsICJwb3J0IiwgbnVsbCwgMCwgLTEsIFNlcnZlclJ1bnRpbWUuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFNlcnZlclJ1bnRpbWVfR3JvdXAyKCksIGVjb3JlUGFja2FnZS5nZXRFRmVhdHVyZU1hcEVudHJ5KCksICJncm91cDIiLCBudWxsLCAwLCAtMSwgU2VydmVyUnVudGltZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFNlcnZlclJ1bnRpbWVfTW9kdWxlKCksIHRoaXMuZ2V0TW9kdWxlKCksIG51bGwsICJtb2R1bGUiLCBudWxsLCAxLCAtMSwgU2VydmVyUnVudGltZS5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VydmVyUnVudGltZV9Qcm9qZWN0KCksIHRoaXMuZ2V0UHJvamVjdCgpLCBudWxsLCAicHJvamVjdCIsIG51bGwsIDEsIDEsIFNlcnZlclJ1bnRpbWUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFNlcnZlclJ1bnRpbWVfU3RhcnQoKSwgdGhpcy5nZXRMYXVuY2hDb25maWd1cmF0aW9uKCksIG51bGwsICJzdGFydCIsIG51bGwsIDEsIDEsIFNlcnZlclJ1bnRpbWUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFNlcnZlclJ1bnRpbWVfU3RvcCgpLCB0aGlzLmdldExhdW5jaENvbmZpZ3VyYXRpb24oKSwgbnVsbCwgInN0b3AiLCBudWxsLCAxLCAxLCBTZXJ2ZXJSdW50aW1lLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRTZXJ2ZXJSdW50aW1lX0dyb3VwMygpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAiZ3JvdXAzIiwgbnVsbCwgMCwgLTEsIFNlcnZlclJ1bnRpbWUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRTZXJ2ZXJSdW50aW1lX1B1Ymxpc2hlcigpLCB0aGlzLmdldFB1Ymxpc2hlcigpLCBudWxsLCAicHVibGlzaGVyIiwgbnVsbCwgMCwgLTEsIFNlcnZlclJ1bnRpbWUuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFNlcnZlclJ1bnRpbWVfR3JvdXA0KCksIGVjb3JlUGFja2FnZS5nZXRFRmVhdHVyZU1hcEVudHJ5KCksICJncm91cDQiLCBudWxsLCAwLCAtMSwgU2VydmVyUnVudGltZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFNlcnZlclJ1bnRpbWVfQ2xhc3NwYXRoKCksIHRoaXMuZ2V0Q2xhc3NwYXRoKCksIG51bGwsICJjbGFzc3BhdGgiLCBudWxsLCAxLCAtMSwgU2VydmVyUnVudGltZS5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VydmVyUnVudGltZV9KbmRpQ29ubmVjdGlvbigpLCB0aGlzLmdldEpuZGlDb25uZWN0aW9uKCksIG51bGwsICJqbmRpQ29ubmVjdGlvbiIsIG51bGwsIDEsIDEsIFNlcnZlclJ1bnRpbWUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFNlcnZlclJ1bnRpbWVfTmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAxLCAxLCBTZXJ2ZXJSdW50aW1lLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VydmVyUnVudGltZV9WZXJzaW9uKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAidmVyc2lvbiIsIG51bGwsIDAsIDEsIFNlcnZlclJ1bnRpbWUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCS8vIENyZWF0ZSByZXNvdXJjZQotCQljcmVhdGVSZXNvdXJjZShlTlNfVVJJKTsKLQotCQkvLyBDcmVhdGUgYW5ub3RhdGlvbnMKLQkJLy8gaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhCi0JCWNyZWF0ZUV4dGVuZGVkTWV0YURhdGFBbm5vdGF0aW9ucygpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSBhbm5vdGF0aW9ucyBmb3IgPGI+aHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhPC9iPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFeHRlbmRlZE1ldGFEYXRhQW5ub3RhdGlvbnMoKSB7Ci0JCVN0cmluZyBzb3VyY2UgPSAiaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIjsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGFyY2hpdmVUeXBlRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJhcmNoaXZlXy5fdHlwZSIsCi0JCQkgImtpbmQiLCAiZW1wdHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QXJjaGl2ZVR5cGVfUGF0aCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgInBhdGgiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoYXJndW1lbnRQYWlyRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJBcmd1bWVudFBhaXIiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEFyZ3VtZW50UGFpcl9OYW1lKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIm5hbWUiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QXJndW1lbnRQYWlyX1ZhbHVlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgInZhbHVlIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGNsYXNzcGF0aEVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiQ2xhc3NwYXRoIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRDbGFzc3BhdGhfR3JvdXAoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZ3JvdXAiLAotCQkJICJuYW1lIiwgImdyb3VwOjAiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0Q2xhc3NwYXRoX0FyY2hpdmUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiYXJjaGl2ZSIsCi0JCQkgImdyb3VwIiwgIiNncm91cDowIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldENsYXNzcGF0aF9JZCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgImlkIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGV4dGVybmFsRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJFeHRlcm5hbCIsCi0JCQkgImtpbmQiLCAic2ltcGxlIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEV4dGVybmFsX1ZhbHVlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIjowIiwKLQkJCSAia2luZCIsICJzaW1wbGUiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RXh0ZXJuYWxfT3MoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJvcyIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChqbmRpQ29ubmVjdGlvbkVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiam5kaUNvbm5lY3Rpb24iLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEpuZGlDb25uZWN0aW9uX1Byb3ZpZGVyVXJsKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgInByb3ZpZGVyVXJsIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEpuZGlDb25uZWN0aW9uX0dyb3VwKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImdyb3VwIiwKLQkJCSAibmFtZSIsICJncm91cDoxIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEpuZGlDb25uZWN0aW9uX0puZGlQcm9wZXJ0eSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJqbmRpUHJvcGVydHkiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRKbmRpQ29ubmVjdGlvbl9Jbml0aWFsQ29udGV4dEZhY3RvcnkoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiaW5pdGlhbENvbnRleHRGYWN0b3J5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGxhdW5jaENvbmZpZ3VyYXRpb25FQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIkxhdW5jaENvbmZpZ3VyYXRpb24iLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldExhdW5jaENvbmZpZ3VyYXRpb25fR3JvdXAoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZ3JvdXAiLAotCQkJICJuYW1lIiwgImdyb3VwOjAiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TGF1bmNoQ29uZmlndXJhdGlvbl9FbnZpcm9ubWVudFZhcmlhYmxlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgImVudmlyb25tZW50VmFyaWFibGUiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRMYXVuY2hDb25maWd1cmF0aW9uX0dyb3VwMSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJncm91cCIsCi0JCQkgIm5hbWUiLCAiZ3JvdXA6MiIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRMYXVuY2hDb25maWd1cmF0aW9uX1Byb2dyYW1Bcmd1bWVudHMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAicHJvZ3JhbUFyZ3VtZW50cyIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoyIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldExhdW5jaENvbmZpZ3VyYXRpb25fV29ya2luZ0RpcmVjdG9yeSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJ3b3JraW5nRGlyZWN0b3J5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldExhdW5jaENvbmZpZ3VyYXRpb25fTWFpbkNsYXNzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIm1haW5DbGFzcyIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRMYXVuY2hDb25maWd1cmF0aW9uX0dyb3VwMigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJncm91cCIsCi0JCQkgIm5hbWUiLCAiZ3JvdXA6NiIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRMYXVuY2hDb25maWd1cmF0aW9uX1ZtUGFyYW1ldGVycygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJ2bVBhcmFtZXRlcnMiLAotCQkJICJncm91cCIsICIjZ3JvdXA6NiIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRMYXVuY2hDb25maWd1cmF0aW9uX0NsYXNzcGF0aFJlZmVyZW5jZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJjbGFzc3BhdGhSZWZlcmVuY2UiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TGF1bmNoQ29uZmlndXJhdGlvbl9EZWJ1Z1BvcnQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiZGVidWdQb3J0IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldExhdW5jaENvbmZpZ3VyYXRpb25fR3JvdXAzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImdyb3VwIiwKLQkJCSAibmFtZSIsICJncm91cDoxMCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRMYXVuY2hDb25maWd1cmF0aW9uX0V4dGVybmFsKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgImV4dGVybmFsIiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjEwIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKG1vZHVsZUVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiTW9kdWxlIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNb2R1bGVfVHlwZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJ0eXBlIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1vZHVsZV9QdWJsaXNoRGlyKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgInB1Ymxpc2hEaXIiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TW9kdWxlX1B1Ymxpc2hlclJlZmVyZW5jZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJwdWJsaXNoZXJSZWZlcmVuY2UiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAocG9ydEVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiUG9ydCIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UG9ydF9ObygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJubyIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQb3J0X05hbWUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAibmFtZSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQb3J0X1Byb3RvY29sKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgInByb3RvY29sIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHByb2plY3RFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIlByb2plY3QiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFByb2plY3RfQ2xhc3NwYXRoUmVmZXJlbmNlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgImNsYXNzcGF0aFJlZmVyZW5jZSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChwcm9wZXJ0eUVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiUHJvcGVydHkiLAotCQkJICJraW5kIiwgImVtcHR5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFByb3BlcnR5X0NvbnRleHQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJjb250ZXh0IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFByb3BlcnR5X0RlZmF1bHQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJkZWZhdWx0IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFByb3BlcnR5X0lkKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAiaWQiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UHJvcGVydHlfTGFiZWwoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJsYWJlbCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQcm9wZXJ0eV9UeXBlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAidHlwZSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChwdWJsaXNoZXJFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIlB1Ymxpc2hlciIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UHVibGlzaGVyX0dyb3VwKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImdyb3VwIiwKLQkJCSAibmFtZSIsICJncm91cDowIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFB1Ymxpc2hlcl9QdWJsaXNoZXJkYXRhKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgInB1Ymxpc2hlcmRhdGEiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQdWJsaXNoZXJfSWQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJpZCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChwdWJsaXNoZXJEYXRhRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJQdWJsaXNoZXJEYXRhIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQdWJsaXNoZXJEYXRhX0RhdGFuYW1lKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgImRhdGFuYW1lIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFB1Ymxpc2hlckRhdGFfRGF0YXZhbHVlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgImRhdGF2YWx1ZSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoc2VydmVyUnVudGltZUVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiU2VydmVyUnVudGltZSIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2VydmVyUnVudGltZV9Hcm91cCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJncm91cCIsCi0JCQkgIm5hbWUiLCAiZ3JvdXA6MCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRTZXJ2ZXJSdW50aW1lX1Byb3BlcnR5KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgInByb3BlcnR5IiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjAiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2VydmVyUnVudGltZV9Hcm91cDEoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZ3JvdXAiLAotCQkJICJuYW1lIiwgImdyb3VwOjIiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2VydmVyUnVudGltZV9Qb3J0KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgInBvcnQiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MiIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRTZXJ2ZXJSdW50aW1lX0dyb3VwMigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJncm91cCIsCi0JCQkgIm5hbWUiLCAiZ3JvdXA6NCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRTZXJ2ZXJSdW50aW1lX01vZHVsZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJtb2R1bGUiLAotCQkJICJncm91cCIsICIjZ3JvdXA6NCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRTZXJ2ZXJSdW50aW1lX1Byb2plY3QoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAicHJvamVjdCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRTZXJ2ZXJSdW50aW1lX1N0YXJ0KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgInN0YXJ0IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlcnZlclJ1bnRpbWVfU3RvcCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJzdG9wIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlcnZlclJ1bnRpbWVfR3JvdXAzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImdyb3VwIiwKLQkJCSAibmFtZSIsICJncm91cDo5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlcnZlclJ1bnRpbWVfUHVibGlzaGVyKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgInB1Ymxpc2hlciIsCi0JCQkgImdyb3VwIiwgIiNncm91cDo5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlcnZlclJ1bnRpbWVfR3JvdXA0KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImdyb3VwIiwKLQkJCSAibmFtZSIsICJncm91cDoxMSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRTZXJ2ZXJSdW50aW1lX0NsYXNzcGF0aCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJjbGFzc3BhdGgiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MTEiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0U2VydmVyUnVudGltZV9KbmRpQ29ubmVjdGlvbigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJqbmRpQ29ubmVjdGlvbiIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRTZXJ2ZXJSdW50aW1lX05hbWUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJuYW1lIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlcnZlclJ1bnRpbWVfVmVyc2lvbigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgInZlcnNpb24iCi0JCSAgIH0pOwotCX0KLQotfSAvL1NlcnZlclR5cGVQYWNrYWdlSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi91dGlsL1NlcnZlclR5cGVBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi91dGlsL1NlcnZlclR5cGVBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTYzNjA2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9pbnRlcm5hbC9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vdXRpbC9TZXJ2ZXJUeXBlQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1MSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IEV0ZXJhdGlvbiBCaWxpc2ltIEEuUy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIKAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBFVEVSQVRJT04gQS5TLiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEV0ZXJhdGlvbiBCaWxpc2ltIEEuUy4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiBldGVyYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmV0ZXJhdGlvbi5jb20vPi4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogU2VydmVyVHlwZUFkYXB0ZXJGYWN0b3J5LmphdmEsdiAxLjcgMjAwNS8wOC8zMCAyMTo0NTo1MSBnZXJjYW4gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVyRmFjdG9yeUltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi4qOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+QWRhcHRlciBGYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgcHJvdmlkZXMgYW4gYWRhcHRlciA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJUeXBlUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU2VydmVyVHlwZUFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBTZXJ2ZXJUeXBlUGFja2FnZSBtb2RlbFBhY2thZ2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBhZGFwdGVyIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFNlcnZlclR5cGVBZGFwdGVyRmFjdG9yeSgpIHsKLQkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7Ci0JCQltb2RlbFBhY2thZ2UgPSBTZXJ2ZXJUeXBlUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9iamVjdCBpcyBlaXRoZXIgdGhlIG1vZGVsJ3MgcGFja2FnZSBvciBpcyBhbiBpbnN0YW5jZSBvYmplY3Qgb2YgdGhlIG1vZGVsLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJcmV0dXJuICgoRU9iamVjdClvYmplY3QpLmVDbGFzcygpLmdldEVQYWNrYWdlKCkgPT0gbW9kZWxQYWNrYWdlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgc3dpdGNoIHRoZSBkZWxlZ2F0ZXMgdG8gdGhlIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU2VydmVyVHlwZVN3aXRjaCBtb2RlbFN3aXRjaCA9Ci0JCW5ldyBTZXJ2ZXJUeXBlU3dpdGNoKCkgewotCQkJcHVibGljIE9iamVjdCBjYXNlQXJjaGl2ZVR5cGUoQXJjaGl2ZVR5cGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUFyY2hpdmVUeXBlQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlQXJndW1lbnRQYWlyKEFyZ3VtZW50UGFpciBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQXJndW1lbnRQYWlyQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlQ2xhc3NwYXRoKENsYXNzcGF0aCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQ2xhc3NwYXRoQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRXh0ZXJuYWwoRXh0ZXJuYWwgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUV4dGVybmFsQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlSm5kaUNvbm5lY3Rpb24oSm5kaUNvbm5lY3Rpb24gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUpuZGlDb25uZWN0aW9uQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlTGF1bmNoQ29uZmlndXJhdGlvbihMYXVuY2hDb25maWd1cmF0aW9uIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVMYXVuY2hDb25maWd1cmF0aW9uQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlTW9kdWxlKE1vZHVsZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlTW9kdWxlQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlUG9ydChQb3J0IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVQb3J0QWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlUHJvamVjdChQcm9qZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVQcm9qZWN0QWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlUHJvcGVydHkoUHJvcGVydHkgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVByb3BlcnR5QWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlUHVibGlzaGVyKFB1Ymxpc2hlciBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUHVibGlzaGVyQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlUHVibGlzaGVyRGF0YShQdWJsaXNoZXJEYXRhIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVQdWJsaXNoZXJEYXRhQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlU2VydmVyUnVudGltZShTZXJ2ZXJSdW50aW1lIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVTZXJ2ZXJSdW50aW1lQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFT2JqZWN0QWRhcHRlcigpOwotCQkJfQotCQl9OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB0YXJnZXQgdGhlIG9iamVjdCB0byBhZGFwdC4KLQkgKiBAcmV0dXJuIHRoZSBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQpIHsKLQkJcmV0dXJuIChBZGFwdGVyKW1vZGVsU3dpdGNoLmRvU3dpdGNoKChFT2JqZWN0KXRhcmdldCk7Ci0JfQotCi0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uQXJjaGl2ZVR5cGUgPGVtPkFyY2hpdmUgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkFyY2hpdmVUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFyY2hpdmVUeXBlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkFyZ3VtZW50UGFpciA8ZW0+QXJndW1lbnQgUGFpcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkFyZ3VtZW50UGFpcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBcmd1bWVudFBhaXJBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uQ2xhc3NwYXRoIDxlbT5DbGFzc3BhdGg8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5DbGFzc3BhdGgKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ2xhc3NwYXRoQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkV4dGVybmFsIDxlbT5FeHRlcm5hbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkV4dGVybmFsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUV4dGVybmFsQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkpuZGlDb25uZWN0aW9uIDxlbT5KbmRpIENvbm5lY3Rpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5KbmRpQ29ubmVjdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgQWRhcHRlciBjcmVhdGVKbmRpQ29ubmVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5MYXVuY2hDb25maWd1cmF0aW9uIDxlbT5MYXVuY2ggQ29uZmlndXJhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkxhdW5jaENvbmZpZ3VyYXRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTGF1bmNoQ29uZmlndXJhdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Nb2R1bGUgPGVtPk1vZHVsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLk1vZHVsZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNb2R1bGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUG9ydCA8ZW0+UG9ydDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlBvcnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUG9ydEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Qcm9qZWN0IDxlbT5Qcm9qZWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUHJvamVjdAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcm9qZWN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlByb3BlcnR5IDxlbT5Qcm9wZXJ0eTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlByb3BlcnR5Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByb3BlcnR5QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlB1Ymxpc2hlciA8ZW0+UHVibGlzaGVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUHVibGlzaGVyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVB1Ymxpc2hlckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5QdWJsaXNoZXJEYXRhIDxlbT5QdWJsaXNoZXIgRGF0YTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlB1Ymxpc2hlckRhdGEKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIEFkYXB0ZXIgY3JlYXRlUHVibGlzaGVyRGF0YUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJSdW50aW1lIDxlbT5TZXJ2ZXIgUnVudGltZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclJ1bnRpbWUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU2VydmVyUnVudGltZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgdGhlIGRlZmF1bHQgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0gLy9TZXJ2ZXJUeXBlQWRhcHRlckZhY3RvcnkKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9pbnRlcm5hbC9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vdXRpbC9TZXJ2ZXJUeXBlUmVzb3VyY2VGYWN0b3J5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi91dGlsL1NlcnZlclR5cGVSZXNvdXJjZUZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlMDNlYjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi91dGlsL1NlcnZlclR5cGVSZXNvdXJjZUZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IEV0ZXJhdGlvbiBCaWxpc2ltIEEuUy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIKAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBFVEVSQVRJT04gQS5TLiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEV0ZXJhdGlvbiBCaWxpc2ltIEEuUy4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiBldGVyYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmV0ZXJhdGlvbi5jb20vPi4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogU2VydmVyVHlwZVJlc291cmNlRmFjdG9yeUltcGwuamF2YSx2IDEuMyAyMDA1LzA4LzMwIDIxOjQ1OjUxIGdlcmNhbiBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24udXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlJlc291cmNlIEZhY3Rvcnk8L2I+IGFzc29jaWF0ZWQgd2l0aCB0aGUgcGFja2FnZS4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLnV0aWwuU2VydmVyVHlwZVJlc291cmNlSW1wbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU2VydmVyVHlwZVJlc291cmNlRmFjdG9yeUltcGwgZXh0ZW5kcyBSZXNvdXJjZUZhY3RvcnlJbXBsIHsKLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSByZXNvdXJjZSBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTZXJ2ZXJUeXBlUmVzb3VyY2VGYWN0b3J5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSByZXNvdXJjZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoVVJJIHVyaSkgewotCQlYTUxSZXNvdXJjZSByZXN1bHQgPSBuZXcgU2VydmVyVHlwZVJlc291cmNlSW1wbCh1cmkpOwotCQlyZXN1bHQuZ2V0RGVmYXVsdFNhdmVPcHRpb25zKCkucHV0KFhNTFJlc291cmNlLk9QVElPTl9FWFRFTkRFRF9NRVRBX0RBVEEsIEJvb2xlYW4uVFJVRSk7Ci0JCXJlc3VsdC5nZXREZWZhdWx0TG9hZE9wdGlvbnMoKS5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX0VYVEVOREVEX01FVEFfREFUQSwgQm9vbGVhbi5UUlVFKTsKLQotCQlyZXN1bHQuZ2V0RGVmYXVsdFNhdmVPcHRpb25zKCkucHV0KFhNTFJlc291cmNlLk9QVElPTl9TQ0hFTUFfTE9DQVRJT04sIEJvb2xlYW4uVFJVRSk7Ci0JCXJlc3VsdC5nZXREZWZhdWx0U2F2ZU9wdGlvbnMoKS5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX1VTRV9FTkNPREVEX0FUVFJJQlVURV9TVFlMRSwgQm9vbGVhbi5UUlVFKTsKLQotCQlyZXN1bHQuZ2V0RGVmYXVsdExvYWRPcHRpb25zKCkucHV0KFhNTFJlc291cmNlLk9QVElPTl9VU0VfTEVYSUNBTF9IQU5ETEVSLCBCb29sZWFuLlRSVUUpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotfSAvL1NlcnZlclR5cGVSZXNvdXJjZUZhY3RvcnlJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvaW50ZXJuYWwvc2VydmVydHlwZS9kZWZpbml0aW9uL3V0aWwvU2VydmVyVHlwZVJlc291cmNlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi91dGlsL1NlcnZlclR5cGVSZXNvdXJjZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDk5Y2FjNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvaW50ZXJuYWwvc2VydmVydHlwZS9kZWZpbml0aW9uL3V0aWwvU2VydmVyVHlwZVJlc291cmNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBFdGVyYXRpb24gQmlsaXNpbSBBLlMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiCgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgRVRFUkFUSU9OIEEuUy4gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBFdGVyYXRpb24gQmlsaXNpbSBBLlMuICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gZXRlcmF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5ldGVyYXRpb24uY29tLz4uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFNlcnZlclR5cGVSZXNvdXJjZUltcGwuamF2YSx2IDEuMiAyMDA1LzA2LzEzIDIxOjAxOjM2IGdlcmNhbiBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24udXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1MUmVzb3VyY2VJbXBsOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+UmVzb3VyY2UgPC9iPiBhc3NvY2lhdGVkIHdpdGggdGhlIHBhY2thZ2UuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi51dGlsLlNlcnZlclR5cGVSZXNvdXJjZUZhY3RvcnlJbXBsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJUeXBlUmVzb3VyY2VJbXBsIGV4dGVuZHMgWE1MUmVzb3VyY2VJbXBsIHsKLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSByZXNvdXJjZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB1cmkgdGhlIFVSSSBvZiB0aGUgbmV3IHJlc291cmNlLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU2VydmVyVHlwZVJlc291cmNlSW1wbChVUkkgdXJpKSB7Ci0JCXN1cGVyKHVyaSk7Ci0JfQotCi19IC8vU2VydmVyVHlwZVJlc291cmNlRmFjdG9yeUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9pbnRlcm5hbC9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vdXRpbC9TZXJ2ZXJUeXBlU3dpdGNoLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvaW50ZXJuYWwvc2VydmVydHlwZS9kZWZpbml0aW9uL3V0aWwvU2VydmVyVHlwZVN3aXRjaC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjJlYmVkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9pbnRlcm5hbC9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vdXRpbC9TZXJ2ZXJUeXBlU3dpdGNoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDkgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBFdGVyYXRpb24gQmlsaXNpbSBBLlMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiCgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgRVRFUkFUSU9OIEEuUy4gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBFdGVyYXRpb24gQmlsaXNpbSBBLlMuICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gZXRlcmF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5ldGVyYXRpb24uY29tLz4uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFNlcnZlclR5cGVTd2l0Y2guamF2YSx2IDEuNyAyMDA1LzA4LzMwIDIxOjQ1OjUxIGdlcmNhbiBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24udXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi4qOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+U3dpdGNoPC9iPiBmb3IgdGhlIG1vZGVsJ3MgaW5oZXJpdGFuY2UgaGllcmFyY2h5LgotICogSXQgc3VwcG9ydHMgdGhlIGNhbGwge0BsaW5rICNkb1N3aXRjaChFT2JqZWN0KSBkb1N3aXRjaChvYmplY3QpfQotICogdG8gaW52b2tlIHRoZSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLAotICogc3RhcnRpbmcgd2l0aCB0aGUgYWN0dWFsIGNsYXNzIG9mIHRoZSBvYmplY3QKLSAqIGFuZCBwcm9jZWVkaW5nIHVwIHRoZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkKLSAqIHVudGlsIGEgbm9uLW51bGwgcmVzdWx0IGlzIHJldHVybmVkLAotICogd2hpY2ggaXMgdGhlIHJlc3VsdCBvZiB0aGUgc3dpdGNoLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFNlcnZlclR5cGVTd2l0Y2ggewotCS8qKgotCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgU2VydmVyVHlwZVBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgc3dpdGNoLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTZXJ2ZXJUeXBlU3dpdGNoKCkgewotCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKLQkJCW1vZGVsUGFja2FnZSA9IFNlcnZlclR5cGVQYWNrYWdlLmVJTlNUQU5DRTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBkb1N3aXRjaChFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVPYmplY3QuZUNsYXNzKCksIHRoZUVPYmplY3QpOwotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBkb1N3aXRjaChFQ2xhc3MgdGhlRUNsYXNzLCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJaWYgKHRoZUVDbGFzcy5lQ29udGFpbmVyKCkgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlyZXR1cm4gZG9Td2l0Y2godGhlRUNsYXNzLmdldENsYXNzaWZpZXJJRCgpLCB0aGVFT2JqZWN0KTsKLQkJfQotCQllbHNlIHsKLQkJCUxpc3QgZVN1cGVyVHlwZXMgPSB0aGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKTsKLQkJCXJldHVybgotCQkJCWVTdXBlclR5cGVzLmlzRW1wdHkoKSA/Ci0JCQkJCWRlZmF1bHRDYXNlKHRoZUVPYmplY3QpIDoKLQkJCQkJZG9Td2l0Y2goKEVDbGFzcyllU3VwZXJUeXBlcy5nZXQoMCksIHRoZUVPYmplY3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGRvU3dpdGNoKGludCBjbGFzc2lmaWVySUQsIEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlzd2l0Y2ggKGNsYXNzaWZpZXJJRCkgewotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5BUkNISVZFX1RZUEU6IHsKLQkJCQlBcmNoaXZlVHlwZSBhcmNoaXZlVHlwZSA9IChBcmNoaXZlVHlwZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQXJjaGl2ZVR5cGUoYXJjaGl2ZVR5cGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuQVJHVU1FTlRfUEFJUjogewotCQkJCUFyZ3VtZW50UGFpciBhcmd1bWVudFBhaXIgPSAoQXJndW1lbnRQYWlyKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VBcmd1bWVudFBhaXIoYXJndW1lbnRQYWlyKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkNMQVNTUEFUSDogewotCQkJCUNsYXNzcGF0aCBjbGFzc3BhdGggPSAoQ2xhc3NwYXRoKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VDbGFzc3BhdGgoY2xhc3NwYXRoKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkVYVEVSTkFMOiB7Ci0JCQkJRXh0ZXJuYWwgZXh0ZXJuYWwgPSAoRXh0ZXJuYWwpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUV4dGVybmFsKGV4dGVybmFsKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLkpORElfQ09OTkVDVElPTjogewotCQkJCUpuZGlDb25uZWN0aW9uIGpuZGlDb25uZWN0aW9uID0gKEpuZGlDb25uZWN0aW9uKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VKbmRpQ29ubmVjdGlvbihqbmRpQ29ubmVjdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBTZXJ2ZXJUeXBlUGFja2FnZS5MQVVOQ0hfQ09ORklHVVJBVElPTjogewotCQkJCUxhdW5jaENvbmZpZ3VyYXRpb24gbGF1bmNoQ29uZmlndXJhdGlvbiA9IChMYXVuY2hDb25maWd1cmF0aW9uKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VMYXVuY2hDb25maWd1cmF0aW9uKGxhdW5jaENvbmZpZ3VyYXRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuTU9EVUxFOiB7Ci0JCQkJTW9kdWxlIG1vZHVsZSA9IChNb2R1bGUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZU1vZHVsZShtb2R1bGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuUE9SVDogewotCQkJCVBvcnQgcG9ydCA9IChQb3J0KXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VQb3J0KHBvcnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuUFJPSkVDVDogewotCQkJCVByb2plY3QgcHJvamVjdCA9IChQcm9qZWN0KXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VQcm9qZWN0KHByb2plY3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuUFJPUEVSVFk6IHsKLQkJCQlQcm9wZXJ0eSBwcm9wZXJ0eSA9IChQcm9wZXJ0eSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlUHJvcGVydHkocHJvcGVydHkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuUFVCTElTSEVSOiB7Ci0JCQkJUHVibGlzaGVyIHB1Ymxpc2hlciA9IChQdWJsaXNoZXIpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVB1Ymxpc2hlcihwdWJsaXNoZXIpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgU2VydmVyVHlwZVBhY2thZ2UuUFVCTElTSEVSX0RBVEE6IHsKLQkJCQlQdWJsaXNoZXJEYXRhIHB1Ymxpc2hlckRhdGEgPSAoUHVibGlzaGVyRGF0YSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlUHVibGlzaGVyRGF0YShwdWJsaXNoZXJEYXRhKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFNlcnZlclR5cGVQYWNrYWdlLlNFUlZFUl9SVU5USU1FOiB7Ci0JCQkJU2VydmVyUnVudGltZSBzZXJ2ZXJSdW50aW1lID0gKFNlcnZlclJ1bnRpbWUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVNlcnZlclJ1bnRpbWUoc2VydmVyUnVudGltZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJZGVmYXVsdDogcmV0dXJuIGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFyY2hpdmUgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BcmNoaXZlIFR5cGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUFyY2hpdmVUeXBlKEFyY2hpdmVUeXBlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QXJndW1lbnQgUGFpcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Bcmd1bWVudCBQYWlyPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VBcmd1bWVudFBhaXIoQXJndW1lbnRQYWlyIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q2xhc3NwYXRoPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNsYXNzcGF0aDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQ2xhc3NwYXRoKENsYXNzcGF0aCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkV4dGVybmFsPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkV4dGVybmFsPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFeHRlcm5hbChFeHRlcm5hbCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkpuZGkgQ29ubmVjdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5KbmRpIENvbm5lY3Rpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBPYmplY3QgY2FzZUpuZGlDb25uZWN0aW9uKEpuZGlDb25uZWN0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TGF1bmNoIENvbmZpZ3VyYXRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TGF1bmNoIENvbmZpZ3VyYXRpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUxhdW5jaENvbmZpZ3VyYXRpb24oTGF1bmNoQ29uZmlndXJhdGlvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1vZHVsZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Nb2R1bGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZU1vZHVsZShNb2R1bGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qb3J0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBvcnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVBvcnQoUG9ydCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByb2plY3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJvamVjdDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlUHJvamVjdChQcm9qZWN0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJvcGVydHk8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJvcGVydHk8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVByb3BlcnR5KFByb3BlcnR5IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHVibGlzaGVyPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlB1Ymxpc2hlcjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlUHVibGlzaGVyKFB1Ymxpc2hlciBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlB1Ymxpc2hlciBEYXRhPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlB1Ymxpc2hlciBEYXRhPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGNhc2VQdWJsaXNoZXJEYXRhKFB1Ymxpc2hlckRhdGEgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TZXJ2ZXIgUnVudGltZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TZXJ2ZXIgUnVudGltZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlU2VydmVyUnVudGltZShTZXJ2ZXJSdW50aW1lIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLCBidXQgdGhpcyBpcyB0aGUgbGFzdCBjYXNlIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0gLy9TZXJ2ZXJUeXBlU3dpdGNoCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvaW50ZXJuYWwveG1sL1Jlc29sdmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvaW50ZXJuYWwveG1sL1Jlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxMTlkZWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL2ludGVybmFsL3htbC9SZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBFdGVyYXRpb24gQS5TLiBhbmQgR29ya2VtIEVyY2FuLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IEdvcmtlbSBFcmNhbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgICAgICAgICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwueG1sOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkFyY2hpdmVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJSdW50aW1lOwotCi0KLXB1YmxpYyBjbGFzcyBSZXNvbHZlciB7Ci0KLQotCi0JcHJpdmF0ZSBNYXAgZlByb3BlcnR5VmFsdWVzID0gbmV3IEhhc2hNYXAoKTsKLQlwcml2YXRlIFNlcnZlclJ1bnRpbWUgc2VydmVyOwotCi0JLyoqCi0JICogQHBhcmFtIGltcGwKLQkgKi8KLQlwdWJsaWMgUmVzb2x2ZXIoU2VydmVyUnVudGltZSBydW50aW1lKSB7Ci0JCXRoaXMuc2VydmVyID0gcnVudGltZTsKLQl9Ci0JCi0JcHVibGljIExpc3QgcmVzb2x2ZUNsYXNzcGF0aFByb3BlcnRpZXMoTGlzdCBjcExpc3QpCi0JewotCQlBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoY3BMaXN0LnNpemUoKSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY3BMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlBcmNoaXZlVHlwZSBpdGVtID0gKEFyY2hpdmVUeXBlKSBjcExpc3QuZ2V0KGkpOwotCQkJU3RyaW5nIGNwYXRoID0gcmVzb2x2ZVByb3BlcnRpZXMoaXRlbS5nZXRQYXRoKCkpOwotCQkJbGlzdC5hZGQoY3BhdGgpOwotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0JCi0JcHVibGljIFN0cmluZyByZXNvbHZlUHJvcGVydGllcyhTdHJpbmcgcHJvcHBlZFN0cmluZykgewotCQlIYXNoTWFwIGNhY2hlID0gbmV3IEhhc2hNYXAoZ2V0UHJvcGVydGllcygpLnNpemUoKSk7Ci0JCUl0ZXJhdG9yIGl0ciA9IGdldFByb3BlcnRpZXMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRyLmhhc05leHQoKSkgewotCQkJUHJvcGVydHkgZWxlbWVudCA9KFByb3BlcnR5KSBpdHIubmV4dCgpOwotCQkJU3RyaW5nIHZhbHVlID0gZWxlbWVudC5nZXREZWZhdWx0KCk7Ci0JCQlpZihmUHJvcGVydHlWYWx1ZXMgIT0gbnVsbCAmJiBmUHJvcGVydHlWYWx1ZXMuY29udGFpbnNLZXkoZWxlbWVudC5nZXRJZCgpKSkKLQkJCSAgICB2YWx1ZT0oU3RyaW5nKWZQcm9wZXJ0eVZhbHVlcy5nZXQoZWxlbWVudC5nZXRJZCgpKTsKLQkJCWlmKCJkaXJlY3RvcnkiLmVxdWFscyhlbGVtZW50LmdldFR5cGUoKSkgfHwgImZpbGUiLmVxdWFscyhlbGVtZW50LmdldFR5cGUoKSkpCi0JCQkJdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKCdcXCcsJy8nKTsKLQkJCSBjYWNoZS5wdXQoZWxlbWVudC5nZXRJZCgpLCB2YWx1ZSk7Ci0JCX0KLQkJLy9TdHJpbmcgdm1QYXRoID0gaW5zdGFsbC5nZXRJbnN0YWxsTG9jYXRpb24oKS5nZXRDYW5vbmljYWxQYXRoKCk7Ci0JCS8vdm1QYXRoID0gdm1QYXRoLnJlcGxhY2UoJ1xcJywgJy8nKTsKLQkJY2FjaGUucHV0KCJqcmVQYXRoIiwgIkpSRSIpOwotCQljYWNoZS5wdXQoInBhdGhDaGFyIiwgRmlsZS5wYXRoU2VwYXJhdG9yKTsKLQotCQlTdHJpbmcgc3RyID0gcmVzb2x2ZVByb3BlcnRpZXNGcm9tQ2FjaGUocHJvcHBlZFN0cmluZywgY2FjaGUpOwotCQlzdHIgPSBmaXhQYXNzdGhyb3VnaFByb3BlcnRpZXMoc3RyKTsKLQkJcmV0dXJuIHN0cjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBMaXN0IGdldFByb3BlcnRpZXMoKSB7Ci0JCXJldHVybiB0aGlzLnNlcnZlci5nZXRQcm9wZXJ0eSgpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzdHIKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZml4UGFzc3Rocm91Z2hQcm9wZXJ0aWVzKFN0cmluZyBzdHIpIHsKLQkJU3RyaW5nIHJlc29sdmVkU3RyaW5nID0gc3RyOwotCQlpZiAoaXNQYXNzUHJvcGVydHlMZWZ0KHJlc29sdmVkU3RyaW5nKSkgewotCQkJcmVzb2x2ZWRTdHJpbmcgPSBmaXhQYXJhbShyZXNvbHZlZFN0cmluZyk7Ci0JCQlyZXNvbHZlZFN0cmluZyA9IGZpeFBhc3N0aHJvdWdoUHJvcGVydGllcyhyZXNvbHZlZFN0cmluZyk7Ci0JCX0KLQkJcmV0dXJuIHJlc29sdmVkU3RyaW5nOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIHJlc29sdmVQcm9wZXJ0aWVzRnJvbUNhY2hlKAotCQlTdHJpbmcgcHJvcHBlZFN0cmluZywKLQkJSGFzaE1hcCBjYWNoZSkgewotCQlTdHJpbmcgcmVzb2x2ZWRTdHJpbmcgPSBwcm9wcGVkU3RyaW5nOwotCQlpbnQgc3RhcnQgPSBza2lwVG9Qcm9wZXJ0eShyZXNvbHZlZFN0cmluZyxjYWNoZSk7Ci0JCWlmIChzdGFydCA+PSAwKSB7Ci0JCQlyZXNvbHZlZFN0cmluZyA9IHJlc29sdmVQcm9wZXJ0eShyZXNvbHZlZFN0cmluZywgc3RhcnQsIGNhY2hlKTsKLQkJCXJlc29sdmVkU3RyaW5nID0gcmVzb2x2ZVByb3BlcnRpZXNGcm9tQ2FjaGUocmVzb2x2ZWRTdHJpbmcsIGNhY2hlKTsKLQkJfQotCQlyZXR1cm4gcmVzb2x2ZWRTdHJpbmc7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgc2tpcFRvUHJvcGVydHkoU3RyaW5nIHN0cixIYXNoTWFwIGNhY2hlKSB7Ci0JCWludCBzdGFydCA9IC0xOyAKLQkJaW50IGVuZCA9ICAwOwotCQlTdHJpbmcgdmFsdWUgPSBudWxsOwotCQlkbyB7Ci0JCQlzdGFydCA9ICBzdHIuaW5kZXhPZigiJHsiLGVuZCk7Ci0JCQlpZiggc3RhcnQgPCAwKQotCQkJCXJldHVybiBzdGFydDsKLQkJCWVuZCA9IHN0ci5pbmRleE9mKCJ9Iiwgc3RhcnQpOwotCQkJCi0JCQlTdHJpbmcga2V5ID0gc3RyLnN1YnN0cmluZyhzdGFydCArIDIsIGVuZCk7Ci0JCQl2YWx1ZSA9IChTdHJpbmcpY2FjaGUuZ2V0KGtleSk7Ci0JCX0KLQkJd2hpbGUodmFsdWUgPT0gbnVsbCk7Ci0JCXJldHVybiBzdGFydDsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGlzUGFzc1Byb3BlcnR5TGVmdChTdHJpbmcgc3RyKSB7Ci0JCXJldHVybiBzdHIuaW5kZXhPZigiJXsiKSA+PSAwOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIHJlc29sdmVQcm9wZXJ0eShTdHJpbmcgcHJvcHBlZFN0cmluZywgaW50IHN0YXJ0LCBIYXNoTWFwIGNhY2hlKSB7Ci0JCVN0cmluZyBzdHIgPSBwcm9wcGVkU3RyaW5nOwotCQlzdGFydCA9IHN0ci5pbmRleE9mKCIkeyIpOwotCQlpbnQgZW5kID0gc3RyLmluZGV4T2YoIn0iLCBzdGFydCk7Ci0JCVN0cmluZyBrZXkgPSBzdHIuc3Vic3RyaW5nKHN0YXJ0ICsgMiwgZW5kKTsKLQkJU3RyaW5nIHZhbHVlID0gKFN0cmluZyljYWNoZS5nZXQoa2V5KTsKLQkJaWYodmFsdWUgPT0gbnVsbCApCi0JCQlyZXR1cm4gc3RyOwotCQlyZXR1cm4gc3RyLnN1YnN0cmluZygwLCBzdGFydCkKLQkJCSsgdmFsdWUKLQkJCSsgc3RyLnN1YnN0cmluZyhlbmQgKyAxKTsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZml4UGFyYW0oU3RyaW5nIHByb3BwZWRTdHJpbmcpIHsKLQkJU3RyaW5nIHN0ciA9IHByb3BwZWRTdHJpbmc7Ci0JCWludCBzdGFydCA9IHN0ci5pbmRleE9mKCIleyIpOwotCQlyZXR1cm4gc3RyLnN1YnN0cmluZygwLCBzdGFydCkKLQkJCSsgIiR7IgotCQkJKyBzdHIuc3Vic3RyaW5nKHN0YXJ0KzIpOwotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGZQcm9wZXJ0eVZhbHVlcy4KLQkgKi8KLQlwdWJsaWMgTWFwIGdldFByb3BlcnR5VmFsdWVzKCkgewotCQlyZXR1cm4gZlByb3BlcnR5VmFsdWVzOwotCX0KLQkvKioKLQkgKiBAcGFyYW0gcHJvcGVydHlWYWx1ZXMgVGhlIGZQcm9wZXJ0eVZhbHVlcyB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvcGVydHlWYWx1ZXMoTWFwIHByb3BlcnR5VmFsdWVzKSB7Ci0JCWZQcm9wZXJ0eVZhbHVlcyA9IHByb3BlcnR5VmFsdWVzOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9pbnRlcm5hbC94bWwvWE1MVXRpbHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9pbnRlcm5hbC94bWwvWE1MVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdkMDYzYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvaW50ZXJuYWwveG1sL1hNTFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC54bWw7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuV3JhcHBlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlU2V0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5pbnRlcm5hbC5Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsLlRyYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5jb3JlLnV0aWwuRXh0ZW5zaW9uUG9pbnRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi51dGlsLlNlcnZlclR5cGVSZXNvdXJjZUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyUnVudGltZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi1wdWJsaWMgY2xhc3MgWE1MVXRpbHMgewotCi0JCi0gICAgcHJpdmF0ZSBBcnJheUxpc3QgZGVmaW5pdGlvbnM7Ci0KLQotCXB1YmxpYyBYTUxVdGlscygpIHsKLQkJcmVmcmVzaCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCByZWZyZXNoKCkgewotCQlkZWZpbml0aW9ucz0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgSUV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSBFeHRlbnNpb25Qb2ludFV0aWwuZ2V0R2VuZXJpY1NlcnZlckRlZmluaXRpb25FeHRlbnNpb25zKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBleHRlbnNpb25zIT1udWxsICYmIGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBqYXZhLm5ldC5VUkkgZGVmaW5pdGlvbkZpbGU9bnVsbDsKLSAgICAgICAgICAgIElFeHRlbnNpb24gZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tpXTsKLSAgICAgICAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzID0gRXh0ZW5zaW9uUG9pbnRVdGlsLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cyhleHRlbnNpb24pOwotICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBlbGVtZW50cy5sZW5ndGg7IGorKykgewotICAgICAgICAgICAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50ID0gZWxlbWVudHNbal07Ci0gICAgICAgICAgICAgICAgZGVmaW5pdGlvbkZpbGUgPSBnZXREZWZpbml0aW9uRmlsZShlbGVtZW50KTsKLSAgICAgICAgICAgICAgICBTZXJ2ZXJSdW50aW1lIHJ1bnRpbWUgPXJlYWRGaWxlKGRlZmluaXRpb25GaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYocnVudGltZSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lLnNldElkKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJpZCIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWUuc2V0Q29uZmlndXJhdGlvbkVsZW1lbnROYW1lc3BhY2UoZWxlbWVudC5nZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWZpbml0aW9ucy5hZGQocnVudGltZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBleHRlbnNpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIGphdmEubmV0LlVSSSBnZXREZWZpbml0aW9uRmlsZShJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotICAgICAgICAKLSAgICAgICAgQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShlbGVtZW50LmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgU3RyaW5nIGRlZmluaXRpb25GaWxlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImRlZmluaXRpb25maWxlIik7Ci0gICAgICAgIFRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwiTG9hZGluZyBzZXJ2ZXJkZWYgZmlsZSAiK2RlZmluaXRpb25GaWxlKyIgZnJvbSBidW5kbGUgIitidW5kbGUuZ2V0U3ltYm9saWNOYW1lKCkpOwotICAgICAgICAKLSAgICAgICAgVVJMIHVybCA9IGJ1bmRsZS5nZXRFbnRyeShkZWZpbml0aW9uRmlsZSk7Ci0JCXRyeSB7Ci0JCQlqYXZhLm5ldC5VUkkgdXJpID0gbmV3IGphdmEubmV0LlVSSSh1cmwuZ2V0UHJvdG9jb2woKSwgdXJsLmdldEhvc3QoKSx1cmwuZ2V0UGF0aCgpLCB1cmwuZ2V0UXVlcnkoKSk7Ci0JCSAgICByZXR1cm4gdXJpOwotCQl9IGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZSkgewotCQkJLy9pZ25vcmUKLQkJfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFNlcnZlclJ1bnRpbWUgcmVhZEZpbGUoamF2YS5uZXQuVVJJIGZpbGUpIHsKLSAgICAgICAgLy8gQ3JlYXRlIGEgcmVzb3VyY2Ugc2V0LgotICAgICAgICBSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IG5ldyBSZXNvdXJjZVNldEltcGwoKTsKLQotICAgICAgICAvLyBSZWdpc3RlciB0aGUgZGVmYXVsdCByZXNvdXJjZSBmYWN0b3J5IC0tIG9ubHkgbmVlZGVkIGZvcgotICAgICAgICAvLyBzdGFuZC1hbG9uZSEKLSAgICAgICAgcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkoKS5nZXRFeHRlbnNpb25Ub0ZhY3RvcnlNYXAoKQotICAgICAgICAgICAgICAgIC5wdXQoUmVzb3VyY2UuRmFjdG9yeS5SZWdpc3RyeS5ERUZBVUxUX0VYVEVOU0lPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTZXJ2ZXJUeXBlUmVzb3VyY2VGYWN0b3J5SW1wbCgpKTsKLQotICAgICAgICAgU2VydmVyVHlwZVBhY2thZ2UgZ3N0UGFjayA9IFNlcnZlclR5cGVQYWNrYWdlLmVJTlNUQU5DRTsKLQotICAgICAgICAvLyBHZXQgdGhlIFVSSSBvZiB0aGUgbW9kZWwgZmlsZS4KLSAgICAgICAgVVJJIGZpbGVVUkkgPSBVUkkuY3JlYXRlVVJJKGZpbGUudG9TdHJpbmcoKSk7Ci0KLSAgICAgICAgLy8gRGVtYW5kIGxvYWQgdGhlIHJlc291cmNlIGZvciB0aGlzIGZpbGUuCi0gICAgICAgIFJlc291cmNlIHJlc291cmNlID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJlc291cmNlID0gcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2UoZmlsZVVSSSwgdHJ1ZSk7Ci0gICAgICAgIH0gY2F0Y2ggKFdyYXBwZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gc3RoIHdyb25nIHdpdGggdGhpcyAuc2VydmVyIGZpbGUuCi0gICAgICAgICAgICBDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2coKS5sb2coCi0gICAgICAgICAgICAgICAgICAgIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ29yZVBsdWdpbi5QTFVHSU5fSUQsIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIGxvYWRpbmcgdGhlIHNlcnZlciB0eXBlIGRlZmluaXRpb24iLCBlKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgU2VydmVyUnVudGltZSBkZWYgPSAoU2VydmVyUnVudGltZSkgcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5nZXQoMCk7Ci0gICAgICAgICAgICBpZiAoZGVmICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBkZWYuc2V0RmlsZW5hbWUoZmlsZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZGVmOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotCi0gICAgfQotCi0KLQkvKioKLQkgKiBAcmV0dXJuIEFycmF5TGlzdAotCSAqLwotCXB1YmxpYyBBcnJheUxpc3QgZ2V0U2VydmVyVHlwZURlZmluaXRpb25zKCkgewotCQlyZXR1cm4gZGVmaW5pdGlvbnM7Ci0JfQotCi0gICAgcHVibGljIFNlcnZlclJ1bnRpbWUgZ2V0U2VydmVyVHlwZURlZmluaXRpb24oU3RyaW5nIGlkKSB7Ci0gICAgCUl0ZXJhdG9yIGRlZnMgPSBnZXRTZXJ2ZXJUeXBlRGVmaW5pdGlvbnMoKS5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoZGVmcy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIFNlcnZlclJ1bnRpbWUgZWxlbSA9IChTZXJ2ZXJSdW50aW1lKSBkZWZzLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChpZC5lcXVhbHMoZWxlbS5nZXRJZCgpKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZWxlbTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvc2VydmVydHlwZS9kZWZpbml0aW9uL0FyY2hpdmVUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvc2VydmVydHlwZS9kZWZpbml0aW9uL0FyY2hpdmVUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0NDBmOGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9BcmNoaXZlVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBFdGVyYXRpb24gQmlsaXNpbSBBLlMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiCgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgRVRFUkFUSU9OIEEuUy4gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBFdGVyYXRpb24gQmlsaXNpbSBBLlMuICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gZXRlcmF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5ldGVyYXRpb24uY29tLz4uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEFyY2hpdmVUeXBlLmphdmEsdiAxLjEwIDIwMDUvMDcvMTUgMDU6Mjk6MjkgZ2VyY2FuIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BcmNoaXZlIFR5cGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5BcmNoaXZlVHlwZSNnZXRQYXRoIDxlbT5QYXRoPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlI2dldEFyY2hpdmVUeXBlKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdhcmNoaXZlXy5fdHlwZScga2luZD0nZW1wdHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFyY2hpdmVUeXBlIGV4dGVuZHMgRU9iamVjdHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QYXRoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QYXRoPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAgICogCi0JICogPC9wPgotCSAqIAotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBhdGg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFBhdGgoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJUeXBlUGFja2FnZSNnZXRBcmNoaXZlVHlwZV9QYXRoKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0ncGF0aCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQYXRoKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkFyY2hpdmVUeXBlI2dldFBhdGggPGVtPlBhdGg8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBhdGg8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2dldFBhdGgoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLS8vCXZvaWQgc2V0UGF0aChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5BcmNoaXZlVHlwZSNnZXRQYXRoIDxlbT5QYXRoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QYXRoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQYXRoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQYXRoKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gQXJjaGl2ZVR5cGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vQXJndW1lbnRQYWlyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvc2VydmVydHlwZS9kZWZpbml0aW9uL0FyZ3VtZW50UGFpci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmMxYmExLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vQXJndW1lbnRQYWlyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEFyZ3VtZW50UGFpci5qYXZhLHYgMS4xIDIwMDUvMDgvMzAgMjE6NDM6MjQgZ2VyY2FuIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Bcmd1bWVudCBQYWlyPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uQXJndW1lbnRQYWlyI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uQXJndW1lbnRQYWlyI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJUeXBlUGFja2FnZSNnZXRBcmd1bWVudFBhaXIoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0FyZ3VtZW50UGFpcicga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFyZ3VtZW50UGFpciBleHRlbmRzIEVPYmplY3R7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2UjZ2V0QXJndW1lbnRQYWlyX05hbWUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgcmVxdWlyZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J25hbWUnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Bcmd1bWVudFBhaXIjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRWYWx1ZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlI2dldEFyZ3VtZW50UGFpcl9WYWx1ZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0ndmFsdWUnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VmFsdWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uQXJndW1lbnRQYWlyI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpOwotCi19IC8vIEFyZ3VtZW50UGFpcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9DbGFzc3BhdGguamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vQ2xhc3NwYXRoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlOGMzODguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9DbGFzc3BhdGguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IEV0ZXJhdGlvbiBCaWxpc2ltIEEuUy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIKAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBFVEVSQVRJT04gQS5TLiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEV0ZXJhdGlvbiBCaWxpc2ltIEEuUy4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiBldGVyYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmV0ZXJhdGlvbi5jb20vPi4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQ2xhc3NwYXRoLmphdmEsdiAxLjkgMjAwNS8wNi8xNCAyMDo0NTo0NSBnZXJjYW4gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNsYXNzcGF0aDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkNsYXNzcGF0aCNnZXRHcm91cCA8ZW0+R3JvdXA8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uQ2xhc3NwYXRoI2dldEFyY2hpdmUgPGVtPkFyY2hpdmU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uQ2xhc3NwYXRoI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJUeXBlUGFja2FnZSNnZXRDbGFzc3BhdGgoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0NsYXNzcGF0aCcga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIENsYXNzcGF0aCBleHRlbmRzIEVPYmplY3R7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwLkVudHJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdyb3VwPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3JvdXA8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlI2dldENsYXNzcGF0aF9Hcm91cCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZlYXR1cmVNYXBFbnRyeSIgbWFueT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZ3JvdXAnIG5hbWU9J2dyb3VwOjAnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlGZWF0dXJlTWFwIGdldEdyb3VwKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BcmNoaXZlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5BcmNoaXZlVHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BcmNoaXZlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXJjaGl2ZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2UjZ2V0Q2xhc3NwYXRoX0FyY2hpdmUoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkFyY2hpdmVUeXBlIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIiByZXF1aXJlZD0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nYXJjaGl2ZScgZ3JvdXA9JyNncm91cDowJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRBcmNoaXZlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2UjZ2V0Q2xhc3NwYXRoX0lkKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0naWQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uQ2xhc3NwYXRoI2dldElkIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5DbGFzc3BhdGgjaXNJc0xpYnJhcnkgPGVtPklzIExpYnJhcnk8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklzIExpYnJhcnk8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2lzU2V0SXNMaWJyYXJ5KCkKLSAgICAgKiBAc2VlICN1bnNldElzTGlicmFyeSgpCi0gICAgICogQHNlZSAjaXNJc0xpYnJhcnkoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLS8vCXZvaWQgc2V0SXNMaWJyYXJ5KGJvb2xlYW4gdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkNsYXNzcGF0aCNpc0lzTGlicmFyeSA8ZW0+SXMgTGlicmFyeTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjaXNTZXRJc0xpYnJhcnkoKQotICAgICAqIEBzZWUgI2lzSXNMaWJyYXJ5KCkKLSAgICAgKiBAc2VlICNzZXRJc0xpYnJhcnkoYm9vbGVhbikKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0vLwl2b2lkIHVuc2V0SXNMaWJyYXJ5KCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uQ2xhc3NwYXRoI2lzSXNMaWJyYXJ5IDxlbT5JcyBMaWJyYXJ5PC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBMaWJyYXJ5PC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0gICAgICogQHNlZSAjdW5zZXRJc0xpYnJhcnkoKQotICAgICAqIEBzZWUgI2lzSXNMaWJyYXJ5KCkKLSAgICAgKiBAc2VlICNzZXRJc0xpYnJhcnkoYm9vbGVhbikKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0vLwlib29sZWFuIGlzU2V0SXNMaWJyYXJ5KCk7Ci0KLX0gLy8gQ2xhc3NwYXRoCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvc2VydmVydHlwZS9kZWZpbml0aW9uL0V4dGVybmFsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvc2VydmVydHlwZS9kZWZpbml0aW9uL0V4dGVybmFsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1YjcwZmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9FeHRlcm5hbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBFeHRlcm5hbC5qYXZhLHYgMS4yIDIwMDUvMDgvMzAgMjE6NDM6MjQgZ2VyY2FuIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FeHRlcm5hbDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkV4dGVybmFsI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5FeHRlcm5hbCNnZXRPcyA8ZW0+T3M8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2UjZ2V0RXh0ZXJuYWwoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0V4dGVybmFsJyBraW5kPSdzaW1wbGUnIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEV4dGVybmFsIGV4dGVuZHMgRU9iamVjdHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFZhbHVlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2UjZ2V0RXh0ZXJuYWxfVmFsdWUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nOjAnIGtpbmQ9J3NpbXBsZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRWYWx1ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5FeHRlcm5hbCNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk9zPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5PczwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0T3MoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJUeXBlUGFja2FnZSNnZXRFeHRlcm5hbF9PcygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J29zJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE9zKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkV4dGVybmFsI2dldE9zIDxlbT5PczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+T3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE9zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRPcyhTdHJpbmcgdmFsdWUpOwotCi19IC8vIEV4dGVybmFsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvc2VydmVydHlwZS9kZWZpbml0aW9uL0puZGlDb25uZWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvc2VydmVydHlwZS9kZWZpbml0aW9uL0puZGlDb25uZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxODM3ZTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9KbmRpQ29ubmVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogSm5kaUNvbm5lY3Rpb24uamF2YSx2IDEuNiAyMDA1LzA4LzMwIDIxOjQzOjI0IGdlcmNhbiBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Sm5kaSBDb25uZWN0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uSm5kaUNvbm5lY3Rpb24jZ2V0UHJvdmlkZXJVcmwgPGVtPlByb3ZpZGVyIFVybDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5KbmRpQ29ubmVjdGlvbiNnZXRHcm91cCA8ZW0+R3JvdXA8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uSm5kaUNvbm5lY3Rpb24jZ2V0Sm5kaVByb3BlcnR5IDxlbT5KbmRpIFByb3BlcnR5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkpuZGlDb25uZWN0aW9uI2dldEluaXRpYWxDb250ZXh0RmFjdG9yeSA8ZW0+SW5pdGlhbCBDb250ZXh0IEZhY3Rvcnk8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2UjZ2V0Sm5kaUNvbm5lY3Rpb24oKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J2puZGlDb25uZWN0aW9uJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSm5kaUNvbm5lY3Rpb24gZXh0ZW5kcyBFT2JqZWN0ewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByb3ZpZGVyIFVybDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJvdmlkZXIgVXJsPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLSAgICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAgICogPC9wPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByb3ZpZGVyIFVybDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UHJvdmlkZXJVcmwoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJUeXBlUGFja2FnZSNnZXRKbmRpQ29ubmVjdGlvbl9Qcm92aWRlclVybCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0ncHJvdmlkZXJVcmwnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBTdHJpbmcgZ2V0UHJvdmlkZXJVcmwoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uSm5kaUNvbm5lY3Rpb24jZ2V0UHJvdmlkZXJVcmwgPGVtPlByb3ZpZGVyIFVybDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJvdmlkZXIgVXJsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQcm92aWRlclVybCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHJvdmlkZXJVcmwoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcC5FbnRyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Hcm91cDwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdyb3VwPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJUeXBlUGFja2FnZSNnZXRKbmRpQ29ubmVjdGlvbl9Hcm91cCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZlYXR1cmVNYXBFbnRyeSIgbWFueT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZ3JvdXAnIG5hbWU9J2dyb3VwOjEnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlGZWF0dXJlTWFwIGdldEdyb3VwKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5KbmRpIFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Bcmd1bWVudFBhaXJ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Sm5kaSBQcm9wZXJ0eTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLSAgICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAgICogPC9wPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkpuZGkgUHJvcGVydHk8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlI2dldEpuZGlDb25uZWN0aW9uX0puZGlQcm9wZXJ0eSgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uQXJndW1lbnRQYWlyIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdqbmRpUHJvcGVydHknIGdyb3VwPScjZ3JvdXA6MSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIExpc3QgZ2V0Sm5kaVByb3BlcnR5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Jbml0aWFsIENvbnRleHQgRmFjdG9yeTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SW5pdGlhbCBDb250ZXh0IEZhY3Rvcnk8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotICAgICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICAgKiA8L3A+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW5pdGlhbCBDb250ZXh0IEZhY3Rvcnk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEluaXRpYWxDb250ZXh0RmFjdG9yeShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlI2dldEpuZGlDb25uZWN0aW9uX0luaXRpYWxDb250ZXh0RmFjdG9yeSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0naW5pdGlhbENvbnRleHRGYWN0b3J5JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgU3RyaW5nIGdldEluaXRpYWxDb250ZXh0RmFjdG9yeSgpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5KbmRpQ29ubmVjdGlvbiNnZXRJbml0aWFsQ29udGV4dEZhY3RvcnkgPGVtPkluaXRpYWwgQ29udGV4dCBGYWN0b3J5PC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Jbml0aWFsIENvbnRleHQgRmFjdG9yeTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjZ2V0SW5pdGlhbENvbnRleHRGYWN0b3J5KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0vLyAgICB2b2lkIHNldEluaXRpYWxDb250ZXh0RmFjdG9yeShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5KbmRpQ29ubmVjdGlvbiNnZXRJbml0aWFsQ29udGV4dEZhY3RvcnkgPGVtPkluaXRpYWwgQ29udGV4dCBGYWN0b3J5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Jbml0aWFsIENvbnRleHQgRmFjdG9yeTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SW5pdGlhbENvbnRleHRGYWN0b3J5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJbml0aWFsQ29udGV4dEZhY3RvcnkoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBKbmRpQ29ubmVjdGlvbgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9MYXVuY2hDb25maWd1cmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvc2VydmVydHlwZS9kZWZpbml0aW9uL0xhdW5jaENvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU5MjRkMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvc2VydmVydHlwZS9kZWZpbml0aW9uL0xhdW5jaENvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyMSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IEV0ZXJhdGlvbiBCaWxpc2ltIEEuUy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIKAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBFVEVSQVRJT04gQS5TLiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEV0ZXJhdGlvbiBCaWxpc2ltIEEuUy4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiBldGVyYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmV0ZXJhdGlvbi5jb20vPi4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogTGF1bmNoQ29uZmlndXJhdGlvbi5qYXZhLHYgMS4xMCAyMDA1LzA4LzMwIDIxOjQzOjI0IGdlcmNhbiBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TGF1bmNoIENvbmZpZ3VyYXRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5MYXVuY2hDb25maWd1cmF0aW9uI2dldEdyb3VwIDxlbT5Hcm91cDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5MYXVuY2hDb25maWd1cmF0aW9uI2dldEVudmlyb25tZW50VmFyaWFibGUgPGVtPkVudmlyb25tZW50IFZhcmlhYmxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkxhdW5jaENvbmZpZ3VyYXRpb24jZ2V0R3JvdXAxIDxlbT5Hcm91cDE8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uTGF1bmNoQ29uZmlndXJhdGlvbiNnZXRQcm9ncmFtQXJndW1lbnRzIDxlbT5Qcm9ncmFtIEFyZ3VtZW50czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5MYXVuY2hDb25maWd1cmF0aW9uI2dldFdvcmtpbmdEaXJlY3RvcnkgPGVtPldvcmtpbmcgRGlyZWN0b3J5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkxhdW5jaENvbmZpZ3VyYXRpb24jZ2V0TWFpbkNsYXNzIDxlbT5NYWluIENsYXNzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkxhdW5jaENvbmZpZ3VyYXRpb24jZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uTGF1bmNoQ29uZmlndXJhdGlvbiNnZXRWbVBhcmFtZXRlcnMgPGVtPlZtIFBhcmFtZXRlcnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uTGF1bmNoQ29uZmlndXJhdGlvbiNnZXRDbGFzc3BhdGhSZWZlcmVuY2UgPGVtPkNsYXNzcGF0aCBSZWZlcmVuY2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uTGF1bmNoQ29uZmlndXJhdGlvbiNnZXREZWJ1Z1BvcnQgPGVtPkRlYnVnIFBvcnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uTGF1bmNoQ29uZmlndXJhdGlvbiNnZXRHcm91cDMgPGVtPkdyb3VwMzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5MYXVuY2hDb25maWd1cmF0aW9uI2dldEV4dGVybmFsIDxlbT5FeHRlcm5hbDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJUeXBlUGFja2FnZSNnZXRMYXVuY2hDb25maWd1cmF0aW9uKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdMYXVuY2hDb25maWd1cmF0aW9uJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTGF1bmNoQ29uZmlndXJhdGlvbiBleHRlbmRzIEVPYmplY3R7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWFpbiBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWFpbiBDbGFzczwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0gICAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgICAqIDwvcD4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYWluIENsYXNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRNYWluQ2xhc3MoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJUeXBlUGFja2FnZSNnZXRMYXVuY2hDb25maWd1cmF0aW9uX01haW5DbGFzcygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdtYWluQ2xhc3MnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBTdHJpbmcgZ2V0TWFpbkNsYXNzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkxhdW5jaENvbmZpZ3VyYXRpb24jZ2V0TWFpbkNsYXNzIDxlbT5NYWluIENsYXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NYWluIENsYXNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRNYWluQ2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE1haW5DbGFzcyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcC5FbnRyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Hcm91cDI8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDI8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlI2dldExhdW5jaENvbmZpZ3VyYXRpb25fR3JvdXAyKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmVhdHVyZU1hcEVudHJ5IiBtYW55PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdncm91cCcgbmFtZT0nZ3JvdXA6NiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZlYXR1cmVNYXAgZ2V0R3JvdXAyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Xb3JraW5nIERpcmVjdG9yeTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V29ya2luZyBEaXJlY3Rvcnk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFdvcmtpbmdEaXJlY3RvcnkoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJUeXBlUGFja2FnZSNnZXRMYXVuY2hDb25maWd1cmF0aW9uX1dvcmtpbmdEaXJlY3RvcnkoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgcmVxdWlyZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J3dvcmtpbmdEaXJlY3RvcnknIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0V29ya2luZ0RpcmVjdG9yeSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5MYXVuY2hDb25maWd1cmF0aW9uI2dldFdvcmtpbmdEaXJlY3RvcnkgPGVtPldvcmtpbmcgRGlyZWN0b3J5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Xb3JraW5nIERpcmVjdG9yeTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0V29ya2luZ0RpcmVjdG9yeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0V29ya2luZ0RpcmVjdG9yeShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJvZ3JhbSBBcmd1bWVudHM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByb2dyYW0gQXJndW1lbnRzPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJUeXBlUGFja2FnZSNnZXRMYXVuY2hDb25maWd1cmF0aW9uX1Byb2dyYW1Bcmd1bWVudHMoKQotCSAqIEBtb2RlbCB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIiB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0ncHJvZ3JhbUFyZ3VtZW50cycgZ3JvdXA9JyNncm91cDoyJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRQcm9ncmFtQXJndW1lbnRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgY29uY2F0ZW5hdGVkIFN0cmluZyBvZiBhbGwgUHJvZ3JhbSBBcmd1bWVudHMKLQkgKiBAZ2VuZXJhdGVkIE5PVAotCSAqIEByZXR1cm4KLQkgKi8KLQlTdHJpbmcgZ2V0UHJvZ3JhbUFyZ3VtZW50c0FzU3RyaW5nKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIGNvbmNhdGVuYXRlZCBTdHJpbmcgb2YgYWxsIFZtIHBhcmFtZXRlcnMuCi0JICogQGdlbmVyYXRlZCBOT1QKLQkgKiBAcmV0dXJuCi0JICovCi0JU3RyaW5nIGdldFZtUGFyYW1ldGVyc0FzU3RyaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WbSBQYXJhbWV0ZXJzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WbSBQYXJhbWV0ZXJzPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJUeXBlUGFja2FnZSNnZXRMYXVuY2hDb25maWd1cmF0aW9uX1ZtUGFyYW1ldGVycygpCi0JICogQG1vZGVsIHR5cGU9ImphdmEubGFuZy5TdHJpbmciIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSd2bVBhcmFtZXRlcnMnIGdyb3VwPScjZ3JvdXA6NiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0Vm1QYXJhbWV0ZXJzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DbGFzc3BhdGggUmVmZXJlbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DbGFzc3BhdGggUmVmZXJlbmNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDbGFzc3BhdGhSZWZlcmVuY2UoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJUeXBlUGFja2FnZSNnZXRMYXVuY2hDb25maWd1cmF0aW9uX0NsYXNzcGF0aFJlZmVyZW5jZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdjbGFzc3BhdGhSZWZlcmVuY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0Q2xhc3NwYXRoUmVmZXJlbmNlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkxhdW5jaENvbmZpZ3VyYXRpb24jZ2V0Q2xhc3NwYXRoUmVmZXJlbmNlIDxlbT5DbGFzc3BhdGggUmVmZXJlbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DbGFzc3BhdGggUmVmZXJlbmNlPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNnZXRDbGFzc3BhdGhSZWZlcmVuY2UoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLS8vCXZvaWQgc2V0Q2xhc3NwYXRoUmVmZXJlbmNlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkxhdW5jaENvbmZpZ3VyYXRpb24jZ2V0Q2xhc3NwYXRoUmVmZXJlbmNlIDxlbT5DbGFzc3BhdGggUmVmZXJlbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DbGFzc3BhdGggUmVmZXJlbmNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDbGFzc3BhdGhSZWZlcmVuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENsYXNzcGF0aFJlZmVyZW5jZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXh0ZXJuYWw8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkV4dGVybmFsfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkV4dGVybmFsPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkV4dGVybmFsPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJUeXBlUGFja2FnZSNnZXRMYXVuY2hDb25maWd1cmF0aW9uX0V4dGVybmFsKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5FeHRlcm5hbCIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nZXh0ZXJuYWwnIGdyb3VwPScjZ3JvdXA6MTAnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldEV4dGVybmFsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZWJ1ZyBQb3J0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZWJ1ZyBQb3J0PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlYnVnIFBvcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldERlYnVnUG9ydChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlI2dldExhdW5jaENvbmZpZ3VyYXRpb25fRGVidWdQb3J0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J2RlYnVnUG9ydCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXREZWJ1Z1BvcnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uTGF1bmNoQ29uZmlndXJhdGlvbiNnZXREZWJ1Z1BvcnQgPGVtPkRlYnVnIFBvcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRlYnVnIFBvcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldERlYnVnUG9ydCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RGVidWdQb3J0KFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Hcm91cDM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwLkVudHJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdyb3VwMzwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdyb3VwMzwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2UjZ2V0TGF1bmNoQ29uZmlndXJhdGlvbl9Hcm91cDMoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGZWF0dXJlTWFwRW50cnkiIG1hbnk9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2dyb3VwJyBuYW1lPSdncm91cDoxMCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZlYXR1cmVNYXAgZ2V0R3JvdXAzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3JvdXA8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2UjZ2V0TGF1bmNoQ29uZmlndXJhdGlvbl9Hcm91cCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZlYXR1cmVNYXBFbnRyeSIgbWFueT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZ3JvdXAnIG5hbWU9J2dyb3VwOjAnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlGZWF0dXJlTWFwIGdldEdyb3VwKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FbnZpcm9ubWVudCBWYXJpYWJsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uQXJndW1lbnRQYWlyfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVudmlyb25tZW50IFZhcmlhYmxlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RW52aXJvbm1lbnQgVmFyaWFibGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlI2dldExhdW5jaENvbmZpZ3VyYXRpb25fRW52aXJvbm1lbnRWYXJpYWJsZSgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uQXJndW1lbnRQYWlyIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdlbnZpcm9ubWVudFZhcmlhYmxlJyBncm91cD0nI2dyb3VwOjAnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldEVudmlyb25tZW50VmFyaWFibGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3JvdXAxPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3JvdXAxPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJUeXBlUGFja2FnZSNnZXRMYXVuY2hDb25maWd1cmF0aW9uX0dyb3VwMSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZlYXR1cmVNYXBFbnRyeSIgbWFueT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZ3JvdXAnIG5hbWU9J2dyb3VwOjInIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlGZWF0dXJlTWFwIGdldEdyb3VwMSgpOwotCi19IC8vIExhdW5jaENvbmZpZ3VyYXRpb24KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vTW9kdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvc2VydmVydHlwZS9kZWZpbml0aW9uL01vZHVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTdmN2JhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vTW9kdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBFdGVyYXRpb24gQmlsaXNpbSBBLlMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiCgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgRVRFUkFUSU9OIEEuUy4gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBFdGVyYXRpb24gQmlsaXNpbSBBLlMuICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gZXRlcmF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5ldGVyYXRpb24uY29tLz4uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IE1vZHVsZS5qYXZhLHYgMS43IDIwMDUvMDYvMTQgMjA6NDU6NDUgZ2VyY2FuIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Nb2R1bGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Nb2R1bGUjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Nb2R1bGUjZ2V0UHVibGlzaERpciA8ZW0+UHVibGlzaCBEaXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uTW9kdWxlI2dldFB1Ymxpc2hlclJlZmVyZW5jZSA8ZW0+UHVibGlzaGVyIFJlZmVyZW5jZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJUeXBlUGFja2FnZSNnZXRNb2R1bGUoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J01vZHVsZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1vZHVsZSBleHRlbmRzIEVPYmplY3R7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRUeXBlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2UjZ2V0TW9kdWxlX1R5cGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgcmVxdWlyZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J3R5cGUnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Nb2R1bGUjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VHlwZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHVibGlzaCBEaXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlB1Ymxpc2ggRGlyPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQdWJsaXNoRGlyKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2UjZ2V0TW9kdWxlX1B1Ymxpc2hEaXIoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgcmVxdWlyZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J3B1Ymxpc2hEaXInIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UHVibGlzaERpcigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Nb2R1bGUjZ2V0UHVibGlzaERpciA8ZW0+UHVibGlzaCBEaXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlB1Ymxpc2ggRGlyPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQdWJsaXNoRGlyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQdWJsaXNoRGlyKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QdWJsaXNoZXIgUmVmZXJlbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QdWJsaXNoZXIgUmVmZXJlbmNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQdWJsaXNoZXJSZWZlcmVuY2UoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJUeXBlUGFja2FnZSNnZXRNb2R1bGVfUHVibGlzaGVyUmVmZXJlbmNlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHJlcXVpcmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdwdWJsaXNoZXJSZWZlcmVuY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UHVibGlzaGVyUmVmZXJlbmNlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLk1vZHVsZSNnZXRQdWJsaXNoZXJSZWZlcmVuY2UgPGVtPlB1Ymxpc2hlciBSZWZlcmVuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlB1Ymxpc2hlciBSZWZlcmVuY2U8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2dldFB1Ymxpc2hlclJlZmVyZW5jZSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotLy8Jdm9pZCBzZXRQdWJsaXNoZXJSZWZlcmVuY2UoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uTW9kdWxlI2dldFB1Ymxpc2hlclJlZmVyZW5jZSA8ZW0+UHVibGlzaGVyIFJlZmVyZW5jZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHVibGlzaGVyIFJlZmVyZW5jZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UHVibGlzaGVyUmVmZXJlbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQdWJsaXNoZXJSZWZlcmVuY2UoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBNb2R1bGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vUG9ydC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9Qb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmM2FlZTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9Qb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBFdGVyYXRpb24gQmlsaXNpbSBBLlMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiCgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgRVRFUkFUSU9OIEEuUy4gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBFdGVyYXRpb24gQmlsaXNpbSBBLlMuICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gZXRlcmF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5ldGVyYXRpb24uY29tLz4uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFBvcnQuamF2YSx2IDEuNyAyMDA1LzA2LzE0IDIwOjQ1OjQ1IGdlcmNhbiBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UG9ydDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlBvcnQjZ2V0Tm8gPGVtPk5vPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlBvcnQjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Qb3J0I2dldFByb3RvY29sIDxlbT5Qcm90b2NvbDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJUeXBlUGFja2FnZSNnZXRQb3J0KCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdQb3J0JyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUG9ydCBleHRlbmRzIEVPYmplY3R7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Tm88L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5vPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5vPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRObyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlI2dldFBvcnRfTm8oKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgcmVxdWlyZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J25vJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE5vKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlBvcnQjZ2V0Tm8gPGVtPk5vPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5ObzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Tm8oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE5vKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2UjZ2V0UG9ydF9OYW1lKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHJlcXVpcmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSduYW1lJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUG9ydCNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcm90b2NvbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJvdG9jb2w8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFByb3RvY29sKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2UjZ2V0UG9ydF9Qcm90b2NvbCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0ncHJvdG9jb2wnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UHJvdG9jb2woKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUG9ydCNnZXRQcm90b2NvbCA8ZW0+UHJvdG9jb2w8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByb3RvY29sPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNnZXRQcm90b2NvbCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotLy8Jdm9pZCBzZXRQcm90b2NvbChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Qb3J0I2dldFByb3RvY29sIDxlbT5Qcm90b2NvbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJvdG9jb2w8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFByb3RvY29sKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQcm90b2NvbChTdHJpbmcgdmFsdWUpOwotCi19IC8vIFBvcnQKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vUHJvamVjdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9Qcm9qZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlNDc5NTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9Qcm9qZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IEV0ZXJhdGlvbiBCaWxpc2ltIEEuUy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIKAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBFVEVSQVRJT04gQS5TLiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEV0ZXJhdGlvbiBCaWxpc2ltIEEuUy4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiBldGVyYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmV0ZXJhdGlvbi5jb20vPi4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUHJvamVjdC5qYXZhLHYgMS44IDIwMDUvMDYvMTQgMjA6NDU6NDUgZ2VyY2FuIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qcm9qZWN0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUHJvamVjdCNnZXRDbGFzc3BhdGhSZWZlcmVuY2UgPGVtPkNsYXNzcGF0aCBSZWZlcmVuY2U8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2UjZ2V0UHJvamVjdCgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nUHJvamVjdCcga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFByb2plY3QgZXh0ZW5kcyBFT2JqZWN0ewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNsYXNzcGF0aCBSZWZlcmVuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNsYXNzcGF0aCBSZWZlcmVuY2U8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2xhc3NwYXRoIFJlZmVyZW5jZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q2xhc3NwYXRoUmVmZXJlbmNlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2UjZ2V0UHJvamVjdF9DbGFzc3BhdGhSZWZlcmVuY2UoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgcmVxdWlyZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J2NsYXNzcGF0aFJlZmVyZW5jZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRDbGFzc3BhdGhSZWZlcmVuY2UoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUHJvamVjdCNnZXRDbGFzc3BhdGhSZWZlcmVuY2UgPGVtPkNsYXNzcGF0aCBSZWZlcmVuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNsYXNzcGF0aCBSZWZlcmVuY2U8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2dldENsYXNzcGF0aFJlZmVyZW5jZSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotLy8Jdm9pZCBzZXRDbGFzc3BhdGhSZWZlcmVuY2UoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUHJvamVjdCNnZXRDbGFzc3BhdGhSZWZlcmVuY2UgPGVtPkNsYXNzcGF0aCBSZWZlcmVuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNsYXNzcGF0aCBSZWZlcmVuY2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENsYXNzcGF0aFJlZmVyZW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q2xhc3NwYXRoUmVmZXJlbmNlKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gUHJvamVjdApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9Qcm9wZXJ0eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9Qcm9wZXJ0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzIzZDZlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vUHJvcGVydHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IEV0ZXJhdGlvbiBCaWxpc2ltIEEuUy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIKAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBFVEVSQVRJT04gQS5TLiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEV0ZXJhdGlvbiBCaWxpc2ltIEEuUy4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiBldGVyYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmV0ZXJhdGlvbi5jb20vPi4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUHJvcGVydHkuamF2YSx2IDEuOCAyMDA1LzA5LzA1IDIwOjU3OjU0IGdlcmNhbiBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJvcGVydHk8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Qcm9wZXJ0eSNnZXRDb250ZXh0IDxlbT5Db250ZXh0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlByb3BlcnR5I2dldERlZmF1bHQgPGVtPkRlZmF1bHQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUHJvcGVydHkjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlByb3BlcnR5I2dldExhYmVsIDxlbT5MYWJlbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Qcm9wZXJ0eSNnZXRUeXBlIDxlbT5UeXBlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlI2dldFByb3BlcnR5KCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdQcm9wZXJ0eScga2luZD0nZW1wdHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFByb3BlcnR5IGV4dGVuZHMgRU9iamVjdHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URVhUX1JVTlRJTUUgPSAicnVudGltZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVYVF9TRVJWRVIgPSAic2VydmVyIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0ZJTEU9ImZpbGUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfRElSRUNUT1JZPSJkaXJlY3RvcnkiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfQk9PTEVBTj0iYm9vbGVhbiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9URVhUPSJzdHJpbmciOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfU0VMRUNUPSJzZWxlY3QiOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29udGV4dDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29udGV4dDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db250ZXh0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDb250ZXh0KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2UjZ2V0UHJvcGVydHlfQ29udGV4dCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J2NvbnRleHQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0Q29udGV4dCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Qcm9wZXJ0eSNnZXRDb250ZXh0IDxlbT5Db250ZXh0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db250ZXh0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDb250ZXh0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDb250ZXh0KFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZWZhdWx0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZWZhdWx0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXREZWZhdWx0KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2UjZ2V0UHJvcGVydHlfRGVmYXVsdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J2RlZmF1bHQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0RGVmYXVsdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Qcm9wZXJ0eSNnZXREZWZhdWx0IDxlbT5EZWZhdWx0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZWZhdWx0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXREZWZhdWx0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXREZWZhdWx0KFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2UjZ2V0UHJvcGVydHlfSWQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSdpZCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Qcm9wZXJ0eSNnZXRJZCA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SWQoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxhYmVsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MYWJlbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TGFiZWwoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJUeXBlUGFja2FnZSNnZXRQcm9wZXJ0eV9MYWJlbCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J2xhYmVsJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldExhYmVsKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlByb3BlcnR5I2dldExhYmVsIDxlbT5MYWJlbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TGFiZWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldExhYmVsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRMYWJlbChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VHlwZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlI2dldFByb3BlcnR5X1R5cGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSd0eXBlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFR5cGUoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUHJvcGVydHkjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjZ2V0VHlwZSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotLy8Jdm9pZCBzZXRUeXBlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlByb3BlcnR5I2dldFR5cGUgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFR5cGUoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBQcm9wZXJ0eQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9QdWJsaXNoZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vUHVibGlzaGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkYWY4YTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3NlcnZlcnR5cGUvZGVmaW5pdGlvbi9QdWJsaXNoZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IEV0ZXJhdGlvbiBCaWxpc2ltIEEuUy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIKAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBFVEVSQVRJT04gQS5TLiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEV0ZXJhdGlvbiBCaWxpc2ltIEEuUy4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiBldGVyYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmV0ZXJhdGlvbi5jb20vPi4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUHVibGlzaGVyLmphdmEsdiAxLjkgMjAwNS8wNi8xNCAyMDo0NTo0NSBnZXJjYW4gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlB1Ymxpc2hlcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlB1Ymxpc2hlciNnZXRHcm91cCA8ZW0+R3JvdXA8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUHVibGlzaGVyI2dldFB1Ymxpc2hlcmRhdGEgPGVtPlB1Ymxpc2hlcmRhdGE8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUHVibGlzaGVyI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJUeXBlUGFja2FnZSNnZXRQdWJsaXNoZXIoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1B1Ymxpc2hlcicga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFB1Ymxpc2hlciBleHRlbmRzIEVPYmplY3R7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwLkVudHJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdyb3VwPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3JvdXA8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlI2dldFB1Ymxpc2hlcl9Hcm91cCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZlYXR1cmVNYXBFbnRyeSIgbWFueT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZ3JvdXAnIG5hbWU9J2dyb3VwOjAnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlGZWF0dXJlTWFwIGdldEdyb3VwKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QdWJsaXNoZXJkYXRhPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5QdWJsaXNoZXJEYXRhfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlB1Ymxpc2hlcmRhdGE8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0gICAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgICAqIDwvcD4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QdWJsaXNoZXJkYXRhPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJUeXBlUGFja2FnZSNnZXRQdWJsaXNoZXJfUHVibGlzaGVyZGF0YSgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUHVibGlzaGVyRGF0YSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIgcmVxdWlyZWQ9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J3B1Ymxpc2hlcmRhdGEnIGdyb3VwPScjZ3JvdXA6MCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIExpc3QgZ2V0UHVibGlzaGVyZGF0YSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlI2dldFB1Ymxpc2hlcl9JZCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J2lkJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldElkKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlB1Ymxpc2hlciNnZXRJZCA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNnZXRJZCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotLy8Jdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5QdWJsaXNoZXIjZ2V0SWQgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElkKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gUHVibGlzaGVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvc2VydmVydHlwZS9kZWZpbml0aW9uL1B1Ymxpc2hlckRhdGEuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vUHVibGlzaGVyRGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWQ1NzM3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vUHVibGlzaGVyRGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBQdWJsaXNoZXJEYXRhLmphdmEsdiAxLjYgMjAwNS8wNi8xNCAyMDo0NTo0NSBnZXJjYW4gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlB1Ymxpc2hlciBEYXRhPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUHVibGlzaGVyRGF0YSNnZXREYXRhbmFtZSA8ZW0+RGF0YW5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUHVibGlzaGVyRGF0YSNnZXREYXRhdmFsdWUgPGVtPkRhdGF2YWx1ZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJUeXBlUGFja2FnZSNnZXRQdWJsaXNoZXJEYXRhKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdQdWJsaXNoZXJEYXRhJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUHVibGlzaGVyRGF0YSBleHRlbmRzIEVPYmplY3R7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGF0YW5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRhdGFuYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLSAgICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAgICogPC9wPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRhdGFuYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXREYXRhbmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlI2dldFB1Ymxpc2hlckRhdGFfRGF0YW5hbWUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgcmVxdWlyZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J2RhdGFuYW1lJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgU3RyaW5nIGdldERhdGFuYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlB1Ymxpc2hlckRhdGEjZ2V0RGF0YW5hbWUgPGVtPkRhdGFuYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EYXRhbmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RGF0YW5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldERhdGFuYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EYXRhdmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRhdGF2YWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RGF0YXZhbHVlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2UjZ2V0UHVibGlzaGVyRGF0YV9EYXRhdmFsdWUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgcmVxdWlyZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J2RhdGF2YWx1ZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIFN0cmluZyBnZXREYXRhdmFsdWUoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUHVibGlzaGVyRGF0YSNnZXREYXRhdmFsdWUgPGVtPkRhdGF2YWx1ZTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGF0YXZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNnZXREYXRhdmFsdWUoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLS8vICAgIHZvaWQgc2V0RGF0YXZhbHVlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlB1Ymxpc2hlckRhdGEjZ2V0RGF0YXZhbHVlIDxlbT5EYXRhdmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRhdGF2YWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RGF0YXZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXREYXRhdmFsdWUoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBQdWJsaXNoZXJEYXRhCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvc2VydmVydHlwZS9kZWZpbml0aW9uL1NlcnZlclJ1bnRpbWUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vU2VydmVyUnVudGltZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzg5MDg0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vU2VydmVyUnVudGltZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYzICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgRXRlcmF0aW9uIEJpbGlzaW0gQS5TLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4goCBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEVURVJBVElPTiBBLlMuIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgRXRlcmF0aW9uIEJpbGlzaW0gQS5TLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIGV0ZXJhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuZXRlcmF0aW9uLmNvbS8+LgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBTZXJ2ZXJSdW50aW1lLmphdmEsdiAxLjkgMjAwNS8wNi8xNCAyMDo0NTo0NSBnZXJjYW4gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwueG1sLlJlc29sdmVyOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TZXJ2ZXIgUnVudGltZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIAotICogCQkJCUdlbmVyaWMgU2VydmVyIFR5cGUgRGVmaW5pdGlvbi4gSXQgbXVzdCBoYXZlIGEgbGlzdCBvZgotICogCQkJCXByb3BlcnRpZXMuCi0gKiAJCQkKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclJ1bnRpbWUjZ2V0R3JvdXAgPGVtPkdyb3VwPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclJ1bnRpbWUjZ2V0UHJvcGVydHkgPGVtPlByb3BlcnR5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclJ1bnRpbWUjZ2V0R3JvdXAxIDxlbT5Hcm91cDE8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyUnVudGltZSNnZXRQb3J0IDxlbT5Qb3J0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclJ1bnRpbWUjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyUnVudGltZSNnZXRNb2R1bGUgPGVtPk1vZHVsZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJSdW50aW1lI2dldFByb2plY3QgPGVtPlByb2plY3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyUnVudGltZSNnZXRTdGFydCA8ZW0+U3RhcnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyUnVudGltZSNnZXRTdG9wIDxlbT5TdG9wPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclJ1bnRpbWUjZ2V0R3JvdXAzIDxlbT5Hcm91cDM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyUnVudGltZSNnZXRQdWJsaXNoZXIgPGVtPlB1Ymxpc2hlcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJSdW50aW1lI2dldEdyb3VwNCA8ZW0+R3JvdXA0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclJ1bnRpbWUjZ2V0Q2xhc3NwYXRoIDxlbT5DbGFzc3BhdGg8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyUnVudGltZSNnZXRKbmRpQ29ubmVjdGlvbiA8ZW0+Sm5kaSBDb25uZWN0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclJ1bnRpbWUjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJSdW50aW1lI2dldFZlcnNpb24gPGVtPlZlcnNpb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2UjZ2V0U2VydmVyUnVudGltZSgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nU2VydmVyUnVudGltZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNlcnZlclJ1bnRpbWUgZXh0ZW5kcyBFT2JqZWN0ewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcC5FbnRyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Hcm91cDwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdyb3VwPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJUeXBlUGFja2FnZSNnZXRTZXJ2ZXJSdW50aW1lX0dyb3VwKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmVhdHVyZU1hcEVudHJ5IiBtYW55PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdncm91cCcgbmFtZT0nZ3JvdXA6MCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZlYXR1cmVNYXAgZ2V0R3JvdXAoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Qcm9wZXJ0eX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qcm9wZXJ0eTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLSAgICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAgICogPC9wPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByb3BlcnR5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJUeXBlUGFja2FnZSNnZXRTZXJ2ZXJSdW50aW1lX1Byb3BlcnR5KCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Qcm9wZXJ0eSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0ncHJvcGVydHknIGdyb3VwPScjZ3JvdXA6MCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIExpc3QgZ2V0UHJvcGVydHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3JvdXAxPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3JvdXAxPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJUeXBlUGFja2FnZSNnZXRTZXJ2ZXJSdW50aW1lX0dyb3VwMSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZlYXR1cmVNYXBFbnRyeSIgbWFueT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZ3JvdXAnIG5hbWU9J2dyb3VwOjInIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlGZWF0dXJlTWFwIGdldEdyb3VwMSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UG9ydDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUG9ydH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qb3J0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotICAgICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICAgKiA8L3A+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UG9ydDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2UjZ2V0U2VydmVyUnVudGltZV9Qb3J0KCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Qb3J0IiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdwb3J0JyBncm91cD0nI2dyb3VwOjInIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBMaXN0IGdldFBvcnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3JvdXAyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3JvdXAyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJUeXBlUGFja2FnZSNnZXRTZXJ2ZXJSdW50aW1lX0dyb3VwMigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZlYXR1cmVNYXBFbnRyeSIgbWFueT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZ3JvdXAnIG5hbWU9J2dyb3VwOjQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlGZWF0dXJlTWFwIGdldEdyb3VwMigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TW9kdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Nb2R1bGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TW9kdWxlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotICAgICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICAgKiA8L3A+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TW9kdWxlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJUeXBlUGFja2FnZSNnZXRTZXJ2ZXJSdW50aW1lX01vZHVsZSgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uTW9kdWxlIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIiByZXF1aXJlZD0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nbW9kdWxlJyBncm91cD0nI2dyb3VwOjQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBMaXN0IGdldE1vZHVsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJvamVjdDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJvamVjdDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9qZWN0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRQcm9qZWN0KFByb2plY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlI2dldFNlcnZlclJ1bnRpbWVfUHJvamVjdCgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiIHJlcXVpcmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdwcm9qZWN0JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUHJvamVjdCBnZXRQcm9qZWN0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclJ1bnRpbWUjZ2V0UHJvamVjdCA8ZW0+UHJvamVjdDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJvamVjdDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHJvamVjdChQcm9qZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN0YXJ0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdGFydDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0U3RhcnQoTGF1bmNoQ29uZmlndXJhdGlvbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2UjZ2V0U2VydmVyUnVudGltZV9TdGFydCgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiIHJlcXVpcmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdzdGFydCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxhdW5jaENvbmZpZ3VyYXRpb24gZ2V0U3RhcnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyUnVudGltZSNnZXRTdGFydCA8ZW0+U3RhcnQ8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlN0YXJ0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRTdGFydCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U3RhcnQoTGF1bmNoQ29uZmlndXJhdGlvbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdG9wPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdG9wPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRTdG9wKExhdW5jaENvbmZpZ3VyYXRpb24pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlI2dldFNlcnZlclJ1bnRpbWVfU3RvcCgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiIHJlcXVpcmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdzdG9wJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGF1bmNoQ29uZmlndXJhdGlvbiBnZXRTdG9wKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclJ1bnRpbWUjZ2V0U3RvcCA8ZW0+U3RvcDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3RvcDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0U3RvcCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U3RvcChMYXVuY2hDb25maWd1cmF0aW9uIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdyb3VwMzwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3JvdXAzPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3JvdXAzPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJUeXBlUGFja2FnZSNnZXRTZXJ2ZXJSdW50aW1lX0dyb3VwMygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZlYXR1cmVNYXBFbnRyeSIgbWFueT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZ3JvdXAnIG5hbWU9J2dyb3VwOjknIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlGZWF0dXJlTWFwIGdldEdyb3VwMygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHVibGlzaGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5QdWJsaXNoZXJ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHVibGlzaGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotICAgICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICAgKiA8L3A+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHVibGlzaGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJUeXBlUGFja2FnZSNnZXRTZXJ2ZXJSdW50aW1lX1B1Ymxpc2hlcigpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uUHVibGlzaGVyIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdwdWJsaXNoZXInIGdyb3VwPScjZ3JvdXA6OSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIExpc3QgZ2V0UHVibGlzaGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Hcm91cDQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwLkVudHJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdyb3VwNDwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdyb3VwNDwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2UjZ2V0U2VydmVyUnVudGltZV9Hcm91cDQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGZWF0dXJlTWFwRW50cnkiIG1hbnk9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2dyb3VwJyBuYW1lPSdncm91cDoxMSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZlYXR1cmVNYXAgZ2V0R3JvdXA0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DbGFzc3BhdGg8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkNsYXNzcGF0aH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DbGFzc3BhdGg8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0gICAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgICAqIDwvcD4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DbGFzc3BhdGg8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlI2dldFNlcnZlclJ1bnRpbWVfQ2xhc3NwYXRoKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5DbGFzc3BhdGgiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiIHJlcXVpcmVkPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdjbGFzc3BhdGgnIGdyb3VwPScjZ3JvdXA6MTEnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBMaXN0IGdldENsYXNzcGF0aCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Sm5kaSBDb25uZWN0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5KbmRpIENvbm5lY3Rpb248L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotICAgICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICAgKiA8L3A+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Sm5kaSBDb25uZWN0aW9uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRKbmRpQ29ubmVjdGlvbihKbmRpQ29ubmVjdGlvbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2UjZ2V0U2VydmVyUnVudGltZV9KbmRpQ29ubmVjdGlvbigpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiIHJlcXVpcmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdqbmRpQ29ubmVjdGlvbiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIEpuZGlDb25uZWN0aW9uIGdldEpuZGlDb25uZWN0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclJ1bnRpbWUjZ2V0Sm5kaUNvbm5lY3Rpb24gPGVtPkpuZGkgQ29ubmVjdGlvbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Sm5kaSBDb25uZWN0aW9uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRKbmRpQ29ubmVjdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Sm5kaUNvbm5lY3Rpb24oSm5kaUNvbm5lY3Rpb24gdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlI2dldFNlcnZlclJ1bnRpbWVfTmFtZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSduYW1lJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyUnVudGltZSNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WZXJzaW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRWZXJzaW9uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2UjZ2V0U2VydmVyUnVudGltZV9WZXJzaW9uKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0ndmVyc2lvbiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRWZXJzaW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclJ1bnRpbWUjZ2V0VmVyc2lvbiA8ZW0+VmVyc2lvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmVyc2lvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VmVyc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VmVyc2lvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQHBhcmFtIHR5cGUgdGhlIHR5cGUgb2YgdGhlICc8ZW0+TW9kdWxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAcmV0dXJuCi0JICogQGdlbmVyYXRlZCBOT1QKLQkgKi8KLQlNb2R1bGUgZ2V0TW9kdWxlKFN0cmluZyB0eXBlKTsKLQotCS8qKgotCSAqIEBwYXJhbSBjcFJlZiB0aGUgcmVmZXJlbmNlIGlkIG9mIHRoZSAnPGVtPkNsYXNzcGF0aDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHJldHVybgotCSAqIEBnZW5lcmF0ZWQgTk9UCi0JICovCi0JQ2xhc3NwYXRoIGdldENsYXNzcGF0aChTdHJpbmcgY3BSZWYpOwotCi0gICAgCi0gICAgLyoqCi0gICAgICogQGdlbmVyYXRlZCBOT1QKLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0SWQoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgICAqIEBwYXJhbSBpZAotICAgICAqLwotICAgIHZvaWQgc2V0SWQoU3RyaW5nIGlkKTsKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIE5PVAotCSAqLwotCVN0cmluZyBnZXRGaWxlbmFtZSgpOwotCi0gICAgCi0JLyoqCi0JICogQGdlbmVyYXRlZCBOT1QKLSAqLwotCXZvaWQgc2V0RmlsZW5hbWUoU3RyaW5nIGZuKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgTk9UCi0JICovCi0Jdm9pZCBzZXRQcm9wZXJ0eVZhbHVlcyhNYXAgcHJvcGVydGllcyk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIE5PVAotCSAqLwotCVJlc29sdmVyIGdldFJlc29sdmVyKCk7Ci0JCi0gICAgLyoqCi0gICAgICogQGdlbmVyYXRlZCBOT1QKLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnROYW1lc3BhY2UoKTsKLSAgICAvKioKLSAgICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgICAqIEBwYXJhbSBuYW1lc3BhY2UKLSAgICAgKi8KLSAgICB2b2lkIHNldENvbmZpZ3VyYXRpb25FbGVtZW50TmFtZXNwYWNlKFN0cmluZyBuYW1lc3BhY2UpOwotCS8qKgotCSAqIEBwYXJhbSBpZCB0aGUgaWQgb2YgdGhlICc8ZW0+UHVibGlzaGVyPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAcmV0dXJuCi0JICogQGdlbmVyYXRlZCBOT1QKLQkgKi8KLQlQdWJsaXNoZXIgZ2V0UHVibGlzaGVyKFN0cmluZyBpZCk7Ci19IC8vIFNlcnZlclJ1bnRpbWUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vU2VydmVyVHlwZUZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9zZXJ2ZXJ0eXBlL2RlZmluaXRpb24vU2VydmVyVHlwZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTEzN2NmNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvc2VydmVydHlwZS9kZWZpbml0aW9uL1NlcnZlclR5cGVGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBFdGVyYXRpb24gQmlsaXNpbSBBLlMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiCgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgRVRFUkFUSU9OIEEuUy4gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBFdGVyYXRpb24gQmlsaXNpbSBBLlMuICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gZXRlcmF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5ldGVyYXRpb24uY29tLz4uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFNlcnZlclR5cGVGYWN0b3J5LmphdmEsdiAxLjkgMjAwNS8wOC8zMCAyMTo0MzoyNCBnZXJjYW4gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyVHlwZVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5GYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgcHJvdmlkZXMgYSBjcmVhdGUgbWV0aG9kIGZvciBlYWNoIG5vbi1hYnN0cmFjdCBjbGFzcyBvZiB0aGUgbW9kZWwuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJUeXBlUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNlcnZlclR5cGVGYWN0b3J5IGV4dGVuZHMgRUZhY3Rvcnl7Ci0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTZXJ2ZXJUeXBlRmFjdG9yeSBlSU5TVEFOQ0UgPSBuZXcgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5pbXBsLlNlcnZlclR5cGVGYWN0b3J5SW1wbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BcmNoaXZlIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFyY2hpdmUgVHlwZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQXJjaGl2ZVR5cGUgY3JlYXRlQXJjaGl2ZVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QXJndW1lbnQgUGFpcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QXJndW1lbnQgUGFpcjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQXJndW1lbnRQYWlyIGNyZWF0ZUFyZ3VtZW50UGFpcigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5DbGFzc3BhdGg8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNsYXNzcGF0aDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQ2xhc3NwYXRoIGNyZWF0ZUNsYXNzcGF0aCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FeHRlcm5hbDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RXh0ZXJuYWw8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUV4dGVybmFsIGNyZWF0ZUV4dGVybmFsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkpuZGkgQ29ubmVjdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Sm5kaSBDb25uZWN0aW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBKbmRpQ29ubmVjdGlvbiBjcmVhdGVKbmRpQ29ubmVjdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5MYXVuY2ggQ29uZmlndXJhdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TGF1bmNoIENvbmZpZ3VyYXRpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxhdW5jaENvbmZpZ3VyYXRpb24gY3JlYXRlTGF1bmNoQ29uZmlndXJhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Nb2R1bGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk1vZHVsZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTW9kdWxlIGNyZWF0ZU1vZHVsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Qb3J0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Qb3J0PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQb3J0IGNyZWF0ZVBvcnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UHJvamVjdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UHJvamVjdDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUHJvamVjdCBjcmVhdGVQcm9qZWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByb3BlcnR5PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Qcm9wZXJ0eTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUHJvcGVydHkgY3JlYXRlUHJvcGVydHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UHVibGlzaGVyPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QdWJsaXNoZXI8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVB1Ymxpc2hlciBjcmVhdGVQdWJsaXNoZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UHVibGlzaGVyIERhdGE8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlB1Ymxpc2hlciBEYXRhPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBQdWJsaXNoZXJEYXRhIGNyZWF0ZVB1Ymxpc2hlckRhdGEoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U2VydmVyIFJ1bnRpbWU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNlcnZlciBSdW50aW1lPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTZXJ2ZXJSdW50aW1lIGNyZWF0ZVNlcnZlclJ1bnRpbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU2VydmVyVHlwZVBhY2thZ2UgZ2V0U2VydmVyVHlwZVBhY2thZ2UoKTsKLQotfSAvL1NlcnZlclR5cGVGYWN0b3J5CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3hzZC9TZXJ2ZXJUeXBlRGVmaW5pdGlvblNjaGVtYS54c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3hzZC9TZXJ2ZXJUeXBlRGVmaW5pdGlvblNjaGVtYS54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3ZmE5NmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS94c2QvU2VydmVyVHlwZURlZmluaXRpb25TY2hlbWEueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2VjbGlwc2Uub3JnL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9TZXJ2ZXJUeXBlRGVmaW5pdGlvbiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczpqc3Q9Imh0dHA6Ly9lY2xpcHNlLm9yZy9qc3Qvc2VydmVyL2dlbmVyaWMvU2VydmVyVHlwZURlZmluaXRpb24iPgotCi0KLQotCTxjb21wbGV4VHlwZSBuYW1lPSJTZXJ2ZXJSdW50aW1lIj4KLQkJPGFubm90YXRpb24+Ci0JCQk8ZG9jdW1lbnRhdGlvbj4KLQkJCQlHZW5lcmljIFNlcnZlciBUeXBlIERlZmluaXRpb24uIEl0IG11c3QgaGF2ZSBhIGxpc3Qgb2YKLQkJCQlwcm9wZXJ0aWVzLgotCQkJPC9kb2N1bWVudGF0aW9uPgotCQk8L2Fubm90YXRpb24+Ci0KLQkJPHNlcXVlbmNlIG1heE9jY3Vycz0iMSIgbWluT2NjdXJzPSIxIj4KLQkJCTxzZXF1ZW5jZSBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIj4KLQkJCQk8ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ianN0OlByb3BlcnR5Ii8+Ci0JCQk8L3NlcXVlbmNlPgotCi0JCQk8c2VxdWVuY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJPGVsZW1lbnQgbmFtZT0icG9ydCIgdHlwZT0ianN0OlBvcnQiLz4KLQkJCTwvc2VxdWVuY2U+Ci0KLQkJCTxzZXF1ZW5jZSBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIxIj4KLQkJCQk8ZWxlbWVudCBuYW1lPSJtb2R1bGUiIHR5cGU9ImpzdDpNb2R1bGUiLz4KLQkJCTwvc2VxdWVuY2U+Ci0JCQk8ZWxlbWVudCBuYW1lPSJwcm9qZWN0IiB0eXBlPSJqc3Q6UHJvamVjdCIvPgotCQkJPGVsZW1lbnQgbmFtZT0ic3RhcnQiIHR5cGU9ImpzdDpMYXVuY2hDb25maWd1cmF0aW9uIi8+Ci0JCQk8ZWxlbWVudCBuYW1lPSJzdG9wIiB0eXBlPSJqc3Q6TGF1bmNoQ29uZmlndXJhdGlvbiIvPgotCi0JCQk8c2VxdWVuY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJPGVsZW1lbnQgbmFtZT0icHVibGlzaGVyIiB0eXBlPSJqc3Q6UHVibGlzaGVyIi8+Ci0JCQk8L3NlcXVlbmNlPgotCi0JCQk8c2VxdWVuY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMSI+Ci0JCQkJPGVsZW1lbnQgbmFtZT0iY2xhc3NwYXRoIiB0eXBlPSJqc3Q6Q2xhc3NwYXRoIi8+Ci0JCQk8L3NlcXVlbmNlPgotCQkJPGVsZW1lbnQgbmFtZT0iam5kaUNvbm5lY3Rpb24iIHR5cGU9ImpzdDpqbmRpQ29ubmVjdGlvbiIvPgotCQk8L3NlcXVlbmNlPgotCi0JCTxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0JCTxhdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIgdHlwZT0ic3RyaW5nIi8+Ci0JPC9jb21wbGV4VHlwZT4KLQotCTxjb21wbGV4VHlwZSBuYW1lPSJQcm9wZXJ0eSI+Ci0JCTxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIvPgotCQk8YXR0cmlidXRlIG5hbWU9ImxhYmVsIiB0eXBlPSJzdHJpbmciLz4KLQkJPGF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJzdHJpbmciLz4KLQkJPGF0dHJpYnV0ZSBuYW1lPSJjb250ZXh0IiB0eXBlPSJzdHJpbmciLz4KLQkJPGF0dHJpYnV0ZSBuYW1lPSJkZWZhdWx0IiB0eXBlPSJzdHJpbmciLz4KLQk8L2NvbXBsZXhUeXBlPgotCi0JPGNvbXBsZXhUeXBlIG5hbWU9Ik1vZHVsZSI+Ci0JCTxzZXF1ZW5jZT4KLQkJCTxlbGVtZW50IG5hbWU9InR5cGUiIHR5cGU9InN0cmluZyIvPgotCQkJPGVsZW1lbnQgbmFtZT0icHVibGlzaERpciIgdHlwZT0ic3RyaW5nIi8+Ci0JCQk8ZWxlbWVudCBuYW1lPSJwdWJsaXNoZXJSZWZlcmVuY2UiIHR5cGU9InN0cmluZyIvPgotCQk8L3NlcXVlbmNlPgotCTwvY29tcGxleFR5cGU+Ci0KLQk8Y29tcGxleFR5cGUgbmFtZT0iTGF1bmNoQ29uZmlndXJhdGlvbiI+Ci0JCTxzZXF1ZW5jZT4KLQkJCTxzZXF1ZW5jZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQk8ZWxlbWVudCBuYW1lPSJlbnZpcm9ubWVudFZhcmlhYmxlIgotCQkJCQl0eXBlPSJqc3Q6QXJndW1lbnRQYWlyIj4KLQkJCQk8L2VsZW1lbnQ+Ci0JCQk8L3NlcXVlbmNlPgotCQkJPHNlcXVlbmNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCTxlbGVtZW50IG5hbWU9InByb2dyYW1Bcmd1bWVudHMiIHR5cGU9InN0cmluZyIgLz4KLQkJCTwvc2VxdWVuY2U+Ci0JCQk8ZWxlbWVudCBuYW1lPSJ3b3JraW5nRGlyZWN0b3J5IiB0eXBlPSJzdHJpbmciIC8+Ci0JCQk8Y2hvaWNlPgotCQkJCTxzZXF1ZW5jZT4KLQkJCQkJPGVsZW1lbnQgbmFtZT0ibWFpbkNsYXNzIiB0eXBlPSJzdHJpbmciIC8+Ci0JCQkJCTxzZXF1ZW5jZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJCTxlbGVtZW50IG5hbWU9InZtUGFyYW1ldGVycyIgdHlwZT0ic3RyaW5nIiAvPgotCQkJCQk8L3NlcXVlbmNlPgotCQkJCQk8ZWxlbWVudCBuYW1lPSJjbGFzc3BhdGhSZWZlcmVuY2UiIHR5cGU9InN0cmluZyIgLz4KLQkJCQk8L3NlcXVlbmNlPgotCQkJCTxzZXF1ZW5jZT4KLQkJCQkJPGVsZW1lbnQgbmFtZT0iZGVidWdQb3J0IiB0eXBlPSJzdHJpbmciIC8+Ci0JCQkJCTxzZXF1ZW5jZSBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIxIj4KLQkJCQkJCTxlbGVtZW50IG5hbWU9ImV4dGVybmFsIiB0eXBlPSJqc3Q6RXh0ZXJuYWwiPjwvZWxlbWVudD4KLQkJCQkJPC9zZXF1ZW5jZT4KLQkJCQk8L3NlcXVlbmNlPgotCQkJPC9jaG9pY2U+Ci0JCTwvc2VxdWVuY2U+Ci0JPC9jb21wbGV4VHlwZT4KLQotCTxjb21wbGV4VHlwZSBuYW1lPSJQb3J0Ij4KLQkJPHNlcXVlbmNlPgotCQkJPGVsZW1lbnQgbmFtZT0ibm8iIHR5cGU9InN0cmluZyIvPgotCQkJPGVsZW1lbnQgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIi8+Ci0JCQk8ZWxlbWVudCBuYW1lPSJwcm90b2NvbCIgdHlwZT0ic3RyaW5nIi8+Ci0JCTwvc2VxdWVuY2U+Ci0JPC9jb21wbGV4VHlwZT4KLQotCTxjb21wbGV4VHlwZSBuYW1lPSJDbGFzc3BhdGgiPgotCQk8c2VxdWVuY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMSI+Ci0JCQk8ZWxlbWVudCBuYW1lPSJhcmNoaXZlIj4KLQkJCQk8Y29tcGxleFR5cGU+Ci0JCQkJCTxhdHRyaWJ1dGUgbmFtZT0icGF0aCIgdHlwZT0ic3RyaW5nIi8+Ci0JCQkJPC9jb21wbGV4VHlwZT4KLQkJCTwvZWxlbWVudD4KLQkJPC9zZXF1ZW5jZT4KLQkJPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIi8+Ci0JPC9jb21wbGV4VHlwZT4KLQotCTxjb21wbGV4VHlwZSBuYW1lPSJQdWJsaXNoZXIiPgotCQk8c2VxdWVuY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJwdWJsaXNoZXJkYXRhIiB0eXBlPSJqc3Q6UHVibGlzaGVyRGF0YSI+Ci0gICAgICA8L2VsZW1lbnQ+Ci0gICAgICAgIDwvc2VxdWVuY2U+Ci0JCTxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIvPgotCTwvY29tcGxleFR5cGU+Ci0KLQk8Y29tcGxleFR5cGUgbmFtZT0iUHJvamVjdCI+Ci0JCTxzZXF1ZW5jZSBtYXhPY2N1cnM9IjEiIG1pbk9jY3Vycz0iMSI+Ci0JCTxlbGVtZW50IG5hbWU9ImNsYXNzcGF0aFJlZmVyZW5jZSIgdHlwZT0ic3RyaW5nIi8+Ci0JCTwvc2VxdWVuY2U+Ci0JPC9jb21wbGV4VHlwZT4KLQotICAgIDxjb21wbGV4VHlwZSBuYW1lPSJQdWJsaXNoZXJEYXRhIj4KLSAgICA8c2VxdWVuY2UgbWF4T2NjdXJzPSIxIiBtaW5PY2N1cnM9IjEiPgotICAgICAgPGVsZW1lbnQgbmFtZT0iZGF0YW5hbWUiIHR5cGU9InN0cmluZyIvPgotICAgICAgPGVsZW1lbnQgbmFtZT0iZGF0YXZhbHVlIiB0eXBlPSJzdHJpbmciLz4KLSAgICA8L3NlcXVlbmNlPgotICA8L2NvbXBsZXhUeXBlPgotICAgIDxjb21wbGV4VHlwZSBuYW1lPSJqbmRpQ29ubmVjdGlvbiI+Ci0gICAgCTxzZXF1ZW5jZT4KLSAgICAJCTxlbGVtZW50IG5hbWU9InByb3ZpZGVyVXJsIiB0eXBlPSJzdHJpbmciLz4KLSAgICAJCTxzZXF1ZW5jZSBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIj4KLSAgICAJCQk8ZWxlbWVudCBuYW1lPSJqbmRpUHJvcGVydHkiIHR5cGU9ImpzdDpBcmd1bWVudFBhaXIiLz4KLSAgICAJCTwvc2VxdWVuY2U+Ci0gICAgCQk8ZWxlbWVudCBuYW1lPSJpbml0aWFsQ29udGV4dEZhY3RvcnkiIHR5cGU9InN0cmluZyIvPgotICAgIAk8L3NlcXVlbmNlPgotICAgIDwvY29tcGxleFR5cGU+Ci0KLSAgICA8Y29tcGxleFR5cGUgbmFtZT0iQXJndW1lbnRQYWlyIj4KLSAgICAJPGFsbCBtYXhPY2N1cnM9IjEiIG1pbk9jY3Vycz0iMSI+Ci0gICAgCQk8ZWxlbWVudCBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciLz4KLSAgICAJCTxlbGVtZW50IG5hbWU9InZhbHVlIiB0eXBlPSJzdHJpbmciLz4KLSAgICAJPC9hbGw+Ci0gICAgPC9jb21wbGV4VHlwZT4KLQotICAgIDxjb21wbGV4VHlwZSBuYW1lPSJFeHRlcm5hbCI+Ci0gICAgCTxzaW1wbGVDb250ZW50PgotICAgIAkJPGV4dGVuc2lvbiBiYXNlPSJzdHJpbmciPgotICAgIAkJCTxhdHRyaWJ1dGUgbmFtZT0ib3MiIHR5cGU9InN0cmluZyI+PC9hdHRyaWJ1dGU+Ci0gICAgCQk8L2V4dGVuc2lvbj4KLSAgICAJPC9zaW1wbGVDb250ZW50PgotICAgIDwvY29tcGxleFR5cGU+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS94c2Qvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZWNvcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3hzZC9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5lY29yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFiMzg1Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3hzZC9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5lY29yZQorKysgL2Rldi9udWxsCkBAIC0xLDUwMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGVjb3JlOkVQYWNrYWdlIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIiBuYW1lPSJkZWZpbml0aW9uIgotICAgIG5zVVJJPSJodHRwOi8vZWNsaXBzZS5vcmcvanN0L3NlcnZlci9nZW5lcmljL1NlcnZlclR5cGVEZWZpbml0aW9uIiBuc1ByZWZpeD0iZGVmaW5pdGlvbiI+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQXJjaGl2ZVR5cGUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iYXJjaGl2ZV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVtcHR5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBhdGgiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0icGF0aCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBcmd1bWVudFBhaXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQXJndW1lbnRQYWlyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiB1bmlxdWU9ImZhbHNlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJuYW1lIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbHVlIiB1bmlxdWU9ImZhbHNlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJ2YWx1ZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDbGFzc3BhdGgiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ2xhc3NwYXRoIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJncm91cCIgdW5pcXVlPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VGZWF0dXJlTWFwRW50cnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9Imdyb3VwIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Imdyb3VwOjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYXJjaGl2ZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9BcmNoaXZlVHlwZSIgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJhcmNoaXZlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpZCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJpZCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJFeHRlcm5hbCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFeHRlcm5hbCIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0ic2ltcGxlIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbHVlIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iOjAiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0ic2ltcGxlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im9zIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Im9zIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkpuZGlDb25uZWN0aW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9ImpuZGlDb25uZWN0aW9uIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcm92aWRlclVybCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0icHJvdmlkZXJVcmwiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ3JvdXAiIHVuaXF1ZT0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRmVhdHVyZU1hcEVudHJ5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJncm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJncm91cDoxIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImpuZGlQcm9wZXJ0eSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9Bcmd1bWVudFBhaXIiIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiIGNvbnRhaW5tZW50PSJ0cnVlIgotICAgICAgICByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iam5kaVByb3BlcnR5Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpbml0aWFsQ29udGV4dEZhY3RvcnkiCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9ImluaXRpYWxDb250ZXh0RmFjdG9yeSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJMYXVuY2hDb25maWd1cmF0aW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkxhdW5jaENvbmZpZ3VyYXRpb24iLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdyb3VwIiB1bmlxdWU9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUZlYXR1cmVNYXBFbnRyeSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZ3JvdXAiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iZ3JvdXA6MCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlbnZpcm9ubWVudFZhcmlhYmxlIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0FyZ3VtZW50UGFpciIgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIgY29udGFpbm1lbnQ9InRydWUiCi0gICAgICAgIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJlbnZpcm9ubWVudFZhcmlhYmxlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJncm91cDEiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRmVhdHVyZU1hcEVudHJ5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJncm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJncm91cDoyIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByb2dyYW1Bcmd1bWVudHMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJwcm9ncmFtQXJndW1lbnRzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3b3JraW5nRGlyZWN0b3J5IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJ3b3JraW5nRGlyZWN0b3J5Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1haW5DbGFzcyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0ibWFpbkNsYXNzIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdyb3VwMiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VGZWF0dXJlTWFwRW50cnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9Imdyb3VwIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Imdyb3VwOjYiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idm1QYXJhbWV0ZXJzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0idm1QYXJhbWV0ZXJzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6NiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjbGFzc3BhdGhSZWZlcmVuY2UiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9ImNsYXNzcGF0aFJlZmVyZW5jZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZWJ1Z1BvcnQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9ImRlYnVnUG9ydCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJncm91cDMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRmVhdHVyZU1hcEVudHJ5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJncm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJncm91cDoxMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJleHRlcm5hbCIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9FeHRlcm5hbCIgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIgY29udGFpbm1lbnQ9InRydWUiCi0gICAgICAgIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJleHRlcm5hbCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjEwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1vZHVsZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNb2R1bGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InR5cGUiIHVuaXF1ZT0iZmFsc2UiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9InR5cGUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHVibGlzaERpciIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0icHVibGlzaERpciIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwdWJsaXNoZXJSZWZlcmVuY2UiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9InB1Ymxpc2hlclJlZmVyZW5jZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQb3J0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlBvcnQiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5vIiB1bmlxdWU9ImZhbHNlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJubyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiB1bmlxdWU9ImZhbHNlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJuYW1lIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByb3RvY29sIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJwcm90b2NvbCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9qZWN0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlByb2plY3QiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNsYXNzcGF0aFJlZmVyZW5jZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iY2xhc3NwYXRoUmVmZXJlbmNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb3BlcnR5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlByb3BlcnR5Ii8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbXB0eSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb250ZXh0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9ImNvbnRleHQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVmYXVsdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJkZWZhdWx0Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlkIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9ImlkIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxhYmVsIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9ImxhYmVsIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InR5cGUiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0idHlwZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQdWJsaXNoZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHVibGlzaGVyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJncm91cCIgdW5pcXVlPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VGZWF0dXJlTWFwRW50cnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9Imdyb3VwIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Imdyb3VwOjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHVibGlzaGVyZGF0YSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9QdWJsaXNoZXJEYXRhIiB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIgotICAgICAgICBkZXJpdmVkPSJ0cnVlIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9InB1Ymxpc2hlcmRhdGEiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDowIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlkIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9ImlkIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlB1Ymxpc2hlckRhdGEiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHVibGlzaGVyRGF0YSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGF0YW5hbWUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9ImRhdGFuYW1lIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRhdGF2YWx1ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iZGF0YXZhbHVlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlNlcnZlclJ1bnRpbWUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IiYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5O0dlbmVyaWMgU2VydmVyIFR5cGUgRGVmaW5pdGlvbi4gSXQgbXVzdCBoYXZlIGEgbGlzdCBvZiYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5O3Byb3BlcnRpZXMuJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU2VydmVyUnVudGltZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ3JvdXAiIHVuaXF1ZT0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRmVhdHVyZU1hcEVudHJ5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJncm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJncm91cDowIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByb3BlcnR5IiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1Byb3BlcnR5IiB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIiBjb250YWlubWVudD0idHJ1ZSIKLSAgICAgICAgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9InByb3BlcnR5Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJncm91cDEiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRmVhdHVyZU1hcEVudHJ5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJncm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJncm91cDoyIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InBvcnQiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUG9ydCIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJwb3J0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJncm91cDIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRmVhdHVyZU1hcEVudHJ5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJncm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJncm91cDo0Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1vZHVsZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Nb2R1bGUiIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0ibW9kdWxlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6NCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcm9qZWN0IiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vUHJvamVjdCIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJwcm9qZWN0Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN0YXJ0IiBsb3dlckJvdW5kPSIxIiBlVHlwZT0iIy8vTGF1bmNoQ29uZmlndXJhdGlvbiIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJzdGFydCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzdG9wIiBsb3dlckJvdW5kPSIxIiBlVHlwZT0iIy8vTGF1bmNoQ29uZmlndXJhdGlvbiIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJzdG9wIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdyb3VwMyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VGZWF0dXJlTWFwRW50cnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9Imdyb3VwIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Imdyb3VwOjkiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHVibGlzaGVyIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1B1Ymxpc2hlciIgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIgY29udGFpbm1lbnQ9InRydWUiCi0gICAgICAgIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJwdWJsaXNoZXIiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDo5Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdyb3VwNCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VGZWF0dXJlTWFwRW50cnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9Imdyb3VwIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Imdyb3VwOjExIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNsYXNzcGF0aCIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9DbGFzc3BhdGgiIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iY2xhc3NwYXRoIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MTEiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iam5kaUNvbm5lY3Rpb24iIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9KbmRpQ29ubmVjdGlvbiIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJqbmRpQ29ubmVjdGlvbiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiB1bmlxdWU9ImZhbHNlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Im5hbWUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmVyc2lvbiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJ2ZXJzaW9uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotPC9lY29yZTpFUGFja2FnZT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUveHNkL3NlcnZlcnR5cGUuZ2VubW9kZWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3hzZC9zZXJ2ZXJ0eXBlLmdlbm1vZGVsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDY3MGJiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUveHNkL3NlcnZlcnR5cGUuZ2VubW9kZWwKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGdlbm1vZGVsOkdlbk1vZGVsIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIKLSAgICB4bWxuczpnZW5tb2RlbD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCIgbW9kZWxEaXJlY3Rvcnk9Ii9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS9zcmMiCi0gICAgZWRpdERpcmVjdG9yeT0iL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5tb2RlbC5lZGl0L3NyYyIgZWRpdG9yRGlyZWN0b3J5PSIvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLm1vZGVsLmVkaXRvci9zcmMiCi0gICAgbW9kZWxQbHVnaW5JRD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLm1vZGVsIiBydW50aW1lSmFyPSJ0cnVlIiBtb2RlbE5hbWU9IlNlcnZlcnR5cGUiCi0gICAgZWRpdFBsdWdpbkNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVyLnR5cGUuZGVmaW5pdGlvbi5wcm92aWRlci5TZXJ2ZXJ0eXBlRWRpdFBsdWdpbiIKLSAgICBlZGl0b3JQbHVnaW5DbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlci50eXBlLmRlZmluaXRpb24ucHJlc2VudGF0aW9uLlNlcnZlcnR5cGVFZGl0b3JQbHVnaW4iCi0gICAgc3VwcHJlc3NFTUZUeXBlcz0idHJ1ZSIgaW1wb3J0ZXJJRD0ib3JnLmVjbGlwc2UueHNkLmVjb3JlLmltcG9ydGVyIj4KLSAgPGZvcmVpZ25Nb2RlbD5TZXJ2ZXJUeXBlRGVmaW5pdGlvblNjaGVtYS54c2Q8L2ZvcmVpZ25Nb2RlbD4KLSAgPGdlblBhY2thZ2VzIHByZWZpeD0iU2VydmVyVHlwZSIgYmFzZVBhY2thZ2U9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlIgotICAgICAgcmVzb3VyY2U9IlhNTCIgZWNvcmVQYWNrYWdlPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5lY29yZSMvIj4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5lY29yZSMvL0FyY2hpdmVUeXBlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5lY29yZSMvL0FyY2hpdmVUeXBlL3BhdGgiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZWNvcmUjLy9Bcmd1bWVudFBhaXIiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmVjb3JlIy8vQXJndW1lbnRQYWlyL25hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5lY29yZSMvL0FyZ3VtZW50UGFpci92YWx1ZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5lY29yZSMvL0NsYXNzcGF0aCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmVjb3JlIy8vQ2xhc3NwYXRoL2dyb3VwIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmVjb3JlIy8vQ2xhc3NwYXRoL2FyY2hpdmUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5lY29yZSMvL0NsYXNzcGF0aC9pZCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5lY29yZSMvL0V4dGVybmFsIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5lY29yZSMvL0V4dGVybmFsL3ZhbHVlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZWNvcmUjLy9FeHRlcm5hbC9vcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5lY29yZSMvL0puZGlDb25uZWN0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5lY29yZSMvL0puZGlDb25uZWN0aW9uL3Byb3ZpZGVyVXJsIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmVjb3JlIy8vSm5kaUNvbm5lY3Rpb24vZ3JvdXAiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZWNvcmUjLy9KbmRpQ29ubmVjdGlvbi9qbmRpUHJvcGVydHkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5lY29yZSMvL0puZGlDb25uZWN0aW9uL2luaXRpYWxDb250ZXh0RmFjdG9yeSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5lY29yZSMvL0xhdW5jaENvbmZpZ3VyYXRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5lY29yZSMvL0xhdW5jaENvbmZpZ3VyYXRpb24vZ3JvdXAiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZWNvcmUjLy9MYXVuY2hDb25maWd1cmF0aW9uL2Vudmlyb25tZW50VmFyaWFibGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZWNvcmUjLy9MYXVuY2hDb25maWd1cmF0aW9uL2dyb3VwMSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmVjb3JlIy8vTGF1bmNoQ29uZmlndXJhdGlvbi9wcm9ncmFtQXJndW1lbnRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZWNvcmUjLy9MYXVuY2hDb25maWd1cmF0aW9uL3dvcmtpbmdEaXJlY3RvcnkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5lY29yZSMvL0xhdW5jaENvbmZpZ3VyYXRpb24vbWFpbkNsYXNzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmVjb3JlIy8vTGF1bmNoQ29uZmlndXJhdGlvbi9ncm91cDIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5lY29yZSMvL0xhdW5jaENvbmZpZ3VyYXRpb24vdm1QYXJhbWV0ZXJzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZWNvcmUjLy9MYXVuY2hDb25maWd1cmF0aW9uL2NsYXNzcGF0aFJlZmVyZW5jZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmVjb3JlIy8vTGF1bmNoQ29uZmlndXJhdGlvbi9kZWJ1Z1BvcnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZWNvcmUjLy9MYXVuY2hDb25maWd1cmF0aW9uL2dyb3VwMyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmVjb3JlIy8vTGF1bmNoQ29uZmlndXJhdGlvbi9leHRlcm5hbCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5lY29yZSMvL01vZHVsZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZWNvcmUjLy9Nb2R1bGUvdHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmVjb3JlIy8vTW9kdWxlL3B1Ymxpc2hEaXIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5lY29yZSMvL01vZHVsZS9wdWJsaXNoZXJSZWZlcmVuY2UiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZWNvcmUjLy9Qb3J0Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5lY29yZSMvL1BvcnQvbm8iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5lY29yZSMvL1BvcnQvbmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmVjb3JlIy8vUG9ydC9wcm90b2NvbCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5lY29yZSMvL1Byb2plY3QiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmVjb3JlIy8vUHJvamVjdC9jbGFzc3BhdGhSZWZlcmVuY2UiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZWNvcmUjLy9Qcm9wZXJ0eSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZWNvcmUjLy9Qcm9wZXJ0eS9jb250ZXh0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZWNvcmUjLy9Qcm9wZXJ0eS9kZWZhdWx0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZWNvcmUjLy9Qcm9wZXJ0eS9pZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmVjb3JlIy8vUHJvcGVydHkvbGFiZWwiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5lY29yZSMvL1Byb3BlcnR5L3R5cGUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZWNvcmUjLy9QdWJsaXNoZXIiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5lY29yZSMvL1B1Ymxpc2hlci9ncm91cCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5lY29yZSMvL1B1Ymxpc2hlci9wdWJsaXNoZXJkYXRhIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZWNvcmUjLy9QdWJsaXNoZXIvaWQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZWNvcmUjLy9QdWJsaXNoZXJEYXRhIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5lY29yZSMvL1B1Ymxpc2hlckRhdGEvZGF0YW5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5lY29yZSMvL1B1Ymxpc2hlckRhdGEvZGF0YXZhbHVlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmVjb3JlIy8vU2VydmVyUnVudGltZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmVjb3JlIy8vU2VydmVyUnVudGltZS9ncm91cCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5lY29yZSMvL1NlcnZlclJ1bnRpbWUvcHJvcGVydHkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZWNvcmUjLy9TZXJ2ZXJSdW50aW1lL2dyb3VwMSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5lY29yZSMvL1NlcnZlclJ1bnRpbWUvcG9ydCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5lY29yZSMvL1NlcnZlclJ1bnRpbWUvZ3JvdXAyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmVjb3JlIy8vU2VydmVyUnVudGltZS9tb2R1bGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZWNvcmUjLy9TZXJ2ZXJSdW50aW1lL3Byb2plY3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZWNvcmUjLy9TZXJ2ZXJSdW50aW1lL3N0YXJ0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmVjb3JlIy8vU2VydmVyUnVudGltZS9zdG9wIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmVjb3JlIy8vU2VydmVyUnVudGltZS9ncm91cDMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZWNvcmUjLy9TZXJ2ZXJSdW50aW1lL3B1Ymxpc2hlciIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5lY29yZSMvL1NlcnZlclJ1bnRpbWUvZ3JvdXA0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmVjb3JlIy8vU2VydmVyUnVudGltZS9jbGFzc3BhdGgiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZWNvcmUjLy9TZXJ2ZXJSdW50aW1lL2puZGlDb25uZWN0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZWNvcmUjLy9TZXJ2ZXJSdW50aW1lL25hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5lY29yZSMvL1NlcnZlclJ1bnRpbWUvdmVyc2lvbiIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgPC9nZW5QYWNrYWdlcz4KLTwvZ2VubW9kZWw6R2VuTW9kZWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlL3hzZC9zZXJ2ZXJ0eXBlLnhzZDJlY29yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUveHNkL3NlcnZlcnR5cGUueHNkMmVjb3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTllNGU0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUveHNkL3NlcnZlcnR5cGUueHNkMmVjb3JlCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IkFTQ0lJIj8+Ci08eHNkMmVjb3JlOlhTRDJFY29yZU1hcHBpbmdSb290IHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2QyZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvWFNEMkVjb3JlIiBpbnB1dHM9IlNlcnZlclR5cGVEZWZpbml0aW9uU2NoZW1hLnhzZCMvIgotICAgIG91dHB1dHM9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmVjb3JlIy8iIHRvcFRvQm90dG9tPSJ0cnVlIj4KLSAgPG5lc3RlZCBpbnB1dHM9ImJ1bmRsZWVudHJ5Oi8vMTc1L2NhY2hlL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEueHNkIy8vc3RyaW5nO1hTRFNpbXBsZVR5cGVEZWZpbml0aW9uPTciCi0gICAgICBvdXRwdXRzPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgPG5lc3RlZCBpbnB1dHM9IlNlcnZlclR5cGVEZWZpbml0aW9uU2NoZW1hLnhzZCMvL0NsYXNzcGF0aDtYU0RDb21wbGV4VHlwZURlZmluaXRpb249NS9YU0RQYXJ0aWNsZS9YU0RNb2RlbEdyb3VwL1hTRFBhcnRpY2xlL2FyY2hpdmU7WFNERWxlbWVudERlY2xhcmF0aW9uL1hTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIKLSAgICAgIG91dHB1dHM9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmVjb3JlIy8vQXJjaGl2ZVR5cGUiPgotICAgIDxuZXN0ZWQgaW5wdXRzPSJTZXJ2ZXJUeXBlRGVmaW5pdGlvblNjaGVtYS54c2QjLy9DbGFzc3BhdGg7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uPTUvWFNEUGFydGljbGUvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZS9hcmNoaXZlO1hTREVsZW1lbnREZWNsYXJhdGlvbi9YU0RDb21wbGV4VHlwZURlZmluaXRpb24vWFNEQXR0cmlidXRlVXNlIgotICAgICAgICBvdXRwdXRzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5lY29yZSMvL0FyY2hpdmVUeXBlL3BhdGgiLz4KLSAgPC9uZXN0ZWQ+Ci0gIDxuZXN0ZWQgaW5wdXRzPSJidW5kbGVlbnRyeTovLzE3NS9jYWNoZS93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLnhzZCMvL2Jvb2xlYW47WFNEU2ltcGxlVHlwZURlZmluaXRpb249OCIKLSAgICAgIG91dHB1dHM9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iLz4KLSAgPG5lc3RlZCBpbnB1dHM9IlNlcnZlclR5cGVEZWZpbml0aW9uU2NoZW1hLnhzZCMvL0NsYXNzcGF0aDtYU0RDb21wbGV4VHlwZURlZmluaXRpb249NSIKLSAgICAgIG91dHB1dHM9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmVjb3JlIy8vQ2xhc3NwYXRoIj4KLSAgICA8bmVzdGVkIGlucHV0cz0iU2VydmVyVHlwZURlZmluaXRpb25TY2hlbWEueHNkIy8vQ2xhc3NwYXRoO1hTRENvbXBsZXhUeXBlRGVmaW5pdGlvbj01L1hTRFBhcnRpY2xlIgotICAgICAgICBvdXRwdXRzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5lY29yZSMvL0NsYXNzcGF0aC9ncm91cCIvPgotICAgIDxuZXN0ZWQgaW5wdXRzPSJTZXJ2ZXJUeXBlRGVmaW5pdGlvblNjaGVtYS54c2QjLy9DbGFzc3BhdGg7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uPTUvWFNEUGFydGljbGUvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZSIKLSAgICAgICAgb3V0cHV0cz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZWNvcmUjLy9DbGFzc3BhdGgvYXJjaGl2ZSIvPgotICAgIDxuZXN0ZWQgaW5wdXRzPSJTZXJ2ZXJUeXBlRGVmaW5pdGlvblNjaGVtYS54c2QjLy9DbGFzc3BhdGg7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uPTUvWFNEQXR0cmlidXRlVXNlIgotICAgICAgICBvdXRwdXRzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5lY29yZSMvL0NsYXNzcGF0aC9pZCIvPgotICAgIDxuZXN0ZWQgaW5wdXRzPSJTZXJ2ZXJUeXBlRGVmaW5pdGlvblNjaGVtYS54c2QjLy9DbGFzc3BhdGg7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uPTUvWFNEQXR0cmlidXRlVXNlPTEiCi0gICAgICAgIG91dHB1dHM9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmVjb3JlIy8vQ2xhc3NwYXRoL2lzTGlicmFyeSIvPgotICA8L25lc3RlZD4KLSAgPG5lc3RlZCBpbnB1dHM9IlNlcnZlclR5cGVEZWZpbml0aW9uU2NoZW1hLnhzZCMvL0xhdW5jaENvbmZpZ3VyYXRpb247WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uPTMiCi0gICAgICBvdXRwdXRzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5lY29yZSMvL0xhdW5jaENvbmZpZ3VyYXRpb24iPgotICAgIDxuZXN0ZWQgaW5wdXRzPSJTZXJ2ZXJUeXBlRGVmaW5pdGlvblNjaGVtYS54c2QjLy9MYXVuY2hDb25maWd1cmF0aW9uO1hTRENvbXBsZXhUeXBlRGVmaW5pdGlvbj0zL1hTRFBhcnRpY2xlL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGUiCi0gICAgICAgIG91dHB1dHM9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmVjb3JlIy8vTGF1bmNoQ29uZmlndXJhdGlvbi9jbGFzcyIvPgotICAgIDxuZXN0ZWQgaW5wdXRzPSJTZXJ2ZXJUeXBlRGVmaW5pdGlvblNjaGVtYS54c2QjLy9MYXVuY2hDb25maWd1cmF0aW9uO1hTRENvbXBsZXhUeXBlRGVmaW5pdGlvbj0zL1hTRFBhcnRpY2xlL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGU9MSIKLSAgICAgICAgb3V0cHV0cz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZWNvcmUjLy9MYXVuY2hDb25maWd1cmF0aW9uL3dvcmtpbmdEaXJlY3RvcnkiLz4KLSAgICA8bmVzdGVkIGlucHV0cz0iU2VydmVyVHlwZURlZmluaXRpb25TY2hlbWEueHNkIy8vTGF1bmNoQ29uZmlndXJhdGlvbjtYU0RDb21wbGV4VHlwZURlZmluaXRpb249My9YU0RQYXJ0aWNsZS9YU0RNb2RlbEdyb3VwL1hTRFBhcnRpY2xlPTIiCi0gICAgICAgIG91dHB1dHM9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmVjb3JlIy8vTGF1bmNoQ29uZmlndXJhdGlvbi9wcm9ncmFtQXJndW1lbnRzIi8+Ci0gICAgPG5lc3RlZCBpbnB1dHM9IlNlcnZlclR5cGVEZWZpbml0aW9uU2NoZW1hLnhzZCMvL0xhdW5jaENvbmZpZ3VyYXRpb247WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uPTMvWFNEUGFydGljbGUvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZT0zIgotICAgICAgICBvdXRwdXRzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5lY29yZSMvL0xhdW5jaENvbmZpZ3VyYXRpb24vdm1QYXJhbWV0ZXJzIi8+Ci0gICAgPG5lc3RlZCBpbnB1dHM9IlNlcnZlclR5cGVEZWZpbml0aW9uU2NoZW1hLnhzZCMvL0xhdW5jaENvbmZpZ3VyYXRpb247WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uPTMvWFNEUGFydGljbGUvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZT00IgotICAgICAgICBvdXRwdXRzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5lY29yZSMvL0xhdW5jaENvbmZpZ3VyYXRpb24vY2xhc3NwYXRoUmVmZXJlbmNlIi8+Ci0gIDwvbmVzdGVkPgotICA8bmVzdGVkIGlucHV0cz0iU2VydmVyVHlwZURlZmluaXRpb25TY2hlbWEueHNkIy8vTW9kdWxlO1hTRENvbXBsZXhUeXBlRGVmaW5pdGlvbj0yIgotICAgICAgb3V0cHV0cz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZWNvcmUjLy9Nb2R1bGUiPgotICAgIDxuZXN0ZWQgaW5wdXRzPSJTZXJ2ZXJUeXBlRGVmaW5pdGlvblNjaGVtYS54c2QjLy9Nb2R1bGU7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uPTIvWFNEUGFydGljbGUvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZSIKLSAgICAgICAgb3V0cHV0cz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZWNvcmUjLy9Nb2R1bGUvdHlwZSIvPgotICAgIDxuZXN0ZWQgaW5wdXRzPSJTZXJ2ZXJUeXBlRGVmaW5pdGlvblNjaGVtYS54c2QjLy9Nb2R1bGU7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uPTIvWFNEUGFydGljbGUvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZT0xIgotICAgICAgICBvdXRwdXRzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5lY29yZSMvL01vZHVsZS9wdWJsaXNoRGlyIi8+Ci0gICAgPG5lc3RlZCBpbnB1dHM9IlNlcnZlclR5cGVEZWZpbml0aW9uU2NoZW1hLnhzZCMvL01vZHVsZTtYU0RDb21wbGV4VHlwZURlZmluaXRpb249Mi9YU0RQYXJ0aWNsZS9YU0RNb2RlbEdyb3VwL1hTRFBhcnRpY2xlPTIiCi0gICAgICAgIG91dHB1dHM9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmVjb3JlIy8vTW9kdWxlL3B1Ymxpc2hlclJlZmVyZW5jZSIvPgotICA8L25lc3RlZD4KLSAgPG5lc3RlZCBpbnB1dHM9IlNlcnZlclR5cGVEZWZpbml0aW9uU2NoZW1hLnhzZCMvL1BvcnQ7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uPTQiCi0gICAgICBvdXRwdXRzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5lY29yZSMvL1BvcnQiPgotICAgIDxuZXN0ZWQgaW5wdXRzPSJTZXJ2ZXJUeXBlRGVmaW5pdGlvblNjaGVtYS54c2QjLy9Qb3J0O1hTRENvbXBsZXhUeXBlRGVmaW5pdGlvbj00L1hTRFBhcnRpY2xlL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGUiCi0gICAgICAgIG91dHB1dHM9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmVjb3JlIy8vUG9ydC9ubyIvPgotICAgIDxuZXN0ZWQgaW5wdXRzPSJTZXJ2ZXJUeXBlRGVmaW5pdGlvblNjaGVtYS54c2QjLy9Qb3J0O1hTRENvbXBsZXhUeXBlRGVmaW5pdGlvbj00L1hTRFBhcnRpY2xlL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGU9MSIKLSAgICAgICAgb3V0cHV0cz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZWNvcmUjLy9Qb3J0L25hbWUiLz4KLSAgICA8bmVzdGVkIGlucHV0cz0iU2VydmVyVHlwZURlZmluaXRpb25TY2hlbWEueHNkIy8vUG9ydDtYU0RDb21wbGV4VHlwZURlZmluaXRpb249NC9YU0RQYXJ0aWNsZS9YU0RNb2RlbEdyb3VwL1hTRFBhcnRpY2xlPTIiCi0gICAgICAgIG91dHB1dHM9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmVjb3JlIy8vUG9ydC9wcm90b2NvbCIvPgotICA8L25lc3RlZD4KLSAgPG5lc3RlZCBpbnB1dHM9IlNlcnZlclR5cGVEZWZpbml0aW9uU2NoZW1hLnhzZCMvL1Byb2plY3Q7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uPTciCi0gICAgICBvdXRwdXRzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5lY29yZSMvL1Byb2plY3QiPgotICAgIDxuZXN0ZWQgaW5wdXRzPSJTZXJ2ZXJUeXBlRGVmaW5pdGlvblNjaGVtYS54c2QjLy9Qcm9qZWN0O1hTRENvbXBsZXhUeXBlRGVmaW5pdGlvbj03L1hTRFBhcnRpY2xlL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGUiCi0gICAgICAgIG91dHB1dHM9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmVjb3JlIy8vUHJvamVjdC9jbGFzc3BhdGhSZWZlcmVuY2UiLz4KLSAgPC9uZXN0ZWQ+Ci0gIDxuZXN0ZWQgaW5wdXRzPSJTZXJ2ZXJUeXBlRGVmaW5pdGlvblNjaGVtYS54c2QjLy9Qcm9wZXJ0eTtYU0RDb21wbGV4VHlwZURlZmluaXRpb249MSIKLSAgICAgIG91dHB1dHM9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmVjb3JlIy8vUHJvcGVydHkiPgotICAgIDxuZXN0ZWQgaW5wdXRzPSJTZXJ2ZXJUeXBlRGVmaW5pdGlvblNjaGVtYS54c2QjLy9Qcm9wZXJ0eTtYU0RDb21wbGV4VHlwZURlZmluaXRpb249MS9YU0RBdHRyaWJ1dGVVc2U9MyIKLSAgICAgICAgb3V0cHV0cz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZWNvcmUjLy9Qcm9wZXJ0eS9jb250ZXh0Ii8+Ci0gICAgPG5lc3RlZCBpbnB1dHM9IlNlcnZlclR5cGVEZWZpbml0aW9uU2NoZW1hLnhzZCMvL1Byb3BlcnR5O1hTRENvbXBsZXhUeXBlRGVmaW5pdGlvbj0xL1hTREF0dHJpYnV0ZVVzZT00IgotICAgICAgICBvdXRwdXRzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5lY29yZSMvL1Byb3BlcnR5L2RlZmF1bHQiLz4KLSAgICA8bmVzdGVkIGlucHV0cz0iU2VydmVyVHlwZURlZmluaXRpb25TY2hlbWEueHNkIy8vUHJvcGVydHk7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uPTEvWFNEQXR0cmlidXRlVXNlIgotICAgICAgICBvdXRwdXRzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5lY29yZSMvL1Byb3BlcnR5L2lkIi8+Ci0gICAgPG5lc3RlZCBpbnB1dHM9IlNlcnZlclR5cGVEZWZpbml0aW9uU2NoZW1hLnhzZCMvL1Byb3BlcnR5O1hTRENvbXBsZXhUeXBlRGVmaW5pdGlvbj0xL1hTREF0dHJpYnV0ZVVzZT0xIgotICAgICAgICBvdXRwdXRzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5lY29yZSMvL1Byb3BlcnR5L2xhYmVsIi8+Ci0gICAgPG5lc3RlZCBpbnB1dHM9IlNlcnZlclR5cGVEZWZpbml0aW9uU2NoZW1hLnhzZCMvL1Byb3BlcnR5O1hTRENvbXBsZXhUeXBlRGVmaW5pdGlvbj0xL1hTREF0dHJpYnV0ZVVzZT0yIgotICAgICAgICBvdXRwdXRzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5lY29yZSMvL1Byb3BlcnR5L3R5cGUiLz4KLSAgPC9uZXN0ZWQ+Ci0gIDxuZXN0ZWQgaW5wdXRzPSJTZXJ2ZXJUeXBlRGVmaW5pdGlvblNjaGVtYS54c2QjLy9QdWJsaXNoZXI7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uPTYvWFNEUGFydGljbGUvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZS9wdWJsaXNoO1hTREVsZW1lbnREZWNsYXJhdGlvbi9YU0RDb21wbGV4VHlwZURlZmluaXRpb24iCi0gICAgICBvdXRwdXRzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5lY29yZSMvL1B1Ymxpc2hUeXBlIj4KLSAgICA8bmVzdGVkIGlucHV0cz0iU2VydmVyVHlwZURlZmluaXRpb25TY2hlbWEueHNkIy8vUHVibGlzaGVyO1hTRENvbXBsZXhUeXBlRGVmaW5pdGlvbj02L1hTRFBhcnRpY2xlL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGUvcHVibGlzaDtYU0RFbGVtZW50RGVjbGFyYXRpb24vWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uL1hTRFBhcnRpY2xlL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGUiCi0gICAgICAgIG91dHB1dHM9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmVjb3JlIy8vUHVibGlzaFR5cGUvdGFzayIvPgotICAgIDxuZXN0ZWQgaW5wdXRzPSJTZXJ2ZXJUeXBlRGVmaW5pdGlvblNjaGVtYS54c2QjLy9QdWJsaXNoZXI7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uPTYvWFNEUGFydGljbGUvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZS9wdWJsaXNoO1hTREVsZW1lbnREZWNsYXJhdGlvbi9YU0RDb21wbGV4VHlwZURlZmluaXRpb24vWFNEUGFydGljbGUvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZT0xIgotICAgICAgICBvdXRwdXRzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5lY29yZSMvL1B1Ymxpc2hUeXBlL2NsYXNzcGF0aFJlZmVyZW5jZSIvPgotICA8L25lc3RlZD4KLSAgPG5lc3RlZCBpbnB1dHM9IlNlcnZlclR5cGVEZWZpbml0aW9uU2NoZW1hLnhzZCMvL1B1Ymxpc2hlcjtYU0RDb21wbGV4VHlwZURlZmluaXRpb249Ni9YU0RQYXJ0aWNsZS9YU0RNb2RlbEdyb3VwL1hTRFBhcnRpY2xlPTEvdW5wdWJsaXNoO1hTREVsZW1lbnREZWNsYXJhdGlvbi9YU0RDb21wbGV4VHlwZURlZmluaXRpb24iCi0gICAgICBvdXRwdXRzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5lY29yZSMvL1VucHVibGlzaFR5cGUiPgotICAgIDxuZXN0ZWQgaW5wdXRzPSJTZXJ2ZXJUeXBlRGVmaW5pdGlvblNjaGVtYS54c2QjLy9QdWJsaXNoZXI7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uPTYvWFNEUGFydGljbGUvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZT0xL3VucHVibGlzaDtYU0RFbGVtZW50RGVjbGFyYXRpb24vWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uL1hTRFBhcnRpY2xlL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGUiCi0gICAgICAgIG91dHB1dHM9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmVjb3JlIy8vVW5wdWJsaXNoVHlwZS90YXNrIi8+Ci0gICAgPG5lc3RlZCBpbnB1dHM9IlNlcnZlclR5cGVEZWZpbml0aW9uU2NoZW1hLnhzZCMvL1B1Ymxpc2hlcjtYU0RDb21wbGV4VHlwZURlZmluaXRpb249Ni9YU0RQYXJ0aWNsZS9YU0RNb2RlbEdyb3VwL1hTRFBhcnRpY2xlPTEvdW5wdWJsaXNoO1hTREVsZW1lbnREZWNsYXJhdGlvbi9YU0RDb21wbGV4VHlwZURlZmluaXRpb24vWFNEUGFydGljbGUvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZT0xIgotICAgICAgICBvdXRwdXRzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5lY29yZSMvL1VucHVibGlzaFR5cGUvY2xhc3NwYXRoUmVmZXJlbmNlIi8+Ci0gIDwvbmVzdGVkPgotICA8bmVzdGVkIGlucHV0cz0iU2VydmVyVHlwZURlZmluaXRpb25TY2hlbWEueHNkIy8vUHVibGlzaGVyO1hTRENvbXBsZXhUeXBlRGVmaW5pdGlvbj02IgotICAgICAgb3V0cHV0cz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZWNvcmUjLy9QdWJsaXNoZXIiPgotICAgIDxuZXN0ZWQgaW5wdXRzPSJTZXJ2ZXJUeXBlRGVmaW5pdGlvblNjaGVtYS54c2QjLy9QdWJsaXNoZXI7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uPTYvWFNEUGFydGljbGUiCi0gICAgICAgIG91dHB1dHM9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmVjb3JlIy8vUHVibGlzaGVyL2dyb3VwIi8+Ci0gICAgPG5lc3RlZCBpbnB1dHM9IlNlcnZlclR5cGVEZWZpbml0aW9uU2NoZW1hLnhzZCMvL1B1Ymxpc2hlcjtYU0RDb21wbGV4VHlwZURlZmluaXRpb249Ni9YU0RQYXJ0aWNsZS9YU0RNb2RlbEdyb3VwL1hTRFBhcnRpY2xlIgotICAgICAgICBvdXRwdXRzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5lY29yZSMvL1B1Ymxpc2hlci9wdWJsaXNoIi8+Ci0gICAgPG5lc3RlZCBpbnB1dHM9IlNlcnZlclR5cGVEZWZpbml0aW9uU2NoZW1hLnhzZCMvL1B1Ymxpc2hlcjtYU0RDb21wbGV4VHlwZURlZmluaXRpb249Ni9YU0RQYXJ0aWNsZS9YU0RNb2RlbEdyb3VwL1hTRFBhcnRpY2xlPTEiCi0gICAgICAgIG91dHB1dHM9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmVjb3JlIy8vUHVibGlzaGVyL3VucHVibGlzaCIvPgotICAgIDxuZXN0ZWQgaW5wdXRzPSJTZXJ2ZXJUeXBlRGVmaW5pdGlvblNjaGVtYS54c2QjLy9QdWJsaXNoZXI7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uPTYvWFNEQXR0cmlidXRlVXNlIgotICAgICAgICBvdXRwdXRzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5lY29yZSMvL1B1Ymxpc2hlci9pZCIvPgotICA8L25lc3RlZD4KLSAgPG5lc3RlZCBpbnB1dHM9IlNlcnZlclR5cGVEZWZpbml0aW9uU2NoZW1hLnhzZCMvL1NlcnZlclJ1bnRpbWU7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIgotICAgICAgb3V0cHV0cz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZWNvcmUjLy9TZXJ2ZXJSdW50aW1lIj4KLSAgICA8bmVzdGVkIGlucHV0cz0iU2VydmVyVHlwZURlZmluaXRpb25TY2hlbWEueHNkIy8vU2VydmVyUnVudGltZTtYU0RDb21wbGV4VHlwZURlZmluaXRpb24vWFNEUGFydGljbGUvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZSIKLSAgICAgICAgb3V0cHV0cz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZWNvcmUjLy9TZXJ2ZXJSdW50aW1lL2dyb3VwIi8+Ci0gICAgPG5lc3RlZCBpbnB1dHM9IlNlcnZlclR5cGVEZWZpbml0aW9uU2NoZW1hLnhzZCMvL1NlcnZlclJ1bnRpbWU7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uL1hTRFBhcnRpY2xlL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGUvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZSIKLSAgICAgICAgb3V0cHV0cz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZWNvcmUjLy9TZXJ2ZXJSdW50aW1lL3Byb3BlcnR5Ii8+Ci0gICAgPG5lc3RlZCBpbnB1dHM9IlNlcnZlclR5cGVEZWZpbml0aW9uU2NoZW1hLnhzZCMvL1NlcnZlclJ1bnRpbWU7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uL1hTRFBhcnRpY2xlL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGU9MSIKLSAgICAgICAgb3V0cHV0cz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZWNvcmUjLy9TZXJ2ZXJSdW50aW1lL2dyb3VwMSIvPgotICAgIDxuZXN0ZWQgaW5wdXRzPSJTZXJ2ZXJUeXBlRGVmaW5pdGlvblNjaGVtYS54c2QjLy9TZXJ2ZXJSdW50aW1lO1hTRENvbXBsZXhUeXBlRGVmaW5pdGlvbi9YU0RQYXJ0aWNsZS9YU0RNb2RlbEdyb3VwL1hTRFBhcnRpY2xlPTEvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZSIKLSAgICAgICAgb3V0cHV0cz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZWNvcmUjLy9TZXJ2ZXJSdW50aW1lL3BvcnQiLz4KLSAgICA8bmVzdGVkIGlucHV0cz0iU2VydmVyVHlwZURlZmluaXRpb25TY2hlbWEueHNkIy8vU2VydmVyUnVudGltZTtYU0RDb21wbGV4VHlwZURlZmluaXRpb24vWFNEUGFydGljbGUvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZT0yIgotICAgICAgICBvdXRwdXRzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5lY29yZSMvL1NlcnZlclJ1bnRpbWUvZ3JvdXAyIi8+Ci0gICAgPG5lc3RlZCBpbnB1dHM9IlNlcnZlclR5cGVEZWZpbml0aW9uU2NoZW1hLnhzZCMvL1NlcnZlclJ1bnRpbWU7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uL1hTRFBhcnRpY2xlL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGU9Mi9YU0RNb2RlbEdyb3VwL1hTRFBhcnRpY2xlIgotICAgICAgICBvdXRwdXRzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5lY29yZSMvL1NlcnZlclJ1bnRpbWUvbW9kdWxlIi8+Ci0gICAgPG5lc3RlZCBpbnB1dHM9IlNlcnZlclR5cGVEZWZpbml0aW9uU2NoZW1hLnhzZCMvL1NlcnZlclJ1bnRpbWU7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uL1hTRFBhcnRpY2xlL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGU9MyIKLSAgICAgICAgb3V0cHV0cz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZWNvcmUjLy9TZXJ2ZXJSdW50aW1lL3Byb2plY3QiLz4KLSAgICA8bmVzdGVkIGlucHV0cz0iU2VydmVyVHlwZURlZmluaXRpb25TY2hlbWEueHNkIy8vU2VydmVyUnVudGltZTtYU0RDb21wbGV4VHlwZURlZmluaXRpb24vWFNEUGFydGljbGUvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZT00IgotICAgICAgICBvdXRwdXRzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5lY29yZSMvL1NlcnZlclJ1bnRpbWUvc3RhcnQiLz4KLSAgICA8bmVzdGVkIGlucHV0cz0iU2VydmVyVHlwZURlZmluaXRpb25TY2hlbWEueHNkIy8vU2VydmVyUnVudGltZTtYU0RDb21wbGV4VHlwZURlZmluaXRpb24vWFNEUGFydGljbGUvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZT01IgotICAgICAgICBvdXRwdXRzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5lY29yZSMvL1NlcnZlclJ1bnRpbWUvc3RvcCIvPgotICAgIDxuZXN0ZWQgaW5wdXRzPSJTZXJ2ZXJUeXBlRGVmaW5pdGlvblNjaGVtYS54c2QjLy9TZXJ2ZXJSdW50aW1lO1hTRENvbXBsZXhUeXBlRGVmaW5pdGlvbi9YU0RQYXJ0aWNsZS9YU0RNb2RlbEdyb3VwL1hTRFBhcnRpY2xlPTYiCi0gICAgICAgIG91dHB1dHM9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmVjb3JlIy8vU2VydmVyUnVudGltZS9ncm91cDMiLz4KLSAgICA8bmVzdGVkIGlucHV0cz0iU2VydmVyVHlwZURlZmluaXRpb25TY2hlbWEueHNkIy8vU2VydmVyUnVudGltZTtYU0RDb21wbGV4VHlwZURlZmluaXRpb24vWFNEUGFydGljbGUvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZT02L1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGUiCi0gICAgICAgIG91dHB1dHM9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmVjb3JlIy8vU2VydmVyUnVudGltZS9wdWJsaXNoZXIiLz4KLSAgICA8bmVzdGVkIGlucHV0cz0iU2VydmVyVHlwZURlZmluaXRpb25TY2hlbWEueHNkIy8vU2VydmVyUnVudGltZTtYU0RDb21wbGV4VHlwZURlZmluaXRpb24vWFNEUGFydGljbGUvWFNETW9kZWxHcm91cC9YU0RQYXJ0aWNsZT03IgotICAgICAgICBvdXRwdXRzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5lY29yZSMvL1NlcnZlclJ1bnRpbWUvZ3JvdXA0Ii8+Ci0gICAgPG5lc3RlZCBpbnB1dHM9IlNlcnZlclR5cGVEZWZpbml0aW9uU2NoZW1hLnhzZCMvL1NlcnZlclJ1bnRpbWU7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uL1hTRFBhcnRpY2xlL1hTRE1vZGVsR3JvdXAvWFNEUGFydGljbGU9Ny9YU0RNb2RlbEdyb3VwL1hTRFBhcnRpY2xlIgotICAgICAgICBvdXRwdXRzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5lY29yZSMvL1NlcnZlclJ1bnRpbWUvY2xhc3NwYXRoIi8+Ci0gICAgPG5lc3RlZCBpbnB1dHM9IlNlcnZlclR5cGVEZWZpbml0aW9uU2NoZW1hLnhzZCMvL1NlcnZlclJ1bnRpbWU7WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uL1hTREF0dHJpYnV0ZVVzZSIKLSAgICAgICAgb3V0cHV0cz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZWNvcmUjLy9TZXJ2ZXJSdW50aW1lL25hbWUiLz4KLSAgICA8bmVzdGVkIGlucHV0cz0iU2VydmVyVHlwZURlZmluaXRpb25TY2hlbWEueHNkIy8vU2VydmVyUnVudGltZTtYU0RDb21wbGV4VHlwZURlZmluaXRpb24vWFNEQXR0cmlidXRlVXNlPTEiCi0gICAgICAgIG91dHB1dHM9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmVjb3JlIy8vU2VydmVyUnVudGltZS92ZXJzaW9uIi8+Ci0gIDwvbmVzdGVkPgotPC94c2QyZWNvcmU6WFNEMkVjb3JlTWFwcGluZ1Jvb3Q+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5tb2R1bGVzLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5tb2R1bGVzLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyNjU0YzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMubW9kdWxlcy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4KLWJ1aWxkLnhtbAotY29tbW9ubW9kdWxlcy5qYXIKLW9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5tb2R1bGVzXzEuMC4wLmphcgotdGVtcC5mb2xkZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLm1vZHVsZXMvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5tb2R1bGVzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjE0YmE4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLm1vZHVsZXMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MWM4ZjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODFjZTFiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLWJpbgotYnVpbGQueG1sCi1nZW5lcmljdWkuamFyCi1vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWlfMS4wLjAuamFyCi10ZW1wLmZvbGRlcgotZ2VuZXJpY3Vpc3JjLnppcAotQGRvdApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWYxNGJhOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTI2MzdiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjEucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkuaW50ZXJuYWwuR2VuZXJpY1VpUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkuaW50ZXJuYWwKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS51aSwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aSwKLSBvcmcuZWNsaXBzZS5kZWJ1Zy51aSwKLSBvcmcuZWNsaXBzZS5qZHQuZGVidWcudWksCi0gb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLAotIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLAotIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZQotRWNsaXBzZS1BdXRvU3RhcnQ6IHRydWUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpL2Fib3V0Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjZiOTZjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+RmVicnVhcnkgMjQsIDIwMDU8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjllYzQzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUgRXRlcmF0aW9uIEEuUy4gYW5kIEdvcmtlbSBFcmNhbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSMgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jICAgICAgICAgICAgICAgCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCi1zcmMuaW5jbHVkZXMgPSBidWlsZC5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS9pY29ucy9vYmoxNi9zZXJ2ZXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvaWNvbnMvb2JqMTYvc2VydmVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjUxYWUzOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS9pY29ucy9vYmoxNi9zZXJ2ZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvaWNvbnMvd2l6YmFuL25ld19zZXJ2ZXJfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpL2ljb25zL3dpemJhbi9uZXdfc2VydmVyX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwZGU5MWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvaWNvbnMvd2l6YmFuL25ld19zZXJ2ZXJfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExMDViZTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUgRXRlcmF0aW9uIEEuUy4gYW5kIEdvcmtlbSBFcmNhbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSMgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jICAgICAgICAgICAgICAgCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBsdWdpbk5hbWU9R2VuZXJpYyBTZXJ2ZXIgUGx1Z2luIFVJCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLXBsdWdpbkRlc2NyaXB0aW9uPVVJIENvbXBvbmVudHMgZm9yIHRoZSBnZW5lcmljIHNlcnZlciBwbHVnaW4uCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpL3BsdWdpbi54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYThmNWY5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZGVidWcudWkubGF1bmNoQ29uZmlndXJhdGlvblR5cGVJbWFnZXMiPgotICAgIDxsYXVuY2hDb25maWd1cmF0aW9uVHlwZUltYWdlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmltYWdlLnVpLmxhdW5jaENvbmZpZ3VyYXRpb25UeXBlSW1hZ2UiCi0gICAgICBjb25maWdUeXBlSUQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmxhdW5jaENvbmZpZ3VyYXRpb25UeXBlIgotICAgICAgaWNvbj0iaWNvbnMvb2JqMTYvc2VydmVyLmdpZiI+Ci0gICAgPC9sYXVuY2hDb25maWd1cmF0aW9uVHlwZUltYWdlPgotICAgIDxsYXVuY2hDb25maWd1cmF0aW9uVHlwZUltYWdlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmltYWdlLnVpLkV4dGVybmFsTGF1bmNoQ29uZmlndXJhdGlvblR5cGVJbWFnZSIKLSAgICAgIGNvbmZpZ1R5cGVJRD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuRXh0ZXJuYWxMYXVuY2hDb25maWd1cmF0aW9uVHlwZSIKLSAgICAgIGljb249Imljb25zL29iajE2L3NlcnZlci5naWYiPgotICAgIDwvbGF1bmNoQ29uZmlndXJhdGlvblR5cGVJbWFnZT4KLSAgPC9leHRlbnNpb24+Ci0gIAotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5sYXVuY2hDb25maWd1cmF0aW9uVGFiR3JvdXBzIj4KLSAgICA8bGF1bmNoQ29uZmlndXJhdGlvblRhYkdyb3VwCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpLmludGVybmFsLmxhdW5jaENvbmZpZ3VyYXRpb25UYWJHcm91cCIKLSAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmxhdW5jaENvbmZpZ3VyYXRpb25UeXBlIgotICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS5pbnRlcm5hbC5HZW5lcmljTGF1bmNoQ29uZmlndXJhdGlvblRhYkdyb3VwIj4KLSAgICA8L2xhdW5jaENvbmZpZ3VyYXRpb25UYWJHcm91cD4KLSAgICA8bGF1bmNoQ29uZmlndXJhdGlvblRhYkdyb3VwCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpLmludGVybmFsLmxhdW5jaENvbmZpZ3VyYXRpb25UYWJHcm91cCIKLSAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLkV4dGVybmFsTGF1bmNoQ29uZmlndXJhdGlvblR5cGUiCi0gICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpLmludGVybmFsLkdlbmVyaWNMYXVuY2hDb25maWd1cmF0aW9uVGFiR3JvdXAiPgotICAgIDwvbGF1bmNoQ29uZmlndXJhdGlvblRhYkdyb3VwPgotICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3VpL2ludGVybmFsL0dlbmVyaWNMYXVuY2hDb25maWd1cmF0aW9uVGFiR3JvdXAuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvdWkvaW50ZXJuYWwvR2VuZXJpY0xhdW5jaENvbmZpZ3VyYXRpb25UYWJHcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWM1YzU1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvdWkvaW50ZXJuYWwvR2VuZXJpY0xhdW5jaENvbmZpZ3VyYXRpb25UYWJHcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5BYnN0cmFjdExhdW5jaENvbmZpZ3VyYXRpb25UYWJHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5Db21tb25UYWI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuRW52aXJvbm1lbnRUYWI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuSUxhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuSUxhdW5jaENvbmZpZ3VyYXRpb25UYWI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuc291cmNlbG9va3VwLlNvdXJjZUxvb2t1cFRhYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuZGVidWcudWkubGF1bmNoQ29uZmlndXJhdGlvbnMuSmF2YUFyZ3VtZW50c1RhYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuZGVidWcudWkubGF1bmNoQ29uZmlndXJhdGlvbnMuSmF2YUNsYXNzcGF0aFRhYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuZGVidWcudWkubGF1bmNoQ29uZmlndXJhdGlvbnMuSmF2YUpSRVRhYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuY29yZS51dGlsLkV4dGVuc2lvblBvaW50VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlclR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlckNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5TZXJ2ZXJMYXVuY2hDb25maWd1cmF0aW9uVGFiOwotCi0KLXB1YmxpYyBjbGFzcyBHZW5lcmljTGF1bmNoQ29uZmlndXJhdGlvblRhYkdyb3VwIGV4dGVuZHMgQWJzdHJhY3RMYXVuY2hDb25maWd1cmF0aW9uVGFiR3JvdXB7Ci0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5JTGF1bmNoQ29uZmlndXJhdGlvblRhYkdyb3VwIElMYXVuY2hDb25maWd1cmF0aW9uVGFiR3JvdXAjY3JlYXRlVGFicyhJTGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZywgU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVRhYnMoSUxhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2cgZGlhbG9nLCBTdHJpbmcgbW9kZSkgewotCQlJTGF1bmNoQ29uZmlndXJhdGlvblRhYltdIHRhYnMgPSBuZXcgSUxhdW5jaENvbmZpZ3VyYXRpb25UYWJbN107Ci0JCXRhYnNbMF0gPSBuZXcgU2VydmVyTGF1bmNoQ29uZmlndXJhdGlvblRhYihnZXRUeXBlSWRzKCkpOwotCQl0YWJzWzBdLnNldExhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2coZGlhbG9nKTsKLQkJdGFic1sxXSA9IG5ldyBKYXZhQXJndW1lbnRzVGFiKCk7Ci0JCXRhYnNbMV0uc2V0TGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZyhkaWFsb2cpOwotCQl0YWJzWzJdID0gbmV3IEphdmFDbGFzc3BhdGhUYWIoKTsKLQkJdGFic1syXS5zZXRMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nKGRpYWxvZyk7Ci0JCXRhYnNbM10gPSBuZXcgU291cmNlTG9va3VwVGFiKCk7Ci0JCXRhYnNbM10uc2V0TGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZyhkaWFsb2cpOwotCQl0YWJzWzRdID0gbmV3IEVudmlyb25tZW50VGFiKCk7Ci0JCXRhYnNbNF0uc2V0TGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZyhkaWFsb2cpOwotCQl0YWJzWzVdID0gbmV3IEphdmFKUkVUYWIoKTsKLQkJdGFic1s1XS5zZXRMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nKGRpYWxvZyk7CSAKLQkJdGFic1s2XSA9IG5ldyBDb21tb25UYWIoKTsKLQkJdGFic1s2XS5zZXRMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nKGRpYWxvZyk7Ci0JCXNldFRhYnModGFicyk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmdbXSBnZXRUeXBlSWRzKCkgewotCQlBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSUV4dGVuc2lvbltdIGV4dGVuc2lvbnM9IEV4dGVuc2lvblBvaW50VXRpbC5nZXRHZW5lcmljU2VydmVyRGVmaW5pdGlvbkV4dGVuc2lvbnMoKTsKLQkJIGZvciAoaW50IGkgPSAwOyBleHRlbnNpb25zIT1udWxsICYmIGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkgSUV4dGVuc2lvbiBleHRlbnNpb24gPSBleHRlbnNpb25zW2ldOwotCSAgICAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzID0gRXh0ZW5zaW9uUG9pbnRVdGlsLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cyhleHRlbnNpb24pOwotCSAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZWxlbWVudHMubGVuZ3RoOyBqKyspIHsKLQkgICAgICAgIAkgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQgPSBlbGVtZW50c1tqXTsKLQkgICAgICAgIAkgU3RyaW5nIGdlbmVyaWNSdW50aW1lSUQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgiaWQiKTsKLQkgICAgICAgIAkgSVNlcnZlclR5cGVbXSBzZXJ2ZXJUeXBlcyA9IFNlcnZlckNvcmUuZ2V0U2VydmVyVHlwZXMoKTsKLQkgICAgICAgIAkgZm9yIChpbnQgayA9IDA7IGsgPCBzZXJ2ZXJUeXBlcy5sZW5ndGg7IGsrKykgewotCQkJCQlpZihzZXJ2ZXJUeXBlc1trXS5oYXNSdW50aW1lKCkgJiYgc2VydmVyVHlwZXNba10uZ2V0UnVudGltZVR5cGUoKS5nZXRJZCgpLmVxdWFscyhnZW5lcmljUnVudGltZUlEKSkKLQkJCQkJCWxpc3QuYWRkKHNlcnZlclR5cGVzW2tdLmdldElkKCkpOwotCQkJCX0KLQkgICAgICAgICB9Ci0JCSB9Ci0JCSByZXR1cm4gKFN0cmluZ1tdKWxpc3QudG9BcnJheShuZXcgU3RyaW5nW2xpc3Quc2l6ZSgpXSk7Ci0JfQotCQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3VpL2ludGVybmFsL0dlbmVyaWNTZXJ2ZXJDb21wb3NpdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvdWkvaW50ZXJuYWwvR2VuZXJpY1NlcnZlckNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTkzNjliLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvdWkvaW50ZXJuYWwvR2VuZXJpY1NlcnZlckNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIEdlbmVyaWNTZXJ2ZXJDb21wb3NpdGUgZXh0ZW5kcyBDb21wb3NpdGUgewotCi0JcHJpdmF0ZSBHZW5lcmljU2VydmVyQ29tcG9zaXRlRGVjb3JhdG9yW10gZkRlY29yYXRvcnM7Ci0JcHVibGljIEdlbmVyaWNTZXJ2ZXJDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgR2VuZXJpY1NlcnZlckNvbXBvc2l0ZURlY29yYXRvcltdIGRlY29yYXRvcnMpIHsKLQkJc3VwZXIocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWZEZWNvcmF0b3JzID0gZGVjb3JhdG9yczsKLQkJR3JpZExheW91dCBsYXlvdXQgPW5ldyBHcmlkTGF5b3V0KDMsZmFsc2UpOyAKLQkJc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgICAgIHNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQljcmVhdGVDb250cm9sKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRyb2woKXsKLQkJZm9yIChpbnQgaSA9IDA7IGZEZWNvcmF0b3JzIT0gbnVsbCAmJiBpIDwgZkRlY29yYXRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCWZEZWNvcmF0b3JzW2ldLmRlY29yYXRlKHRoaXMpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy91aS9pbnRlcm5hbC9HZW5lcmljU2VydmVyQ29tcG9zaXRlRGVjb3JhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3VpL2ludGVybmFsL0dlbmVyaWNTZXJ2ZXJDb21wb3NpdGVEZWNvcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjMyZjM1Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3VpL2ludGVybmFsL0dlbmVyaWNTZXJ2ZXJDb21wb3NpdGVEZWNvcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBFdGVyYXRpb24gQS5TLiBhbmQgR29ya2VtIEVyY2FuLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IEdvcmtlbSBFcmNhbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgICAgICAgICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpLmludGVybmFsOwotCi0KLS8qKgotICogCi0gKiBAYXV0aG9yIEdvcmtlbSBFcmNhbgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEdlbmVyaWNTZXJ2ZXJDb21wb3NpdGVEZWNvcmF0b3IgCi17Ci0JLyoqCi0JICogCi0JICogQHBhcmFtIGNvbXBvc2l0ZQotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIGRlY29yYXRlKEdlbmVyaWNTZXJ2ZXJDb21wb3NpdGUgY29tcG9zaXRlKTsKLSAgICAvKioKLQkgKiBDYWxsZWQgaWYgYWxsIHRoZSBmaWVsZHMgYXJlIHZhbGlkLiBUaGlzIGdpdmVzIHN1YmNsYXNzZXMgb3Bwb3J0dW5pdHkgdG8KLQkgKiB2YWxpZGF0ZSBhbmQgdGFrZSBuZWNlc3NhcnkgYWN0aW9ucy4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGFic3RyYWN0IGJvb2xlYW4gdmFsaWRhdGUoKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvdWkvaW50ZXJuYWwvR2VuZXJpY1NlcnZlclJ1bnRpbWVXaXphcmRGcmFnbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy91aS9pbnRlcm5hbC9HZW5lcmljU2VydmVyUnVudGltZVdpemFyZEZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhOTc2MDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy91aS9pbnRlcm5hbC9HZW5lcmljU2VydmVyUnVudGltZVdpemFyZEZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsLkdlbmVyaWNTZXJ2ZXJSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlckNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlRhc2tNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuSUluc3RhbGxhYmxlUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuU2VydmVyUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5SdW50aW1lRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuSVdpemFyZEhhbmRsZTsKLQotLyoqCi0gKiBBIHNlcnZlckRlZmluaXRpb25UeXBlIGF3YXJlIHdpemFyZCBmb3IgZGVmaW5pbmcgcnVudGltZXMuCi0gKiAKLSAqIEBhdXRob3IgR29ya2VtIEVyY2FuCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmljU2VydmVyUnVudGltZVdpemFyZEZyYWdtZW50IGV4dGVuZHMgU2VydmVyRGVmaW5pdGlvblR5cGVBd2FyZVdpemFyZEZyYWdtZW50IHsKLQkKLQlwcml2YXRlIEdlbmVyaWNTZXJ2ZXJDb21wb3NpdGVEZWNvcmF0b3JbXSBmRGVjb3JhdG9yczsKLQkKLQkKLQkvKioKLQkgKiBDb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBHZW5lcmljU2VydmVyUnVudGltZVdpemFyZEZyYWdtZW50KCkgewotCQlzdXBlcigpOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLndpemFyZC5JV2l6YXJkRnJhZ21lbnQjaXNDb21wbGV0ZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDb21wbGV0ZSgpIHsKLQkgIAlSdW50aW1lRGVsZWdhdGUgcnVudGltZSA9IGdldFJ1bnRpbWVEZWxlZ2F0ZSgpOwotCQlpZiAocnVudGltZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlJU3RhdHVzIHN0YXR1cyA9IHJ1bnRpbWUudmFsaWRhdGUoKTsKLQkJcmV0dXJuIChzdGF0dXMgIT0gbnVsbCAmJiBzdGF0dXMuaXNPSygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udGVudChDb21wb3NpdGUgcGFyZW50LCBJV2l6YXJkSGFuZGxlIGhhbmRsZSkgewkJCi0JCU1hcCBwcm9wZXJ0aWVzPSBudWxsOwotCQlTZXJ2ZXJSdW50aW1lIGRlZmluaXRpb249bnVsbDsKLSAgICAgICAgaWYoZ2V0UnVudGltZURlbGVnYXRlKCkhPW51bGwpewotIAkJCXByb3BlcnRpZXMgPSBnZXRSdW50aW1lRGVsZWdhdGUoKS5nZXRTZXJ2ZXJJbnN0YW5jZVByb3BlcnRpZXMoKTsKLQkJCWRlZmluaXRpb24gPSBnZXRTZXJ2ZXJUeXBlRGVmaW5pdGlvbihnZXRTZXJ2ZXJEZWZpbml0aW9uSWQoKSxwcm9wZXJ0aWVzKTsKLQkJfSAgICAgICAKLSAgICAgICAgSUluc3RhbGxhYmxlUnVudGltZSBpciA9IFNlcnZlclBsdWdpbi5maW5kSW5zdGFsbGFibGVSdW50aW1lKGdldFJ1bnRpbWVEZWxlZ2F0ZSgpLmdldFJ1bnRpbWUoKS5nZXRSdW50aW1lVHlwZSgpLmdldElkKCkpOwotICAgICAgICBpZiAoaXIhPSBudWxsKXsJCi0gICAgICAgIAlmRGVjb3JhdG9ycz0gbmV3IEdlbmVyaWNTZXJ2ZXJDb21wb3NpdGVEZWNvcmF0b3JbM107IAotICAgICAgICAJZkRlY29yYXRvcnNbMF09IG5ldyBKUkVTZWxlY3REZWNvcmF0b3IoZ2V0UnVudGltZURlbGVnYXRlKCkpOwotICAgICAgICAJZkRlY29yYXRvcnNbMV09IG5ldyBTZXJ2ZXJUeXBlRGVmaW5pdGlvblJ1bnRpbWVEZWNvcmF0b3IoZGVmaW5pdGlvbixwcm9wZXJ0aWVzLGdldFdpemFyZCgpLGdldFJ1bnRpbWVEZWxlZ2F0ZSgpKTsKLSAgICAgICAgCWZEZWNvcmF0b3JzWzJdPSBuZXcgSW5zdGFsbGFibGVSdW50aW1lRGVjb3JhdG9yKGdldFdpemFyZCgpLCBnZXRSdW50aW1lRGVsZWdhdGUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZXsKLSAgICAgICAgCWZEZWNvcmF0b3JzPSBuZXcgR2VuZXJpY1NlcnZlckNvbXBvc2l0ZURlY29yYXRvclsyXTsgCi0gICAgICAgIAlmRGVjb3JhdG9yc1swXT0gbmV3IEpSRVNlbGVjdERlY29yYXRvcihnZXRSdW50aW1lRGVsZWdhdGUoKSk7Ci0gICAgICAgIAlmRGVjb3JhdG9yc1sxXT0gbmV3IFNlcnZlclR5cGVEZWZpbml0aW9uUnVudGltZURlY29yYXRvcihkZWZpbml0aW9uLHByb3BlcnRpZXMsZ2V0V2l6YXJkKCksZ2V0UnVudGltZURlbGVnYXRlKCkpOwotICAgICAgICB9Ci0JCQotCQluZXcgR2VuZXJpY1NlcnZlckNvbXBvc2l0ZShwYXJlbnQsZkRlY29yYXRvcnMpOwotCX0KLQotCQotCXByaXZhdGUgU3RyaW5nIGdldFNlcnZlckRlZmluaXRpb25JZCgpewotCQlTdHJpbmcgY3VycmVudERlZmluaXRpb249IG51bGw7Ci0JCWlmKGdldFJ1bnRpbWVEZWxlZ2F0ZSgpIT1udWxsKQotCQkJY3VycmVudERlZmluaXRpb24gPSAgZ2V0UnVudGltZURlbGVnYXRlKCkuZ2V0UnVudGltZSgpLmdldFJ1bnRpbWVUeXBlKCkuZ2V0SWQoKTsKLQkJaWYoY3VycmVudERlZmluaXRpb24hPSBudWxsICYmIGN1cnJlbnREZWZpbml0aW9uLmxlbmd0aCgpPjApCi0JCXsJCi0JCQlyZXR1cm4gY3VycmVudERlZmluaXRpb247Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkud2l6YXJkLklXaXphcmRGcmFnbWVudCNlbnRlcigpCi0JICovCi0JcHVibGljIHZvaWQgZW50ZXIoKSB7Ci0JICAgIGlmKGdldFJ1bnRpbWVEZWxlZ2F0ZSgpIT1udWxsKQotCQkJZ2V0UnVudGltZURlbGVnYXRlKCkuZ2V0UnVudGltZVdvcmtpbmdDb3B5KCkuc2V0TmFtZShjcmVhdGVOYW1lKCkpOwotCSAgICAKLQkgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmRGVjb3JhdG9ycy5sZW5ndGg7IGkrKykgewotCQkJaWYoZkRlY29yYXRvcnNbaV0udmFsaWRhdGUoKSkKLQkJCQlyZXR1cm47Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgZXhpdCgpIHsKLQkJLy92YWxpZGF0ZSB0byBzYXZlIGxhdGVzdCB2YWx1ZXMKLQkgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmRGVjb3JhdG9ycy5sZW5ndGg7IGkrKykgewotCQkJaWYoZkRlY29yYXRvcnNbaV0udmFsaWRhdGUoKSkKLQkJCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQotCXByaXZhdGUgU3RyaW5nIGNyZWF0ZU5hbWUoKQotCXsKLQkgICAgUnVudGltZURlbGVnYXRlIGRsID0gZ2V0UnVudGltZURlbGVnYXRlKCk7Ci0JICAgIElSdW50aW1lVHlwZSBydW50aW1lVHlwZSA9IGRsLmdldFJ1bnRpbWUoKS5nZXRSdW50aW1lVHlwZSgpOwotCSAgICBTdHJpbmcgbmFtZSA9IEdlbmVyaWNTZXJ2ZXJVSU1lc3NhZ2VzLmJpbmQoR2VuZXJpY1NlcnZlclVJTWVzc2FnZXMucnVudGltZU5hbWUscnVudGltZVR5cGUuZ2V0TmFtZSgpKTsKLQkJSVJ1bnRpbWVbXSBsaXN0ID0gU2VydmVyQ29yZS5nZXRSdW50aW1lcygpOwotCQlpbnQgc3VmZml4ID0gMTsKLQkJU3RyaW5nIHN1ZmZpeE5hbWU9bmFtZTsKLQkJZm9yKGludCBpPTA7aTxsaXN0Lmxlbmd0aDtpKyspCi0JICAgIHsKLQkgICAgICAgIGlmKChsaXN0W2ldLmdldE5hbWUoKS5lcXVhbHMobmFtZSl8fCBsaXN0W2ldLmdldE5hbWUoKS5lcXVhbHMoc3VmZml4TmFtZSkpJiYgIWxpc3RbaV0uZXF1YWxzKGRsLmdldFJ1bnRpbWUoKSkpCi0JICAgICAgICAgICAgc3VmZml4Kys7Ci0JICAgICAgICBzdWZmaXhOYW1lPSBuYW1lKyIgIitzdWZmaXg7Ci0JICAgIH0KLQkgICAgCi0JCWlmKHN1ZmZpeD4xKQotCQkgICAgcmV0dXJuIHN1ZmZpeE5hbWU7Ci0JICAgIHJldHVybiBuYW1lOwotCX0KLQkKLQlwcml2YXRlIEdlbmVyaWNTZXJ2ZXJSdW50aW1lIGdldFJ1bnRpbWVEZWxlZ2F0ZSgpewotCQlJUnVudGltZVdvcmtpbmdDb3B5IHdjID0gKElSdW50aW1lV29ya2luZ0NvcHkpIGdldFRhc2tNb2RlbCgpLmdldE9iamVjdChUYXNrTW9kZWwuVEFTS19SVU5USU1FKTsKLQkJaWYgKHdjID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChHZW5lcmljU2VydmVyUnVudGltZSkgd2MubG9hZEFkYXB0ZXIoR2VuZXJpY1NlcnZlclJ1bnRpbWUuY2xhc3MsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCX0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwudWkuU2VydmVyRGVmaW5pdGlvblR5cGVBd2FyZVdpemFyZEZyYWdtZW50I2Rlc2NyaXB0aW9uKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGRlc2NyaXB0aW9uKCkgewotICAgICAgICBTdHJpbmcgck5hbWUgPSBnZXRSdW50aW1lTmFtZSgpOwotICAgICAgICBpZihyTmFtZSA9PSBudWxsIHx8IHJOYW1lLmxlbmd0aCgpPDEpCi0gICAgICAgICAgICByTmFtZT0iR2VuZXJpYyI7ICAgICAgCi0gICAgICAgIHJldHVybiAgR2VuZXJpY1NlcnZlclVJTWVzc2FnZXMuYmluZChHZW5lcmljU2VydmVyVUlNZXNzYWdlcy5ydW50aW1lV2l6YXJkRGVzY3JpcHRpb24sck5hbWUpOwotICAgIH0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwudWkuU2VydmVyRGVmaW5pdGlvblR5cGVBd2FyZVdpemFyZEZyYWdtZW50I3RpdGxlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRpdGxlKCkgewotICAgICAgICBTdHJpbmcgck5hbWUgPSBnZXRSdW50aW1lTmFtZSgpOwotICAgICAgICBpZihyTmFtZSA9PSBudWxsIHx8IHJOYW1lLmxlbmd0aCgpPDEpCi0gICAgICAgICAgICByTmFtZT0iR2VuZXJpYyI7Ci0gICAgICAgcmV0dXJuIEdlbmVyaWNTZXJ2ZXJVSU1lc3NhZ2VzLmJpbmQoR2VuZXJpY1NlcnZlclVJTWVzc2FnZXMucnVudGltZVdpemFyZFRpdGxlLHJOYW1lKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0UnVudGltZU5hbWUoKQotICAgIHsKLSAgICAgICBpZihnZXRSdW50aW1lRGVsZWdhdGUoKSE9bnVsbCAmJiBnZXRSdW50aW1lRGVsZWdhdGUoKS5nZXRSdW50aW1lKCkhPW51bGwpCi0gICAgICAgICAgICByZXR1cm4gZ2V0UnVudGltZURlbGVnYXRlKCkuZ2V0UnVudGltZSgpLmdldE5hbWUoKTsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy91aS9pbnRlcm5hbC9HZW5lcmljU2VydmVyVUlNZXNzYWdlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy91aS9pbnRlcm5hbC9HZW5lcmljU2VydmVyVUlNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTA4NjZhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvdWkvaW50ZXJuYWwvR2VuZXJpY1NlcnZlclVJTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBFdGVyYXRpb24gQS5TLiBhbmQgR29ya2VtIEVyY2FuLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IEdvcmtlbSBFcmNhbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgICAgICAgICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBIZWxwZXIgY2xhc3MgdG8gZ2V0IG1lc3NhZ2VzCi0gKiAKLSAqIEBhdXRob3IgR29ya2VtIEVyY2FuCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmljU2VydmVyVUlNZXNzYWdlcyBleHRlbmRzIE5MU3sKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNPVVJDRV9CVU5ETEU9ICJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkuaW50ZXJuYWwuR2VuZXJpY1NlcnZlclVJTWVzc2FnZXMiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZXJ2ZXJUeXBlR3JvdXBfbGFiZWxfYnJvd3NlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJ1bnRpbWVOYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJ1bnRpbWVXaXphcmREZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBydW50aW1lV2l6YXJkVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VydmVyTmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZXJ2ZXJXaXphcmREZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZXJ2ZXJXaXphcmRUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbnN0YWxsZWRfanJlX2xpbms7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcganJlX3NlbGVjdF9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWZhdWx0SlJFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGludmFsaWRQYXRoOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGluc3RhbGxTZXJ2ZXJCdXR0b247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW5zdGFsbGF0aW9uRGlyZWN0b3J5OwotCQotCXN0YXRpY3sKLQkJICBOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKFJFU09VUkNFX0JVTkRMRSwgR2VuZXJpY1NlcnZlclVJTWVzc2FnZXMuY2xhc3MpOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3VpL2ludGVybmFsL0dlbmVyaWNTZXJ2ZXJVSU1lc3NhZ2VzLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3VpL2ludGVybmFsL0dlbmVyaWNTZXJ2ZXJVSU1lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyYzk1MjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy91aS9pbnRlcm5hbC9HZW5lcmljU2VydmVyVUlNZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0jIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6IEdvcmtlbSBFcmNhbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyAgICAgICAgICAgICAgIAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zZXJ2ZXJXaXphcmRUaXRsZT1OZXcgezB9IFNlcnZlcgotc2VydmVyV2l6YXJkRGVzY3JpcHRpb249Q3JlYXRlIGEgbmV3IHswfSBzZXJ2ZXIgCi1ydW50aW1lV2l6YXJkVGl0bGU9TmV3IHswfSBSdW50aW1lCi1ydW50aW1lV2l6YXJkRGVzY3JpcHRpb249RGVmaW5lIGEgbmV3IHswfSBydW50aW1lCi1zZXJ2ZXJUeXBlR3JvdXBfbGFiZWxfYnJvd3NlPUJyb3dzZS4uLgotc2VydmVyTmFtZSA9IHswfQotcnVudGltZU5hbWU9IHswfQotaW5zdGFsbGVkX2pyZV9saW5rID0gWW91IGNhbiB1c2UgPGE+SW5zdGFsbGVkIEpSRSBwcmVmZXJlbmNlczwvYT4gdG8gY3JlYXRlIGEgbmV3IEpSRQotaW5zdGFsbFNlcnZlckJ1dHRvbj1JbnN0YWxsIFNlcnZlcgotaW5zdGFsbGF0aW9uRGlyZWN0b3J5PVNlbGVjdCBpbnN0YWxsYXRpb24gZGlyZWN0b3J5Ci1qcmVfc2VsZWN0X2xhYmVsPSAmSlJFOgotZGVmYXVsdEpSRSA9IERlZmF1bHQgSlJFCi1pbnZhbGlkUGF0aCA9IHswfSBpcyBub3QgdmFsaWQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3VpL2ludGVybmFsL0dlbmVyaWNTZXJ2ZXJXaXphcmRGcmFnbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy91aS9pbnRlcm5hbC9HZW5lcmljU2VydmVyV2l6YXJkRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTEwMDNiMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3VpL2ludGVybmFsL0dlbmVyaWNTZXJ2ZXJXaXphcmRGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBFdGVyYXRpb24gQS5TLiBhbmQgR29ya2VtIEVyY2FuLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IEdvcmtlbSBFcmNhbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgICAgICAgICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsLkdlbmVyaWNTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuaW50ZXJuYWwuR2VuZXJpY1NlcnZlclJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuVGFza01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkud2l6YXJkLklXaXphcmRIYW5kbGU7Ci0vKioKLSAqIAotICoKLSAqIEBhdXRob3IgR29ya2VtIEVyY2FuCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmljU2VydmVyV2l6YXJkRnJhZ21lbnQgZXh0ZW5kcyBTZXJ2ZXJEZWZpbml0aW9uVHlwZUF3YXJlV2l6YXJkRnJhZ21lbnQgCi17Ci0JcHJpdmF0ZSBHZW5lcmljU2VydmVyQ29tcG9zaXRlRGVjb3JhdG9yW10gZkRlY29yYXRvcnM7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NvbXBsZXRlKCkgewotCi0JCVNlcnZlclJ1bnRpbWUgc2VydmVyUnVudGltZSA9IGdldFNlcnZlclR5cGVEZWZpbml0aW9uRm9yKGdldFNlcnZlcigpKTsKLQkJaWYoc2VydmVyUnVudGltZT09bnVsbCkKLQkJICAgIHJldHVybiBmYWxzZTsKLQotCQlJU2VydmVyV29ya2luZ0NvcHkgc2VydmVyID0gZ2V0U2VydmVyKCk7Ci0JCUdlbmVyaWNTZXJ2ZXIgZGw9IChHZW5lcmljU2VydmVyKXNlcnZlci5sb2FkQWRhcHRlcihHZW5lcmljU2VydmVyLmNsYXNzLG51bGwpOwotCi0JCUlTdGF0dXMgc3RhdHVzID0gZGwudmFsaWRhdGUoKTsKLQkJcmV0dXJuIChzdGF0dXMgIT0gbnVsbCAmJiBzdGF0dXMuaXNPSygpKTsKLQkJCi0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udGVudChDb21wb3NpdGUgcGFyZW50LCBJV2l6YXJkSGFuZGxlIGhhbmRsZSl7Ci0JCUlTZXJ2ZXJXb3JraW5nQ29weSBzZXJ2ZXIgPSBnZXRTZXJ2ZXIoKTsKLQkJR2VuZXJpY1NlcnZlciBkbD0gKEdlbmVyaWNTZXJ2ZXIpc2VydmVyLmxvYWRBZGFwdGVyKEdlbmVyaWNTZXJ2ZXIuY2xhc3MsbnVsbCk7Ci0JCVNlcnZlclJ1bnRpbWUgZGVmaW5pdGlvbiA9IGdldFNlcnZlclR5cGVEZWZpbml0aW9uRm9yKHNlcnZlcik7Ci0JCWZEZWNvcmF0b3JzID0gbmV3IEdlbmVyaWNTZXJ2ZXJDb21wb3NpdGVEZWNvcmF0b3JbMV07Ci0JCWZEZWNvcmF0b3JzWzBdPW5ldyBTZXJ2ZXJUeXBlRGVmaW5pdGlvblNlcnZlckRlY29yYXRvcihkZWZpbml0aW9uLG51bGwsZ2V0V2l6YXJkKCksZGwpOwotCQluZXcgR2VuZXJpY1NlcnZlckNvbXBvc2l0ZShwYXJlbnQsZkRlY29yYXRvcnMpOwotCQkKLQl9Ci0JLyoqCi0gICAgICogQHBhcmFtIHNlcnZlcgotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwcml2YXRlIFNlcnZlclJ1bnRpbWUgZ2V0U2VydmVyVHlwZURlZmluaXRpb25Gb3IoSVNlcnZlcldvcmtpbmdDb3B5IHNlcnZlcikgeyAgICAgICAgCi0gICAgICAgIEdlbmVyaWNTZXJ2ZXJSdW50aW1lIHJ1bnRpbWUgPSAoR2VuZXJpY1NlcnZlclJ1bnRpbWUpc2VydmVyLmdldFJ1bnRpbWUoKS5nZXRBZGFwdGVyKEdlbmVyaWNTZXJ2ZXJSdW50aW1lLmNsYXNzKTsKLSAgICAgICAgaWYocnVudGltZT09bnVsbCl7Ci0gICAgICAgICAgICBJUnVudGltZSB3YyA9IChJUnVudGltZSlnZXRUYXNrTW9kZWwoKS5nZXRPYmplY3QoVGFza01vZGVsLlRBU0tfUlVOVElNRSk7Ci0gICAgICAgICAgICBydW50aW1lPSAoR2VuZXJpY1NlcnZlclJ1bnRpbWUpd2MuZ2V0QWRhcHRlcihHZW5lcmljU2VydmVyUnVudGltZS5jbGFzcyk7Ci0gICAgICAgICAgICBpZihydW50aW1lPT1udWxsKQotICAgICAgICAgICAgCXJ1bnRpbWU9IChHZW5lcmljU2VydmVyUnVudGltZSl3Yy5sb2FkQWRhcHRlcihHZW5lcmljU2VydmVyUnVudGltZS5jbGFzcyxuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLSAgICAgICAgfSAgICAgICAgCi0gICAgICAgIFN0cmluZyBpZCA9IHJ1bnRpbWUuZ2V0UnVudGltZSgpLmdldFJ1bnRpbWVUeXBlKCkuZ2V0SWQoKTsKLSAgICAgICAgaWYoaWQ9PW51bGwpeyAgIAotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgTWFwIHJ1bnRpbWVQcm9wZXJ0aWVzID0gcnVudGltZS5nZXRTZXJ2ZXJJbnN0YW5jZVByb3BlcnRpZXMoKTsKLQkJU2VydmVyUnVudGltZSBkZWZpbml0aW9uID0gZ2V0U2VydmVyVHlwZURlZmluaXRpb24oaWQscnVudGltZVByb3BlcnRpZXMpOwotICAgICAgICByZXR1cm4gZGVmaW5pdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHJpdmF0ZSBJU2VydmVyV29ya2luZ0NvcHkgZ2V0U2VydmVyKCkgewotICAgICAgICBJU2VydmVyV29ya2luZ0NvcHkgc2VydmVyID0gKElTZXJ2ZXJXb3JraW5nQ29weSlnZXRUYXNrTW9kZWwoKS5nZXRPYmplY3QoVGFza01vZGVsLlRBU0tfU0VSVkVSKTsKLSAgICAgICAgcmV0dXJuIHNlcnZlcjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNOYW1lSW5Vc2UoU3RyaW5nIG5hbWUpewotICAgICAgIAlJU2VydmVyW10gc2VydmVycyA9U2VydmVyQ29yZS5nZXRTZXJ2ZXJzKCk7ICAgCQotICAgIAlmb3IgKGludCBpID0gMDsgaSA8IHNlcnZlcnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmKCFzZXJ2ZXJzW2ldLmVxdWFscyhnZXRTZXJ2ZXIoKS5nZXRPcmlnaW5hbCgpKSAmJiAoc2VydmVyc1tpXS5nZXROYW1lKCkuZXF1YWxzKG5hbWUpICkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLSAgICAJcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIFN0cmluZyBjcmVhdGVOYW1lKCl7Ci0gICAgCVN0cmluZyBuYW1lID0gR2VuZXJpY1NlcnZlclVJTWVzc2FnZXMuYmluZChHZW5lcmljU2VydmVyVUlNZXNzYWdlcy5zZXJ2ZXJOYW1lLGdldFNlcnZlclR5cGVEZWZpbml0aW9uRm9yKGdldFNlcnZlcigpKS5nZXROYW1lKCkpOwotICAgIAlpbnQgc3VmZml4PTE7Ci0gICAgCVN0cmluZyBzdWZmaXhOYW1lID1uYW1lOwotICAgIAl3aGlsZShpc05hbWVJblVzZShzdWZmaXhOYW1lKSl7Ci0gICAgCQlzdWZmaXhOYW1lID0gbmFtZSsiICIrc3VmZml4OwotICAgIAkJc3VmZml4Kys7Ci0gICAgCX0KLSAgICAJcmV0dXJuIHN1ZmZpeE5hbWU7Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIGVudGVyKCkgewotICAgIAlnZXRTZXJ2ZXIoKS5zZXROYW1lKGNyZWF0ZU5hbWUoKSk7Ci0JICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZkRlY29yYXRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmKGZEZWNvcmF0b3JzW2ldLnZhbGlkYXRlKCkpCi0JCQkJcmV0dXJuOwotCQl9Ci0gICAgIH0KLQlwdWJsaWMgdm9pZCBleGl0KCkgewotCSAgICAvL3ZhbGlkYXRlIG5lZWRlZCB0byBzYXZlIHRoZSBsYXRlc3QgdmFsdWVzLgotCQlmb3IgKGludCBpID0gMDsgaSA8IGZEZWNvcmF0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZihmRGVjb3JhdG9yc1tpXS52YWxpZGF0ZSgpKQotCQkJCXJldHVybjsKLQkJfQotCX0JCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnVpLlNlcnZlckRlZmluaXRpb25UeXBlQXdhcmVXaXphcmRGcmFnbWVudCNkZXNjcmlwdGlvbigpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBkZXNjcmlwdGlvbigpIHsKLSAgICAgICAgU3RyaW5nIHNOYW1lID0gZ2V0U2VydmVyTmFtZSgpOwotICAgICAgICBpZihzTmFtZT09bnVsbCB8fCBzTmFtZS5sZW5ndGgoKTwxKQotICAgICAgICAgICAgc05hbWU9IkdlbmVyaWMiOwotICAgICAgICByZXR1cm4gIEdlbmVyaWNTZXJ2ZXJVSU1lc3NhZ2VzLmJpbmQoR2VuZXJpY1NlcnZlclVJTWVzc2FnZXMuc2VydmVyV2l6YXJkRGVzY3JpcHRpb24sc05hbWUpOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldFNlcnZlck5hbWUoKQotICAgIHsKLSAgICAgICAgaWYoZ2V0U2VydmVyKCkhPW51bGwgJiYgZ2V0U2VydmVyKCkuZ2V0UnVudGltZSgpIT1udWxsKQotICAgICAgICAgICByZXR1cm4gZ2V0U2VydmVyKCkuZ2V0UnVudGltZSgpLmdldFJ1bnRpbWVUeXBlKCkuZ2V0TmFtZSgpOwotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnVpLlNlcnZlckRlZmluaXRpb25UeXBlQXdhcmVXaXphcmRGcmFnbWVudCN0aXRsZSgpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyB0aXRsZSgpIHsKLSAgICAgICAgU3RyaW5nIHNOYW1lPSBnZXRTZXJ2ZXJOYW1lKCk7Ci0gICAgICAgIGlmKHNOYW1lPT1udWxsIHx8IHNOYW1lLmxlbmd0aCgpPDEpCi0gICAgICAgICAgICBzTmFtZT0iR2VuZXJpYyI7Ci0gICAgICAgIHJldHVybiAgR2VuZXJpY1NlcnZlclVJTWVzc2FnZXMuYmluZChHZW5lcmljU2VydmVyVUlNZXNzYWdlcy5zZXJ2ZXJXaXphcmRUaXRsZSxzTmFtZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy91aS9pbnRlcm5hbC9HZW5lcmljVWlQbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvdWkvaW50ZXJuYWwvR2VuZXJpY1VpUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmZjVhODEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy91aS9pbnRlcm5hbC9HZW5lcmljVWlQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBFdGVyYXRpb24gQS5TLiBhbmQgR29ya2VtIEVyY2FuLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IEdvcmtlbSBFcmNhbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgICAgICAgICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLio7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLS8qKgotICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIHRvIGJlIHVzZWQgaW4gdGhlIGRlc2t0b3AuCi0gKiAKLSAqIEBhdXRob3IgR29ya2VtIEVyY2FuCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmljVWlQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQkKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXSVpCQU5fSU1BR0UgPSAiZ2VuZXJpY2xvZ28iOwotICAgIC8vVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBHZW5lcmljVWlQbHVnaW4gcGx1Z2luOwotCS8vUmVzb3VyY2UgYnVuZGxlLgotCXByaXZhdGUgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGU7Ci0JCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBHZW5lcmljVWlQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JCXRyeSB7Ci0JCQlyZXNvdXJjZUJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpLkdlbmVyaWNVaVBsdWdpblJlc291cmNlcyIpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24geCkgewotCQkJcmVzb3VyY2VCdW5kbGUgPSBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHVwb24gcGx1Zy1pbiBhY3RpdmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIHBsdWctaW4gaXMgc3RvcHBlZAotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBHZW5lcmljVWlQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdHJpbmcgZnJvbSB0aGUgcGx1Z2luJ3MgcmVzb3VyY2UgYnVuZGxlLAotCSAqIG9yICdrZXknIGlmIG5vdCBmb3VuZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXNvdXJjZVN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCVJlc291cmNlQnVuZGxlIGJ1bmRsZSA9IEdlbmVyaWNVaVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UmVzb3VyY2VCdW5kbGUoKTsKLQkJdHJ5IHsKLQkJCXJldHVybiAoYnVuZGxlICE9IG51bGwpID8gYnVuZGxlLmdldFN0cmluZyhrZXkpIDoga2V5OwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGtleTsKLQkJfQotCX0KLQotICAgIHByb3RlY3RlZCBJbWFnZVJlZ2lzdHJ5IGNyZWF0ZUltYWdlUmVnaXN0cnkoKSB7Ci0gICAgICAgIEltYWdlUmVnaXN0cnkgcmVnaXN0cnkgPSBuZXcgSW1hZ2VSZWdpc3RyeSgpOwotICAgICAgICBJbWFnZURlc2NyaXB0b3IgZGVzYyA9IEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKGdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRFbnRyeSgiL2ljb25zL3dpemJhbi9uZXdfc2VydmVyX3dpei5naWYiKSk7Ci0gICAgICAgIHJlZ2lzdHJ5LnB1dChXSVpCQU5fSU1BR0UsZGVzYyk7Ci0gICAgICAgIHJldHVybiByZWdpc3RyeTsKLSAgICB9Ci0gIAlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvcihTdHJpbmcga2V5KXsKLQkJcmV0dXJuIGdldEltYWdlUmVnaXN0cnkoKS5nZXREZXNjcmlwdG9yKGtleSk7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBsdWdpbidzIHJlc291cmNlIGJ1bmRsZSwKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoKSB7Ci0JCXJldHVybiByZXNvdXJjZUJ1bmRsZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3VpL2ludGVybmFsL0luc3RhbGxhYmxlUnVudGltZURlY29yYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy91aS9pbnRlcm5hbC9JbnN0YWxsYWJsZVJ1bnRpbWVEZWNvcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjVkYmFkMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3VpL2ludGVybmFsL0luc3RhbGxhYmxlUnVudGltZURlY29yYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5pbnRlcm5hbC5HZW5lcmljU2VydmVyUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5pbnRlcm5hbC5UcmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlyZWN0b3J5RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5JSW5zdGFsbGFibGVSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5TZXJ2ZXJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuSVdpemFyZEhhbmRsZTsKLQotcHVibGljIGNsYXNzIEluc3RhbGxhYmxlUnVudGltZURlY29yYXRvciBpbXBsZW1lbnRzCi0JCUdlbmVyaWNTZXJ2ZXJDb21wb3NpdGVEZWNvcmF0b3IgewotCi0JcHJpdmF0ZSBHZW5lcmljU2VydmVyUnVudGltZSBmUnVudGltZTsKLQlwcml2YXRlIElXaXphcmRIYW5kbGUgZldpemFyZDsKLQotCXB1YmxpYyBJbnN0YWxsYWJsZVJ1bnRpbWVEZWNvcmF0b3IoSVdpemFyZEhhbmRsZSB3aXphcmQsIEdlbmVyaWNTZXJ2ZXJSdW50aW1lIHJ1bnRpbWUpIHsKLQkJZlJ1bnRpbWUgPSBydW50aW1lOwotCQlmV2l6YXJkID0gd2l6YXJkOwotCX0KLQotCXB1YmxpYyB2b2lkIGRlY29yYXRlKGZpbmFsIEdlbmVyaWNTZXJ2ZXJDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCWZpbmFsIElJbnN0YWxsYWJsZVJ1bnRpbWUgaXIgPSBTZXJ2ZXJQbHVnaW4KLQkJCQkuZmluZEluc3RhbGxhYmxlUnVudGltZShmUnVudGltZS5nZXRSdW50aW1lKCkuZ2V0UnVudGltZVR5cGUoKQotCQkJCQkJLmdldElkKCkpOwotCi0JCUJ1dHRvbiBpbnN0YWxsID0gU1dUVXRpbC5jcmVhdGVCdXR0b24oY29tcG9zaXRlLCBHZW5lcmljU2VydmVyVUlNZXNzYWdlcy5pbnN0YWxsU2VydmVyQnV0dG9uKTsKLQkJaW5zdGFsbC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IHNlKSB7Ci0JCQkJRGlyZWN0b3J5RGlhbG9nIGRpYWxvZyA9IG5ldyBEaXJlY3RvcnlEaWFsb2coY29tcG9zaXRlCi0JCQkJCQkuZ2V0U2hlbGwoKSk7Ci0JCQkJZGlhbG9nLnNldE1lc3NhZ2UoR2VuZXJpY1NlcnZlclVJTWVzc2FnZXMuaW5zdGFsbGF0aW9uRGlyZWN0b3J5KTsKLQkJCQlmaW5hbCBTdHJpbmcgc2VsZWN0ZWREaXJlY3RvcnkgPSBkaWFsb2cub3BlbigpOwotCQkJCWlmIChzZWxlY3RlZERpcmVjdG9yeSAhPSBudWxsKSB7Ci0JCQkJCQotCQkJCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJCQkJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sCi0JCQkJCQkJCUludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlpci5pbnN0YWxsKG5ldyBQYXRoKHNlbGVjdGVkRGlyZWN0b3J5KSwKLQkJCQkJCQkJCQluZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLAotCQkJCQkJCQkJCSJFcnJvciBpbnN0YWxsaW5nIHJ1bnRpbWUiLCBlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX07Ci0JCQkJCQotCQkJCQl0cnkgewotCQkJCQkJZldpemFyZC5ydW4odHJ1ZSwgZmFsc2UsIHJ1bm5hYmxlKTsKLQkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLAotCQkJCQkJCQkiRXJyb3IgaW5zdGFsbGluZyBydW50aW1lIiwgZSk7Ci0JCQkJCX0KLQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvdWkvaW50ZXJuYWwvSlJFU2VsZWN0RGVjb3JhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3VpL2ludGVybmFsL0pSRVNlbGVjdERlY29yYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTRiYmYxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvdWkvaW50ZXJuYWwvSlJFU2VsZWN0RGVjb3JhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSVZNSW5zdGFsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLklWTUluc3RhbGxUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSmF2YVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5pbnRlcm5hbC5HZW5lcmljU2VydmVyUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0KLXB1YmxpYyBjbGFzcyBKUkVTZWxlY3REZWNvcmF0b3IgaW1wbGVtZW50cyBHZW5lcmljU2VydmVyQ29tcG9zaXRlRGVjb3JhdG9yIHsKLQlwcml2YXRlIExpc3QgaW5zdGFsbGVkSlJFczsKLQlwcml2YXRlIFN0cmluZ1tdIGpyZU5hbWVzOwotCXByaXZhdGUgR2VuZXJpY1NlcnZlclJ1bnRpbWUgZlJ1bnRpbWU7Ci0JcHVibGljIEpSRVNlbGVjdERlY29yYXRvcihHZW5lcmljU2VydmVyUnVudGltZSBydW50aW1lKXsKLQkJc3VwZXIoKTsKLQkJZlJ1bnRpbWUgPSBydW50aW1lOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBkZWNvcmF0ZShmaW5hbCBHZW5lcmljU2VydmVyQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQl1cGRhdGVKUkVzKCk7Ci0JCUxpbmsgbGluayA9IG5ldyBMaW5rKGNvbXBvc2l0ZSxTV1QuTk9ORSk7Ci0JCWxpbmsuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsU1dULk5PTkUsdHJ1ZSxmYWxzZSwzLDEpKTsKLQkJbGluay5zZXRUZXh0KEdlbmVyaWNTZXJ2ZXJVSU1lc3NhZ2VzLmluc3RhbGxlZF9qcmVfbGluayk7Ci0JCQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChHZW5lcmljU2VydmVyVUlNZXNzYWdlcy5qcmVfc2VsZWN0X2xhYmVsKTsKLQkJCi0JCWZpbmFsIENvbWJvIGNvbWJvID0gbmV3IENvbWJvKGNvbXBvc2l0ZSwgU1dULkRST1BfRE9XTiB8IFNXVC5SRUFEX09OTFkpOwotCQljb21iby5zZXRJdGVtcyhqcmVOYW1lcyk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsU1dULk5PTkUsZmFsc2UsZmFsc2UsMiwxKTsKLQkJCi0JCWNvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQljb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaW50IHNlbCA9IGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCQkJSVZNSW5zdGFsbCB2bUluc3RhbGwgPSBudWxsOwotCQkJCWlmIChzZWwgPiAwKQotCQkJCQl2bUluc3RhbGwgPSAoSVZNSW5zdGFsbCkgaW5zdGFsbGVkSlJFcy5nZXQoc2VsIC0gMSk7Ci0JCQkKLQkJCQlmUnVudGltZS5zZXRWTUluc3RhbGwodm1JbnN0YWxsKTsKLQkJCQl2YWxpZGF0ZSgpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXdpZGdldFNlbGVjdGVkKGUpOwotCQkJfQotCQl9KTsKLQkJCi0JCWxpbmsuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJU3RyaW5nIGN1cnJlbnRWTSA9IGNvbWJvLmdldFRleHQoKTsKLQkJCQlpZiAoc2hvd1ByZWZlcmVuY2VQYWdlKGNvbXBvc2l0ZSkpIHsKLQkJCQkJdXBkYXRlSlJFcygpOwotCQkJCQljb21iby5zZXRJdGVtcyhqcmVOYW1lcyk7Ci0JCQkJCWNvbWJvLnNldFRleHQoY3VycmVudFZNKTsKLQkJCQkJaWYgKGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkgPT0gLTEpCi0JCQkJCQljb21iby5zZWxlY3QoMCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQlpZiAoZlJ1bnRpbWUhPW51bGwpewotCQkJaWYoZlJ1bnRpbWUuaXNVc2luZ0RlZmF1bHRKUkUoKSl7Ci0JCQkJY29tYm8uc2VsZWN0KDApOwotCQkJfWVsc2V7Ci0JCQkJY29tYm8uc2V0VGV4dChmUnVudGltZS5nZXRWTUluc3RhbGwoKS5nZXROYW1lKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvd1ByZWZlcmVuY2VQYWdlKEdlbmVyaWNTZXJ2ZXJDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCVByZWZlcmVuY2VNYW5hZ2VyIG1hbmFnZXIgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFByZWZlcmVuY2VNYW5hZ2VyKCk7Ci0JCUlQcmVmZXJlbmNlTm9kZSBub2RlID0gbWFuYWdlci5maW5kKCJvcmcuZWNsaXBzZS5qZHQudWkucHJlZmVyZW5jZXMuSmF2YUJhc2VQcmVmZXJlbmNlUGFnZSIpLmZpbmRTdWJOb2RlKCJvcmcuZWNsaXBzZS5qZHQuZGVidWcudWkucHJlZmVyZW5jZXMuVk1QcmVmZXJlbmNlUGFnZSIpOwotCQlQcmVmZXJlbmNlTWFuYWdlciBtYW5hZ2VyMiA9IG5ldyBQcmVmZXJlbmNlTWFuYWdlcigpOwotCQltYW5hZ2VyMi5hZGRUb1Jvb3Qobm9kZSk7Ci0JCWZpbmFsIFByZWZlcmVuY2VEaWFsb2cgZGlhbG9nID0gbmV3IFByZWZlcmVuY2VEaWFsb2coY29tcG9zaXRlLmdldFNoZWxsKCksIG1hbmFnZXIyKTsKLQkJZmluYWwgYm9vbGVhbltdIHJlc3VsdCA9IG5ldyBib29sZWFuW10geyBmYWxzZSB9OwotCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShjb21wb3NpdGUuZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJZGlhbG9nLmNyZWF0ZSgpOwotCQkJCWlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykKLQkJCQkJcmVzdWx0WzBdID0gdHJ1ZTsKLQkJCX0KLQkJfSk7Ci0JCXJldHVybiByZXN1bHRbMF07Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUpSRXMoKSB7Ci0JCWluc3RhbGxlZEpSRXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlWTUluc3RhbGxUeXBlW10gdm1JbnN0YWxsVHlwZXMgPSBKYXZhUnVudGltZS5nZXRWTUluc3RhbGxUeXBlcygpOwotCQlpbnQgc2l6ZSA9IHZtSW5zdGFsbFR5cGVzLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCUlWTUluc3RhbGxbXSB2bUluc3RhbGxzID0gdm1JbnN0YWxsVHlwZXNbaV0uZ2V0Vk1JbnN0YWxscygpOwotCQkJaW50IHNpemUyID0gdm1JbnN0YWxscy5sZW5ndGg7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IHNpemUyOyBqKyspIHsKLQkJCQlpbnN0YWxsZWRKUkVzLmFkZCh2bUluc3RhbGxzW2pdKTsKLQkJCX0KLQkJfQotCQkKLQkJc2l6ZSA9IGluc3RhbGxlZEpSRXMuc2l6ZSgpOwotCQlqcmVOYW1lcyA9IG5ldyBTdHJpbmdbc2l6ZSsxXTsKLQkJanJlTmFtZXNbMF0gPSBHZW5lcmljU2VydmVyVUlNZXNzYWdlcy5kZWZhdWx0SlJFOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJSVZNSW5zdGFsbCB2bUluc3RhbGwgPSAoSVZNSW5zdGFsbCkgaW5zdGFsbGVkSlJFcy5nZXQoaSk7Ci0JCQlqcmVOYW1lc1tpKzFdID0gdm1JbnN0YWxsLmdldE5hbWUoKTsKLQkJfQotCX0KLQkKLQkKLQkKLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvdWkvaW50ZXJuYWwvU1dUVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy91aS9pbnRlcm5hbC9TV1RVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5NjQxMzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy91aS9pbnRlcm5hbC9TV1RVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgRXRlcmF0aW9uIEEuUy4gYW5kIEdvcmtlbSBFcmNhbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBHb3JrZW0gRXJjYW4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAgICAgICAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250TWV0cmljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci0vKioKLSAqIFNXVCBVdGlsaXR5IGNsYXNzLgotICogQ29waWVkIGZyb20gb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC4KLSAqLwotcHVibGljIGNsYXNzIFNXVFV0aWwgewotCXByaXZhdGUgc3RhdGljIEZvbnRNZXRyaWNzIGZvbnRNZXRyaWNzOwotCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGluaXRpYWxpemVEaWFsb2dVbml0cyhDb250cm9sIHRlc3RDb250cm9sKSB7Ci0JCS8vIENvbXB1dGUgYW5kIHN0b3JlIGEgZm9udCBtZXRyaWMKLQkJR0MgZ2MgPSBuZXcgR0ModGVzdENvbnRyb2wpOwotCQlnYy5zZXRGb250KEpGYWNlUmVzb3VyY2VzLmdldERpYWxvZ0ZvbnQoKSk7Ci0JCWZvbnRNZXRyaWNzID0gZ2MuZ2V0Rm9udE1ldHJpY3MoKTsKLQkJZ2MuZGlzcG9zZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSB3aWR0aCBoaW50IGZvciBhIGJ1dHRvbiBjb250cm9sLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgaW50IGdldEJ1dHRvbldpZHRoSGludChCdXR0b24gYnV0dG9uKSB7Ci0JCWludCB3aWR0aEhpbnQgPSBEaWFsb2cuY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoZm9udE1ldHJpY3MsIElEaWFsb2dDb25zdGFudHMuQlVUVE9OX1dJRFRIKTsKLQkJcmV0dXJuIE1hdGgubWF4KHdpZHRoSGludCwgYnV0dG9uLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwgdHJ1ZSkueCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IGJ1dHRvbiB3aXRoIHRoZSBzdGFuZGFyZCBzaXplLgotCSAqIAotCSAqIEBwYXJhbSBjb21wIHRoZSBjb21wb25lbnQgdG8gYWRkIHRoZSBidXR0b24gdG8KLQkgKiBAcGFyYW0gbGFiZWwgdGhlIGJ1dHRvbiBsYWJlbAotCSAqIEByZXR1cm4gYSBidXR0b24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEJ1dHRvbiBjcmVhdGVCdXR0b24oQ29tcG9zaXRlIGNvbXAsIFN0cmluZyBsYWJlbCkgewotCQlCdXR0b24gYiA9IG5ldyBCdXR0b24oY29tcCwgU1dULlBVU0gpOwotCQliLnNldFRleHQobGFiZWwpOwotCQlpZiAoZm9udE1ldHJpY3MgPT0gbnVsbCkKLQkJCWluaXRpYWxpemVEaWFsb2dVbml0cyhjb21wKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpOwotCQlkYXRhLndpZHRoSGludCA9IGdldEJ1dHRvbldpZHRoSGludChiKTsKLQkJYi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlyZXR1cm4gYjsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVydCBETFVzIHRvIHBpeGVscy4KLQkgKiAKLQkgKiBAcGFyYW0gY29tcCBhIGNvbXBvbmVudAotCSAqIEBwYXJhbSB4IHBpeGVscwotCSAqIEByZXR1cm4gZGx1cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKENvbXBvc2l0ZSBjb21wLCBpbnQgeCkgewotCQlpZiAoZm9udE1ldHJpY3MgPT0gbnVsbCkKLQkJCWluaXRpYWxpemVEaWFsb2dVbml0cyhjb21wKTsKLQkJcmV0dXJuIERpYWxvZy5jb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhmb250TWV0cmljcywgeCk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCBETFVzIHRvIHBpeGVscy4KLQkgKiAKLQkgKiBAcGFyYW0gY29tcCBhIGNvbXBvbmVudAotCSAqIEBwYXJhbSB5IHBpeGVscwotCSAqIEByZXR1cm4gZGx1cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscyhDb21wb3NpdGUgY29tcCwgaW50IHkpIHsKLQkJaWYgKGZvbnRNZXRyaWNzID09IG51bGwpCi0JCQlpbml0aWFsaXplRGlhbG9nVW5pdHMoY29tcCk7Ci0JCXJldHVybiBEaWFsb2cuY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKGZvbnRNZXRyaWNzLCB5KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy91aS9pbnRlcm5hbC9TZXJ2ZXJEZWZpbml0aW9uVHlwZUF3YXJlV2l6YXJkRnJhZ21lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvdWkvaW50ZXJuYWwvU2VydmVyRGVmaW5pdGlvblR5cGVBd2FyZVdpemFyZEZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhOTEwZDEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy91aS9pbnRlcm5hbC9TZXJ2ZXJEZWZpbml0aW9uVHlwZUF3YXJlV2l6YXJkRnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBFdGVyYXRpb24gQS5TLiBhbmQgR29ya2VtIEVyY2FuLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IEdvcmtlbSBFcmNhbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgICAgICAgICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsLkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkud2l6YXJkLklXaXphcmRIYW5kbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuV2l6YXJkRnJhZ21lbnQ7Ci0KLS8qKgotICogQSB3aXphcmQgZnJhZ21lbnQgdGhhdCBwcm92aWRlcyBzdXBwb3J0IGZvciBzZXJ2ZXJkZWYgZmlsZXMuCi0gKgotICogQGF1dGhvciBHb3JrZW0gRXJjYW4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFNlcnZlckRlZmluaXRpb25UeXBlQXdhcmVXaXphcmRGcmFnbWVudCBleHRlbmRzIFdpemFyZEZyYWdtZW50IHsKLQotICAgIHByaXZhdGUgSVdpemFyZEhhbmRsZSBmV2l6YXJkOwotCQotICAgIHB1YmxpYyBib29sZWFuIGhhc0NvbXBvc2l0ZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgSVdpemFyZEhhbmRsZSBoYW5kbGUpIHsKLQkgICAgCi0JICAgIHRoaXMuZldpemFyZCA9IGhhbmRsZTsKLQkgICAgQ29tcG9zaXRlIGNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgZ3JpZCA9IG5ldyBHcmlkTGF5b3V0KDEsZmFsc2UpOwotCQlncmlkLm1hcmdpbldpZHRoPTA7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXQoZ3JpZCk7Ci0JICAgIGNvbnRhaW5lci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJaGFuZGxlLnNldEltYWdlRGVzY3JpcHRvcihHZW5lcmljVWlQbHVnaW4uZ2V0RGVmYXVsdCgpLmltYWdlRGVzY3JpcHRvcihHZW5lcmljVWlQbHVnaW4uV0laQkFOX0lNQUdFKSk7Ci0JCWhhbmRsZS5zZXRUaXRsZSh0aXRsZSgpKTsKLQkJaGFuZGxlLnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uKCkpOwotCQljcmVhdGVDb250ZW50KGNvbnRhaW5lcixoYW5kbGUpOwotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLQlwdWJsaWMgSVdpemFyZEhhbmRsZSBnZXRXaXphcmQoKXsKLQkgICAgcmV0dXJuIGZXaXphcmQ7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRlc2NyaXB0aW9uIHRvIGJlIGRpc3BsYXllZCBvbiB0aGUgd2l6YXJkIGhlYWQuCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZGVzY3JpcHRpb24oKTsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0aXRsZSBvZiB0aGUgd2l6YXJkLgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIHRpdGxlKCk7Ci0JLyoqCi0JICogQ3JlYXRlIHRoZSByZWFsIGNvbnRlbnQKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHBhcmFtIGhhbmRsZQotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIGNyZWF0ZUNvbnRlbnQoQ29tcG9zaXRlIHBhcmVudCwgSVdpemFyZEhhbmRsZSBoYW5kbGUpOwotCi0JLyoqCi0JICogUmV0dW5zIHRoZSBTZXJ2ZXJSdW50aW1lLgotCSAqIEBwYXJhbSBkZWZpbml0aW9uSUQKLQkgKiBAcGFyYW0gcHJvcGVydGllcwotCSAqIEByZXR1cm4KLQkgKi8JCi0JcHJvdGVjdGVkIFNlcnZlclJ1bnRpbWUgZ2V0U2VydmVyVHlwZURlZmluaXRpb24oU3RyaW5nIGRlZmluaXRpb25JRCwgTWFwIHByb3BlcnRpZXMpCi0JewotCSAgICByZXR1cm4gQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U2VydmVyVHlwZURlZmluaXRpb25NYW5hZ2VyKCkuZ2V0U2VydmVyUnVudGltZURlZmluaXRpb24oZGVmaW5pdGlvbklELHByb3BlcnRpZXMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvdWkvaW50ZXJuYWwvU2VydmVyVHlwZURlZmluaXRpb25EZWNvcmF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvdWkvaW50ZXJuYWwvU2VydmVyVHlwZURlZmluaXRpb25EZWNvcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDI4NjVjZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3VpL2ludGVybmFsL1NlcnZlclR5cGVEZWZpbml0aW9uRGVjb3JhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklNZXNzYWdlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpcmVjdG9yeURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5GaWxlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpLmludGVybmFsLlNXVFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuSVdpemFyZEhhbmRsZTsKLS8qKgotICogUHJvdmlkZXMgdGhlIFVJIG9iamVjdHMgZm9yIGdhdGhlcmluZyB1c2VyIGluZm9ybWF0aW9uCi0gKiBmb3Igc2VydmVyIHByb3BlcnRpZXMuCi0gKiAKLSAqIEBhdXRob3IgR29ya2VtIEVyY2FuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTZXJ2ZXJUeXBlRGVmaW5pdGlvbkRlY29yYXRvciBpbXBsZW1lbnRzIEdlbmVyaWNTZXJ2ZXJDb21wb3NpdGVEZWNvcmF0b3IgewotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVYVF9SVU5USU1FID0gUHJvcGVydHkuQ09OVEVYVF9SVU5USU1FOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFWFRfU0VSVkVSID0gUHJvcGVydHkuQ09OVEVYVF9TRVJWRVI7Ci0JcHJpdmF0ZSBTZXJ2ZXJSdW50aW1lIGZEZWZpbml0aW9uOwotICAgIHByaXZhdGUgTWFwIGZQcm9wZXJ0aWVzOwotCXByaXZhdGUgU3RyaW5nIGZDb250ZXh0OwotCXByaXZhdGUgU3RyaW5nIGZMYXN0TWVzc2FnZSA9IG51bGw7Ci0JcHJvdGVjdGVkIElXaXphcmRIYW5kbGUgZldpemFyZDsKLQlwcml2YXRlIExpc3QgZlByb3BlcnR5Q29udHJvbHM9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByaXZhdGUgZmluYWwgY2xhc3MgUGF0aE1vZGlmeUxpc3RlbmVyIGltcGxlbWVudHMgTW9kaWZ5TGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCVN0cmluZyBwYXRoID0gKChUZXh0KSBlLndpZGdldCkuZ2V0VGV4dCgpOwotCQkJaWYoIXBhdGhFeGlzdChwYXRoKSl7Ci0JCQkJZkxhc3RNZXNzYWdlID0gR2VuZXJpY1NlcnZlclVJTWVzc2FnZXMuYmluZChHZW5lcmljU2VydmVyVUlNZXNzYWdlcy5pbnZhbGlkUGF0aCxwYXRoKTsKLQkJCQlmV2l6YXJkLnNldE1lc3NhZ2UoZkxhc3RNZXNzYWdlLElNZXNzYWdlUHJvdmlkZXIuRVJST1IpOwotCQkJfWVsc2V7Ci0JCQkJaWYoZkxhc3RNZXNzYWdlIT1udWxsICYmIGZMYXN0TWVzc2FnZS5lcXVhbHMoZldpemFyZC5nZXRNZXNzYWdlKCkpKXsKLQkJCQkJZkxhc3RNZXNzYWdlPW51bGw7Ci0JCQkJCWZXaXphcmQuc2V0TWVzc2FnZShudWxsLElNZXNzYWdlUHJvdmlkZXIuTk9ORSk7Ci0JCQkJfQotCQkJCXZhbGlkYXRlKCk7Ci0JCQl9Ci0JCX0KLQkJcHJpdmF0ZSBib29sZWFuIHBhdGhFeGlzdChTdHJpbmcgcGF0aCl7Ci0JCQlGaWxlIGYgPSBuZXcgRmlsZShwYXRoKTsKLQkJCXJldHVybiBmLmV4aXN0cygpOwotCQl9Ci0JfQotCi0JCi0JcHVibGljIFNlcnZlclR5cGVEZWZpbml0aW9uRGVjb3JhdG9yKFNlcnZlclJ1bnRpbWUgZGVmaW5pdGlvbiwgTWFwIGluaXRpYWxQcm9wZXJ0aWVzLCBTdHJpbmcgY29udGV4dCwgSVdpemFyZEhhbmRsZSBoYW5kbGUpIHsKLQkJc3VwZXIoKTsKLQkJZkRlZmluaXRpb24gPSBkZWZpbml0aW9uOwotCQlmUHJvcGVydGllcyA9IGluaXRpYWxQcm9wZXJ0aWVzOwotCQlmQ29udGV4dCA9IGNvbnRleHQ7Ci0JCWZXaXphcmQgPSBoYW5kbGU7Ci0JfQotCi0JcHVibGljIHZvaWQgZGVjb3JhdGUoR2VuZXJpY1NlcnZlckNvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQotCQlMaXN0IHByb3BlcnRpZXMgPW51bGw7IAotCQlpZihmRGVmaW5pdGlvbj09bnVsbCl7Ci0JCQlwcm9wZXJ0aWVzPSBuZXcgQXJyYXlMaXN0KDApOwotCQl9Ci0JCWVsc2V7Ci0JCQlwcm9wZXJ0aWVzPSBmRGVmaW5pdGlvbi5nZXRQcm9wZXJ0eSgpOwotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvcGVydGllcy5zaXplKCk7IGkrKykgewotCQkJUHJvcGVydHkgcHJvcGVydHkgPSAoUHJvcGVydHkpIHByb3BlcnRpZXMuZ2V0KGkpOwotCQkJaWYgKHRoaXMuZkNvbnRleHQuZXF1YWxzKHByb3BlcnR5LmdldENvbnRleHQoKSkpCi0JCQkJY3JlYXRlUHJvcGVydHlDb250cm9sKGNvbXBvc2l0ZSwgcHJvcGVydHkpOwotCQl9Ci0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQoY29tcG9zaXRlKTsKLQl9Ci0KLQkKLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlUHJvcGVydHlDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQsIFByb3BlcnR5IHByb3BlcnR5KXsKLSAgICAJaWYoIFByb3BlcnR5LlRZUEVfRElSRUNUT1JZLmVxdWFscyhwcm9wZXJ0eS5nZXRUeXBlKCkpKSB7Ci0gICAgCQlUZXh0IHBhdGggPSBjcmVhdGVMYWJlbGVkUGF0aChwcm9wZXJ0eS5nZXRMYWJlbCgpLGdldFByb3BlcnR5VmFsdWUocHJvcGVydHkpLHBhcmVudCk7Ci0gICAgCQlwYXRoLnNldERhdGEocHJvcGVydHkpOwotICAgIAkJcmVnaXN0ZXJDb250cm9sKHBhdGgpOwotICAgICAJfSBlbHNlIGlmKCBQcm9wZXJ0eS5UWVBFX0ZJTEUuZXF1YWxzKHByb3BlcnR5LmdldFR5cGUoKSkpIHsKLSAgICAJICAgIFRleHQgZmlsZSA9IGNyZWF0ZUxhYmVsZWRGaWxlKHByb3BlcnR5LmdldExhYmVsKCksZ2V0UHJvcGVydHlWYWx1ZShwcm9wZXJ0eSkscGFyZW50KTsKLSAgICAJCWZpbGUuc2V0RGF0YShwcm9wZXJ0eSk7Ci0gICAgCQlyZWdpc3RlckNvbnRyb2woZmlsZSk7Ci0gICAgICAgCX0gZWxzZSBpZiggUHJvcGVydHkuVFlQRV9URVhULmVxdWFscyhwcm9wZXJ0eS5nZXRUeXBlKCkpKSB7Ci0gICAgCSAgICBUZXh0IHN0ciA9IGNyZWF0ZUxhYmVsZWRUZXh0KHByb3BlcnR5LmdldExhYmVsKCksZ2V0UHJvcGVydHlWYWx1ZShwcm9wZXJ0eSkscGFyZW50KTsKLSAgICAJCXN0ci5zZXREYXRhKHByb3BlcnR5KTsKLSAgICAJCXJlZ2lzdGVyQ29udHJvbChzdHIpOwotICAgICAgIAl9IGVsc2UgaWYoIFByb3BlcnR5LlRZUEVfQk9PTEVBTi5lcXVhbHMocHJvcGVydHkuZ2V0VHlwZSgpKSkgewotICAgIAkgICAgQnV0dG9uIGJvb2wgPWNyZWF0ZUxhYmVsZWRDaGVjayhwcm9wZXJ0eS5nZXRMYWJlbCgpLCgidHJ1ZSIuZXF1YWxzKCBnZXRQcm9wZXJ0eVZhbHVlKHByb3BlcnR5KSkpLAlwYXJlbnQpOwotICAgIAkJYm9vbC5zZXREYXRhKHByb3BlcnR5KTsKLSAgICAJCXJlZ2lzdGVyQ29udHJvbChib29sKTsKLSAgICAgICAJfWVsc2UgaWYoUHJvcGVydHkuVFlQRV9TRUxFQ1QuZXF1YWxzKHByb3BlcnR5LmdldFR5cGUoKSkpIHsKLSAgICAgICAJCUNvbWJvIGNvbWJvID0gY3JlYXRlTGFiZWxlZENvbWJvKHBhcmVudCwgcHJvcGVydHkpOwotICAgICAgIAkJY29tYm8uc2V0RGF0YShwcm9wZXJ0eSk7Ci0gICAgICAgCQlyZWdpc3RlckNvbnRyb2woY29tYm8pOwotICAgICAgIAl9Ci0gICAgICAgCWVsc2UgIHsKLSAgICAJICAgIFRleHQgZGVmYXVsdFRleHQ9IGNyZWF0ZUxhYmVsZWRUZXh0KHByb3BlcnR5LmdldExhYmVsKCksZ2V0UHJvcGVydHlWYWx1ZShwcm9wZXJ0eSkscGFyZW50KTsKLSAgICAJCWRlZmF1bHRUZXh0LnNldERhdGEocHJvcGVydHkpOwotICAgIAkJcmVnaXN0ZXJDb250cm9sKGRlZmF1bHRUZXh0KTsKLSAgICAJfQotICAgIH0KLQotCXByaXZhdGUgQ29tYm8gY3JlYXRlTGFiZWxlZENvbWJvKENvbXBvc2l0ZSBkZWZQYW5lbCwgUHJvcGVydHkgcHJvcGVydHkpIHsKLQkJCi0JICAgCUdyaWREYXRhIGdyaWREYXRhOwotICAgIAlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChkZWZQYW5lbCwgU1dULldSQVApOwotICAgIAlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIAlsYWJlbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICAJbGFiZWwuc2V0VGV4dChwcm9wZXJ0eS5nZXRMYWJlbCgpKTsKLQotCQlDb21ibyBjb21ibyA9IG5ldyBDb21ibyhkZWZQYW5lbCxTV1QuUkVBRF9PTkxZKTsKLSAgICAJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMCi0gICAgCQkJfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpOwotICAgIAlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgCWNvbWJvLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgIAkKLQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIocHJvcGVydHkuZ2V0RGVmYXVsdCgpLCIsIik7Ci0JCXdoaWxlKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpewotCQkJY29tYm8uYWRkKHRva2VuaXplci5uZXh0VG9rZW4oKSk7Ci0JCX0KLQkJaWYoY29tYm8uZ2V0SXRlbUNvdW50KCk+MCkKLQkJCWNvbWJvLnNlbGVjdCgwKTsKLQkJcmV0dXJuIGNvbWJvOwotCX0KLSAgICBwcml2YXRlIHZvaWQgcmVnaXN0ZXJDb250cm9sKENvbnRyb2wgY29udHJvbCkKLSAgICB7Ci0gICAgCWZQcm9wZXJ0eUNvbnRyb2xzLmFkZChjb250cm9sKTsKLSAgICB9Ci0gICAgcHJpdmF0ZSBCdXR0b24gY3JlYXRlTGFiZWxlZENoZWNrKFN0cmluZyB0aXRsZSwgYm9vbGVhbiB2YWx1ZSwgQ29tcG9zaXRlIGRlZlBhbmVsKSB7Ci0gICAgCUdyaWREYXRhIGdyaWREYXRhOwotICAgIAlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChkZWZQYW5lbCwgU1dULldSQVApOwotICAgIAlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIAlsYWJlbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICAJbGFiZWwuc2V0VGV4dCh0aXRsZSk7Ci0KLSAgICAJQnV0dG9uIGZCdXR0b24gPSBuZXcgQnV0dG9uKGRlZlBhbmVsLCBTV1QuQ0hFQ0spOwotICAgIAkKLSAgICAJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMCi0gICAgCQkJfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpOwotICAgIAlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgCWZCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgCWZCdXR0b24uc2V0U2VsZWN0aW9uKHZhbHVlKTsKLSAgICAJZkJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgIAotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgCQotICAgIAlyZXR1cm4gZkJ1dHRvbjsKLSAgICB9Ci0gICAgcHJpdmF0ZSBUZXh0IGNyZWF0ZUxhYmVsZWRGaWxlKFN0cmluZyB0aXRsZSwgU3RyaW5nIHZhbHVlLGZpbmFsIENvbXBvc2l0ZSBkZWZQYW5lbCkgewotICAgIAlHcmlkRGF0YSBncmlkRGF0YTsKLSAgICAJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoZGVmUGFuZWwsIFNXVC5XUkFQKTsKLSAgICAJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICAJbGFiZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgCWxhYmVsLnNldFRleHQodGl0bGUpOwotICAgIAotICAgIAlmaW5hbCBUZXh0IHRleHQgPSBuZXcgVGV4dChkZWZQYW5lbCwgU1dULlNIQURPV19JTiB8IFNXVC5CT1JERVIpOwotICAgIAlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwKLSAgICAJCQl8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCk7Ci0gICAgCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMTsKLSAgICAJdGV4dC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICAJdGV4dC5zZXRUZXh0KHZhbHVlKTsKLSAgICAJdGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgUGF0aE1vZGlmeUxpc3RlbmVyKCkpOwotICAgIAlCdXR0b24gZkJ1dHRvbiA9IFNXVFV0aWwuY3JlYXRlQnV0dG9uKGRlZlBhbmVsLEdlbmVyaWNTZXJ2ZXJVSU1lc3NhZ2VzLnNlcnZlclR5cGVHcm91cF9sYWJlbF9icm93c2UpOwotICAgIAkKLSAgICAJZkJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0gICAgCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgCQkJRmlsZURpYWxvZyBkbGcgPSBuZXcgRmlsZURpYWxvZyhkZWZQYW5lbC5nZXRTaGVsbCgpKTsKLSAgICAJCQlkbGcuc2V0RmlsZU5hbWUodGV4dC5nZXRUZXh0KCkucmVwbGFjZSgnXFwnLCcvJykpOwotICAgIAkJCVN0cmluZyByZXMgPSBkbGcub3BlbigpOwotICAgIAkJCWlmIChyZXMgIT0gbnVsbCkgewotICAgIAkJCQl0ZXh0LnNldFRleHQocmVzLnJlcGxhY2UoJ1xcJywnLycpKTsKLQotICAgIAkJCX0KLSAgICAJCX0KLSAgICAKLSAgICAJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgCQkJd2lkZ2V0U2VsZWN0ZWQoZSk7Ci0gICAgCQl9Ci0gICAgCi0gICAgCX0pOwotICAgIAotICAgIAlyZXR1cm4gdGV4dDsKLSAgICB9Ci0JCi0gICAgcHJpdmF0ZSBUZXh0IGNyZWF0ZUxhYmVsZWRQYXRoKFN0cmluZyB0aXRsZSwgU3RyaW5nIHZhbHVlLAotICAgIAkJZmluYWwgQ29tcG9zaXRlIHBhcmVudCkgewotICAgIAlHcmlkRGF0YSBncmlkRGF0YTsKLSAgICAJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuV1JBUCk7Ci0gICAgCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgCWxhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgIAlsYWJlbC5zZXRUZXh0KHRpdGxlKTsKLSAgICAKLSAgICAJZmluYWwgVGV4dCB0ZXh0ID0gbmV3IFRleHQocGFyZW50LCBTV1QuU0hBRE9XX0lOIHwgU1dULkJPUkRFUik7Ci0gICAgCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0gICAgCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMTsKLSAgICAJdGV4dC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICAJdGV4dC5zZXRUZXh0KHZhbHVlKTsKLSAgICAJdGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgUGF0aE1vZGlmeUxpc3RlbmVyKCkpOwotICAgIAlCdXR0b24gZkJ1dHRvbiA9IFNXVFV0aWwuY3JlYXRlQnV0dG9uKHBhcmVudCxHZW5lcmljU2VydmVyVUlNZXNzYWdlcy5zZXJ2ZXJUeXBlR3JvdXBfbGFiZWxfYnJvd3NlKTsKLSAgICAJZkJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0gICAgCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgCQkJRGlyZWN0b3J5RGlhbG9nIGRsZyA9IG5ldyBEaXJlY3RvcnlEaWFsb2cocGFyZW50LmdldFNoZWxsKCkpOwotICAgIAkJCWRsZy5zZXRGaWx0ZXJQYXRoKHRleHQuZ2V0VGV4dCgpLnJlcGxhY2UoJ1xcJywnLycpKTsKLSAgICAJCQlTdHJpbmcgcmVzID0gZGxnLm9wZW4oKTsKLSAgICAJCQlpZiAocmVzICE9IG51bGwpIHsKLSAgICAJCQkJdGV4dC5zZXRUZXh0KHJlcy5yZXBsYWNlKCdcXCcsJy8nKSk7Ci0KLSAgICAJCQl9Ci0gICAgCQl9Ci0gICAgCi0gICAgCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgIAkJCXdpZGdldFNlbGVjdGVkKGUpOwotICAgIAkJfQotICAgIAotICAgIAl9KTsKLSAgICAJcmV0dXJuIHRleHQ7Ci0gICAgfQotICAgIHByaXZhdGUgVGV4dCBjcmVhdGVMYWJlbGVkVGV4dChTdHJpbmcgdGl0bGUsIFN0cmluZyB2YWx1ZSwKLSAgICAJCUNvbXBvc2l0ZSBkZWZQYW5lbCkgewotICAgIAlHcmlkRGF0YSBncmlkRGF0YTsKLSAgICAJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoZGVmUGFuZWwsIFNXVC5XUkFQKTsKLSAgICAJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICAJbGFiZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgCWxhYmVsLnNldFRleHQodGl0bGUpOwotICAgIAotICAgIAlUZXh0IHRleHQgPSBuZXcgVGV4dChkZWZQYW5lbCwgU1dULlNIQURPV19JTiB8IFNXVC5CT1JERVIpOwotICAgIAlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwKLSAgICAJCQl8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCk7Ci0gICAgCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLSAgICAJdGV4dC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICAJdGV4dC5zZXRUZXh0KHZhbHVlKTsKLQotICAgIAlyZXR1cm4gdGV4dDsKLSAgICB9Ci0JcHJpdmF0ZSBTdHJpbmcgZ2V0UHJvcGVydHlWYWx1ZShQcm9wZXJ0eSBwcm9wZXJ0eSkKLQl7Ci0JCVN0cmluZyB2YWx1ZSA9IHByb3BlcnR5LmdldERlZmF1bHQoKTsKLQkJaWYoZlByb3BlcnRpZXMhPW51bGwgJiYgZlByb3BlcnRpZXMuaXNFbXB0eSgpPT1mYWxzZSkKLQkJCXZhbHVlPShTdHJpbmcpZlByb3BlcnRpZXMuZ2V0KHByb3BlcnR5LmdldElkKCkpOyAKLQkJcmV0dXJuIHZhbHVlOwotCX0JCi0KLQotCQotICAgLyoqCi0gICAgKiBSZXR1cm5zIHRoZSBwcm9wZXJ0eSBuYW1lL3ZhbHVlIHBhaXJzLgotICAgICogQHJldHVybgotICAgICovCi0JcHVibGljIE1hcCBnZXRWYWx1ZXMoKXsKLQkJTWFwIHByb3BlcnR5TWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICAJZm9yKGludCBpPTA7IGk8ZlByb3BlcnR5Q29udHJvbHMuc2l6ZSgpO2krKyl7Ci0gICAgCQlQcm9wZXJ0eSBwcm9wID0gKFByb3BlcnR5KSgoQ29udHJvbClmUHJvcGVydHlDb250cm9scy5nZXQoaSkpLmdldERhdGEoKTsKLSAgICAJCWlmKGZQcm9wZXJ0eUNvbnRyb2xzLmdldChpKWluc3RhbmNlb2YgQnV0dG9uKXsKLSAgICAJCQlCdXR0b24gYnV0dG9uID0gKEJ1dHRvbilmUHJvcGVydHlDb250cm9scy5nZXQoaSk7Ci0gICAgCQkJcHJvcGVydHlNYXAucHV0KHByb3AuZ2V0SWQoKSxCb29sZWFuLnRvU3RyaW5nKGJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkpOwotICAgIAkJfQotICAgIAkJZWxzZSBpZihmUHJvcGVydHlDb250cm9scy5nZXQoaSkgaW5zdGFuY2VvZiBDb21ibyl7Ci0gICAgCQkJQ29tYm8gY29tYm8gPSAoQ29tYm8pZlByb3BlcnR5Q29udHJvbHMuZ2V0KGkpOwotICAgICAJCQlpbnQgaW5kZXggPSBjb21iby5nZXRTZWxlY3Rpb25JbmRleCgpOwotICAgIAkJCXByb3BlcnR5TWFwLnB1dChwcm9wLmdldElkKCksY29tYm8uZ2V0SXRlbShpbmRleCkpOwotICAgIAkJfWVsc2V7Ci0gICAgCQkJVGV4dCB0ZXh0ID0gKFRleHQpZlByb3BlcnR5Q29udHJvbHMuZ2V0KGkpOwotICAgIAkJCXByb3BlcnR5TWFwLnB1dChwcm9wLmdldElkKCksdGV4dC5nZXRUZXh0KCkpOwotICAgIAkJfQotICAgIAl9Ci0gICAgCXJldHVybiBwcm9wZXJ0eU1hcDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3VpL2ludGVybmFsL1NlcnZlclR5cGVEZWZpbml0aW9uUnVudGltZURlY29yYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy91aS9pbnRlcm5hbC9TZXJ2ZXJUeXBlRGVmaW5pdGlvblJ1bnRpbWVEZWNvcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBjZWRjYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3VpL2ludGVybmFsL1NlcnZlclR5cGVEZWZpbml0aW9uUnVudGltZURlY29yYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JTWVzc2FnZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsLkdlbmVyaWNTZXJ2ZXJSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLndpemFyZC5JV2l6YXJkSGFuZGxlOwotCi1wdWJsaWMgY2xhc3MgU2VydmVyVHlwZURlZmluaXRpb25SdW50aW1lRGVjb3JhdG9yIGV4dGVuZHMgU2VydmVyVHlwZURlZmluaXRpb25EZWNvcmF0b3IgewotCi0JcHJpdmF0ZSBHZW5lcmljU2VydmVyUnVudGltZSBmUnVudGltZTsKLQlwdWJsaWMgU2VydmVyVHlwZURlZmluaXRpb25SdW50aW1lRGVjb3JhdG9yKFNlcnZlclJ1bnRpbWUgZGVmaW5pdGlvbiwgTWFwIGluaXRpYWxQcm9wZXJ0aWVzLCBJV2l6YXJkSGFuZGxlIHdpemFyZCwgR2VuZXJpY1NlcnZlclJ1bnRpbWUgcnVudGltZSkgewotCQlzdXBlcihkZWZpbml0aW9uLCBpbml0aWFsUHJvcGVydGllcyxDT05URVhUX1JVTlRJTUUsd2l6YXJkKTsKLQkJZlJ1bnRpbWU9cnVudGltZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZSgpewotCi0JCWlmKGZSdW50aW1lPT1udWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlmUnVudGltZS5zZXRTZXJ2ZXJEZWZpbml0aW9uSWQoZlJ1bnRpbWUuZ2V0UnVudGltZSgpLmdldFJ1bnRpbWVUeXBlKCkuZ2V0SWQoKSk7Ci0gICAgICAgIGZSdW50aW1lLnNldFNlcnZlckluc3RhbmNlUHJvcGVydGllcyhnZXRWYWx1ZXMoKSk7Ci0gICAgICAgCi0JCUlTdGF0dXMgc3RhdHVzID0gZlJ1bnRpbWUudmFsaWRhdGUoKTsKLQkJCi0JCWlmIChzdGF0dXMgPT0gbnVsbCB8fCBzdGF0dXMuaXNPSygpKXsKLQotCQkJZldpemFyZC5zZXRNZXNzYWdlKG51bGwsIElNZXNzYWdlUHJvdmlkZXIuTk9ORSk7Ci0JCQlmV2l6YXJkLnVwZGF0ZSgpOwotCSAgICAgICAgU3RyaW5nIHdEaXIgPSBmUnVudGltZS5nZXRTZXJ2ZXJUeXBlRGVmaW5pdGlvbigpLmdldFJlc29sdmVyKCkucmVzb2x2ZVByb3BlcnRpZXMoZlJ1bnRpbWUuZ2V0U2VydmVyVHlwZURlZmluaXRpb24oKS5nZXRTdGFydCgpLmdldFdvcmtpbmdEaXJlY3RvcnkoKSk7IAotCSAgICAgICAgZlJ1bnRpbWUuZ2V0UnVudGltZVdvcmtpbmdDb3B5KCkuc2V0TG9jYXRpb24obmV3IFBhdGgod0RpcikpOwotCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX1lbHNlCi0JCXsKLQkJCWZXaXphcmQuc2V0TWVzc2FnZShzdGF0dXMuZ2V0TWVzc2FnZSgpLCBJTWVzc2FnZVByb3ZpZGVyLkVSUk9SKTsKLQkJCWZXaXphcmQudXBkYXRlKCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSAKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3VpL2ludGVybmFsL1NlcnZlclR5cGVEZWZpbml0aW9uU2VydmVyRGVjb3JhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3VpL2ludGVybmFsL1NlcnZlclR5cGVEZWZpbml0aW9uU2VydmVyRGVjb3JhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyN2MyNTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy91aS9pbnRlcm5hbC9TZXJ2ZXJUeXBlRGVmaW5pdGlvblNlcnZlckRlY29yYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JTWVzc2FnZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsLkdlbmVyaWNTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkud2l6YXJkLklXaXphcmRIYW5kbGU7Ci0vKioKLSAqIFNlcnZlciBwcm9wZXJ0aWVzIGRlY29yYXRvci4KLSAqIEBhdXRob3IgR29ya2VtIEVyY2FuCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJUeXBlRGVmaW5pdGlvblNlcnZlckRlY29yYXRvciBleHRlbmRzCi0JCVNlcnZlclR5cGVEZWZpbml0aW9uRGVjb3JhdG9yIHsKLQkKLQlwcml2YXRlIEdlbmVyaWNTZXJ2ZXIgZlNlcnZlcjsKLQlwdWJsaWMgU2VydmVyVHlwZURlZmluaXRpb25TZXJ2ZXJEZWNvcmF0b3IoU2VydmVyUnVudGltZSBkZWZpbml0aW9uLCBNYXAgaW5pdGlhbFByb3BlcnRpZXMsSVdpemFyZEhhbmRsZSB3aXphcmQsR2VuZXJpY1NlcnZlciBzZXJ2ZXIpIHsKLQkJc3VwZXIoZGVmaW5pdGlvbiwgaW5pdGlhbFByb3BlcnRpZXMsQ09OVEVYVF9TRVJWRVIsIHdpemFyZCk7Ci0JCWZTZXJ2ZXI9c2VydmVyOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlKCkgewotCQlpZihmU2VydmVyIT1udWxsKQotCQkJZlNlcnZlci5zZXRTZXJ2ZXJJbnN0YW5jZVByb3BlcnRpZXMoZ2V0VmFsdWVzKCkpOwotCQlJU3RhdHVzIHN0YXR1cyA9IGZTZXJ2ZXIudmFsaWRhdGUoKTsKLQkJaWYoc3RhdHVzPT1udWxsIHx8IHN0YXR1cy5pc09LKCkpCi0JCXsKLQkJCWZXaXphcmQuc2V0TWVzc2FnZShudWxsLCBJTWVzc2FnZVByb3ZpZGVyLk5PTkUpOwotCQkJZldpemFyZC51cGRhdGUoKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCWZXaXphcmQuc2V0TWVzc2FnZShzdGF0dXMuZ2V0TWVzc2FnZSgpLCBJTWVzc2FnZVByb3ZpZGVyLkVSUk9SKTsKLQkJCWZXaXphcmQudXBkYXRlKCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucGRlLy5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucGRlLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MWM4ZjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnBkZS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnBkZS8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnBkZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGIwYTJkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wZGUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotYmluCi0uc2V0dGluZ3MKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wZGUvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucGRlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTc4OGNjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wZGUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnBkZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucGRlL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnBkZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY5NDVmOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucGRlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJUdlbmVyaWMgc2VydmVyIFBERSBUZW1wbGF0ZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnBkZTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5wZGUuU2VydmVyUGRlUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS51aSwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UucGRlLnVpLAotIG9yZy5lY2xpcHNlLnBkZS5jb3JlCi1FY2xpcHNlLUF1dG9TdGFydDogdHJ1ZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnBkZS9hYm91dC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnBkZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjZiOTZjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wZGUvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5GZWJydWFyeSAyNCwgMjAwNTwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnBkZS9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnBkZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzkzMTgzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wZGUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSBFdGVyYXRpb24gQS5TLiBhbmQgR29ya2VtIEVyY2FuLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotIyBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOiBHb3JrZW0gRXJjYW4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgICAgICAgICAgICAgICAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgdGVtcGxhdGVzXzMuMC8sXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKLXNyYy5pbmNsdWRlcyA9IHNyYy8KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wZGUvYnVpbGQueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnBkZS9idWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxN2YxMDEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnBkZS9idWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0IG5hbWU9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5wZGUiIGRlZmF1bHQ9ImJ1aWxkLmphcnMiIGJhc2VkaXI9Ii4iPgotCi0JPHByb3BlcnR5IG5hbWU9ImJhc2V3cyIgdmFsdWU9IiR7d3N9Ii8+Ci0JPHByb3BlcnR5IG5hbWU9ImJhc2VvcyIgdmFsdWU9IiR7b3N9Ii8+Ci0JPHByb3BlcnR5IG5hbWU9ImJhc2VhcmNoIiB2YWx1ZT0iJHthcmNofSIvPgotCTxwcm9wZXJ0eSBuYW1lPSJiYXNlbmwiIHZhbHVlPSIke25sfSIvPgotCi0JPCEtLSBDb21waWxlciBzZXR0aW5ncy4gLS0+Ci0JPHByb3BlcnR5IG5hbWU9ImphdmFjRmFpbE9uRXJyb3IiIHZhbHVlPSJmYWxzZSIvPgotCTxwcm9wZXJ0eSBuYW1lPSJqYXZhY0RlYnVnSW5mbyIgdmFsdWU9Im9uIi8+Ci0JPHByb3BlcnR5IG5hbWU9ImphdmFjVmVyYm9zZSIgdmFsdWU9InRydWUiLz4KLQk8cHJvcGVydHkgbmFtZT0iamF2YWNTb3VyY2UiIHZhbHVlPSIxLjMiLz4KLQk8cHJvcGVydHkgbmFtZT0iamF2YWNUYXJnZXQiIHZhbHVlPSIxLjIiLz4KLQk8cHJvcGVydHkgbmFtZT0iY29tcGlsZXJBcmciIHZhbHVlPSIiLz4KLQk8cGF0aCBpZD0icGF0aF9ib290Y2xhc3NwYXRoIj4KLQkJPGZpbGVzZXQgZGlyPSIke2phdmEuaG9tZX0vbGliIj4KLQkJCTxpbmNsdWRlIG5hbWU9IiouamFyIi8+Ci0JCTwvZmlsZXNldD4KLQk8L3BhdGg+Ci0JPHByb3BlcnR5IG5hbWU9ImJvb3RjbGFzc3BhdGgiIHJlZmlkPSJwYXRoX2Jvb3RjbGFzc3BhdGgiLz4KLQotCTx0YXJnZXQgbmFtZT0iaW5pdCIgZGVwZW5kcz0icHJvcGVydGllcyI+Ci0JCTxjb25kaXRpb24gcHJvcGVydHk9InBsdWdpblRlbXAiIHZhbHVlPSIke2J1aWxkVGVtcEZvbGRlcn0vcGx1Z2lucyI+Ci0JCQk8aXNzZXQgcHJvcGVydHk9ImJ1aWxkVGVtcEZvbGRlciIvPgotCQk8L2NvbmRpdGlvbj4KLQkJPHByb3BlcnR5IG5hbWU9InBsdWdpblRlbXAiIHZhbHVlPSIke2Jhc2VkaXJ9Ii8+Ci0JCTxjb25kaXRpb24gcHJvcGVydHk9ImJ1aWxkLnJlc3VsdC5mb2xkZXIiIHZhbHVlPSIke3BsdWdpblRlbXB9L29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5wZGUiPgotCQkJPGlzc2V0IHByb3BlcnR5PSJidWlsZFRlbXBGb2xkZXIiLz4KLQkJPC9jb25kaXRpb24+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJidWlsZC5yZXN1bHQuZm9sZGVyIiB2YWx1ZT0iJHtiYXNlZGlyfSIvPgotCQk8cHJvcGVydHkgbmFtZT0idGVtcC5mb2xkZXIiIHZhbHVlPSIke2Jhc2VkaXJ9L3RlbXAuZm9sZGVyIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4uZGVzdGluYXRpb24iIHZhbHVlPSIke2Jhc2VkaXJ9Ii8+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9InByb3BlcnRpZXMiIGlmPSJlY2xpcHNlLnJ1bm5pbmciPgotCQk8cHJvcGVydHkgbmFtZT0iYnVpbGQuY29tcGlsZXIiIHZhbHVlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5KRFRDb21waWxlckFkYXB0ZXIiLz4KLQotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJidWlsZC51cGRhdGUuamFyIiBkZXBlbmRzPSJpbml0IiBkZXNjcmlwdGlvbj0iQnVpbGQgdGhlIHBsdWctaW46IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5wZGUgZm9yIGFuIHVwZGF0ZSBzaXRlLiI+Ci0JCTxkZWxldGUgZGlyPSIke3RlbXAuZm9sZGVyfSIvPgotCQk8bWtkaXIgZGlyPSIke3RlbXAuZm9sZGVyfSIvPgotCQk8YW50Y2FsbCB0YXJnZXQ9ImJ1aWxkLmphcnMiLz4KLQkJPGFudGNhbGwgdGFyZ2V0PSJnYXRoZXIuYmluLnBhcnRzIj4KLQkJCTxwYXJhbSBuYW1lPSJkZXN0aW5hdGlvbi50ZW1wLmZvbGRlciIgdmFsdWU9IiR7dGVtcC5mb2xkZXJ9LyIvPgotCQk8L2FudGNhbGw+Ci0JCTx6aXAgZGVzdGZpbGU9IiR7cGx1Z2luLmRlc3RpbmF0aW9ufS9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucGRlXzEuMC4wLmphciIgYmFzZWRpcj0iJHt0ZW1wLmZvbGRlcn0vb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnBkZV8xLjAuMCIgZmlsZXNvbmx5PSJmYWxzZSIgd2hlbmVtcHR5PSJza2lwIiB1cGRhdGU9ImZhbHNlIi8+Ci0JCTxkZWxldGUgZGlyPSIke3RlbXAuZm9sZGVyfSIvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJAZG90IiBkZXBlbmRzPSJpbml0IiB1bmxlc3M9IkBkb3QiIGRlc2NyaXB0aW9uPSJDcmVhdGUgamFyOiBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucGRlIEBkb3QuIj4KLQkJPGRlbGV0ZSBkaXI9IiR7dGVtcC5mb2xkZXJ9L0Bkb3QuYmluIi8+Ci0JCTxta2RpciBkaXI9IiR7dGVtcC5mb2xkZXJ9L0Bkb3QuYmluIi8+Ci0JCTwhLS0gY29tcGlsZSB0aGUgc291cmNlIGNvZGUgLS0+Ci0JCTxqYXZhYyBkZXN0ZGlyPSIke3RlbXAuZm9sZGVyfS9AZG90LmJpbiIgZmFpbG9uZXJyb3I9IiR7amF2YWNGYWlsT25FcnJvcn0iIHZlcmJvc2U9IiR7amF2YWNWZXJib3NlfSIgZGVidWc9IiR7amF2YWNEZWJ1Z0luZm99IiBpbmNsdWRlQW50UnVudGltZT0ibm8iIGJvb3RjbGFzc3BhdGg9IiR7Ym9vdGNsYXNzcGF0aH0iIHNvdXJjZT0iJHtqYXZhY1NvdXJjZX0iIHRhcmdldD0iJHtqYXZhY1RhcmdldH0iCQk+Ci0JCQk8Y29tcGlsZXJhcmcgbGluZT0iJHtjb21waWxlckFyZ30iLz4KLQkJCTxjbGFzc3BhdGg+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uXC4uXC4uXC4uXGVjbGlwc2UzXHRhcmdldC0wLjdcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLnVpXzMuMS4wLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLlwuLlwuLlwuLlxlY2xpcHNlM1x0YXJnZXQtMC43XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWVfMy4xLjAuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uXC4uXC4uXC4uXGVjbGlwc2UzXHRhcmdldC0wLjdcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLm9zZ2lfMy4xLjAuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uXC4uXC4uXC4uXGVjbGlwc2UzXHRhcmdldC0wLjdcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLmhlbHBfMy4xLjAuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uXC4uXC4uXC4uXGVjbGlwc2UzXHRhcmdldC0wLjdcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLnN3dF8zLjEuMC5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi5cLi5cLi5cLi5cZWNsaXBzZTNcdGFyZ2V0LTAuN1xlY2xpcHNlXHBsdWdpbnNcb3JnLmVjbGlwc2Uuc3d0LndpbjMyLndpbjMyLng4Nl8zLjEuMC5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi5cLi5cLi5cLi5cZWNsaXBzZTNcdGFyZ2V0LTAuN1xlY2xpcHNlXHBsdWdpbnNcb3JnLmVjbGlwc2UuamZhY2VfMy4xLjAuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uXC4uXC4uXC4uXGVjbGlwc2UzXHRhcmdldC0wLjdcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHNfMy4xLjAuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uXC4uXC4uXC4uXGVjbGlwc2UzXHRhcmdldC0wLjdcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaF8zLjEuMC5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vLi4vLi4vZWNsaXBzZTMvdGFyZ2V0LTAuNy9lY2xpcHNlL3BsdWdpbnMvb3JnLmVjbGlwc2UudWkud29ya2JlbmNoLmNvbXBhdGliaWxpdHlfMy4xLjAvY29tcGF0aWJpbGl0eS5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vLi4vLi4vZWNsaXBzZTMvdGFyZ2V0LTAuNy9lY2xpcHNlL3BsdWdpbnMvb3JnLmVjbGlwc2UudWkud29ya2JlbmNoLmNvbXBhdGliaWxpdHlfMy4xLjAvQGRvdCIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLlwuLlwuLlwuLlxlY2xpcHNlM1x0YXJnZXQtMC43XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zXzMuMS4wLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLlwuLlwuLlwuLlxlY2xpcHNlM1x0YXJnZXQtMC43XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlc18zLjEuMC5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi5cLi5cLi5cLi5cZWNsaXBzZTNcdGFyZ2V0LTAuN1xlY2xpcHNlXHBsdWdpbnNcb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuY29tcGF0aWJpbGl0eV8zLjEuMC5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi5cLi5cLi5cLi5cZWNsaXBzZTNcdGFyZ2V0LTAuN1xlY2xpcHNlXHBsdWdpbnNcb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMud2luMzJfMy4xLjAuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uXC4uXC4uXC4uXGVjbGlwc2UzXHRhcmdldC0wLjdcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb21wYXRpYmlsaXR5XzMuMS4wLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLlwuLlwuLlwuLlxlY2xpcHNlM1x0YXJnZXQtMC43XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yXzMuMS4wLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLlwuLlwuLlwuLlxlY2xpcHNlM1x0YXJnZXQtMC43XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS5hbnQuY29yZV8zLjEuMC5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi5cLi5cLi5cLi5cZWNsaXBzZTNcdGFyZ2V0LTAuN1xlY2xpcHNlXHBsdWdpbnNcb3JnLmVjbGlwc2UuY29yZS52YXJpYWJsZXNfMy4xLjAuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uL29yZy5lY2xpcHNlLnBkZS51aS9lY2xpcHNlMy90YXJnZXQtMC43L2VjbGlwc2UvcGx1Z2lucy9vcmcuZWNsaXBzZS5wZGUudWlfMy4xLjAuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uL29yZy5lY2xpcHNlLnBkZS51aS9vcmcuZWNsaXBzZS5wZGUudWlfMy4xLjAuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uXC4uXC4uXC4uXGVjbGlwc2UzXHRhcmdldC0wLjdcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLnVpLmlkZV8zLjEuMC5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi5cLi5cLi5cLi5cZWNsaXBzZTNcdGFyZ2V0LTAuN1xlY2xpcHNlXHBsdWdpbnNcb3JnLmVjbGlwc2UudWkud2luMzJfMy4xLjAuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uXC4uXC4uXC4uXGVjbGlwc2UzXHRhcmdldC0wLjdcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLnVpLnZpZXdzXzMuMS4wLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLlwuLlwuLlwuLlxlY2xpcHNlM1x0YXJnZXQtMC43XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS51cGRhdGUuY29yZV8zLjEuMC5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi5cLi5cLi5cLi5cZWNsaXBzZTNcdGFyZ2V0LTAuN1xlY2xpcHNlXHBsdWdpbnNcb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUud2luMzJfMy4xLjAuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uXC4uXC4uXC4uXGVjbGlwc2UzXHRhcmdldC0wLjdcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLnVwZGF0ZS51aV8zLjEuMC5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi5cLi5cLi5cLi5cZWNsaXBzZTNcdGFyZ2V0LTAuN1xlY2xpcHNlXHBsdWdpbnNcb3JnLmVjbGlwc2UudWkuZm9ybXNfMy4xLjAuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uXC4uXC4uXC4uXGVjbGlwc2UzXHRhcmdldC0wLjdcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLmpmYWNlLnRleHRfMy4xLjAuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uXC4uXC4uXC4uXGVjbGlwc2UzXHRhcmdldC0wLjdcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLnRleHRfMy4xLjAuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uXC4uXC4uXC4uXGVjbGlwc2UzXHRhcmdldC0wLjdcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yXzMuMS4wLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLlwuLlwuLlwuLlxlY2xpcHNlM1x0YXJnZXQtMC43XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS51aS5lZGl0b3JzXzMuMS4wLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLlwuLlwuLlwuLlxlY2xpcHNlM1x0YXJnZXQtMC43XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzXzMuMS4wLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLlwuLlwuLlwuLlxlY2xpcHNlM1x0YXJnZXQtMC43XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlXzMuMS4wLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLlwuLlwuLlwuLlxlY2xpcHNlM1x0YXJnZXQtMC43XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS5kZWJ1Zy51aV8zLjEuMC5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi5cLi5cLi5cLi5cZWNsaXBzZTNcdGFyZ2V0LTAuN1xlY2xpcHNlXHBsdWdpbnNcb3JnLmVjbGlwc2UudWkuY29uc29sZV8zLjEuMC5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi5cLi5cLi5cLi5cZWNsaXBzZTNcdGFyZ2V0LTAuN1xlY2xpcHNlXHBsdWdpbnNcb3JnLmVjbGlwc2UuamR0LmNvcmVfMy4xLjAuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uXC4uXC4uXC4uXGVjbGlwc2UzXHRhcmdldC0wLjdcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLnRlYW0uY29yZV8zLjEuMC5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi5cLi5cLi5cLi5cZWNsaXBzZTNcdGFyZ2V0LTAuN1xlY2xpcHNlXHBsdWdpbnNcb3JnLmVjbGlwc2UuamR0LmRlYnVnLnVpXzMuMS4wLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi8uLi8uLi9lY2xpcHNlMy90YXJnZXQtMC43L2VjbGlwc2UvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZHQuZGVidWdfMy4xLjAvamRpLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi8uLi8uLi9lY2xpcHNlMy90YXJnZXQtMC43L2VjbGlwc2UvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZHQuZGVidWdfMy4xLjAvamRpbW9kZWwuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uLy4uLy4uL2VjbGlwc2UzL3RhcmdldC0wLjcvZWNsaXBzZS9wbHVnaW5zL29yZy5lY2xpcHNlLmpkdC5kZWJ1Z18zLjEuMC90b29scy5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi5cLi5cLi5cLi5cZWNsaXBzZTNcdGFyZ2V0LTAuN1xlY2xpcHNlXHBsdWdpbnNcb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZ18zLjEuMC5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi5cLi5cLi5cLi5cZWNsaXBzZTNcdGFyZ2V0LTAuN1xlY2xpcHNlXHBsdWdpbnNcb3JnLmVjbGlwc2UuamR0LnVpXzMuMS4wLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLlwuLlwuLlwuLlxlY2xpcHNlM1x0YXJnZXQtMC43XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS5zZWFyY2hfMy4xLjAuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uXC4uXC4uXC4uXGVjbGlwc2UzXHRhcmdldC0wLjdcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLmNvbXBhcmVfMy4xLjAuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uXC4uXC4uXC4uXGVjbGlwc2UzXHRhcmdldC0wLjdcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nXzMuMS4wLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLlwuLlwuLlwuLlxlY2xpcHNlM1x0YXJnZXQtMC43XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS5sdGsudWkucmVmYWN0b3JpbmdfMy4xLjAuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uXC4uXC4uXC4uXGVjbGlwc2UzXHRhcmdldC0wLjdcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLnBkZV8zLjEuMC5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi5cLi5cLi5cLi5cZWNsaXBzZTNcdGFyZ2V0LTAuN1xlY2xpcHNlXHBsdWdpbnNcb3JnLmVjbGlwc2UucGRlLmNvcmVfMy4xLjAuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uLy4uLy4uL2VjbGlwc2UzL3RhcmdldC0wLjcvZWNsaXBzZS9wbHVnaW5zL29yZy5lY2xpcHNlLnBkZS5idWlsZF8zLjEuMC9wZGVidWlsZC5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vLi4vLi4vZWNsaXBzZTMvdGFyZ2V0LTAuNy9lY2xpcHNlL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnRfMS42LjUvbGliL2FudC5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vLi4vLi4vZWNsaXBzZTMvdGFyZ2V0LTAuNy9lY2xpcHNlL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnRfMS42LjUvbGliL2FudC1hbnRsci5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vLi4vLi4vZWNsaXBzZTMvdGFyZ2V0LTAuNy9lY2xpcHNlL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnRfMS42LjUvbGliL2FudC1hcGFjaGUtYmNlbC5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vLi4vLi4vZWNsaXBzZTMvdGFyZ2V0LTAuNy9lY2xpcHNlL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnRfMS42LjUvbGliL2FudC1hcGFjaGUtYnNmLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi8uLi8uLi9lY2xpcHNlMy90YXJnZXQtMC43L2VjbGlwc2UvcGx1Z2lucy9vcmcuYXBhY2hlLmFudF8xLjYuNS9saWIvYW50LWFwYWNoZS1sb2c0ai5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vLi4vLi4vZWNsaXBzZTMvdGFyZ2V0LTAuNy9lY2xpcHNlL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnRfMS42LjUvbGliL2FudC1hcGFjaGUtb3JvLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi8uLi8uLi9lY2xpcHNlMy90YXJnZXQtMC43L2VjbGlwc2UvcGx1Z2lucy9vcmcuYXBhY2hlLmFudF8xLjYuNS9saWIvYW50LWFwYWNoZS1yZWdleHAuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uLy4uLy4uL2VjbGlwc2UzL3RhcmdldC0wLjcvZWNsaXBzZS9wbHVnaW5zL29yZy5hcGFjaGUuYW50XzEuNi41L2xpYi9hbnQtYXBhY2hlLXJlc29sdmVyLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi8uLi8uLi9lY2xpcHNlMy90YXJnZXQtMC43L2VjbGlwc2UvcGx1Z2lucy9vcmcuYXBhY2hlLmFudF8xLjYuNS9saWIvYW50LWNvbW1vbnMtbG9nZ2luZy5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vLi4vLi4vZWNsaXBzZTMvdGFyZ2V0LTAuNy9lY2xpcHNlL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnRfMS42LjUvbGliL2FudC1jb21tb25zLW5ldC5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vLi4vLi4vZWNsaXBzZTMvdGFyZ2V0LTAuNy9lY2xpcHNlL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnRfMS42LjUvbGliL2FudC1pY29udHJhY3QuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uLy4uLy4uL2VjbGlwc2UzL3RhcmdldC0wLjcvZWNsaXBzZS9wbHVnaW5zL29yZy5hcGFjaGUuYW50XzEuNi41L2xpYi9hbnQtamFpLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi8uLi8uLi9lY2xpcHNlMy90YXJnZXQtMC43L2VjbGlwc2UvcGx1Z2lucy9vcmcuYXBhY2hlLmFudF8xLjYuNS9saWIvYW50LWphdmFtYWlsLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi8uLi8uLi9lY2xpcHNlMy90YXJnZXQtMC43L2VjbGlwc2UvcGx1Z2lucy9vcmcuYXBhY2hlLmFudF8xLjYuNS9saWIvYW50LWpkZXBlbmQuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uLy4uLy4uL2VjbGlwc2UzL3RhcmdldC0wLjcvZWNsaXBzZS9wbHVnaW5zL29yZy5hcGFjaGUuYW50XzEuNi41L2xpYi9hbnQtam1mLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi8uLi8uLi9lY2xpcHNlMy90YXJnZXQtMC43L2VjbGlwc2UvcGx1Z2lucy9vcmcuYXBhY2hlLmFudF8xLjYuNS9saWIvYW50LWpzY2guamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uLy4uLy4uL2VjbGlwc2UzL3RhcmdldC0wLjcvZWNsaXBzZS9wbHVnaW5zL29yZy5hcGFjaGUuYW50XzEuNi41L2xpYi9hbnQtanVuaXQuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uLy4uLy4uL2VjbGlwc2UzL3RhcmdldC0wLjcvZWNsaXBzZS9wbHVnaW5zL29yZy5hcGFjaGUuYW50XzEuNi41L2xpYi9hbnQtbGF1bmNoZXIuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uLy4uLy4uL2VjbGlwc2UzL3RhcmdldC0wLjcvZWNsaXBzZS9wbHVnaW5zL29yZy5hcGFjaGUuYW50XzEuNi41L2xpYi9hbnQtbmV0cmV4eC5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vLi4vLi4vZWNsaXBzZTMvdGFyZ2V0LTAuNy9lY2xpcHNlL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnRfMS42LjUvbGliL2FudC1ub2RlcHMuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uLy4uLy4uL2VjbGlwc2UzL3RhcmdldC0wLjcvZWNsaXBzZS9wbHVnaW5zL29yZy5hcGFjaGUuYW50XzEuNi41L2xpYi9hbnQtc3RhcnRlYW0uamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uLy4uLy4uL2VjbGlwc2UzL3RhcmdldC0wLjcvZWNsaXBzZS9wbHVnaW5zL29yZy5hcGFjaGUuYW50XzEuNi41L2xpYi9hbnQtc3R5bGVib29rLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi8uLi8uLi9lY2xpcHNlMy90YXJnZXQtMC43L2VjbGlwc2UvcGx1Z2lucy9vcmcuYXBhY2hlLmFudF8xLjYuNS9saWIvYW50LXN3aW5nLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi8uLi8uLi9lY2xpcHNlMy90YXJnZXQtMC43L2VjbGlwc2UvcGx1Z2lucy9vcmcuYXBhY2hlLmFudF8xLjYuNS9saWIvYW50LXRyYXguamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uLy4uLy4uL2VjbGlwc2UzL3RhcmdldC0wLjcvZWNsaXBzZS9wbHVnaW5zL29yZy5hcGFjaGUuYW50XzEuNi41L2xpYi9hbnQtdmFqLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi8uLi8uLi9lY2xpcHNlMy90YXJnZXQtMC43L2VjbGlwc2UvcGx1Z2lucy9vcmcuYXBhY2hlLmFudF8xLjYuNS9saWIvYW50LXdlYmxvZ2ljLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi8uLi8uLi9lY2xpcHNlMy90YXJnZXQtMC43L2VjbGlwc2UvcGx1Z2lucy9vcmcuYXBhY2hlLmFudF8xLjYuNS9saWIvYW50LXhhbGFuMS5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vLi4vLi4vZWNsaXBzZTMvdGFyZ2V0LTAuNy9lY2xpcHNlL3BsdWdpbnMvb3JnLmFwYWNoZS5hbnRfMS42LjUvbGliL2FudC14c2xwLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi8uLi8uLi9lY2xpcHNlMy90YXJnZXQtMC43L2VjbGlwc2UvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbnQub3B0aW9uYWwuanVuaXRfMi4xLjAvbGliL2FudC5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vLi4vLi4vZWNsaXBzZTMvdGFyZ2V0LTAuNy9lY2xpcHNlL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW50Lm9wdGlvbmFsLmp1bml0XzIuMS4wL2xpYi9hbnQtYW50bHIuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uLy4uLy4uL2VjbGlwc2UzL3RhcmdldC0wLjcvZWNsaXBzZS9wbHVnaW5zL29yZy5lY2xpcHNlLmFudC5vcHRpb25hbC5qdW5pdF8yLjEuMC9saWIvYW50LWFwYWNoZS1iY2VsLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi8uLi8uLi9lY2xpcHNlMy90YXJnZXQtMC43L2VjbGlwc2UvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbnQub3B0aW9uYWwuanVuaXRfMi4xLjAvbGliL2FudC1hcGFjaGUtYnNmLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi8uLi8uLi9lY2xpcHNlMy90YXJnZXQtMC43L2VjbGlwc2UvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbnQub3B0aW9uYWwuanVuaXRfMi4xLjAvbGliL2FudC1hcGFjaGUtbG9nNGouamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uLy4uLy4uL2VjbGlwc2UzL3RhcmdldC0wLjcvZWNsaXBzZS9wbHVnaW5zL29yZy5lY2xpcHNlLmFudC5vcHRpb25hbC5qdW5pdF8yLjEuMC9saWIvYW50LWFwYWNoZS1vcm8uamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uLy4uLy4uL2VjbGlwc2UzL3RhcmdldC0wLjcvZWNsaXBzZS9wbHVnaW5zL29yZy5lY2xpcHNlLmFudC5vcHRpb25hbC5qdW5pdF8yLjEuMC9saWIvYW50LWFwYWNoZS1yZWdleHAuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uLy4uLy4uL2VjbGlwc2UzL3RhcmdldC0wLjcvZWNsaXBzZS9wbHVnaW5zL29yZy5lY2xpcHNlLmFudC5vcHRpb25hbC5qdW5pdF8yLjEuMC9saWIvYW50LWFwYWNoZS1yZXNvbHZlci5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vLi4vLi4vZWNsaXBzZTMvdGFyZ2V0LTAuNy9lY2xpcHNlL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW50Lm9wdGlvbmFsLmp1bml0XzIuMS4wL2xpYi9hbnQtY29tbW9ucy1sb2dnaW5nLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi8uLi8uLi9lY2xpcHNlMy90YXJnZXQtMC43L2VjbGlwc2UvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbnQub3B0aW9uYWwuanVuaXRfMi4xLjAvbGliL2FudC1jb21tb25zLW5ldC5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vLi4vLi4vZWNsaXBzZTMvdGFyZ2V0LTAuNy9lY2xpcHNlL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW50Lm9wdGlvbmFsLmp1bml0XzIuMS4wL2xpYi9hbnQtaWNvbnRyYWN0LmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi8uLi8uLi9lY2xpcHNlMy90YXJnZXQtMC43L2VjbGlwc2UvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbnQub3B0aW9uYWwuanVuaXRfMi4xLjAvbGliL2FudC1qYWkuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uLy4uLy4uL2VjbGlwc2UzL3RhcmdldC0wLjcvZWNsaXBzZS9wbHVnaW5zL29yZy5lY2xpcHNlLmFudC5vcHRpb25hbC5qdW5pdF8yLjEuMC9saWIvYW50LWphdmFtYWlsLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi8uLi8uLi9lY2xpcHNlMy90YXJnZXQtMC43L2VjbGlwc2UvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbnQub3B0aW9uYWwuanVuaXRfMi4xLjAvbGliL2FudC1qZGVwZW5kLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi8uLi8uLi9lY2xpcHNlMy90YXJnZXQtMC43L2VjbGlwc2UvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbnQub3B0aW9uYWwuanVuaXRfMi4xLjAvbGliL2FudC1qbWYuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uLy4uLy4uL2VjbGlwc2UzL3RhcmdldC0wLjcvZWNsaXBzZS9wbHVnaW5zL29yZy5lY2xpcHNlLmFudC5vcHRpb25hbC5qdW5pdF8yLjEuMC9saWIvYW50LWpzY2guamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uLy4uLy4uL2VjbGlwc2UzL3RhcmdldC0wLjcvZWNsaXBzZS9wbHVnaW5zL29yZy5lY2xpcHNlLmFudC5vcHRpb25hbC5qdW5pdF8yLjEuMC9saWIvYW50LWp1bml0LmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi8uLi8uLi9lY2xpcHNlMy90YXJnZXQtMC43L2VjbGlwc2UvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbnQub3B0aW9uYWwuanVuaXRfMi4xLjAvbGliL2FudC1sYXVuY2hlci5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vLi4vLi4vZWNsaXBzZTMvdGFyZ2V0LTAuNy9lY2xpcHNlL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW50Lm9wdGlvbmFsLmp1bml0XzIuMS4wL2xpYi9hbnQtbmV0cmV4eC5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vLi4vLi4vZWNsaXBzZTMvdGFyZ2V0LTAuNy9lY2xpcHNlL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW50Lm9wdGlvbmFsLmp1bml0XzIuMS4wL2xpYi9hbnQtbm9kZXBzLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi8uLi8uLi9lY2xpcHNlMy90YXJnZXQtMC43L2VjbGlwc2UvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbnQub3B0aW9uYWwuanVuaXRfMi4xLjAvbGliL2FudC1zdGFydGVhbS5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vLi4vLi4vZWNsaXBzZTMvdGFyZ2V0LTAuNy9lY2xpcHNlL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW50Lm9wdGlvbmFsLmp1bml0XzIuMS4wL2xpYi9hbnQtc3R5bGVib29rLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi8uLi8uLi9lY2xpcHNlMy90YXJnZXQtMC43L2VjbGlwc2UvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbnQub3B0aW9uYWwuanVuaXRfMi4xLjAvbGliL2FudC1zd2luZy5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vLi4vLi4vZWNsaXBzZTMvdGFyZ2V0LTAuNy9lY2xpcHNlL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW50Lm9wdGlvbmFsLmp1bml0XzIuMS4wL2xpYi9hbnQtdHJheC5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vLi4vLi4vZWNsaXBzZTMvdGFyZ2V0LTAuNy9lY2xpcHNlL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW50Lm9wdGlvbmFsLmp1bml0XzIuMS4wL2xpYi9hbnQtdmFqLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi8uLi8uLi9lY2xpcHNlMy90YXJnZXQtMC43L2VjbGlwc2UvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbnQub3B0aW9uYWwuanVuaXRfMi4xLjAvbGliL2FudC13ZWJsb2dpYy5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vLi4vLi4vZWNsaXBzZTMvdGFyZ2V0LTAuNy9lY2xpcHNlL3BsdWdpbnMvb3JnLmVjbGlwc2UuYW50Lm9wdGlvbmFsLmp1bml0XzIuMS4wL2xpYi9hbnQteGFsYW4xLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi8uLi8uLi9lY2xpcHNlMy90YXJnZXQtMC43L2VjbGlwc2UvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbnQub3B0aW9uYWwuanVuaXRfMi4xLjAvbGliL2FudC14c2xwLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi8uLi8uLi9lY2xpcHNlMy90YXJnZXQtMC43L2VjbGlwc2UvcGx1Z2lucy9vcmcuZWNsaXBzZS5hbnQub3B0aW9uYWwuanVuaXRfMi4xLjAvQGRvdCIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi8uLi8uLi9lY2xpcHNlMy90YXJnZXQtMC43L2VjbGlwc2UvcGx1Z2lucy9vcmcuanVuaXRfMy44LjEvanVuaXQuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uXC4uXC4uXC4uXGVjbGlwc2UzXHRhcmdldC0wLjdcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLmFudC51aV8zLjEuMC5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi5cLi5cLi5cLi5cZWNsaXBzZTNcdGFyZ2V0LTAuN1xlY2xpcHNlXHBsdWdpbnNcb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29sc18zLjEuMC5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vLi4vLi4vZWNsaXBzZTMvdGFyZ2V0LTAuNy9lY2xpcHNlL3BsdWdpbnMvb3JnLmVjbGlwc2UuamR0Lmp1bml0XzMuMS4wL2p1bml0c3VwcG9ydC5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vLi4vLi4vZWNsaXBzZTMvdGFyZ2V0LTAuNy9lY2xpcHNlL3BsdWdpbnMvb3JnLmVjbGlwc2UuamR0Lmp1bml0LnJ1bnRpbWVfMy4xLjAvanVuaXRydW50aW1lLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLlwuLlwuLlwuLlxlY2xpcHNlM1x0YXJnZXQtMC43XGVjbGlwc2VccGx1Z2luc1xvcmcuZWNsaXBzZS51aS5pbnRyb18zLjEuMC5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi5cLi5cLi5cLi5cZWNsaXBzZTNcdGFyZ2V0LTAuN1xlY2xpcHNlXHBsdWdpbnNcb3JnLmVjbGlwc2UudWkuY2hlYXRzaGVldHNfMy4xLjAuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uXC4uXC4uXC4uXGVjbGlwc2UzXHRhcmdldC0wLjdcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLmhlbHAuYmFzZV8zLjEuMC5qYXIiLz4KLQkJCQk8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vLi4vLi4vZWNsaXBzZTMvdGFyZ2V0LTAuNy9lY2xpcHNlL3BsdWdpbnMvb3JnLmFwYWNoZS5sdWNlbmVfMS40LjMvbHVjZW5lLTEuNC4zLmphciIvPgotCQkJCTxwYXRoZWxlbWVudCBwYXRoPSIuLi8uLi8uLi8uLi9lY2xpcHNlMy90YXJnZXQtMC43L2VjbGlwc2UvcGx1Z2lucy9vcmcuYXBhY2hlLmx1Y2VuZV8xLjQuMy9wYXJzZXIuamFyIi8+Ci0JCQkJPHBhdGhlbGVtZW50IHBhdGg9Ii4uXC4uXC4uXC4uXGVjbGlwc2UzXHRhcmdldC0wLjdcZWNsaXBzZVxwbHVnaW5zXG9yZy5lY2xpcHNlLmhlbHAuYXBwc2VydmVyXzMuMS4wLmphciIvPgotCQkJPC9jbGFzc3BhdGg+Ci0JCQk8c3JjIHBhdGg9InNyYy8iCQkJLz4KLQkJCTwvamF2YWM+Ci0JCTwhLS0gQ29weSBuZWNlc3NhcnkgcmVzb3VyY2VzIC0tPgotCQk8Y29weSB0b2Rpcj0iJHt0ZW1wLmZvbGRlcn0vQGRvdC5iaW4iIGZhaWxvbmVycm9yPSJ0cnVlIiBvdmVyd3JpdGU9ImZhbHNlIj4KLQkJCTxmaWxlc2V0IGRpcj0ic3JjLyIgZXhjbHVkZXM9IioqLyouamF2YSwgKiovcGFja2FnZS5odG0qLG51bGwiCQkJLz4KLQkJPC9jb3B5PgotCQk8bWtkaXIgZGlyPSIke2J1aWxkLnJlc3VsdC5mb2xkZXJ9Ii8+Ci0JCTxjb3B5IHRvZGlyPSIke2J1aWxkLnJlc3VsdC5mb2xkZXJ9L0Bkb3QiIGZhaWxvbmVycm9yPSJ0cnVlIiBvdmVyd3JpdGU9ImZhbHNlIj4KLQkJCTxmaWxlc2V0IGRpcj0iJHt0ZW1wLmZvbGRlcn0vQGRvdC5iaW4iCQkJLz4KLQkJPC9jb3B5PgotCQk8ZGVsZXRlIGRpcj0iJHt0ZW1wLmZvbGRlcn0vQGRvdC5iaW4iLz4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0ic3JjLnppcCIgZGVwZW5kcz0iaW5pdCIgdW5sZXNzPSJzcmMuemlwIj4KLQkJPG1rZGlyIGRpcj0iJHtidWlsZC5yZXN1bHQuZm9sZGVyfSIvPgotCQk8emlwIGRlc3RmaWxlPSIke2J1aWxkLnJlc3VsdC5mb2xkZXJ9L3NyYy56aXAiIGZpbGVzb25seT0iZmFsc2UiIHdoZW5lbXB0eT0ic2tpcCIgdXBkYXRlPSJmYWxzZSI+Ci0JCQk8ZmlsZXNldCBkaXI9InNyYy8iIGluY2x1ZGVzPSIqKi8qLmphdmEiCQkJLz4KLQkJPC96aXA+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9ImJ1aWxkLmphcnMiIGRlcGVuZHM9ImluaXQiIGRlc2NyaXB0aW9uPSJCdWlsZCBhbGwgdGhlIGphcnMgZm9yIHRoZSBwbHVnLWluOiBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucGRlLiI+Ci0JCTxhdmFpbGFibGUgcHJvcGVydHk9IkBkb3QiIGZpbGU9IiR7YnVpbGQucmVzdWx0LmZvbGRlcn0vQGRvdCIvPgotCQk8YW50Y2FsbCB0YXJnZXQ9IkBkb3QiLz4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0iYnVpbGQuc291cmNlcyIgZGVwZW5kcz0iaW5pdCI+Ci0JCTxhdmFpbGFibGUgcHJvcGVydHk9InNyYy56aXAiIGZpbGU9IiR7YnVpbGQucmVzdWx0LmZvbGRlcn0vc3JjLnppcCIvPgotCQk8YW50Y2FsbCB0YXJnZXQ9InNyYy56aXAiLz4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0iZ2F0aGVyLmJpbi5wYXJ0cyIgZGVwZW5kcz0iaW5pdCIgaWY9ImRlc3RpbmF0aW9uLnRlbXAuZm9sZGVyIj4KLQkJPG1rZGlyIGRpcj0iJHtkZXN0aW5hdGlvbi50ZW1wLmZvbGRlcn0vb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnBkZV8xLjAuMCIvPgotCQk8Y29weSB0b2Rpcj0iJHtkZXN0aW5hdGlvbi50ZW1wLmZvbGRlcn0vb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnBkZV8xLjAuMCIgZmFpbG9uZXJyb3I9InRydWUiIG92ZXJ3cml0ZT0iZmFsc2UiPgotCQkJPGZpbGVzZXQgZGlyPSIke2J1aWxkLnJlc3VsdC5mb2xkZXJ9L0Bkb3QiIGluY2x1ZGVzPSIqKiIJCQkvPgotCQk8L2NvcHk+Ci0JCTxjb3B5IHRvZGlyPSIke2Rlc3RpbmF0aW9uLnRlbXAuZm9sZGVyfS9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucGRlXzEuMC4wIiBmYWlsb25lcnJvcj0idHJ1ZSIgb3ZlcndyaXRlPSJmYWxzZSI+Ci0JCQk8ZmlsZXNldCBkaXI9IiR7YmFzZWRpcn0iIGluY2x1ZGVzPSJNRVRBLUlORi8sbnVsbCxwbHVnaW4ueG1sLHRlbXBsYXRlc18zLjAvLGljb25zLyxwbHVnaW4ucHJvcGVydGllcyxidWlsZC5wcm9wZXJ0aWVzIgkJCS8+Ci0JCTwvY29weT4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0iYnVpbGQuemlwcyIgZGVwZW5kcz0iaW5pdCI+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9ImdhdGhlci5zb3VyY2VzIiBkZXBlbmRzPSJpbml0IiBpZj0iZGVzdGluYXRpb24udGVtcC5mb2xkZXIiPgotCQk8bWtkaXIgZGlyPSIke2Rlc3RpbmF0aW9uLnRlbXAuZm9sZGVyfS9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucGRlXzEuMC4wIi8+Ci0JCTxjb3B5IGZpbGU9IiR7YnVpbGQucmVzdWx0LmZvbGRlcn0vc3JjLnppcCIgdG9kaXI9IiR7ZGVzdGluYXRpb24udGVtcC5mb2xkZXJ9L29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5wZGVfMS4wLjAiIGZhaWxvbmVycm9yPSJmYWxzZSIgb3ZlcndyaXRlPSJmYWxzZSIvPgotCQk8Y29weSB0b2Rpcj0iJHtkZXN0aW5hdGlvbi50ZW1wLmZvbGRlcn0vb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnBkZV8xLjAuMCIgZmFpbG9uZXJyb3I9ImZhbHNlIiBvdmVyd3JpdGU9ImZhbHNlIj4KLQkJCTxmaWxlc2V0IGRpcj0iJHtiYXNlZGlyfSIgaW5jbHVkZXM9InNyYy8iCQkJLz4KLQkJPC9jb3B5PgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJnYXRoZXIubG9ncyIgZGVwZW5kcz0iaW5pdCIgaWY9ImRlc3RpbmF0aW9uLnRlbXAuZm9sZGVyIj4KLQkJPG1rZGlyIGRpcj0iJHtkZXN0aW5hdGlvbi50ZW1wLmZvbGRlcn0vb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnBkZV8xLjAuMCIvPgotCQk8Y29weSBmaWxlPSIke3RlbXAuZm9sZGVyfS9AZG90LmJpbi5sb2ciIHRvZGlyPSIke2Rlc3RpbmF0aW9uLnRlbXAuZm9sZGVyfS9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucGRlXzEuMC4wIiBmYWlsb25lcnJvcj0iZmFsc2UiIG92ZXJ3cml0ZT0iZmFsc2UiLz4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0iY2xlYW4iIGRlcGVuZHM9ImluaXQiIGRlc2NyaXB0aW9uPSJDbGVhbiB0aGUgcGx1Zy1pbjogb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnBkZSBvZiBhbGwgdGhlIHppcHMsIGphcnMgYW5kIGxvZ3MgY3JlYXRlZC4iPgotCQk8ZGVsZXRlIGRpcj0iJHtidWlsZC5yZXN1bHQuZm9sZGVyfS9AZG90Ii8+Ci0JCTxkZWxldGUgZmlsZT0iJHtidWlsZC5yZXN1bHQuZm9sZGVyfS9zcmMuemlwIi8+Ci0JCTxkZWxldGUgZmlsZT0iJHtwbHVnaW4uZGVzdGluYXRpb259L29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5wZGVfMS4wLjAuamFyIi8+Ci0JCTxkZWxldGUgZmlsZT0iJHtwbHVnaW4uZGVzdGluYXRpb259L29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5wZGVfMS4wLjAuemlwIi8+Ci0JCTxkZWxldGUgZGlyPSIke3RlbXAuZm9sZGVyfSIvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJyZWZyZXNoIiBkZXBlbmRzPSJpbml0IiBpZj0iZWNsaXBzZS5ydW5uaW5nIiBkZXNjcmlwdGlvbj0iUmVmcmVzaCB0aGlzIGZvbGRlci4iPgotCQk8ZWNsaXBzZS5jb252ZXJ0UGF0aCBmaWxlU3lzdGVtUGF0aD0iRDovX2JnZS93b3Jrc3BhY2VzL3dvcmtzcGFjZS9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucGRlIiBwcm9wZXJ0eT0icmVzb3VyY2VQYXRoIi8+Ci0JCTxlY2xpcHNlLnJlZnJlc2hMb2NhbCByZXNvdXJjZT0iJHtyZXNvdXJjZVBhdGh9IiBkZXB0aD0iaW5maW5pdGUiLz4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0iemlwLnBsdWdpbiIgZGVwZW5kcz0iaW5pdCIgZGVzY3JpcHRpb249IkNyZWF0ZSBhIHppcCBjb250YWluaW5nIGFsbCB0aGUgZWxlbWVudHMgZm9yIHRoZSBwbHVnLWluOiBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucGRlLiI+Ci0JCTxkZWxldGUgZGlyPSIke3RlbXAuZm9sZGVyfSIvPgotCQk8bWtkaXIgZGlyPSIke3RlbXAuZm9sZGVyfSIvPgotCQk8YW50Y2FsbCB0YXJnZXQ9ImJ1aWxkLmphcnMiLz4KLQkJPGFudGNhbGwgdGFyZ2V0PSJidWlsZC5zb3VyY2VzIi8+Ci0JCTxhbnRjYWxsIHRhcmdldD0iZ2F0aGVyLmJpbi5wYXJ0cyI+Ci0JCQk8cGFyYW0gbmFtZT0iZGVzdGluYXRpb24udGVtcC5mb2xkZXIiIHZhbHVlPSIke3RlbXAuZm9sZGVyfS8iLz4KLQkJPC9hbnRjYWxsPgotCQk8YW50Y2FsbCB0YXJnZXQ9ImdhdGhlci5zb3VyY2VzIj4KLQkJCTxwYXJhbSBuYW1lPSJkZXN0aW5hdGlvbi50ZW1wLmZvbGRlciIgdmFsdWU9IiR7dGVtcC5mb2xkZXJ9LyIvPgotCQk8L2FudGNhbGw+Ci0JCTxkZWxldGU+Ci0JCQk8ZmlsZXNldCBkaXI9IiR7dGVtcC5mb2xkZXJ9IiBpbmNsdWRlcz0iKiovKi5iaW4ubG9nIgkJCS8+Ci0JCTwvZGVsZXRlPgotCQk8emlwIGRlc3RmaWxlPSIke3BsdWdpbi5kZXN0aW5hdGlvbn0vb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnBkZV8xLjAuMC56aXAiIGJhc2VkaXI9IiR7dGVtcC5mb2xkZXJ9IiBmaWxlc29ubHk9InRydWUiIHdoZW5lbXB0eT0ic2tpcCIgdXBkYXRlPSJmYWxzZSIvPgotCQk8ZGVsZXRlIGRpcj0iJHt0ZW1wLmZvbGRlcn0iLz4KLQk8L3RhcmdldD4KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnBkZS9pY29ucy9vYmoxNi93aXpfbmV3X3NlcnZlcl9wbHVnaW4uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnBkZS9pY29ucy9vYmoxNi93aXpfbmV3X3NlcnZlcl9wbHVnaW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2ZkMTFhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wZGUvaWNvbnMvb2JqMTYvd2l6X25ld19zZXJ2ZXJfcGx1Z2luLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wZGUvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucGRlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTU5YTU2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wZGUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUgRXRlcmF0aW9uIEEuUy4gYW5kIEdvcmtlbSBFcmNhbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSMgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jICAgICAgICAgICAgICAgCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBsdWdpbk5hbWU9IEdlbmVyaWMgc2VydmVyIFBERSBUZW1wbGF0ZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi10ZW1wbGF0ZS5nZW5lcmljU2VydmVyLm5hbWU9R2VuZXJpYyBTZXJ2ZXIgUGx1Z2luIFdpemFyZAotdGVtcGxhdGUuZ2VuZXJpY1NlcnZlci5kZXNjcmlwdGlvbj1cCi08cD5UaGlzIHdpemFyZCBjcmVhdGVzIGEgc2ltcGxlIGdlbmVyaWMgc2VydmVyIHBsdWctaW4uIFwKLVRoZSAuc2VydmVyZGVmIGZpbGUgYW5kIHRoZSBidWlsZC54bWwgZmlsZSBmb3IgQU5UIGJhc2VkIHB1Ymxpc2hpbmcgYXJlIGNyZWF0ZWQuIFwKLUNyZWF0ZWQgZmlsZXMgYXJlIHRoZSBzYW1lIGZpbGVzIHVzZWQgZm9yIEpCb3NzIDMuMi4zIGluIEdlbmVyaWMgRXhhbXBsZXMuIFwKLTwvcD5cCi08cD48Yj5FeHRlbnNpb24gVXNlZDwvYj48L3A+XAotPGxpPm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLnNlcnZlcmRlZmluaXRpb248L2xpPiBcCi08bGk+b3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnJ1bnRpbWVUYXJnZXRIYW5kbGVyczwvbGk+IFwKLTxsaT5vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLnNlcnZlckltYWdlczwvbGk+IFwKLTxsaT5vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLndpemFyZEZyYWdtZW50czwvbGk+IFwKLTxsaT5vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuc2VydmVyVHlwZXM8L2xpPiBcCi08bGk+b3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnJ1bnRpbWVUeXBlczwvbGk+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnBkZS9wbHVnaW4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnBkZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDE4YTQ4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wZGUvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnBkZS51aS5wbHVnaW5Db250ZW50Ij4KLSAgICAgIDx3aXphcmQKLSAgICAgICAgICAgIGNhdGVnb3J5PSJXVFAiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnBkZS5pbnRlcm5hbC5HZW5lcmljU2VydmVyUGx1Z2luTmV3V2l6YXJkIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvb2JqMTYvd2l6X25ld19zZXJ2ZXJfcGx1Z2luLmdpZiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucGRlLmdlbmVyaWNTZXJ2ZXIiCi0gICAgICAgICAgICBqYXZhPSJ0cnVlIgotICAgICAgICAgICAgbmFtZT0iJXRlbXBsYXRlLmdlbmVyaWNTZXJ2ZXIubmFtZSIKLSAgICAgICAgICAgIHJjcD0iZmFsc2UiCi0gICAgICAgICAgICB1aS1jb250ZW50PSJ0cnVlIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICV0ZW1wbGF0ZS5nZW5lcmljU2VydmVyLmRlc2NyaXB0aW9uCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgCi0gICAgICAgICAgICA8L3dpemFyZD4KLSAgIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wZGUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9wZGUvU2VydmVyUGRlUGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucGRlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvcGRlL1NlcnZlclBkZVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWQ4NzcwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wZGUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9wZGUvU2VydmVyUGRlUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgRXRlcmF0aW9uIEEuUy4gYW5kIEdvcmtlbSBFcmNhbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBHb3JrZW0gRXJjYW4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAgICAgICAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5wZGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIHRvIGJlIHVzZWQgaW4gdGhlIGRlc2t0b3AuCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJQZGVQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQotCS8vVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBTZXJ2ZXJQZGVQbHVnaW4gcGx1Z2luOwotCQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgU2VydmVyUGRlUGx1Z2luKCkgewotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB1cG9uIHBsdWctaW4gYWN0aXZhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBwbHVnLWluIGlzIHN0b3BwZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU2VydmVyUGRlUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBpbWFnZSBkZXNjcmlwdG9yIGZvciB0aGUgaW1hZ2UgZmlsZSBhdCB0aGUgZ2l2ZW4KLQkgKiBwbHVnLWluIHJlbGF0aXZlIHBhdGguCi0JICoKLQkgKiBAcGFyYW0gcGF0aCB0aGUgcGF0aAotCSAqIEByZXR1cm4gdGhlIGltYWdlIGRlc2NyaXB0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIHBhdGgpIHsKLQkJcmV0dXJuIEFic3RyYWN0VUlQbHVnaW4uaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbigib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnBkZSIsIHBhdGgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wZGUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9wZGUvaW50ZXJuYWwvR2VuZXJpY1NlcnZlclBsdWdpbk5ld1dpemFyZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnBkZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3BkZS9pbnRlcm5hbC9HZW5lcmljU2VydmVyUGx1Z2luTmV3V2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjZGE0YWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnBkZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3BkZS9pbnRlcm5hbC9HZW5lcmljU2VydmVyUGx1Z2luTmV3V2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgRXRlcmF0aW9uIEEuUy4gYW5kIEdvcmtlbSBFcmNhbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBHb3JrZW0gRXJjYW4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAgICAgICAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5wZGUuaW50ZXJuYWw7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnBkZS51aS5JRmllbGREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnBkZS51aS50ZW1wbGF0ZXMuSVRlbXBsYXRlU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wZGUudWkudGVtcGxhdGVzLk5ld1BsdWdpblRlbXBsYXRlV2l6YXJkOwotLyoqCi0gKiBOZXcgR2VuZXJpYyBzZXJ2ZXIgcGx1Zy1pbiB3aXphcmQuIAotICogQGF1dGhvciBHb3JrZW0gRXJjYW4KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmljU2VydmVyUGx1Z2luTmV3V2l6YXJkIGV4dGVuZHMgTmV3UGx1Z2luVGVtcGxhdGVXaXphcmQgewotCi0JcHVibGljIElUZW1wbGF0ZVNlY3Rpb25bXSBjcmVhdGVUZW1wbGF0ZVNlY3Rpb25zKCl7Ci0JCXJldHVybiBuZXcgSVRlbXBsYXRlU2VjdGlvbltdIHtuZXcgR2VuZXJpY1NlcnZlclRlbXBsYXRlKCl9OwotCX0KLQkKLQlwdWJsaWMgdm9pZCBpbml0KElGaWVsZERhdGEgZGF0YSkgewotCQlzdXBlci5pbml0KGRhdGEpOwotCQlzZXRXaW5kb3dUaXRsZShNZXNzYWdlcy53aW5kb3dUaXRsZVdpemFyZCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnBkZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3BkZS9pbnRlcm5hbC9HZW5lcmljU2VydmVyVGVtcGxhdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wZGUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9wZGUvaW50ZXJuYWwvR2VuZXJpY1NlcnZlclRlbXBsYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyMmFjMzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnBkZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3BkZS9pbnRlcm5hbC9HZW5lcmljU2VydmVyVGVtcGxhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgRXRlcmF0aW9uIEEuUy4gYW5kIEdvcmtlbSBFcmNhbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBHb3JrZW0gRXJjYW4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAgICAgICAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5wZGUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucGRlLlNlcnZlclBkZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wZGUuY29yZS5wbHVnaW4uSVBsdWdpbkJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucGRlLmNvcmUucGx1Z2luLklQbHVnaW5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnBkZS5jb3JlLnBsdWdpbi5JUGx1Z2luRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnBkZS5jb3JlLnBsdWdpbi5JUGx1Z2luTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnBkZS5jb3JlLnBsdWdpbi5JUGx1Z2luUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnBkZS5pbnRlcm5hbC51aS53aXphcmRzLnRlbXBsYXRlcy5QbHVnaW5SZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucGRlLnVpLnRlbXBsYXRlcy5PcHRpb25UZW1wbGF0ZVNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucGRlLnVpLnRlbXBsYXRlcy5UZW1wbGF0ZU9wdGlvbjsKLS8qKgotICogU2ltcGxlIGdlbmVyaWMgc2VydmVyIHBsdWctaW4gdGVtcGxhdGUKLSAqIAotICogQGF1dGhvciBHb3JrZW0gRXJjYW4KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmljU2VydmVyVGVtcGxhdGUgZXh0ZW5kcyBPcHRpb25UZW1wbGF0ZVNlY3Rpb24gewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9TRVJWRVJfVkVSU0lPTiA9ICJzZXJ2ZXJfdmVyc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1NFUlZFUl9TVEFSVF9CRUZPUkVfUFVCTElTSCA9ICJzZXJ2ZXJfc3RhcnRfYmVmb3JlX3B1Ymxpc2giOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9TRVJWRVJfTEFVTkNIVFlQRSA9ICJzZXJ2ZXJfbGF1bmNodHlwZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1NFUlZFUl9WRU5ET1IgPSAic2VydmVyX3ZlbmRvciI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1NFUlZFUl9ERVNDUklQVElPTiA9ICJzZXJ2ZXJfZGVzY3JpcHRpb24iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9TRVJWRVJfTkFNRSA9ICJzZXJ2ZXJfbmFtZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXVtdIGxhdW5jaE9wdHMgPSB7eyJqYXZhIixNZXNzYWdlcy5sYWJlbEphdmFMYXVuY2hDb25maWd1cmF0aW9ufSx7ImV4dGVybmFsIixNZXNzYWdlcy5sYWJlbEV4dGVybmFsTGF1bmNoQ29uZmlndXJhdGlvbn19OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMyQKLQkKLQlwcml2YXRlIFRlbXBsYXRlT3B0aW9uIGZTZXJ2ZXJOYW1lT3B0aW9uOwotCXByaXZhdGUgVGVtcGxhdGVPcHRpb24gZlNlcnZlckRlc2NyaXB0aW9uT3B0aW9uOwotCXByaXZhdGUgVGVtcGxhdGVPcHRpb24gZlNlcnZlclZlbmRvck9wdGlvbjsKLQlwcml2YXRlIFRlbXBsYXRlT3B0aW9uIGZTZXJ2ZXJWZXJzaW9uT3B0aW9uOwotCXByaXZhdGUgVGVtcGxhdGVPcHRpb24gZkxhdW5jaFR5cGVPcHRpb247Ci0JcHJpdmF0ZSBUZW1wbGF0ZU9wdGlvbiBmU3RhcnRCZWZvclB1Ymxpc2hPcHRpb247Ci0JCi0JcHVibGljIEdlbmVyaWNTZXJ2ZXJUZW1wbGF0ZSgpIHsKLQkJc2V0UGFnZUNvdW50KDEpOwotCQljcmVhdGVPcHRpb25zKCk7Ci0JfQotCQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVPcHRpb25zKCl7Ci0JCi0JCWZTZXJ2ZXJOYW1lT3B0aW9uPSBhZGRPcHRpb24oS0VZX1NFUlZFUl9OQU1FLE1lc3NhZ2VzLmxhYmVsU2VydmVyTmFtZSwieW91ciBzZXJ2ZXIncyBuYW1lIiwwKTsgLy8kTk9OLU5MUy0yJAotCQlmU2VydmVyRGVzY3JpcHRpb25PcHRpb24gPSBhZGRPcHRpb24oS0VZX1NFUlZFUl9ERVNDUklQVElPTiwiRGVzY3JpcHRpb24iLCJVc2VyIGRlc2NyaXB0aW9uIG9mIHlvdXIgc2VydmVyIiwwKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZTZXJ2ZXJWZW5kb3JPcHRpb249IGFkZE9wdGlvbihLRVlfU0VSVkVSX1ZFTkRPUixNZXNzYWdlcy5sYWJlbFNlcnZlclZlbmRvciwiU2VydmVyIHZlbmRvcicgcyBuYW1lIiwwKTsgLy8kTk9OLU5MUy0yJAotCQlmU2VydmVyVmVyc2lvbk9wdGlvbj0gYWRkT3B0aW9uKEtFWV9TRVJWRVJfVkVSU0lPTixNZXNzYWdlcy5sYWJlbFNlcnZlclZlc2lvbiwiMCIsMCk7IC8vJE5PTi1OTFMtMiQKLQkJZkxhdW5jaFR5cGVPcHRpb249IGFkZE9wdGlvbihLRVlfU0VSVkVSX0xBVU5DSFRZUEUsTWVzc2FnZXMubGFiZWxMYXVuY2hUeXBlLGxhdW5jaE9wdHMsImphdmEiLDApOyAvLyROT04tTkxTLTIkCi0JCWZTdGFydEJlZm9yUHVibGlzaE9wdGlvbj0gYWRkT3B0aW9uKEtFWV9TRVJWRVJfU1RBUlRfQkVGT1JFX1BVQkxJU0gsTWVzc2FnZXMubGFiZWxTdGFydEJlZm9yZVB1Ymxpc2gsZmFsc2UsMCk7Ci0JCQotCQlmU2VydmVyTmFtZU9wdGlvbi5zZXRSZXF1aXJlZCh0cnVlKTsKLQkJZlNlcnZlckRlc2NyaXB0aW9uT3B0aW9uLnNldFJlcXVpcmVkKHRydWUpOwotCQlmU2VydmVyVmVuZG9yT3B0aW9uLnNldFJlcXVpcmVkKHRydWUpOwotCQlmU2VydmVyVmVyc2lvbk9wdGlvbi5zZXRSZXF1aXJlZCh0cnVlKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRTZWN0aW9uSWQoKSB7Ci0JCXJldHVybiAiZ2VuZXJpY3NlcnZlciI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVNb2RlbChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uewotCQlJUGx1Z2luQmFzZSBwbHVnaW4gPSBtb2RlbC5nZXRQbHVnaW5CYXNlKCk7Ci0JCUlQbHVnaW5Nb2RlbEZhY3RvcnkgZmFjdG9yeSA9IG1vZGVsLmdldFBsdWdpbkZhY3RvcnkoKTsJCQotCQlhZGRSdW50aW1lVHlwZShwbHVnaW4sIGZhY3RvcnkpOwotCQlhZGRTZXJ2ZXJUeXBlKHBsdWdpbiwgZmFjdG9yeSk7Ci0JCWFkZFdpemFyZEZyYWdtZW50KHBsdWdpbiwgZmFjdG9yeSk7Ci0JCWFkZFNlcnZlckltYWdlKHBsdWdpbiwgZmFjdG9yeSk7Ci0JCWFkZFJ1bnRpbWVUYXJnZXRIYW5kbGVyKHBsdWdpbiwgZmFjdG9yeSk7Ci0JCWFkZFNlcnZlckRlZmluaXRpb24ocGx1Z2luLCBmYWN0b3J5KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkU2VydmVyRGVmaW5pdGlvbihJUGx1Z2luQmFzZSBwbHVnaW4sIElQbHVnaW5Nb2RlbEZhY3RvcnkgZmFjdG9yeSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJUGx1Z2luRXh0ZW5zaW9uIGRlZmluaXRpb25FeHRlbnNpb24gPSBjcmVhdGVFeHRlbnNpb24oIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLnNlcnZlcmRlZmluaXRpb24iLHRydWUpOyAvLyROT04tTkxTLTEkCi0JCUlQbHVnaW5FbGVtZW50IHNlcnZlckRlZiA9IGZhY3RvcnkuY3JlYXRlRWxlbWVudChkZWZpbml0aW9uRXh0ZW5zaW9uKTsKLQkJc2VydmVyRGVmLnNldE5hbWUoInNlcnZlcmRlZmluaXRpb24iKTsgLy8kTk9OLU5MUy0xJAotCQlzZXJ2ZXJEZWYuc2V0QXR0cmlidXRlKCJpZCIsZ2V0UnVudGltZUlkKCkpOyAvLyROT04tTkxTLTEkCi0JCXNlcnZlckRlZi5zZXRBdHRyaWJ1dGUoImRlZmluaXRpb25maWxlIiwiL3NlcnZlcnMvIitnZXRTdHJpbmdPcHRpb24oS0VZX1NFUlZFUl9OQU1FKSsiLnNlcnZlcmRlZiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQlkZWZpbml0aW9uRXh0ZW5zaW9uLmFkZChzZXJ2ZXJEZWYpOwotCQlpZighZGVmaW5pdGlvbkV4dGVuc2lvbi5pc0luVGhlTW9kZWwoKSkKLQkJCXBsdWdpbi5hZGQoZGVmaW5pdGlvbkV4dGVuc2lvbik7Ci0JfQotCi0KLQlwcml2YXRlIHZvaWQgYWRkUnVudGltZVRhcmdldEhhbmRsZXIoSVBsdWdpbkJhc2UgcGx1Z2luLCBJUGx1Z2luTW9kZWxGYWN0b3J5IGZhY3RvcnkpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVBsdWdpbkV4dGVuc2lvbiBoYW5kbGVyRXh0ZW5zaW9uID0gY3JlYXRlRXh0ZW5zaW9uKCJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUucnVudGltZVRhcmdldEhhbmRsZXJzIix0cnVlKTsgLy8kTk9OLU5MUy0xJAotCQlJUGx1Z2luRWxlbWVudCBoYW5kbGVyPSBmYWN0b3J5LmNyZWF0ZUVsZW1lbnQoaGFuZGxlckV4dGVuc2lvbik7Ci0JCWhhbmRsZXIuc2V0TmFtZSgicnVudGltZVRhcmdldEhhbmRsZXIiKTsgLy8kTk9OLU5MUy0xJAotCQloYW5kbGVyLnNldEF0dHJpYnV0ZSgiaWQiLGdldE5hbWVzcGFjZSgpKyIucnVudGltZVRhcmdldCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaGFuZGxlci5zZXRBdHRyaWJ1dGUoInJ1bnRpbWVUeXBlSWRzIixnZXRSdW50aW1lSWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJaGFuZGxlci5zZXRBdHRyaWJ1dGUoImNsYXNzIiwib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuaW50ZXJuYWwuR2VuZXJpY1NlcnZlclJ1bnRpbWVUYXJnZXRIYW5kbGVyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQloYW5kbGVyRXh0ZW5zaW9uLmFkZChoYW5kbGVyKTsKLQkJaWYoIWhhbmRsZXJFeHRlbnNpb24uaXNJblRoZU1vZGVsKCkpCi0JCQlwbHVnaW4uYWRkKGhhbmRsZXJFeHRlbnNpb24pOwotCX0KLQotCi0JcHJpdmF0ZSB2b2lkIGFkZFNlcnZlckltYWdlKElQbHVnaW5CYXNlIHBsdWdpbiwgSVBsdWdpbk1vZGVsRmFjdG9yeSBmYWN0b3J5KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlQbHVnaW5FeHRlbnNpb24gaW1hZ2VFeHRlbnNpb24gPSBjcmVhdGVFeHRlbnNpb24oIm9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuc2VydmVySW1hZ2VzIix0cnVlKTsgLy8kTk9OLU5MUy0xJAotCQlJUGx1Z2luRWxlbWVudCBzZXJ2ZXJJbWFnZSA9IGZhY3RvcnkuY3JlYXRlRWxlbWVudChpbWFnZUV4dGVuc2lvbik7Ci0JCXNlcnZlckltYWdlLnNldE5hbWUoImltYWdlIik7IC8vJE5PTi1OTFMtMSQKLQkJc2VydmVySW1hZ2Uuc2V0QXR0cmlidXRlKCJpZCIsZ2V0TmFtZXNwYWNlKCkrIi5zZXJ2ZXJJbWFnZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJc2VydmVySW1hZ2Uuc2V0QXR0cmlidXRlKCJpY29uIiwiaWNvbnMvc2VydmVyLmdpZiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJc2VydmVySW1hZ2Uuc2V0QXR0cmlidXRlKCJ0eXBlSWRzIixnZXRTZXJ2ZXJJZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlpbWFnZUV4dGVuc2lvbi5hZGQoc2VydmVySW1hZ2UpOwotCQkKLQkJSVBsdWdpbkVsZW1lbnQgcnVudGltZUltYWdlID0gZmFjdG9yeS5jcmVhdGVFbGVtZW50KGltYWdlRXh0ZW5zaW9uKTsKLQkJcnVudGltZUltYWdlLnNldE5hbWUoImltYWdlIik7IC8vJE5PTi1OTFMtMSQKLQkJcnVudGltZUltYWdlLnNldEF0dHJpYnV0ZSgiaWQiLGdldE5hbWVzcGFjZSgpKyIucnVudGltZUltYWdlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlydW50aW1lSW1hZ2Uuc2V0QXR0cmlidXRlKCJpY29uIiwiaWNvbnMvc2VydmVyLmdpZiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJcnVudGltZUltYWdlLnNldEF0dHJpYnV0ZSgidHlwZUlkcyIsZ2V0UnVudGltZUlkKCkpOyAvLyROT04tTkxTLTEkCi0JCWltYWdlRXh0ZW5zaW9uLmFkZChydW50aW1lSW1hZ2UpOwotCQlpZighaW1hZ2VFeHRlbnNpb24uaXNJblRoZU1vZGVsKCkpCi0JCQlwbHVnaW4uYWRkKGltYWdlRXh0ZW5zaW9uKTsKLQl9Ci0KLQotCXByaXZhdGUgdm9pZCBhZGRXaXphcmRGcmFnbWVudChJUGx1Z2luQmFzZSBwbHVnaW4sIElQbHVnaW5Nb2RlbEZhY3RvcnkgZmFjdG9yeSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJUGx1Z2luRXh0ZW5zaW9uIHdpemFyZEV4dGVuc2lvbiA9IGNyZWF0ZUV4dGVuc2lvbigib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmRGcmFnbWVudHMiLHRydWUpOyAvLyROT04tTkxTLTEkCi0JCUlQbHVnaW5FbGVtZW50IHJ1bnRpbWVXaXogPSBmYWN0b3J5LmNyZWF0ZUVsZW1lbnQod2l6YXJkRXh0ZW5zaW9uKTsKLQkJcnVudGltZVdpei5zZXROYW1lKCJmcmFnbWVudCIpOyAvLyROT04tTkxTLTEkCi0JCXJ1bnRpbWVXaXouc2V0QXR0cmlidXRlKCJpZCIsZ2V0TmFtZXNwYWNlKCkrIi5ydW50aW1lV2l6YXJkIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlydW50aW1lV2l6LnNldEF0dHJpYnV0ZSgiY2xhc3MiLCJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkuaW50ZXJuYWwuR2VuZXJpY1NlcnZlclJ1bnRpbWVXaXphcmRGcmFnbWVudCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJcnVudGltZVdpei5zZXRBdHRyaWJ1dGUoInR5cGVJZHMiLGdldFJ1bnRpbWVJZCgpKTsgLy8kTk9OLU5MUy0xJAotCQl3aXphcmRFeHRlbnNpb24uYWRkKHJ1bnRpbWVXaXopOwotCQlpZighd2l6YXJkRXh0ZW5zaW9uLmlzSW5UaGVNb2RlbCgpKQotCQkJcGx1Z2luLmFkZCh3aXphcmRFeHRlbnNpb24pOwotCQkKLQkJSVBsdWdpbkVsZW1lbnQgc2VydmVyV2l6ID0gZmFjdG9yeS5jcmVhdGVFbGVtZW50KHdpemFyZEV4dGVuc2lvbik7Ci0JCXNlcnZlcldpei5zZXROYW1lKCJmcmFnbWVudCIpOyAvLyROT04tTkxTLTEkCi0JCXNlcnZlcldpei5zZXRBdHRyaWJ1dGUoImlkIixnZXROYW1lc3BhY2UoKSsiLnNlcnZlcldpemFyZCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgc2VydmVyV2l6LnNldEF0dHJpYnV0ZSgiY2xhc3MiLCJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkuaW50ZXJuYWwuR2VuZXJpY1NlcnZlcldpemFyZEZyYWdtZW50Iik7ICAgIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlzZXJ2ZXJXaXouc2V0QXR0cmlidXRlKCJ0eXBlSWRzIixnZXRTZXJ2ZXJJZCgpKTsgLy8kTk9OLU5MUy0xJAotCQl3aXphcmRFeHRlbnNpb24uYWRkKHNlcnZlcldpeik7Ci0JfQotCi0KLQlwcml2YXRlIHZvaWQgYWRkU2VydmVyVHlwZShJUGx1Z2luQmFzZSBwbHVnaW4sIElQbHVnaW5Nb2RlbEZhY3RvcnkgZmFjdG9yeSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJUGx1Z2luRXh0ZW5zaW9uIHNlcnZlckV4dGVuc2lvbiA9Y3JlYXRlRXh0ZW5zaW9uKCJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuc2VydmVyVHlwZXMiLHRydWUpOyAvLyROT04tTkxTLTEkCi0JCUlQbHVnaW5FbGVtZW50IHNlcnZlclR5cGUgPSBmYWN0b3J5LmNyZWF0ZUVsZW1lbnQoc2VydmVyRXh0ZW5zaW9uKTsKLQkJc2VydmVyVHlwZS5zZXROYW1lKCJzZXJ2ZXJUeXBlIik7IC8vJE5PTi1OTFMtMSQKLQkJc2VydmVyVHlwZS5zZXRBdHRyaWJ1dGUoInJ1bnRpbWUiLCJ0cnVlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlzZXJ2ZXJUeXBlLnNldEF0dHJpYnV0ZSgiY2xhc3MiLCJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5pbnRlcm5hbC5HZW5lcmljU2VydmVyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlzZXJ2ZXJUeXBlLnNldEF0dHJpYnV0ZSgiaWQiLGdldFNlcnZlcklkKCkpOyAvLyROT04tTkxTLTEkCi0JCXNlcnZlclR5cGUuc2V0QXR0cmlidXRlKCJpbml0aWFsU3RhdGUiLCJzdG9wcGVkIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlzZXJ2ZXJUeXBlLnNldEF0dHJpYnV0ZSgic3VwcG9ydHNSZW1vdGVIb3N0cyIsImZhbHNlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlzZXJ2ZXJUeXBlLnNldEF0dHJpYnV0ZSgicnVudGltZVR5cGVJZCIsZ2V0UnVudGltZUlkKCkpOyAvLyROT04tTkxTLTEkCi0JCXNlcnZlclR5cGUuc2V0QXR0cmlidXRlKCJkZXNjcmlwdGlvbiIsZ2V0U3RyaW5nT3B0aW9uKEtFWV9TRVJWRVJfREVTQ1JJUFRJT04pKTsgLy8kTk9OLU5MUy0xJAotCQlzZXJ2ZXJUeXBlLnNldEF0dHJpYnV0ZSgibGF1bmNoQ29uZmlnSWQiLGdldFNlbGVjdGVkQ29uZmlnVHlwZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlzZXJ2ZXJUeXBlLnNldEF0dHJpYnV0ZSgiYmVoYXZpb3VyQ2xhc3MiLGdldFNlbGVjdGVkQmVoYXZpb3VyQ2xhc3MoKSk7IC8vJE5PTi1OTFMtMSQKLQkJc2VydmVyVHlwZS5zZXRBdHRyaWJ1dGUoIm5hbWUiLGdldFN0cmluZ09wdGlvbihLRVlfU0VSVkVSX05BTUUpKTsgLy8kTk9OLU5MUy0xJAotCQlzZXJ2ZXJUeXBlLnNldEF0dHJpYnV0ZSgic3RhcnRUaW1lb3V0IiwiNzUwMDAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXNlcnZlclR5cGUuc2V0QXR0cmlidXRlKCJzdG9wVGltZW91dCIsIjMwMDAwIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlzZXJ2ZXJUeXBlLnNldEF0dHJpYnV0ZSgiaGFzQ29uZmlndXJhdGlvbiIsImZhbHNlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlzZXJ2ZXJUeXBlLnNldEF0dHJpYnV0ZSgibGF1bmNoTW9kZXMiLCJydW4sZGVidWciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXNlcnZlclR5cGUuc2V0QXR0cmlidXRlKCJzdGFydEJlZm9yZVB1Ymxpc2giLCBCb29sZWFuLnRvU3RyaW5nKGdldEJvb2xlYW5PcHRpb24oS0VZX1NFUlZFUl9TVEFSVF9CRUZPUkVfUFVCTElTSCkpKTsgLy8kTk9OLU5MUy0xJAotCQlzZXJ2ZXJFeHRlbnNpb24uYWRkKHNlcnZlclR5cGUpOwotCQlpZighc2VydmVyRXh0ZW5zaW9uLmlzSW5UaGVNb2RlbCgpKQotCQkJcGx1Z2luLmFkZChzZXJ2ZXJFeHRlbnNpb24pOwotCX0KLQotCi0JcHJpdmF0ZSB2b2lkIGFkZFJ1bnRpbWVUeXBlKElQbHVnaW5CYXNlIHBsdWdpbiwgSVBsdWdpbk1vZGVsRmFjdG9yeSBmYWN0b3J5KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlQbHVnaW5FeHRlbnNpb24gZXh0ZW5zaW9uID1jcmVhdGVFeHRlbnNpb24oIm9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5ydW50aW1lVHlwZXMiLHRydWUpOyAvLyROT04tTkxTLTEkCi0JCUlQbHVnaW5FbGVtZW50IHJ1bnRpbWVUeXBlID0gZmFjdG9yeS5jcmVhdGVFbGVtZW50KGV4dGVuc2lvbik7Ci0JCXJ1bnRpbWVUeXBlLnNldE5hbWUoInJ1bnRpbWVUeXBlIik7IC8vJE5PTi1OTFMtMSQKLQkJcnVudGltZVR5cGUuc2V0QXR0cmlidXRlKCJpZCIsZ2V0UnVudGltZUlkKCkpOyAvLyROT04tTkxTLTEkCi0JCXJ1bnRpbWVUeXBlLnNldEF0dHJpYnV0ZSgibmFtZSIsZ2V0U3RyaW5nT3B0aW9uKEtFWV9TRVJWRVJfTkFNRSkpOyAvLyROT04tTkxTLTEkCi0JCXJ1bnRpbWVUeXBlLnNldEF0dHJpYnV0ZSgiZGVzY3JpcHRpb24iLGdldFN0cmluZ09wdGlvbihLRVlfU0VSVkVSX0RFU0NSSVBUSU9OKSk7IC8vJE5PTi1OTFMtMSQKLQkJcnVudGltZVR5cGUuc2V0QXR0cmlidXRlKCJ2ZW5kb3IiLGdldFN0cmluZ09wdGlvbihLRVlfU0VSVkVSX1ZFTkRPUikpOyAvLyROT04tTkxTLTEkCi0JCXJ1bnRpbWVUeXBlLnNldEF0dHJpYnV0ZSgidmVyc2lvbiIsZ2V0U3RyaW5nT3B0aW9uKEtFWV9TRVJWRVJfVkVSU0lPTikpOyAvLyROT04tTkxTLTEkCi0JCXJ1bnRpbWVUeXBlLnNldEF0dHJpYnV0ZSgiY2xhc3MiLCJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5pbnRlcm5hbC5HZW5lcmljU2VydmVyUnVudGltZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCi0JCUlQbHVnaW5FbGVtZW50IG1vZHVsZVR5cGUgPSBmYWN0b3J5LmNyZWF0ZUVsZW1lbnQocnVudGltZVR5cGUpOwotCQltb2R1bGVUeXBlLnNldE5hbWUoIm1vZHVsZVR5cGUiKTsgLy8kTk9OLU5MUy0xJAotCQltb2R1bGVUeXBlLnNldEF0dHJpYnV0ZSgidHlwZXMiLCJqc3Qud2ViIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICBtb2R1bGVUeXBlLnNldEF0dHJpYnV0ZSgidmVyc2lvbnMiLCIxLjIsIDEuMyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgcnVudGltZVR5cGUuYWRkKG1vZHVsZVR5cGUpOwotICAgICAgICAKLQkJZXh0ZW5zaW9uLmFkZChydW50aW1lVHlwZSk7Ci0JCWlmKCFleHRlbnNpb24uaXNJblRoZU1vZGVsKCkpCi0JCQlwbHVnaW4uYWRkKGV4dGVuc2lvbik7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGdldFJ1bnRpbWVJZCgpewotCQlyZXR1cm4gZ2V0TmFtZXNwYWNlKCkrIi5ydW50aW1lIjsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXRTZXJ2ZXJJZCgpewotCQlyZXR1cm4gZ2V0TmFtZXNwYWNlKCkrIi5zZXJ2ZXIiOyAvLyROT04tTkxTLTEkCi0JfQotCXByaXZhdGUgU3RyaW5nIGdldE5hbWVzcGFjZSgpCi0JewotCQlyZXR1cm4gbW9kZWwuZ2V0UGx1Z2luQmFzZSgpLmdldElkKCk7Ci0JfQotCXByaXZhdGUgU3RyaW5nIGdldFNlbGVjdGVkQmVoYXZpb3VyQ2xhc3MoKSB7Ci0JCWlmKGlzRXh0ZXJuYWxTZWxlY3RlZCgpKQotCQkJcmV0dXJuICJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5pbnRlcm5hbC5FeHRlcm5hbFNlcnZlckJlaGF2aW91ciI7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuICJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5pbnRlcm5hbC5HZW5lcmljU2VydmVyQmVoYXZpb3VyIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0V4dGVybmFsU2VsZWN0ZWQoKXsKLQkJU3RyaW5nIHNlbGVjdGVkVHlwZSA9IGdldFN0cmluZ09wdGlvbihLRVlfU0VSVkVSX0xBVU5DSFRZUEUpOwotCQlyZXR1cm4gImV4dGVybmFsIi5lcXVhbHMoc2VsZWN0ZWRUeXBlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFNlbGVjdGVkQ29uZmlnVHlwZSgpewotCQlpZihpc0V4dGVybmFsU2VsZWN0ZWQoKSkKLQkJCXJldHVybiAib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuRXh0ZXJuYWxMYXVuY2hDb25maWd1cmF0aW9uVHlwZSI7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuICJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5sYXVuY2hDb25maWd1cmF0aW9uVHlwZSI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHJvdGVjdGVkIFJlc291cmNlQnVuZGxlIGdldFBsdWdpblJlc291cmNlQnVuZGxlKCl7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nW10gZ2V0TmV3RmlsZXMoKXsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXXsiaWNvbnMvIiwgInNlcnZlci8iLCJidWlsZGZpbGVzLyJ9OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VXNlZEV4dGVuc2lvblBvaW50KCl7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZU9wdGlvbnMoVGVtcGxhdGVPcHRpb24gY2hhbmdlZCl7Ci0JCWlmKGNoYW5nZWQuaXNSZXF1aXJlZCgpICYmIGNoYW5nZWQuaXNFbXB0eSgpKXsKLQkJCWZsYWdNaXNzaW5nUmVxdWlyZWRPcHRpb24oY2hhbmdlZCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJVGVtcGxhdGVPcHRpb25bXSBvcHRpb25zID0gZ2V0T3B0aW9ucygwKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvcHRpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZihvcHRpb25zW2ldLmlzUmVxdWlyZWQoKSAmJiBvcHRpb25zW2ldLmlzRW1wdHkoKSl7Ci0JCQkJZmxhZ01pc3NpbmdSZXF1aXJlZE9wdGlvbihvcHRpb25zW2ldKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJcmVzZXRQYWdlU3RhdGUoKTsKLQl9Ci0JCi0JCi0JCi0JcHVibGljIHZvaWQgYWRkUGFnZXMoV2l6YXJkIHdpemFyZCkgewotCQlXaXphcmRQYWdlIHBhZ2UgPSBjcmVhdGVQYWdlKDApOwotCQlwYWdlLnNldFRpdGxlKE1lc3NhZ2VzLnBhZ2VUaXRsZSk7Ci0JCXBhZ2Uuc2V0RGVzY3JpcHRpb24oTWVzc2FnZXMucGFnZURlc2NyaXB0aW9uKTsKLQkJd2l6YXJkLmFkZFBhZ2UocGFnZSk7Ci0JCW1hcmtQYWdlc0FkZGVkKCk7Ci0JfQotCQotCQotIAotCXByb3RlY3RlZCBVUkwgZ2V0SW5zdGFsbFVSTCgpIHsKLQkJcmV0dXJuIFNlcnZlclBkZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0RW50cnkoIi8iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wZGUudWkudGVtcGxhdGVzLkFic3RyYWN0VGVtcGxhdGVTZWN0aW9uI2dldERlcGVuZGVuY2llcyhqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJUGx1Z2luUmVmZXJlbmNlW10gZ2V0RGVwZW5kZW5jaWVzKFN0cmluZyBzY2hlbWFWZXJzaW9uKSB7Ci0JCUlQbHVnaW5SZWZlcmVuY2VbXSBkZXAgPSBuZXcgSVBsdWdpblJlZmVyZW5jZVs0XTsKLQkJZGVwWzBdID0gbmV3IFBsdWdpblJlZmVyZW5jZSgib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIiwgbnVsbCwgMCk7IC8vJE5PTi1OTFMtMSQKLQkJZGVwWzFdID0gbmV3IFBsdWdpblJlZmVyZW5jZSgib3JnLmVjbGlwc2UudWkiLCBudWxsLCAwKTsgLy8kTk9OLU5MUy0xJAotCQlkZXBbMl0gPSBuZXcgUGx1Z2luUmVmZXJlbmNlKCJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZSIsIG51bGwsIDApOyAvLyROT04tTkxTLTEkCi0JCWRlcFszXSA9IG5ldyBQbHVnaW5SZWZlcmVuY2UoIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aSIsIG51bGwsIDApOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBkZXA7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRWYWx1ZShTdHJpbmcgdmFyaWFibGUpIHsKLQkJcmV0dXJuIHN1cGVyLmdldFZhbHVlKHZhcmlhYmxlKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucGRlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvcGRlL2ludGVybmFsL01lc3NhZ2VzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucGRlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL2dlbmVyaWMvcGRlL2ludGVybmFsL01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmMzU3ZWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnBkZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3BkZS9pbnRlcm5hbC9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEV0ZXJhdGlvbiBBLlMuIGFuZCBHb3JrZW0gRXJjYW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogR29ya2VtIEVyY2FuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgICAgICAgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucGRlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIE1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnBkZS5pbnRlcm5hbC5tZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgTWVzc2FnZXMoKSB7Ci0JfQotCi0Jc3RhdGljIHsKLQkJLy8gaW5pdGlhbGl6ZSByZXNvdXJjZSBidW5kbGUKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgTWVzc2FnZXMuY2xhc3MpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxhYmVsSmF2YUxhdW5jaENvbmZpZ3VyYXRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsYWJlbEV4dGVybmFsTGF1bmNoQ29uZmlndXJhdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxhYmVsU2VydmVyTmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxhYmVsU2VydmVyVmVuZG9yOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbGFiZWxTZXJ2ZXJWZXNpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsYWJlbExhdW5jaFR5cGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsYWJlbFN0YXJ0QmVmb3JlUHVibGlzaDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhZ2VUaXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhZ2VEZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdpbmRvd1RpdGxlV2l6YXJkOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnBkZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3BkZS9pbnRlcm5hbC9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnBkZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci9nZW5lcmljL3BkZS9pbnRlcm5hbC9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODkwY2U5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wZGUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9wZGUvaW50ZXJuYWwvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSBFdGVyYXRpb24gQS5TLiBhbmQgR29ya2VtIEVyY2FuLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotIyBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOiBHb3JrZW0gRXJjYW4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgICAgICAgICAgICAgICAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotbGFiZWxKYXZhTGF1bmNoQ29uZmlndXJhdGlvbj1KYXZhIGxhdW5jaCBjb2ZpZ3VyYXRpb24KLWxhYmVsRXh0ZXJuYWxMYXVuY2hDb25maWd1cmF0aW9uPUV4dGVybmFsIGxhdW5jaCBjb25maWd1cmF0aW9uCi1sYWJlbFNlcnZlck5hbWU9U2VydmVyIE5hbWUKLWxhYmVsU2VydmVyVmVuZG9yPVNlcnZlciBWZW5kb3IKLWxhYmVsU2VydmVyVmVzaW9uPVNlcnZlciBWZXJzaW9uCi1sYWJlbExhdW5jaFR5cGU9TGF1bmNoIHR5cGUKLWxhYmVsU3RhcnRCZWZvcmVQdWJsaXNoPVN0YXJ0IEJlZm9yZSBwdWJsaXNoCi1wYWdlVGl0bGU9R2VuZXJpYyBTZXJ2ZXIgUGx1Zy1pbgotcGFnZURlc2NyaXB0aW9uPUNyZWF0ZSBhIG5ldyBHZW5lcmljIHNlcnZlciBwbHVnLWluCi13aW5kb3dUaXRsZVdpemFyZD1OZXcgR2VuZXJpYyBTZXJ2ZXIgcGx1Zy1pbgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnBkZS90ZW1wbGF0ZXNfMy4wL2dlbmVyaWNzZXJ2ZXIvYnVpbGRmaWxlcy8kc2VydmVyX25hbWUkLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wZGUvdGVtcGxhdGVzXzMuMC9nZW5lcmljc2VydmVyL2J1aWxkZmlsZXMvJHNlcnZlcl9uYW1lJC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3MjBjYTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnBkZS90ZW1wbGF0ZXNfMy4wL2dlbmVyaWNzZXJ2ZXIvYnVpbGRmaWxlcy8kc2VydmVyX25hbWUkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLTxwcm9qZWN0IG5hbWU9ImRlcGxveWV4dGVuc2lvbiIgIGRlZmF1bHQ9ImRlcGxveS5qMmVlLndlYiIgIGJhc2VkaXI9Ii4iPgotCTx0YXJnZXQgbmFtZT0iZGVwbG95LmoyZWUud2ViIj4KLQkJPGphciBkZXN0ZmlsZT0iJHtwcm9qZWN0LndvcmtpbmcuZGlyfS8ke21vZHVsZS5uYW1lfS53YXIiPiAKLQkJCTx6aXBmaWxlc2V0IGRpcj0iJHttb2R1bGUuZGlyfSI+Ci0JICAgICAgICAJPGluY2x1ZGUgbmFtZT0iKiovKi4qIi8+Ci0JCQkJPGV4Y2x1ZGUgbmFtZT0iKiovKi53YXIiLz4KLQkJCTwvemlwZmlsZXNldD4KLQkJPC9qYXI+Ci0gIAkJPG1vdmUgZmlsZT0iJHtwcm9qZWN0LndvcmtpbmcuZGlyfS8ke21vZHVsZS5uYW1lfS53YXIiIHRvZGlyPSIke3NlcnZlci5wdWJsaXNoLmRpcn0iLz4KLQk8L3RhcmdldD4KLQkKLQk8dGFyZ2V0IG5hbWU9ImRlcGxveS5qMmVlLmVqYiI+Ci0JCTxqYXIgZGVzdGZpbGU9IiR7cHJvamVjdC53b3JraW5nLmRpcn0vJHttb2R1bGUubmFtZX0uamFyIj4gCi0JCQk8emlwZmlsZXNldCBkaXI9IiR7bW9kdWxlLmRpcn0iPgotCSAgICAgICAgCTxpbmNsdWRlIG5hbWU9IioqLyouKiIvPgotCSAgICAgICAJCTxleGNsdWRlIG5hbWU9IioqLyouamF2YSIvPgotCQkJPC96aXBmaWxlc2V0PgotCQk8L2phcj4KLSAgCQk8bW92ZSBmaWxlPSIke3Byb2plY3Qud29ya2luZy5kaXJ9LyR7bW9kdWxlLm5hbWV9LmphciIgdG9kaXI9IiR7c2VydmVyLnB1Ymxpc2guZGlyfSIvPgotCTwvdGFyZ2V0PgotCTx0YXJnZXQgbmFtZT0iZGVwbG95LmoyZWUuZWFyIj4KLQkJPGphciBkZXN0ZmlsZT0iJHtwcm9qZWN0LndvcmtpbmcuZGlyfS8ke21vZHVsZS5uYW1lfS5lYXIiPiAKLQkJCTx6aXBmaWxlc2V0IGRpcj0iJHttb2R1bGUuZGlyfSI+Ci0JICAgICAgICAJPGluY2x1ZGUgbmFtZT0iKiovKi4qIi8+Ci0JICAgICAgIAkJPGV4Y2x1ZGUgbmFtZT0iKiovKi5qYXZhIi8+Ci0JCQk8L3ppcGZpbGVzZXQ+Ci0JCTwvamFyPgotICAJCTxtb3ZlIGZpbGU9IiR7cHJvamVjdC53b3JraW5nLmRpcn0vJHttb2R1bGUubmFtZX0uZWFyIiB0b2Rpcj0iJHtzZXJ2ZXIucHVibGlzaC5kaXJ9Ii8+Ci0JPC90YXJnZXQ+Ci0JCi0JPHRhcmdldCBuYW1lPSJ1bmRlcGxveS5qMmVlLndlYiI+Ci0JCTxkZWxldGUgZmlsZT0iJHtzZXJ2ZXIucHVibGlzaC5kaXJ9LyR7bW9kdWxlLm5hbWV9LndhciI+IDwvZGVsZXRlPgotCTwvdGFyZ2V0PgotCTx0YXJnZXQgbmFtZT0idW5kZXBsb3kuajJlZS5lamIiPgotCQk8ZGVsZXRlIGZpbGU9IiR7c2VydmVyLnB1Ymxpc2guZGlyfS8ke21vZHVsZS5uYW1lfS5qYXIiPiA8L2RlbGV0ZT4KLQk8L3RhcmdldD4KLQk8dGFyZ2V0IG5hbWU9InVuZGVwbG95LmoyZWUuZWFyIj4KLQkJPGRlbGV0ZSBmaWxlPSIke3NlcnZlci5wdWJsaXNoLmRpcn0vJHttb2R1bGUubmFtZX0uZWFyIj4gPC9kZWxldGU+Ci0JPC90YXJnZXQ+CQotCQotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wZGUvdGVtcGxhdGVzXzMuMC9nZW5lcmljc2VydmVyL2ljb25zL3NlcnZlci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucGRlL3RlbXBsYXRlc18zLjAvZ2VuZXJpY3NlcnZlci9pY29ucy9zZXJ2ZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTFhZTM5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci5wZGUvdGVtcGxhdGVzXzMuMC9nZW5lcmljc2VydmVyL2ljb25zL3NlcnZlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucGRlL3RlbXBsYXRlc18zLjAvZ2VuZXJpY3NlcnZlci9zZXJ2ZXJzLyRzZXJ2ZXJfbmFtZSQuc2VydmVyZGVmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnBkZS90ZW1wbGF0ZXNfMy4wL2dlbmVyaWNzZXJ2ZXIvc2VydmVycy8kc2VydmVyX25hbWUkLnNlcnZlcmRlZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzIyODcyYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIucGRlL3RlbXBsYXRlc18zLjAvZ2VuZXJpY3NlcnZlci9zZXJ2ZXJzLyRzZXJ2ZXJfbmFtZSQuc2VydmVyZGVmCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08dG5zOlNlcnZlclJ1bnRpbWUKLQl4bWxuczp0bnM9Imh0dHA6Ly9lY2xpcHNlLm9yZy9qc3Qvc2VydmVyL2dlbmVyaWMvU2VydmVyVHlwZURlZmluaXRpb24iCi0JeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLQl4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9lY2xpcHNlLm9yZy9qc3Qvc2VydmVyL2dlbmVyaWMvU2VydmVyVHlwZURlZmluaXRpb24gU2VydmVyVHlwZURlZmluaXRpb25TY2hlbWEueHNkICIKLQluYW1lPSJKQk9TUyAzLjIuMyIgdmVyc2lvbj0idjMuMi4zIj4KLTxwcm9wZXJ0eSBpZD0ic2VydmVyUm9vdERpcmVjdG9yeSIKLQlsYWJlbD0iJUFwcGxpY2F0aW9uU2VydmVyRGlyZWN0b3J5IgotCXR5cGU9ImRpcmVjdG9yeSIKLQljb250ZXh0PSJydW50aW1lIgotCWRlZmF1bHQ9Ii95b3VyX3NlcnZlcl9yb290L2FwcHNlcnZlcnMvamJvc3MtMy4yLjMiIC8+Ci08cHJvcGVydHkgaWQ9InNlcnZlckFkZHJlc3MiCi0JbGFiZWw9IiVzZXJ2ZXJBZGRyZXNzIgotCXR5cGU9InN0cmluZyIKLQljb250ZXh0PSJzZXJ2ZXIiCi0JZGVmYXVsdD0iMTI3LjAuMC4xIiAvPgotPHByb3BlcnR5IGlkPSJwb3J0IgotCWxhYmVsPSIlc2VydmVyUG9ydCIKLQl0eXBlPSJzdHJpbmciCi0JY29udGV4dD0ic2VydmVyIgotCWRlZmF1bHQ9IjgwODAiIC8+Ci08cHJvcGVydHkgaWQ9InNlcnZlckNvbmZpZyIKLQlsYWJlbD0iJWpib3NzMzIzc2VydmVyQ29uZmlnIgotCXR5cGU9InN0cmluZyIKLQljb250ZXh0PSJzZXJ2ZXIiCi0JZGVmYXVsdD0iZGVmYXVsdCIgLz4KLTxwcm9wZXJ0eSBpZD0iY2xhc3NQYXRoIgotCWxhYmVsPSIlc2VydmVyY2xhc3NQYXRoIgotCXR5cGU9ImRpcmVjdG9yeSIKLQljb250ZXh0PSJydW50aW1lIgotCWRlZmF1bHQ9Ii95b3VyX3NlcnZlcl9yb290L2FwcHNlcnZlcnMvamJvc3MtMy4yLjMiIC8+Ci0KLQk8cG9ydD4KLQkJPG5vPiQke3BvcnR9PC9ubz4KLQkJPG5hbWU+SHR0cDwvbmFtZT4KLQkJPHByb3RvY29sPmh0dHA8L3Byb3RvY29sPgotCTwvcG9ydD4KLQotCTxtb2R1bGU+Ci0JCTx0eXBlPmoyZWUud2ViPC90eXBlPgotCQk8cHVibGlzaERpcj4kJHtzZXJ2ZXJSb290RGlyZWN0b3J5fS9zZXJ2ZXIvJCR7c2VydmVyQ29uZmlnfS9kZXBsb3k8L3B1Ymxpc2hEaXI+Ci0JCTxwdWJsaXNoZXJSZWZlcmVuY2U+b3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmFudHB1Ymxpc2hlcjwvcHVibGlzaGVyUmVmZXJlbmNlPgotCTwvbW9kdWxlPgotCTxtb2R1bGU+Ci0JCTx0eXBlPmoyZWUuZWpiPC90eXBlPgotCQk8cHVibGlzaERpcj4kJHtzZXJ2ZXJSb290RGlyZWN0b3J5fS9zZXJ2ZXIvJCR7c2VydmVyQ29uZmlnfS9kZXBsb3k8L3B1Ymxpc2hEaXI+Ci0JCTxwdWJsaXNoZXJSZWZlcmVuY2U+b3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmFudHB1Ymxpc2hlcjwvcHVibGlzaGVyUmVmZXJlbmNlPgotCTwvbW9kdWxlPgotCTxtb2R1bGU+Ci0JCTx0eXBlPmoyZWUuZWFyPC90eXBlPgotCQk8cHVibGlzaERpcj4kJHtzZXJ2ZXJSb290RGlyZWN0b3J5fS9zZXJ2ZXIvJCR7c2VydmVyQ29uZmlnfS9kZXBsb3k8L3B1Ymxpc2hEaXI+Ci0JCTxwdWJsaXNoZXJSZWZlcmVuY2U+b3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmFudHB1Ymxpc2hlcjwvcHVibGlzaGVyUmVmZXJlbmNlPgotCTwvbW9kdWxlPgotCi0JPHByb2plY3Q+Ci0JCTxjbGFzc3BhdGhSZWZlcmVuY2U+amJvc3MucHJvamVjdDwvY2xhc3NwYXRoUmVmZXJlbmNlPgotCTwvcHJvamVjdD4KLQkKLQk8c3RhcnQ+Ci0JCTxtYWluQ2xhc3M+b3JnLmpib3NzLk1haW48L21haW5DbGFzcz4KLQkJPHdvcmtpbmdEaXJlY3Rvcnk+JCR7c2VydmVyUm9vdERpcmVjdG9yeX0vYmluPC93b3JraW5nRGlyZWN0b3J5PgotCQk8cHJvZ3JhbUFyZ3VtZW50cz4tYyAkJHtzZXJ2ZXJDb25maWd9PC9wcm9ncmFtQXJndW1lbnRzPgotCQk8dm1QYXJhbWV0ZXJzPjwvdm1QYXJhbWV0ZXJzPgotCQk8Y2xhc3NwYXRoUmVmZXJlbmNlPmpib3NzPC9jbGFzc3BhdGhSZWZlcmVuY2U+Ci0JPC9zdGFydD4KLQotCTxzdG9wPgotCQk8bWFpbkNsYXNzPm9yZy5qYm9zcy5TaHV0ZG93bjwvbWFpbkNsYXNzPgotCQk8d29ya2luZ0RpcmVjdG9yeT4kJHtzZXJ2ZXJSb290RGlyZWN0b3J5fS9iaW48L3dvcmtpbmdEaXJlY3Rvcnk+Ci0JCTxwcm9ncmFtQXJndW1lbnRzPi1TPC9wcm9ncmFtQXJndW1lbnRzPgotCQk8dm1QYXJhbWV0ZXJzPjwvdm1QYXJhbWV0ZXJzPgotCQk8Y2xhc3NwYXRoUmVmZXJlbmNlPmpib3NzPC9jbGFzc3BhdGhSZWZlcmVuY2U+Ci0JPC9zdG9wPgotCTxwdWJsaXNoZXIgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5hbnRwdWJsaXNoZXIiPgotCQk8cHVibGlzaGVyZGF0YT4KLQkJCTxkYXRhbmFtZT5idWlsZC5maWxlPC9kYXRhbmFtZT4KLQkJCTxkYXRhdmFsdWU+L2J1aWxkZmlsZXMvamJvc3MzMjMueG1sPC9kYXRhdmFsdWU+Ci0JCTwvcHVibGlzaGVyZGF0YT4KLQkJPHB1Ymxpc2hlcmRhdGE+Ci0JCQk8ZGF0YW5hbWU+dGFyZ2V0LnB1Ymxpc2guajJlZS53ZWI8L2RhdGFuYW1lPgotCQkJPGRhdGF2YWx1ZT5kZXBsb3kuajJlZS53ZWI8L2RhdGF2YWx1ZT4KLQkJPC9wdWJsaXNoZXJkYXRhPgotCQk8cHVibGlzaGVyZGF0YT4KLQkJCTxkYXRhbmFtZT50YXJnZXQucHVibGlzaC5qMmVlLmVqYjwvZGF0YW5hbWU+Ci0JCQk8ZGF0YXZhbHVlPmRlcGxveS5qMmVlLmVqYjwvZGF0YXZhbHVlPgotCQk8L3B1Ymxpc2hlcmRhdGE+Ci0JCTxwdWJsaXNoZXJkYXRhPgotCQkJPGRhdGFuYW1lPnRhcmdldC51bnB1Ymxpc2guajJlZS53ZWI8L2RhdGFuYW1lPgotCQkJPGRhdGF2YWx1ZT51bmRlcGxveS5qMmVlLndlYjwvZGF0YXZhbHVlPgotCQk8L3B1Ymxpc2hlcmRhdGE+Ci0JCTxwdWJsaXNoZXJkYXRhPgotCQkJPGRhdGFuYW1lPnRhcmdldC51bnB1Ymxpc2guajJlZS5lamI8L2RhdGFuYW1lPgotCQkJPGRhdGF2YWx1ZT51bmRlcGxveS5qMmVlLmVqYjwvZGF0YXZhbHVlPgotCQk8L3B1Ymxpc2hlcmRhdGE+Ci0JCTxwdWJsaXNoZXJkYXRhPgotCQkJPGRhdGFuYW1lPnRhcmdldC5wdWJsaXNoLmoyZWUuZWFyPC9kYXRhbmFtZT4KLQkJCTxkYXRhdmFsdWU+ZGVwbG95LmoyZWUuZWFyPC9kYXRhdmFsdWU+Ci0JCTwvcHVibGlzaGVyZGF0YT4KLQkJPHB1Ymxpc2hlcmRhdGE+Ci0JCQk8ZGF0YW5hbWU+dGFyZ2V0LnVucHVibGlzaC5qMmVlLmVhcjwvZGF0YW5hbWU+Ci0JCQk8ZGF0YXZhbHVlPnVuZGVwbG95LmoyZWUuZWFyPC9kYXRhdmFsdWU+Ci0JCTwvcHVibGlzaGVyZGF0YT4JCQkJCi0JPC9wdWJsaXNoZXI+Ci0KLQk8Y2xhc3NwYXRoIGlkPSJqYm9zcyIgPgotCQk8YXJjaGl2ZSBwYXRoPSIkJHtjbGFzc1BhdGh9L2Jpbi9ydW4uamFyIiAvPgotCQk8YXJjaGl2ZSBwYXRoPSIkJHtjbGFzc1BhdGh9L2Jpbi9zaHV0ZG93bi5qYXIiIC8+Ci0JCTxhcmNoaXZlIHBhdGg9IiQke2NsYXNzUGF0aH0vY2xpZW50L2pib3NzLWoyZWUuamFyIiAvPgotCQk8YXJjaGl2ZSBwYXRoPSIkJHtjbGFzc1BhdGh9L3NlcnZlci8kJHtzZXJ2ZXJDb25maWd9L2xpYi9qYXZheC5zZXJ2bGV0LmphciIgLz4KLQkJPGFyY2hpdmUgcGF0aD0iJCR7Y2xhc3NQYXRofS9saWIvamJvc3MtYm9vdC5qYXIiIC8+Ci0JCTxhcmNoaXZlIHBhdGg9IiQke2NsYXNzUGF0aH0vbGliL2pib3NzLXN5c3RlbS5qYXIiIC8+Ci0JCTxhcmNoaXZlIHBhdGg9IiQke2NsYXNzUGF0aH0vbGliL2pib3NzLWpteC5qYXIiIC8+Ci0JCTxhcmNoaXZlIHBhdGg9IiQke2NsYXNzUGF0aH0vbGliL2pib3NzLWNvbW1vbi5qYXIiIC8+Ci0JCTxhcmNoaXZlIHBhdGg9IiQke2NsYXNzUGF0aH0vbGliL2NvbmN1cnJlbnQuamFyIiAvPgotCQk8YXJjaGl2ZSBwYXRoPSIkJHtjbGFzc1BhdGh9L3NlcnZlci8kJHtzZXJ2ZXJDb25maWd9L2xpYi9qYm9zcy5qYXIiIC8+Ci0JCTxhcmNoaXZlIHBhdGg9IiQke2NsYXNzUGF0aH0vc2VydmVyLyQke3NlcnZlckNvbmZpZ30vbGliL2pucHNlcnZlci5qYXIiIC8+Ci0JCTxhcmNoaXZlIHBhdGg9IiQke2NsYXNzUGF0aH0vc2VydmVyLyQke3NlcnZlckNvbmZpZ30vbGliL2pwbC1wYXR0ZXJuLmphciIgLz4KLQkJPGFyY2hpdmUgcGF0aD0iJCR7Y2xhc3NQYXRofS9zZXJ2ZXIvJCR7c2VydmVyQ29uZmlnfS9saWIvanBsLXV0aWwuamFyIiAvPgotCQk8YXJjaGl2ZSBwYXRoPSIkJHtjbGFzc1BhdGh9L3NlcnZlci8kJHtzZXJ2ZXJDb25maWd9L2xpYi9qYm9zcy10cmFuc2FjdGlvbi5qYXIiIC8+Ci0JCTxhcmNoaXZlIHBhdGg9IiQke2NsYXNzUGF0aH0vc2VydmVyLyQke3NlcnZlckNvbmZpZ30vbGliL2JjZWwuamFyIiAvPgotCQk8YXJjaGl2ZSBwYXRoPSIkJHtjbGFzc1BhdGh9L2xpYi9qZG9tLmphciIgLz4KLQkJPGFyY2hpdmUgcGF0aD0iJCR7Y2xhc3NQYXRofS9saWIveGVyY2VzSW1wbC5qYXIiIC8+Ci0JCTxhcmNoaXZlIHBhdGg9IiQke2NsYXNzUGF0aH0vbGliL3htbC1hcGlzLmphciIgLz4KLQkJPGFyY2hpdmUgcGF0aD0iJCR7Y2xhc3NQYXRofS9saWIvZ251LXJlZ2V4cC5qYXIiIC8+Ci0JCTxhcmNoaXZlIHBhdGg9IiQke2NsYXNzUGF0aH0vbGliL2dldG9wdC5qYXIiIC8+Ci0JPC9jbGFzc3BhdGg+Ci0KLQk8Y2xhc3NwYXRoIGlkPSJqYm9zcy5wcm9qZWN0IiA+Ci0JCTxhcmNoaXZlIHBhdGg9IiQke2NsYXNzUGF0aH0vY2xpZW50L2pib3NzLWoyZWUuamFyIiAvPgotCQk8YXJjaGl2ZSBwYXRoPSIkJHtjbGFzc1BhdGh9L3NlcnZlci9kZWZhdWx0L2xpYi9qYXZheC5zZXJ2bGV0LmphciIgLz4KLQkJPGFyY2hpdmUgcGF0aD0iJCR7Y2xhc3NQYXRofS9zZXJ2ZXIvZGVmYXVsdC9saWIvYWN0aXZhdGlvbi5qYXIiIC8+Ci0JCTxhcmNoaXZlIHBhdGg9IiQke2NsYXNzUGF0aH0vc2VydmVyL2RlZmF1bHQvbGliL21haWwuamFyIiAvPgotCTwvY2xhc3NwYXRoPgotCTxqbmRpQ29ubmVjdGlvbj4KLQkJPHByb3ZpZGVyVXJsPmpucDovLyQke3NlcnZlckFkZHJlc3N9OjEwOTk8L3Byb3ZpZGVyVXJsPgotCQk8aW5pdGlhbENvbnRleHRGYWN0b3J5Pm9yZy5qbnAuaW50ZXJmYWNlcy5OYW1pbmdDb250ZXh0RmFjdG9yeTwvaW5pdGlhbENvbnRleHRGYWN0b3J5PgotCQk8am5kaVByb3BlcnR5PgotCQkJPG5hbWU+PC9uYW1lPgotCQkJPHZhbHVlPjwvdmFsdWU+Ci0JCTwvam5kaVByb3BlcnR5PgotCTwvam5kaUNvbm5lY3Rpb24+Ci08L3RuczpTZXJ2ZXJSdW50aW1lPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxNmNiODEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InRvbWNhdGNvcmUvIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyMzg2OTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLWJpbgotYnVpbGQueG1sCi1vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlXzMuMC4wLmphcgotdG9tY2F0Y29yZS5qYXIKLXRlbXAuZm9sZGVyCi1AZG90Ci1zcmMuemlwCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvLm9wdGlvbnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlZWFlNTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLy5vcHRpb25zCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jIERlYnVnZ2luZyBvcHRpb25zIGZvciB0aGUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZSBwbHVnaW4KLQotIyBUdXJuIG9uIGdlbmVyYWwgZGVidWdnaW5nCi1vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL2RlYnVnPXRydWUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFiYmU0Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI5MjA5ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLlRvbWNhdFBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aSIsCi0gb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5jb21tYW5kO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpIiwKLSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aSIsCi0gb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC54bWwuc2VydmVyMzI7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkiLAotIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sLnNlcnZlcjQwO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpIgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcywKLSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLAotIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUsCi0gb3JnLmVjbGlwc2UuamR0LmNvcmUsCi0gb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZywKLSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUsCi0gb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlCi1FY2xpcHNlLUF1dG9TdGFydDogdHJ1ZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL2Fib3V0Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY2Yjk2Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5GZWJydWFyeSAyNCwgMjAwNTwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNmMTkzYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHZlcmlmeUluc3RhbGwucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICAub3B0aW9ucyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCi1iaW4uZXhjbHVkZXMgPSBiaW4vKiosXAotICAgICAgICAgICAgICAgQGRvdC8qKixcCi0gICAgICAgICAgICAgICB0ZW1wLmZvbGRlci8qKgotc3JjLmluY2x1ZGVzID0gc2NoZW1hLwotc291cmNlLi4gPSB0b21jYXRjb3JlLwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjMyYTVhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wbHVnaW5OYW1lPUFwYWNoZSBUb21jYXQgU3VwcG9ydAotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgLS0tLS0tLS0tLS0tLS0tIFJ1bnRpbWUgVHlwZXMgLS0tLS0tLS0tLS0tLS0tCi1hcGFjaGU9QXBhY2hlCi1ydW50aW1lVHlwZVRvbWNhdDMyTGFiZWw9QXBhY2hlIFRvbWNhdCB2My4yCi1ydW50aW1lVHlwZVRvbWNhdDMyRGVzY3JpcHRpb249QXBhY2hlIFRvbWNhdCB2My4yIHN1cHBvcnRzIEoyRUUgMS4yIFdlYiBtb2R1bGVzLgotcnVudGltZVR5cGVUb21jYXQ0MExhYmVsPUFwYWNoZSBUb21jYXQgdjQuMAotcnVudGltZVR5cGVUb21jYXQ0MERlc2NyaXB0aW9uPUFwYWNoZSBUb21jYXQgdjQuMCBzdXBwb3J0cyBKMkVFIDEuMiBhbmQgMS4zIFdlYiBtb2R1bGVzLgotcnVudGltZVR5cGVUb21jYXQ0MUxhYmVsPUFwYWNoZSBUb21jYXQgdjQuMQotcnVudGltZVR5cGVUb21jYXQ0MURlc2NyaXB0aW9uPUFwYWNoZSBUb21jYXQgdjQuMSBzdXBwb3J0cyBKMkVFIDEuMiBhbmQgMS4zIFdlYiBtb2R1bGVzLgotcnVudGltZVR5cGVUb21jYXQ1MExhYmVsPUFwYWNoZSBUb21jYXQgdjUuMAotcnVudGltZVR5cGVUb21jYXQ1MERlc2NyaXB0aW9uPUFwYWNoZSBUb21jYXQgdjUuMCBzdXBwb3J0cyBKMkVFIDEuMiwgMS4zLCBhbmQgMS40IFdlYiBtb2R1bGVzLgotcnVudGltZVR5cGVUb21jYXQ1NUxhYmVsPUFwYWNoZSBUb21jYXQgdjUuNQotcnVudGltZVR5cGVUb21jYXQ1NURlc2NyaXB0aW9uPUFwYWNoZSBUb21jYXQgdjUuNSBzdXBwb3J0cyBKMkVFIDEuMiwgMS4zLCBhbmQgMS40IFdlYiBtb2R1bGVzLgotCi0jIHJ1bnRpbWUgdGFyZ2V0Ci10YXJnZXQzMnJ1bnRpbWU9VG9tY2F0IHYzLjIgcnVudGltZQotdGFyZ2V0NDBydW50aW1lPVRvbWNhdCB2NC4wIHJ1bnRpbWUKLXRhcmdldDQxcnVudGltZT1Ub21jYXQgdjQuMSBydW50aW1lCi10YXJnZXQ1MHJ1bnRpbWU9VG9tY2F0IHY1LjAgcnVudGltZQotdGFyZ2V0NTVydW50aW1lPVRvbWNhdCB2NS41IHJ1bnRpbWUKLQotIyAtLS0tLS0tLS0tLS0tLS0gU2VydmVycyAtLS0tLS0tLS0tLS0tLS0KLXRvbWNhdDMyU2VydmVyVHlwZT1Ub21jYXQgdjMuMiBTZXJ2ZXIKLXRvbWNhdDMyU2VydmVyRGVzY3JpcHRpb249UHVibGlzaGVzIGFuZCBydW5zIEoyRUUgV2ViIHByb2plY3RzIGFuZCBzZXJ2ZXIgY29uZmlndXJhdGlvbnMgdG8gYSBsb2NhbCBUb21jYXQgc2VydmVyLgotCi10b21jYXQ0MFNlcnZlclR5cGU9VG9tY2F0IHY0LjAgU2VydmVyCi10b21jYXQ0MFNlcnZlckRlc2NyaXB0aW9uPVB1Ymxpc2hlcyBhbmQgcnVucyBKMkVFIFdlYiBwcm9qZWN0cyBhbmQgc2VydmVyIGNvbmZpZ3VyYXRpb25zIHRvIGEgbG9jYWwgVG9tY2F0IHNlcnZlci4KLQotdG9tY2F0NDFTZXJ2ZXJUeXBlPVRvbWNhdCB2NC4xIFNlcnZlcgotdG9tY2F0NDFTZXJ2ZXJEZXNjcmlwdGlvbj1QdWJsaXNoZXMgYW5kIHJ1bnMgSjJFRSBXZWIgcHJvamVjdHMgYW5kIHNlcnZlciBjb25maWd1cmF0aW9ucyB0byBhIGxvY2FsIFRvbWNhdCBzZXJ2ZXIuCi0KLXRvbWNhdDUwU2VydmVyVHlwZT1Ub21jYXQgdjUuMCBTZXJ2ZXIKLXRvbWNhdDUwU2VydmVyRGVzY3JpcHRpb249UHVibGlzaGVzIGFuZCBydW5zIEoyRUUgV2ViIHByb2plY3RzIGFuZCBzZXJ2ZXIgY29uZmlndXJhdGlvbnMgdG8gYSBsb2NhbCBUb21jYXQgc2VydmVyLgotCi10b21jYXQ1NVNlcnZlclR5cGU9VG9tY2F0IHY1LjUgU2VydmVyCi10b21jYXQ1NVNlcnZlckRlc2NyaXB0aW9uPVB1Ymxpc2hlcyBhbmQgcnVucyBKMkVFIFdlYiBwcm9qZWN0cyBhbmQgc2VydmVyIGNvbmZpZ3VyYXRpb25zIHRvIGEgbG9jYWwgVG9tY2F0IHNlcnZlci4KLQotdG9tY2F0TGF1bmNoQ29uZmlndXJhdGlvblR5cGU9QXBhY2hlIFRvbWNhdAotCi0jIC0tLS0tLS0tLS0tLS0tLSBHZW5lcmFsIC0tLS0tLS0tLS0tLS0tLQotY2FuQWRkTW9kdWxlPVdlYiBtb2R1bGUgY2FuIGJlIGFkZGVkIHRvIHRoZSBzZXJ2ZXIuCi1jYW5Nb2RpZnlNb2R1bGVzPVdlYiBtb2R1bGVzIGNhbiBiZSBtb2RpZmllZC4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS9wbHVnaW4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkOGFiZGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLQotPHBsdWdpbj4KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnJ1bnRpbWVUeXBlcyI+Ci0gICAgPHJ1bnRpbWVUeXBlCi0gICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnJ1bnRpbWUuMzIiCi0gICAgICAgbmFtZT0iJXJ1bnRpbWVUeXBlVG9tY2F0MzJMYWJlbCIKLSAgICAgICBkZXNjcmlwdGlvbj0iJXJ1bnRpbWVUeXBlVG9tY2F0MzJEZXNjcmlwdGlvbiIKLSAgICAgICB2ZW5kb3I9IiVhcGFjaGUiCi0gICAgICAgdmVyc2lvbj0iMy4yIgotICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLlRvbWNhdFJ1bnRpbWUiPgotICAgICAgIDxtb2R1bGVUeXBlCi0gICAgICAgICB0eXBlcz0ianN0LndlYiIKLSAgICAgICAgIHZlcnNpb25zPSIyLjIiLz4KLSAgICAgICA8bW9kdWxlVHlwZQotICAgICAgICAgdHlwZXM9ImpzdC51dGlsaXR5IgotICAgICAgICAgdmVyc2lvbnM9IjEuMCIvPgotICAgIDwvcnVudGltZVR5cGU+Ci0KLSAgICA8cnVudGltZVR5cGUKLSAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQucnVudGltZS40MCIKLSAgICAgICBuYW1lPSIlcnVudGltZVR5cGVUb21jYXQ0MExhYmVsIgotICAgICAgIGRlc2NyaXB0aW9uPSIlcnVudGltZVR5cGVUb21jYXQ0MERlc2NyaXB0aW9uIgotICAgICAgIHZlbmRvcj0iJWFwYWNoZSIKLSAgICAgICB2ZXJzaW9uPSI0LjAiCi0gICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuVG9tY2F0UnVudGltZSI+Ci0gICAgICAgPG1vZHVsZVR5cGUKLSAgICAgICAgIHR5cGVzPSJqc3Qud2ViIgotICAgICAgICAgdmVyc2lvbnM9IjIuMiwgMi4zIi8+Ci0gICAgICAgPG1vZHVsZVR5cGUKLSAgICAgICAgIHR5cGVzPSJqc3QudXRpbGl0eSIKLSAgICAgICAgIHZlcnNpb25zPSIxLjAiLz4KLSAgICA8L3J1bnRpbWVUeXBlPgotCi0gICAgPHJ1bnRpbWVUeXBlCi0gICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnJ1bnRpbWUuNDEiCi0gICAgICAgbmFtZT0iJXJ1bnRpbWVUeXBlVG9tY2F0NDFMYWJlbCIKLSAgICAgICBkZXNjcmlwdGlvbj0iJXJ1bnRpbWVUeXBlVG9tY2F0NDFEZXNjcmlwdGlvbiIKLSAgICAgICB2ZW5kb3I9IiVhcGFjaGUiCi0gICAgICAgdmVyc2lvbj0iNC4xIgotICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLlRvbWNhdFJ1bnRpbWUiPgotICAgICAgIDxtb2R1bGVUeXBlCi0gICAgICAgICB0eXBlcz0ianN0LndlYiIKLSAgICAgICAgIHZlcnNpb25zPSIyLjIsIDIuMyIvPgotICAgICAgIDxtb2R1bGVUeXBlCi0gICAgICAgICB0eXBlcz0ianN0LnV0aWxpdHkiCi0gICAgICAgICB2ZXJzaW9ucz0iMS4wIi8+Ci0gICAgPC9ydW50aW1lVHlwZT4KLQotICAgIDxydW50aW1lVHlwZQotICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5ydW50aW1lLjUwIgotICAgICAgIG5hbWU9IiVydW50aW1lVHlwZVRvbWNhdDUwTGFiZWwiCi0gICAgICAgZGVzY3JpcHRpb249IiVydW50aW1lVHlwZVRvbWNhdDUwRGVzY3JpcHRpb24iCi0gICAgICAgdmVuZG9yPSIlYXBhY2hlIgotICAgICAgIHZlcnNpb249IjUuMCIKLSAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5Ub21jYXRSdW50aW1lIj4KLSAgICAgICA8bW9kdWxlVHlwZQotICAgICAgICAgdHlwZXM9ImpzdC53ZWIiCi0gICAgICAgICB2ZXJzaW9ucz0iMi4yLCAyLjMsIDIuNCIvPgotICAgICAgIDxtb2R1bGVUeXBlCi0gICAgICAgICB0eXBlcz0ianN0LnV0aWxpdHkiCi0gICAgICAgICB2ZXJzaW9ucz0iMS4wIi8+Ci0gICAgPC9ydW50aW1lVHlwZT4KLQotICAgIDxydW50aW1lVHlwZQotICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5ydW50aW1lLjU1IgotICAgICAgIG5hbWU9IiVydW50aW1lVHlwZVRvbWNhdDU1TGFiZWwiCi0gICAgICAgZGVzY3JpcHRpb249IiVydW50aW1lVHlwZVRvbWNhdDU1RGVzY3JpcHRpb24iCi0gICAgICAgdmVuZG9yPSIlYXBhY2hlIgotICAgICAgIHZlcnNpb249IjUuNSIKLSAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5Ub21jYXRSdW50aW1lIj4KLSAgICAgICA8bW9kdWxlVHlwZQotICAgICAgICAgdHlwZXM9ImpzdC53ZWIiCi0gICAgICAgICB2ZXJzaW9ucz0iMi4yLCAyLjMsIDIuNCIvPgotICAgICAgIDxtb2R1bGVUeXBlCi0gICAgICAgICB0eXBlcz0ianN0LnV0aWxpdHkiCi0gICAgICAgICB2ZXJzaW9ucz0iMS4wIi8+Ci0gICAgPC9ydW50aW1lVHlwZT4KLSAgPC9leHRlbnNpb24+Ci0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnJ1bnRpbWVMb2NhdG9ycyI+Ci0gICAgPHJ1bnRpbWVMb2NhdG9yCi0gICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnJ1bnRpbWUubG9jYXRvciIKLSAgICAgICB0eXBlSWRzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5ydW50aW1lLioiCi0gICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuVG9tY2F0UnVudGltZUxvY2F0b3IiLz4KLSAgPC9leHRlbnNpb24+Ci0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLnJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcnMiPgotICAgICA8cnVudGltZUNsYXNzcGF0aFByb3ZpZGVyCi0gICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5ydW50aW1lVGFyZ2V0IgotICAgICAgICBydW50aW1lVHlwZUlkcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQucnVudGltZS4qIgotICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5Ub21jYXRSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXIiLz4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5zZXJ2ZXJUeXBlcyI+Ci0gICAgIDxzZXJ2ZXJUeXBlCi0gICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LjMyIgotICAgICAgIG5hbWU9IiV0b21jYXQzMlNlcnZlclR5cGUiCi0gICAgICAgZGVzY3JpcHRpb249IiV0b21jYXQzMlNlcnZlckRlc2NyaXB0aW9uIgotICAgICAgIHN1cHBvcnRzUmVtb3RlSG9zdHM9ImZhbHNlIgotICAgICAgIHJ1bnRpbWU9InRydWUiCi0gICAgICAgc3RhcnRUaW1lb3V0PSI0NTAwMCIKLSAgICAgICBzdG9wVGltZW91dD0iMTUwMDAiCi0gICAgICAgaW5pdGlhbFN0YXRlPSJzdG9wcGVkIgotICAgICAgIGhhc0NvbmZpZ3VyYXRpb249InRydWUiCi0gICAgICAgbGF1bmNoQ29uZmlnSWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUubGF1bmNoQ29uZmlndXJhdGlvblR5cGUiCi0gICAgICAgcnVudGltZVR5cGVJZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQucnVudGltZS4zMiIKLSAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5Ub21jYXRTZXJ2ZXIiCi0gICAgICAgYmVoYXZpb3VyQ2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuVG9tY2F0U2VydmVyQmVoYXZpb3VyIj4KLSAgICAgPC9zZXJ2ZXJUeXBlPgotICAgICA8c2VydmVyVHlwZQotICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC40MCIKLSAgICAgICBuYW1lPSIldG9tY2F0NDBTZXJ2ZXJUeXBlIgotICAgICAgIGRlc2NyaXB0aW9uPSIldG9tY2F0NDBTZXJ2ZXJEZXNjcmlwdGlvbiIKLSAgICAgICBzdXBwb3J0c1JlbW90ZUhvc3RzPSJmYWxzZSIKLSAgICAgICBydW50aW1lPSJ0cnVlIgotICAgICAgIHN0YXJ0VGltZW91dD0iNDUwMDAiCi0gICAgICAgc3RvcFRpbWVvdXQ9IjE1MDAwIgotICAgICAgIGluaXRpYWxTdGF0ZT0ic3RvcHBlZCIKLSAgICAgICBoYXNDb25maWd1cmF0aW9uPSJ0cnVlIgotICAgICAgIGxhdW5jaENvbmZpZ0lkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmxhdW5jaENvbmZpZ3VyYXRpb25UeXBlIgotICAgICAgIHJ1bnRpbWVUeXBlSWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnJ1bnRpbWUuNDAiCi0gICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuVG9tY2F0U2VydmVyIgotICAgICAgIGJlaGF2aW91ckNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLlRvbWNhdFNlcnZlckJlaGF2aW91ciI+Ci0gICAgIDwvc2VydmVyVHlwZT4KLSAgICAgPHNlcnZlclR5cGUKLSAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuNDEiCi0gICAgICAgbmFtZT0iJXRvbWNhdDQxU2VydmVyVHlwZSIKLSAgICAgICBkZXNjcmlwdGlvbj0iJXRvbWNhdDQxU2VydmVyRGVzY3JpcHRpb24iCi0gICAgICAgc3VwcG9ydHNSZW1vdGVIb3N0cz0iZmFsc2UiCi0gICAgICAgcnVudGltZT0idHJ1ZSIKLSAgICAgICBzdGFydFRpbWVvdXQ9IjQ1MDAwIgotICAgICAgIHN0b3BUaW1lb3V0PSIxNTAwMCIKLSAgICAgICBpbml0aWFsU3RhdGU9InN0b3BwZWQiCi0gICAgICAgaGFzQ29uZmlndXJhdGlvbj0idHJ1ZSIKLSAgICAgICBsYXVuY2hDb25maWdJZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5sYXVuY2hDb25maWd1cmF0aW9uVHlwZSIKLSAgICAgICBydW50aW1lVHlwZUlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5ydW50aW1lLjQxIgotICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLlRvbWNhdFNlcnZlciIKLSAgICAgICBiZWhhdmlvdXJDbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5Ub21jYXRTZXJ2ZXJCZWhhdmlvdXIiPgotICAgICA8L3NlcnZlclR5cGU+Ci0gICAgIDxzZXJ2ZXJUeXBlCi0gICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LjUwIgotICAgICAgIG5hbWU9IiV0b21jYXQ1MFNlcnZlclR5cGUiCi0gICAgICAgZGVzY3JpcHRpb249IiV0b21jYXQ1MFNlcnZlckRlc2NyaXB0aW9uIgotICAgICAgIHN1cHBvcnRzUmVtb3RlSG9zdHM9ImZhbHNlIgotICAgICAgIHJ1bnRpbWU9InRydWUiCi0gICAgICAgc3RhcnRUaW1lb3V0PSI0NTAwMCIKLSAgICAgICBzdG9wVGltZW91dD0iMTUwMDAiCi0gICAgICAgaW5pdGlhbFN0YXRlPSJzdG9wcGVkIgotICAgICAgIGhhc0NvbmZpZ3VyYXRpb249InRydWUiCi0gICAgICAgbGF1bmNoQ29uZmlnSWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUubGF1bmNoQ29uZmlndXJhdGlvblR5cGUiCi0gICAgICAgcnVudGltZVR5cGVJZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQucnVudGltZS41MCIKLSAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5Ub21jYXRTZXJ2ZXIiCi0gICAgICAgYmVoYXZpb3VyQ2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuVG9tY2F0U2VydmVyQmVoYXZpb3VyIj4KLSAgICAgPC9zZXJ2ZXJUeXBlPgotICAgICA8c2VydmVyVHlwZQotICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC41NSIKLSAgICAgICBuYW1lPSIldG9tY2F0NTVTZXJ2ZXJUeXBlIgotICAgICAgIGRlc2NyaXB0aW9uPSIldG9tY2F0NTVTZXJ2ZXJEZXNjcmlwdGlvbiIKLSAgICAgICBzdXBwb3J0c1JlbW90ZUhvc3RzPSJmYWxzZSIKLSAgICAgICBydW50aW1lPSJ0cnVlIgotICAgICAgIHN0YXJ0VGltZW91dD0iNDUwMDAiCi0gICAgICAgc3RvcFRpbWVvdXQ9IjE1MDAwIgotICAgICAgIGluaXRpYWxTdGF0ZT0ic3RvcHBlZCIKLSAgICAgICBoYXNDb25maWd1cmF0aW9uPSJ0cnVlIgotICAgICAgIGxhdW5jaENvbmZpZ0lkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmxhdW5jaENvbmZpZ3VyYXRpb25UeXBlIgotICAgICAgIHJ1bnRpbWVUeXBlSWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnJ1bnRpbWUuNTUiCi0gICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuVG9tY2F0U2VydmVyIgotICAgICAgIGJlaGF2aW91ckNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLlRvbWNhdFNlcnZlckJlaGF2aW91ciI+Ci0gICAgIDwvc2VydmVyVHlwZT4KLSAgPC9leHRlbnNpb24+Ci0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnNlcnZlckxvY2F0b3JzIj4KLSAgICA8c2VydmVyTG9jYXRvcgotICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5zZXJ2ZXIubG9jYXRvciIKLSAgICAgICBzdXBwb3J0c1JlbW90ZUhvc3RzPSJmYWxzZSIKLSAgICAgICB0eXBlSWRzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC4qIgotICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLlRvbWNhdFNlcnZlckxvY2F0b3IiLz4KLSAgPC9leHRlbnNpb24+Ci0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmxhdW5jaGFibGVBZGFwdGVycyI+Ci0gICAgIDxsYXVuY2hhYmxlQWRhcHRlcgotICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5Ub21jYXRMYXVuY2hhYmxlQWRhcHRlckRlbGVnYXRlIgotICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQud2ViIi8+Ci0gIDwvZXh0ZW5zaW9uPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuc291cmNlUGF0aENvbXB1dGVycyI+Ci0gICAgIDxzb3VyY2VQYXRoQ29tcHV0ZXIKLSAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuc291cmNlUGF0aENvbXB1dGVyIgotICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5Ub21jYXRTb3VyY2VQYXRoQ29tcHV0ZXJEZWxlZ2F0ZSIvPgotICA8L2V4dGVuc2lvbj4KLQotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLmxhdW5jaENvbmZpZ3VyYXRpb25UeXBlcyI+Ci0gICAgIDxsYXVuY2hDb25maWd1cmF0aW9uVHlwZQotICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5sYXVuY2hDb25maWd1cmF0aW9uVHlwZSIKLSAgICAgICAgbmFtZT0iJXRvbWNhdExhdW5jaENvbmZpZ3VyYXRpb25UeXBlIgotICAgICAgICBkZWxlZ2F0ZT0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5Ub21jYXRMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGUiCi0gICAgICAgIG1vZGVzPSJydW4sIGRlYnVnIgotICAgICAgICBzb3VyY2VMb2NhdG9ySWQ9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuc291cmNlTG9jYXRvci5KYXZhU291cmNlTG9va3VwRGlyZWN0b3IiCi0gICAgICAgIHNvdXJjZVBhdGhDb21wdXRlcklkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLnNvdXJjZVBhdGhDb21wdXRlciIvPgotICA8L2V4dGVuc2lvbj4KLQotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUucHVibGlzaFRhc2tzIj4KLSAgICAgPHB1Ymxpc2hUYXNrCi0gICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmNvbnRleHRUYXNrIgotICAgICAgICB0eXBlSWRzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC4qIgotICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5Db250ZXh0UHVibGlzaFRhc2tEZWxlZ2F0ZSIvPgotICAgICA8cHVibGlzaFRhc2sKLSAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUucHVibGlzaFRhc2siCi0gICAgICAgIHR5cGVJZHM9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LioiCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLlB1Ymxpc2hUYXNrIi8+Ci0gIDwvZXh0ZW5zaW9uPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWVzIj4KLSAgICA8cnVudGltZS1jb21wb25lbnQtdHlwZQotICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdCIvPgotCi0gICAgPHJ1bnRpbWUtY29tcG9uZW50LXZlcnNpb24KLSAgICAgICB0eXBlPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdCIKLSAgICAgICB2ZXJzaW9uPSIzLjIiLz4KLQotICAgIDxydW50aW1lLWNvbXBvbmVudC12ZXJzaW9uCi0gICAgICAgdHlwZT0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQiCi0gICAgICAgdmVyc2lvbj0iNC4wIi8+Ci0KLSAgICA8cnVudGltZS1jb21wb25lbnQtdmVyc2lvbgotICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0IgotICAgICAgIHZlcnNpb249IjQuMSIvPgotCi0gICAgPHJ1bnRpbWUtY29tcG9uZW50LXZlcnNpb24KLSAgICAgICB0eXBlPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdCIKLSAgICAgICB2ZXJzaW9uPSI1LjAiLz4KLQotICAgIDxydW50aW1lLWNvbXBvbmVudC12ZXJzaW9uCi0gICAgICAgdHlwZT0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQiCi0gICAgICAgdmVyc2lvbj0iNS41Ii8+Ci0KLSAgICA8YWRhcHRlcj4KLSAgICAgIDxydW50aW1lLWNvbXBvbmVudAotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0Ii8+Ci0gICAgICA8ZmFjdG9yeQotICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5SdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXIkRmFjdG9yeSIvPgotICAgICAgPHR5cGUKLSAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JQ2xhc3NwYXRoUHJvdmlkZXIiLz4KLSAgICA8L2FkYXB0ZXI+Ci0KLSAgICA8c3VwcG9ydGVkPgotICAgICAgPHJ1bnRpbWUtY29tcG9uZW50Ci0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQiCi0gICAgICAgICB2ZXJzaW9uPSIzLjIiLz4KLSAgICAgIDxmYWNldAotICAgICAgICAgaWQ9ImpzdC53ZWIiCi0gICAgICAgICB2ZXJzaW9uPSIyLjIiLz4KLSAgICAgIDxmYWNldAotICAgICAgICAgaWQ9ImpzdC51dGlsaXR5IgotICAgICAgICAgdmVyc2lvbj0iMS4wIi8+Ci0gICAgPC9zdXBwb3J0ZWQ+Ci0KLSAgICA8c3VwcG9ydGVkPgotICAgICAgPHJ1bnRpbWUtY29tcG9uZW50Ci0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQiCi0gICAgICAgICB2ZXJzaW9uPSI0LjAiLz4KLSAgICAgIDxmYWNldAotICAgICAgICAgaWQ9ImpzdC53ZWIiCi0gICAgICAgICB2ZXJzaW9uPSIyLjIsMi4zIi8+Ci0gICAgICA8ZmFjZXQKLSAgICAgICAgIGlkPSJqc3QudXRpbGl0eSIKLSAgICAgICAgIHZlcnNpb249IjEuMCIvPgotICAgIDwvc3VwcG9ydGVkPgotCi0gICAgPHN1cHBvcnRlZD4KLSAgICAgIDxydW50aW1lLWNvbXBvbmVudAotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0IgotICAgICAgICAgdmVyc2lvbj0iNC4xIi8+Ci0gICAgICA8ZmFjZXQKLSAgICAgICAgIGlkPSJqc3Qud2ViIgotICAgICAgICAgdmVyc2lvbj0iMi4yLDIuMyIvPgotICAgICAgPGZhY2V0Ci0gICAgICAgICBpZD0ianN0LnV0aWxpdHkiCi0gICAgICAgICB2ZXJzaW9uPSIxLjAiLz4KLSAgICA8L3N1cHBvcnRlZD4KLQotICAgIDxzdXBwb3J0ZWQ+Ci0gICAgICA8cnVudGltZS1jb21wb25lbnQKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdCIKLSAgICAgICAgIHZlcnNpb249IjUuMCIvPgotICAgICAgPGZhY2V0Ci0gICAgICAgICBpZD0ianN0LndlYiIKLSAgICAgICAgIHZlcnNpb249IjIuMiwyLjMsMi40Ii8+Ci0gICAgICA8ZmFjZXQKLSAgICAgICAgIGlkPSJqc3QudXRpbGl0eSIKLSAgICAgICAgIHZlcnNpb249IjEuMCIvPgotICAgIDwvc3VwcG9ydGVkPgotCi0gICAgPHN1cHBvcnRlZD4KLSAgICAgIDxydW50aW1lLWNvbXBvbmVudAotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0IgotICAgICAgICAgdmVyc2lvbj0iNS41Ii8+Ci0gICAgICA8ZmFjZXQKLSAgICAgICAgIGlkPSJqc3Qud2ViIgotICAgICAgICAgdmVyc2lvbj0iMi4yLDIuMywyLjQiLz4KLSAgICAgIDxmYWNldAotICAgICAgICAgaWQ9ImpzdC51dGlsaXR5IgotICAgICAgICAgdmVyc2lvbj0iMS4wIi8+Ci0gICAgPC9zdXBwb3J0ZWQ+Ci0gIDwvZXh0ZW5zaW9uPgotICAKLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLnJ1bnRpbWVGYWNldE1hcHBpbmdzIj4KLSAgICA8cnVudGltZUZhY2V0TWFwcGluZwotICAgICAgcnVudGltZVR5cGVJZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQucnVudGltZS4zMiIKLSAgICAgIHJ1bnRpbWUtY29tcG9uZW50PSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdCIKLSAgICAgIHZlcnNpb249IjMuMiIvPgotICAgIDxydW50aW1lRmFjZXRNYXBwaW5nCi0gICAgICBydW50aW1lVHlwZUlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5ydW50aW1lLjQwIgotICAgICAgcnVudGltZS1jb21wb25lbnQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0IgotICAgICAgdmVyc2lvbj0iNC4wIi8+Ci0gICAgPHJ1bnRpbWVGYWNldE1hcHBpbmcKLSAgICAgIHJ1bnRpbWVUeXBlSWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnJ1bnRpbWUuNDEiCi0gICAgICBydW50aW1lLWNvbXBvbmVudD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQiCi0gICAgICB2ZXJzaW9uPSI0LjEiLz4KLSAgICA8cnVudGltZUZhY2V0TWFwcGluZwotICAgICAgcnVudGltZVR5cGVJZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQucnVudGltZS41MCIKLSAgICAgIHJ1bnRpbWUtY29tcG9uZW50PSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdCIKLSAgICAgIHZlcnNpb249IjUuMCIvPgotICAgIDxydW50aW1lRmFjZXRNYXBwaW5nCi0gICAgICBydW50aW1lVHlwZUlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5ydW50aW1lLjU1IgotICAgICAgcnVudGltZS1jb21wb25lbnQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0IgotICAgICAgdmVyc2lvbj0iNS41Ii8+Ci0gIDwvZXh0ZW5zaW9uPgotPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9DbGFzc0RldGVjdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL0NsYXNzRGV0ZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZmODczNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL0NsYXNzRGV0ZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbDsKLS8qKgotICogVXRpbGl0eSBjbGFzcyB0byBjaGVjayBmb3IgdGhlIGV4aXN0ZW5jZSBvZiBhIGNsYXNzIGdpdmVuIGFzIGFuCi0gKiBhcmd1bWVudC4gCi0gKi8KLXB1YmxpYyBjbGFzcyBDbGFzc0RldGVjdG9yIHsKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCWlmIChhcmdzID09IG51bGwgfHwgYXJncy5sZW5ndGggIT0gMSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJVc2FnZTogQ2xhc3NEZXRlY3RvciBbY2xhc3NOYW1lXSIpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQl0cnkgewotCQkJQ2xhc3MuZm9yTmFtZShhcmdzWzBdKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigidHJ1ZSIpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJmYWxzZSIpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvQ29udGV4dFB1Ymxpc2hUYXNrRGVsZWdhdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvQ29udGV4dFB1Ymxpc2hUYXNrRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjczYTJkYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL0NvbnRleHRQdWJsaXNoVGFza0RlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5JV2ViTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuY29tbWFuZC5GaXhNb2R1bGVDb250ZXh0Um9vdFRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLlB1Ymxpc2hPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLlB1Ymxpc2hUYXNrRGVsZWdhdGU7Ci0KLXB1YmxpYyBjbGFzcyBDb250ZXh0UHVibGlzaFRhc2tEZWxlZ2F0ZSBleHRlbmRzIFB1Ymxpc2hUYXNrRGVsZWdhdGUgewotCXB1YmxpYyBQdWJsaXNoT3BlcmF0aW9uW10gZ2V0VGFza3MoSVNlcnZlciBzZXJ2ZXIsIExpc3QgbW9kdWxlcykgewotCQlpZiAobW9kdWxlcyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCi0JCVRvbWNhdFNlcnZlciB0b21jYXRTZXJ2ZXIgPSAoVG9tY2F0U2VydmVyKSBzZXJ2ZXIubG9hZEFkYXB0ZXIoVG9tY2F0U2VydmVyLmNsYXNzLCBudWxsKTsKLQkJVG9tY2F0Q29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWNvbmZpZ3VyYXRpb24gPSB0b21jYXRTZXJ2ZXIuZ2V0VG9tY2F0Q29uZmlndXJhdGlvbigpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCUxpc3QgdGFza3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWludCBzaXplID0gbW9kdWxlcy5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlJTW9kdWxlW10gbW9kdWxlID0gKElNb2R1bGVbXSkgbW9kdWxlcy5nZXQoaSk7Ci0JCQlJTW9kdWxlIG0gPSBtb2R1bGVbbW9kdWxlLmxlbmd0aCAtIDFdOwotCQkJSVdlYk1vZHVsZSB3ZWJNb2R1bGUgPSAoSVdlYk1vZHVsZSkgbS5sb2FkQWRhcHRlcihJV2ViTW9kdWxlLmNsYXNzLCBudWxsKTsKLQkJCVdlYk1vZHVsZSB3ZWJNb2R1bGUyID0gY29uZmlndXJhdGlvbi5nZXRXZWJNb2R1bGUobSk7Ci0JCQlpZiAod2ViTW9kdWxlICE9IG51bGwgJiYgd2ViTW9kdWxlMiAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIGNvbnRleHRSb290ID0gd2ViTW9kdWxlLmdldENvbnRleHRSb290KCk7Ci0JCQkJaWYgKGNvbnRleHRSb290ICE9IG51bGwgJiYgIWNvbnRleHRSb290LnN0YXJ0c1dpdGgoIi8iKSAmJiBjb250ZXh0Um9vdC5sZW5ndGgoKSA+IDApCi0JCQkJCWNvbnRleHRSb290ID0gIi8iICsgY29udGV4dFJvb3Q7Ci0JCQkJaW50IGtpbmQgPSBQdWJsaXNoT3BlcmF0aW9uLk9QVElPTkFMOwotCQkJCWlmICghY29udGV4dFJvb3QuZXF1YWxzKHdlYk1vZHVsZTIuZ2V0UGF0aCgpKSkKLQkJCQkJa2luZCA9IFB1Ymxpc2hPcGVyYXRpb24uUFJFRkVSUkVEOwotCQkJCQotCQkJCWludCBpbmRleCA9IGNvbmZpZ3VyYXRpb24uZ2V0V2ViTW9kdWxlcygpLmluZGV4T2Yod2ViTW9kdWxlMik7Ci0JCQkJRml4TW9kdWxlQ29udGV4dFJvb3RUYXNrIHRhc2sgPSBuZXcgRml4TW9kdWxlQ29udGV4dFJvb3RUYXNrKG0sIGluZGV4LCB3ZWJNb2R1bGUuZ2V0Q29udGV4dFJvb3QoKSwga2luZCk7Ci0JCQkJdGFza3MuYWRkKHRhc2spOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gKFB1Ymxpc2hPcGVyYXRpb25bXSkgdGFza3MudG9BcnJheShuZXcgUHVibGlzaE9wZXJhdGlvblt0YXNrcy5zaXplKCldKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9GaWxlVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9GaWxlVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWUwNjNiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvRmlsZVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLlB1Ymxpc2hVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0vKioKLSAqIFV0aWxpdHkgY2xhc3Mgd2l0aCBhbiBhc3NvcnRtZW50IG9mIHVzZWZ1bCBmaWxlIG1ldGhvZHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWxlVXRpbCB7Ci0JLy8gc2l6ZSBvZiB0aGUgYnVmZmVyCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJVRkZFUiA9IDEwMjQwOwotCi0JLy8gdGhlIGJ1ZmZlcgotCXByaXZhdGUgc3RhdGljIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVtCVUZGRVJdOwotCi0JLyoqCi0JICogRmlsZVV0aWwgY2Fubm90IGJlIGNyZWF0ZWQuIFVzZSBzdGF0aWMgbWV0aG9kcy4KLQkgKi8KLQlwcml2YXRlIEZpbGVVdGlsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENvcHlzIGEgZGlyZWN0b3J5IGZyb20gYSB0byBiLgotCSAqCi0JICogQHBhcmFtIGZyb20gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSB0byBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb3B5RGlyZWN0b3J5KFN0cmluZyBmcm9tLCBTdHJpbmcgdG8sIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQl0cnkgewotCQkJRmlsZSBmcm9tRGlyID0gbmV3IEZpbGUoZnJvbSk7Ci0JCQlGaWxlIHRvRGlyID0gbmV3IEZpbGUodG8pOwotCQotCQkJRmlsZVtdIGZpbGVzID0gZnJvbURpci5saXN0RmlsZXMoKTsKLQkKLQkJCXRvRGlyLm1rZGlyKCk7Ci0JCi0JCQkvLyBjeWNsZSB0aHJvdWdoIGZpbGVzCi0JCQlpbnQgc2l6ZSA9IGZpbGVzLmxlbmd0aDsKLQkJCW1vbml0b3IgPSBQcm9ncmVzc1V0aWwuZ2V0TW9uaXRvckZvcihtb25pdG9yKTsKLQkJCW1vbml0b3IuYmVnaW5UYXNrKE5MUy5iaW5kKE1lc3NhZ2VzLmNvcHlpbmdUYXNrLCBuZXcgU3RyaW5nW10ge2Zyb20sIHRvfSksIHNpemUgKiA1MCk7Ci0JCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCUZpbGUgY3VycmVudCA9IGZpbGVzW2ldOwotCQkJCVN0cmluZyBmcm9tRmlsZSA9IGN1cnJlbnQuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCQkJU3RyaW5nIHRvRmlsZSA9IHRvOwotCQkJCWlmICghdG9GaWxlLmVuZHNXaXRoKEZpbGUuc2VwYXJhdG9yKSkKLQkJCQkJdG9GaWxlICs9IEZpbGUuc2VwYXJhdG9yOwotCQkJCXRvRmlsZSArPSBjdXJyZW50LmdldE5hbWUoKTsKLQkJCQlpZiAoY3VycmVudC5pc0ZpbGUoKSkgewotCQkJCQljb3B5RmlsZShmcm9tRmlsZSwgdG9GaWxlKTsKLQkJCQkJbW9uaXRvci53b3JrZWQoNTApOwotCQkJCX0gZWxzZSBpZiAoY3VycmVudC5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJCW1vbml0b3Iuc3ViVGFzayhOTFMuYmluZChNZXNzYWdlcy5jb3B5aW5nVGFzaywgbmV3IFN0cmluZ1tdIHtmcm9tRmlsZSwgdG9GaWxlfSkpOwotCQkJCQljb3B5RGlyZWN0b3J5KGZyb21GaWxlLCB0b0ZpbGUsIFByb2dyZXNzVXRpbC5nZXRTdWJNb25pdG9yRm9yKG1vbml0b3IsIDUwKSk7Ci0JCQkJfQotCQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCQkJcmV0dXJuOwotCQkJfQotCQkJbW9uaXRvci5kb25lKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBjb3B5aW5nIGRpcmVjdG9yeSIsIGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29weSBhIGZpbGUgZnJvbSBhIHRvIGIuIENsb3NlcyB0aGUgaW5wdXQgc3RyZWFtIGFmdGVyIHVzZS4KLQkgKgotCSAqIEBwYXJhbSBpbiBqYXZhLmlvLklucHV0U3RyZWFtCi0JICogQHBhcmFtIHRvIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcmV0dXJuIGEgc3RhdHVzCi0JICovCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIGNvcHlGaWxlKElucHV0U3RyZWFtIGluLCBTdHJpbmcgdG8pIHsKLQkJT3V0cHV0U3RyZWFtIG91dCA9IG51bGw7Ci0JCi0JCXRyeSB7Ci0JCQlvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbSh0byk7Ci0JCi0JCQlpbnQgYXZhaWwgPSBpbi5yZWFkKGJ1Zik7Ci0JCQl3aGlsZSAoYXZhaWwgPiAwKSB7Ci0JCQkJb3V0LndyaXRlKGJ1ZiwgMCwgYXZhaWwpOwotCQkJCWF2YWlsID0gaW4ucmVhZChidWYpOwotCQkJfQotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBjb3B5aW5nIGZpbGUiLCBlKTsKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yQ29weWluZ0ZpbGUsIG5ldyBTdHJpbmdbXSB7dG8sIGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpfSksIGUpOwotCQl9IGZpbmFsbHkgewotCQkJdHJ5IHsKLQkJCQlpZiAoaW4gIT0gbnVsbCkKLQkJCQkJaW4uY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCS8vIGlnbm9yZQotCQkJfQotCQkJdHJ5IHsKLQkJCQlpZiAob3V0ICE9IG51bGwpCi0JCQkJCW91dC5jbG9zZSgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb3B5IGEgZmlsZSBmcm9tIGEgdG8gYi4KLQkgKgotCSAqIEBwYXJhbSBmcm9tIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gdG8gamF2YS5sYW5nLlN0cmluZwotCSAqIEByZXR1cm4gYSBzdGF0dXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgY29weUZpbGUoU3RyaW5nIGZyb20sIFN0cmluZyB0bykgewotCQl0cnkgewotCQkJcmV0dXJuIGNvcHlGaWxlKG5ldyBGaWxlSW5wdXRTdHJlYW0oZnJvbSksIHRvKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGNvcHlpbmcgZmlsZSIsIGUpOwotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgVG9tY2F0UGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JDb3B5aW5nRmlsZSwgbmV3IFN0cmluZ1tdIHt0bywgZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCl9KSwgZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb3B5IGEgZmlsZSBmcm9tIGEgdG8gYi4KLQkgKgotCSAqIEBwYXJhbSBmcm9tIGphdmEubmV0LlVSTAotCSAqIEBwYXJhbSB0byBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHJldHVybiBhIHN0YXR1cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBjb3B5RmlsZShVUkwgZnJvbSwgU3RyaW5nIHRvKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gY29weUZpbGUoZnJvbS5vcGVuU3RyZWFtKCksIHRvKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGNvcHlpbmcgZmlsZSIsIGUpOwotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgVG9tY2F0UGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JDb3B5aW5nRmlsZSwgbmV3IFN0cmluZ1tdIHt0bywgZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCl9KSwgZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb3B5cyBhIGRpcmVjdG9yeSBmcm9tIGEgdG8gYiwgb25seSBtb2RpZnlpbmcgYXMgbmVlZGVkCi0JICogYW5kIGRlbGV0aW5nIG9sZCBmaWxlcyBhbmQgZGlyZWN0b3JpZXMuCi0JICoKLQkgKiBAcGFyYW0gZnJvbSBhIGRpcmVjdG9yeQotCSAqIEBwYXJhbSB0byBhIGRpcmVjdG9yeQotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzbWFydENvcHlEaXJlY3RvcnkoU3RyaW5nIGZyb20sIFN0cmluZyB0bywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXRyeSB7Ci0JCQlGaWxlIGZyb21EaXIgPSBuZXcgRmlsZShmcm9tKTsKLQkJCUZpbGUgdG9EaXIgPSBuZXcgRmlsZSh0byk7Ci0JCi0JCQlGaWxlW10gZnJvbUZpbGVzID0gZnJvbURpci5saXN0RmlsZXMoKTsKLQkJCWludCBmcm9tU2l6ZSA9IGZyb21GaWxlcy5sZW5ndGg7Ci0JCi0JCQltb25pdG9yID0gUHJvZ3Jlc3NVdGlsLmdldE1vbml0b3JGb3IobW9uaXRvcik7Ci0JCQltb25pdG9yLmJlZ2luVGFzayhOTFMuYmluZChNZXNzYWdlcy5jb3B5aW5nVGFzaywgbmV3IFN0cmluZ1tdIHtmcm9tLCB0b30pLCA1NTApOwotCQotCQkJRmlsZVtdIHRvRmlsZXMgPSBudWxsOwotCQotCQkJLy8gZGVsZXRlIG9sZCBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgZnJvbSB0aGlzIGRpcmVjdG9yeQotCQkJaWYgKHRvRGlyLmV4aXN0cygpICYmIHRvRGlyLmlzRGlyZWN0b3J5KCkpIHsKLQkJCQl0b0ZpbGVzID0gdG9EaXIubGlzdEZpbGVzKCk7Ci0JCQkJaW50IHRvU2l6ZSA9IHRvRmlsZXMubGVuZ3RoOwotCQotCQkJCS8vIGNoZWNrIGlmIHRoaXMgZXhhY3QgZmlsZSBleGlzdHMgaW4gdGhlIG5ldyBkaXJlY3RvcnkKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHRvU2l6ZTsgaSsrKSB7Ci0JCQkJCVN0cmluZyBuYW1lID0gdG9GaWxlc1tpXS5nZXROYW1lKCk7Ci0JCQkJCWJvb2xlYW4gaXNEaXIgPSB0b0ZpbGVzW2ldLmlzRGlyZWN0b3J5KCk7Ci0JCQkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBmcm9tU2l6ZTsgaisrKSB7Ci0JCQkJCQlpZiAobmFtZS5lcXVhbHMoZnJvbUZpbGVzW2pdLmdldE5hbWUoKSkgJiYgaXNEaXIgPT0gZnJvbUZpbGVzW2pdLmlzRGlyZWN0b3J5KCkpCi0JCQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCQl9Ci0JCi0JCQkJCS8vIGRlbGV0ZSBmaWxlIGlmIGl0IGNhbid0IGJlIGZvdW5kIG9yIGlzbid0IHRoZSBjb3JyZWN0IHR5cGUKLQkJCQkJaWYgKCFmb3VuZCkgewotCQkJCQkJaWYgKGlzRGlyKQotCQkJCQkJCVB1Ymxpc2hVdGlsLmRlbGV0ZURpcmVjdG9yeSh0b0ZpbGVzW2ldLCBudWxsKTsKLQkJCQkJCWVsc2UKLQkJCQkJCQl0b0ZpbGVzW2ldLmRlbGV0ZSgpOwotCQkJCQl9Ci0JCQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWlmICh0b0Rpci5pc0ZpbGUoKSkKLQkJCQkJdG9EaXIuZGVsZXRlKCk7Ci0JCQkJdG9EaXIubWtkaXIoKTsKLQkJCX0KLQkJCW1vbml0b3Iud29ya2VkKDUwKTsKLQkKLQkJCS8vIGN5Y2xlIHRocm91Z2ggZmlsZXMgYW5kIG9ubHkgY29weSB3aGVuIGl0IGRvZXNuJ3QgZXhpc3QKLQkJCS8vIG9yIGlzIG5ld2VyCi0JCQl0b0ZpbGVzID0gdG9EaXIubGlzdEZpbGVzKCk7Ci0JCQlpbnQgdG9TaXplID0gdG9GaWxlcy5sZW5ndGg7Ci0JCQlpbnQgZHcgPSAwOwotCQkJaWYgKHRvU2l6ZSA+IDApCi0JCQkJZHcgPSA1MDAgLyB0b1NpemU7Ci0JCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZyb21TaXplOyBpKyspIHsKLQkJCQlGaWxlIGN1cnJlbnQgPSBmcm9tRmlsZXNbaV07Ci0JCi0JCQkJLy8gY2hlY2sgaWYgdGhpcyBpcyBhIG5ldyBvciBuZXdlciBmaWxlCi0JCQkJYm9vbGVhbiBjb3B5ID0gdHJ1ZTsKLQkJCQlpZiAoIWN1cnJlbnQuaXNEaXJlY3RvcnkoKSkgewotCQkJCQlTdHJpbmcgbmFtZSA9IGN1cnJlbnQuZ2V0TmFtZSgpOwotCQkJCQlsb25nIG1vZCA9IGN1cnJlbnQubGFzdE1vZGlmaWVkKCk7Ci0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgdG9TaXplOyBqKyspIHsKLQkJCQkJCWlmIChuYW1lLmVxdWFscyh0b0ZpbGVzW2pdLmdldE5hbWUoKSkgJiYgbW9kIDw9IHRvRmlsZXNbal0ubGFzdE1vZGlmaWVkKCkpCi0JCQkJCQkJY29weSA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQotCQkJCWlmIChjb3B5KSB7Ci0JCQkJCVN0cmluZyBmcm9tRmlsZSA9IGN1cnJlbnQuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCQkJCVN0cmluZyB0b0ZpbGUgPSB0bzsKLQkJCQkJaWYgKCF0b0ZpbGUuZW5kc1dpdGgoRmlsZS5zZXBhcmF0b3IpKQotCQkJCQkJdG9GaWxlICs9IEZpbGUuc2VwYXJhdG9yOwotCQkJCQl0b0ZpbGUgKz0gY3VycmVudC5nZXROYW1lKCk7Ci0JCQkJCWlmIChjdXJyZW50LmlzRmlsZSgpKSB7Ci0JCQkJCQljb3B5RmlsZShmcm9tRmlsZSwgdG9GaWxlKTsKLQkJCQkJCW1vbml0b3Iud29ya2VkKGR3KTsKLQkJCQkJfSBlbHNlIGlmIChjdXJyZW50LmlzRGlyZWN0b3J5KCkpIHsKLQkJCQkJCW1vbml0b3Iuc3ViVGFzayhOTFMuYmluZChNZXNzYWdlcy5jb3B5aW5nVGFzaywgbmV3IFN0cmluZ1tdIHtmcm9tRmlsZSwgdG9GaWxlfSkpOwotCQkJCQkJc21hcnRDb3B5RGlyZWN0b3J5KGZyb21GaWxlLCB0b0ZpbGUsIFByb2dyZXNzVXRpbC5nZXRTdWJNb25pdG9yRm9yKG1vbml0b3IsIGR3KSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQltb25pdG9yLndvcmtlZCg1MDAgLSBkdyAqIHRvU2l6ZSk7Ci0JCQltb25pdG9yLmRvbmUoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIHNtYXJ0IGNvcHlpbmcgZGlyZWN0b3J5ICIgKyBmcm9tICsgIiAtICIgKyB0bywgZSk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9JTWltZU1hcHBpbmcuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvSU1pbWVNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlNTk0NmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9JTWltZU1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbDsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU1pbWVNYXBwaW5nIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBleHRlbnNpb24uCi0JICogCi0JICogQHJldHVybiB0aGUgZXh0ZW5zaW9uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFeHRlbnNpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1pbWUgdHlwZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtaW1lIHR5cGUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1pbWVUeXBlKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9JVG9tY2F0Q29uZmlndXJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9JVG9tY2F0Q29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWJhZGExLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvSVRvbWNhdENvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJVG9tY2F0Q29uZmlndXJhdGlvbiB7Ci0JLyoqCi0JICogUmV0dXJucyBhIGxpc3Qgb2YgbWltZSBtYXBwaW5ncy4KLQkgKiAKLQkgKiBAcmV0dXJuIG1pbWUgbWFwcGluZ3MKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRNaW1lTWFwcGluZ3MoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBTZXJ2ZXJQb3J0cyB0aGF0IHRoaXMgY29uZmlndXJhdGlvbiB1c2VzLgotCSAqCi0JICogQHJldHVybiB0aGUgc2VydmVyIHBvcnRzCi0JICovCi0JcHVibGljIExpc3QgZ2V0U2VydmVyUG9ydHMoKTsKLQotCS8qKgotCSAqIFJldHVybiBhIGxpc3Qgb2YgdGhlIHdlYiBtb2R1bGVzIGluIHRoaXMgc2VydmVyLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHdlYiBtb2R1bGVzCi0JICovCi0JcHVibGljIExpc3QgZ2V0V2ViTW9kdWxlcygpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvSVRvbWNhdENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9JVG9tY2F0Q29uZmlndXJhdGlvbldvcmtpbmdDb3B5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxMGQ3N2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9JVG9tY2F0Q29uZmlndXJhdGlvbldvcmtpbmdDb3B5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWw7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVRvbWNhdENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBleHRlbmRzIElUb21jYXRDb25maWd1cmF0aW9uIHsKLQkvKioKLQkgKiBBZGQgYSB3ZWIgbW9kdWxlLgotCSAqCi0JICogQHBhcmFtIGluZGV4IGludAotCSAqIEBwYXJhbSBtb2R1bGUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuV2ViTW9kdWxlCi0JICovCi0JcHVibGljIHZvaWQgYWRkV2ViTW9kdWxlKGludCBpbmRleCwgSVRvbWNhdFdlYk1vZHVsZSBtb2R1bGUpOwotCQotCS8qKgotCSAqIENoYW5nZSBhIHdlYiBtb2R1bGUuCi0JICogCi0JICogQHBhcmFtIGluZGV4IGludAotCSAqIEBwYXJhbSBkb2NCYXNlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gcGF0aCBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIHJlbG9hZGFibGUgYm9vbGVhbgotCSAqLwotCXB1YmxpYyB2b2lkIG1vZGlmeVdlYk1vZHVsZShpbnQgaW5kZXgsIFN0cmluZyBkb2NCYXNlLCBTdHJpbmcgcGF0aCwgYm9vbGVhbiByZWxvYWRhYmxlKTsKLQotCS8qKgotCSAqIFJlbW92ZSBhIHdlYiBtb2R1bGUuCi0JICogCi0JICogQHBhcmFtIGluZGV4IGludAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVdlYk1vZHVsZShpbnQgaW5kZXgpOwotCi0JLyoqCi0JICogQWRkcyBhIG1pbWUgbWFwcGluZy4KLQkgKgotCSAqIEBwYXJhbSBpbmRleCBpbnQKLQkgKiBAcGFyYW0gbWFwIE1pbWVNYXBwaW5nCi0JICovCi0JcHVibGljIHZvaWQgYWRkTWltZU1hcHBpbmcoaW50IGluZGV4LCBJTWltZU1hcHBpbmcgbWFwKTsKLQotCS8qKgotCSAqIENoYW5nZSBhIG1pbWUgbWFwcGluZy4KLQkgKiAKLQkgKiBAcGFyYW0gaW5kZXggaW50Ci0JICogQHBhcmFtIG1hcCBNaW1lTWFwcGluZwotCSAqLwotCXB1YmxpYyB2b2lkIG1vZGlmeU1pbWVNYXBwaW5nKGludCBpbmRleCwgSU1pbWVNYXBwaW5nIG1hcCk7Ci0KLQkvKioKLQkgKiBNb2RpZnkgdGhlIHBvcnQgd2l0aCB0aGUgZ2l2ZW4gaWQuCi0JICoKLQkgKiBAcGFyYW0gaWQgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBwb3J0IGludAotCSAqLwotCXB1YmxpYyB2b2lkIG1vZGlmeVNlcnZlclBvcnQoU3RyaW5nIGlkLCBpbnQgcG9ydCk7Ci0KLQkvKioKLQkgKiBSZW1vdmUgYSBtaW1lIG1hcHBpbmcuCi0JICogCi0JICogQHBhcmFtIGluZGV4IGludAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZU1pbWVNYXBwaW5nKGludCBpbmRleCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9JVG9tY2F0UnVudGltZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9JVG9tY2F0UnVudGltZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjVkYWQzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvSVRvbWNhdFJ1bnRpbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLklKYXZhUnVudGltZTsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVRvbWNhdFJ1bnRpbWUgZXh0ZW5kcyBJSmF2YVJ1bnRpbWUgewotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBzZXJ2ZXIgaXMgdXNpbmcgdGhlIGRlZmF1bHQgSlJFLCBhbmQKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBzZXJ2ZXIgaXMgdXNpbmcgdGhlIGRlZmF1bHQgSlJFLCBhbmQKLQkgKiAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNVc2luZ0RlZmF1bHRKUkUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJ1bnRpbWUgY2xhc3NwYXRoIHRoYXQgaXMgdXNlZCBieSB0aGlzIHJ1bnRpbWUuCi0JICogCi0JICogQHJldHVybiB0aGUgcnVudGltZSBjbGFzc3BhdGgKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRSdW50aW1lQ2xhc3NwYXRoKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9JVG9tY2F0UnVudGltZVdvcmtpbmdDb3B5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL0lUb21jYXRSdW50aW1lV29ya2luZ0NvcHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFhYzNkMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL0lUb21jYXRSdW50aW1lV29ya2luZ0NvcHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSVZNSW5zdGFsbDsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVRvbWNhdFJ1bnRpbWVXb3JraW5nQ29weSBleHRlbmRzIElUb21jYXRSdW50aW1lIHsKLQkvKioKLQkgKiBTZXQgdGhlIFZNIGluc3RhbGwgKGluc3RhbGxlZCBKUkUpIHRoYXQgdGhpcyBydW50aW1lIGlzIHVzaW5nLgotCSAqIFVzZSA8Y29kZT5udWxsPC9jb2RlPiB0byB1c2UgdGhlIEVjbGlwc2UgZGVmYXVsdCBKUkUuCi0JICogCi0JICogQHBhcmFtIHZtSW5zdGFsbCB0aGUgVk0gaW5zdGFsbCB0byB1c2UKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWTUluc3RhbGwoSVZNSW5zdGFsbCB2bUluc3RhbGwpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvSVRvbWNhdFNlcnZlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9JVG9tY2F0U2VydmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkMzgwZWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9JVG9tY2F0U2VydmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLaAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklVUkxQcm92aWRlcjsKLS8qKgotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJVG9tY2F0U2VydmVyIGV4dGVuZHMgSVVSTFByb3ZpZGVyIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9URVNUX0VOVklST05NRU5UID0gInRlc3RFbnZpcm9ubWVudCI7Ci0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoaXMgaXMgYSB0ZXN0IChwdWJsaXNoIGFuZCBydW4gY29kZSBvdXQgb2YgdGhlCi0JICogd29ya2JlbmNoKSBlbnZpcm9ubWVudCBzZXJ2ZXIuCi0JICoKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Rlc3RFbnZpcm9ubWVudCgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvSVRvbWNhdFNlcnZlckJlaGF2aW91ci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9JVG9tY2F0U2VydmVyQmVoYXZpb3VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzZjk2ZWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9JVG9tY2F0U2VydmVyQmVoYXZpb3VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JUHJvY2VzczsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVRvbWNhdFNlcnZlckJlaGF2aW91ciB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgbWFpbiBjbGFzcyB0aGF0IGlzIHVzZWQgdG8gbGF1bmNoIHRoZSBUb21jYXQgc2VydmVyLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1haW4gcnVudGltZSBjbGFzcwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UnVudGltZUNsYXNzKCk7Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHByb2Nlc3MgdGhhdCBpcyBtb25pdG9yZWQgZm9yIFRvbWNhdCBzdGFydHVwIGFuZCBzaHV0ZG93bi4KLQkgKiBXYXJuaW5nOiBEbyBub3QgY2FsbCB0aGlzIG1ldGhvZCB1bmxlc3MgeW91IGtub3cgd2hhdCB5b3UncmUgZG9pbmc7Ci0JICogaXQgc2hvdWxkIG9ubHkgYmUgdXNlZCBpbiByYXJlIGNhc2VzLgotCSAqIAotCSAqIEBwYXJhbSBuZXdQcm9jZXNzCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvY2VzcyhJUHJvY2VzcyBuZXdQcm9jZXNzKTsKLQkKLQkvKioKLQkgKiBTZXR1cCBmb3Igc3RhcnRpbmcgdGhlIHNlcnZlci4KLQkgKiAKLQkgKiBAcGFyYW0gbGF1bmNoIElMYXVuY2gKLQkgKiBAcGFyYW0gbGF1bmNoTW9kZSBTdHJpbmcKLQkgKiBAcGFyYW0gbW9uaXRvciBJUHJvZ3Jlc3NNb25pdG9yCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIGFueXRoaW5nIGdvZXMgd3JvbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXR1cExhdW5jaChJTGF1bmNoIGxhdW5jaCwgU3RyaW5nIGxhdW5jaE1vZGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb247Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9JVG9tY2F0U2VydmVyV29ya2luZ0NvcHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvSVRvbWNhdFNlcnZlcldvcmtpbmdDb3B5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczMjUzNzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9JVG9tY2F0U2VydmVyV29ya2luZ0NvcHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotoCoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWw7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElUb21jYXRTZXJ2ZXJXb3JraW5nQ29weSBleHRlbmRzIElUb21jYXRTZXJ2ZXIgewotCS8qKgotCSAqIFNldHMgdGhpcyBzZXJ2ZXIgdG8gdGVzdCBlbnZpcm9ubWVudCBtb2RlLgotCSAqIAotCSAqIEBwYXJhbSBiIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUZXN0RW52aXJvbm1lbnQoYm9vbGVhbiBiKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL0lUb21jYXRWZXJzaW9uSGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9JVG9tY2F0VmVyc2lvbkhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk3YTI4NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL0lUb21jYXRWZXJzaW9uSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElUb21jYXRWZXJzaW9uSGFuZGxlciB7Ci0JcHVibGljIGJvb2xlYW4gdmVyaWZ5SW5zdGFsbFBhdGgoSVBhdGggaW5zdGFsbFBhdGgpOwotCQotCXB1YmxpYyBTdHJpbmcgZ2V0UnVudGltZUNsYXNzKCk7Ci0JCi0JcHVibGljIExpc3QgZ2V0UnVudGltZUNsYXNzcGF0aChJUGF0aCBpbnN0YWxsUGF0aCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwcm9ncmFtJ3MgcnVudGltZSBhcmd1bWVudHMuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ1BhdGggYSBjb25maWcgcGF0aAotCSAqIEBwYXJhbSBkZWJ1ZyA8Y29kZT50cnVlPC9jb2RlPiBpZiBkZWJ1ZyBtb2RlIGlzIG9uCi0JICogQHBhcmFtIHN0YXJ0aW5nIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzZXJ2ZXIgaXMgc3RhcnRpbmcKLQkgKiBAcmV0dXJuIGEgc3RyaW5nIGFycmF5IG9mIHByb2dyYW0gYXJndW1lbnRzCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldFJ1bnRpbWVQcm9ncmFtQXJndW1lbnRzKElQYXRoIGNvbmZpZ1BhdGgsIGJvb2xlYW4gZGVidWcsIGJvb2xlYW4gc3RhcnRpbmcpOwotCi0JcHVibGljIFN0cmluZ1tdIGdldFJ1bnRpbWVWTUFyZ3VtZW50cyhJUGF0aCBpbnN0YWxsUGF0aCwgSVBhdGggY29uZmlnUGF0aCwgYm9vbGVhbiBpc1Rlc3RFbnYpOwotCi0JcHVibGljIFN0cmluZyBnZXRSdW50aW1lUG9saWN5RmlsZShJUGF0aCBjb25maWdQYXRoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gcHJvamVjdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcwotCSAqIHNlcnZlciwgYW5kIGZhbHNlIG90aGVyd2lzZS4KLQkgKgotCSAqIEBwYXJhbSBtb2R1bGUgYSB3ZWIgbW9kdWxlCi0JICogQHJldHVybiB0aGUgc3RhdHVzCi0JICovCi0JcHVibGljIElTdGF0dXMgY2FuQWRkTW9kdWxlKElNb2R1bGUgbW9kdWxlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJ1bnRpbWUgYmFzZSBwYXRoIGZvciByZWxhdGl2ZSBwYXRocyBpbiB0aGUgc2VydmVyCi0JICogY29uZmlndXJhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gc2VydmVyQmVoYXZpb3VyIFRvbWNhdFNlcnZlckJlaGF2aW91ciBpbnN0YW5jZSBmcm9tCi0JICogd2hpY2ggdG8gZGV0ZXJtaW5lIHRoZSBiYXNlIHBhdGgKLQkgKiBAcmV0dXJuIHRoZSBiYXNlIHBhdGgKLQkgKi8KLQlwdWJsaWMgSVBhdGggZ2V0UnVudGltZUJhc2VEaXJlY3RvcnkoVG9tY2F0U2VydmVyQmVoYXZpb3VyIHNlcnZlckJlaGF2aW91cik7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9JVG9tY2F0V2ViTW9kdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL0lUb21jYXRXZWJNb2R1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NiODhiOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL0lUb21jYXRXZWJNb2R1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbDsKLS8qKgotICogQSBXZWIgbW9kdWxlIGRlcGxveWVkIG9uIFRvbWNhdC4KLSAqLwotcHVibGljIGludGVyZmFjZSBJVG9tY2F0V2ViTW9kdWxlIHsKLQkvKioKLQkgKiBHZXQgdGhlIGRvY3VtZW50IGJhc2UuCi0JICoKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERvY3VtZW50QmFzZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwYXRoLiAoY29udGV4dCByb290KQotCSAqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYXRoKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG1lbWVudG8uCi0JICoKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1lbWVudG8oKTsKLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSB3ZWIgbW9kdWxlIGlzIGF1dG8tcmVsb2FkYWJsZS4KLQkgKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUmVsb2FkYWJsZSgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvTWVzc2FnZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQzZDc1Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLaAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLS8qKgotICogVHJhbnNsYXRlZCBtZXNzYWdlcy4KLSAqLwotcHVibGljIGNsYXNzIE1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb3B5aW5nVGFzazsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckNvcHlpbmdGaWxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlbGV0aW5nVGFzazsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckluc3RhbGxEaXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JJbnN0YWxsRGlyVHJhaWxpbmdTbGFzaDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckpSRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3YXJuaW5nSlJFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhcmdldDMycnVudGltZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YXJnZXQ0MHJ1bnRpbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFyZ2V0NDFydW50aW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhcmdldDUwcnVudGltZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YXJnZXQ1NXJ1bnRpbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcG9ydFVua25vd247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgbG9hZGluZ1Rhc2s7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JDb3VsZE5vdExvYWRDb25maWd1cmF0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNhdmluZ1Rhc2s7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JDb3VsZE5vdFNhdmVDb25maWd1cmF0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVwZGF0aW5nQ29uZmlndXJhdGlvblRhc2s7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2FuQWRkTW9kdWxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yU3BlYzMyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yU3BlYzQwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yU3BlYzQxOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yU3BlYzUwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yU3BlYzU1OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBvcnRTZXJ2ZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcnVudGltZURpclByZXBhcmVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHB1Ymxpc2hDb25maWd1cmF0aW9uVGFzazsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwdWJsaXNoQ29udGV4dENvbmZpZ1Rhc2s7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2F2aW5nQ29udGV4dENvbmZpZ1Rhc2s7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tpbmdDb250ZXh0VGFzazsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZXJ2ZXJQb3N0UHJvY2Vzc2luZ0NvbXBsZXRlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yUHVibGlzaENvbmZpZ3VyYXRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2xlYW51cFNlcnZlclRhc2s7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGV0ZWN0aW5nUmVtb3ZlZFByb2plY3RzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlbGV0aW5nQ29udGV4dEZpbGVzVGFzazsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWxldGluZ0NvbnRleHRGaWxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlbGV0ZWRDb250ZXh0RmlsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckNvdWxkTm90RGVsZXRlQ29udGV4dEZpbGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JDbGVhbnVwU2VydmVyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHB1Ymxpc2hlclB1Ymxpc2hUYXNrOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yTm9Db25maWd1cmF0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yV2ViTW9kdWxlc09ubHk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JOb1J1bnRpbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHVibGlzaFNlcnZlclRhc2s7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JQb3J0SW52YWxpZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvclBvcnRJblVzZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvclBvcnRzSW5Vc2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JEdXBsaWNhdGVDb250ZXh0Um9vdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckNvdWxkTm90TG9hZENvbnRleHRYbWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlndXJhdGlvbkVkaXRvckFjdGlvbk1vZGlmeVBvcnREZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maWd1cmF0aW9uRWRpdG9yQWN0aW9uTW9kaWZ5UG9ydDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maWd1cmF0aW9uRWRpdG9yQWN0aW9uTW9kaWZ5TWltZU1hcHBpbmdEZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maWd1cmF0aW9uRWRpdG9yQWN0aW9uTW9kaWZ5TWltZU1hcHBpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlndXJhdGlvbkVkaXRvckFjdGlvbkFkZE1pbWVNYXBwaW5nRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlndXJhdGlvbkVkaXRvckFjdGlvbkFkZE1pbWVNYXBwaW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmZpZ3VyYXRpb25FZGl0b3JBY3Rpb25BZGRXZWJNb2R1bGVEZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maWd1cmF0aW9uRWRpdG9yQWN0aW9uQWRkV2ViTW9kdWxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmZpZ3VyYXRpb25FZGl0b3JBY3Rpb25Nb2RpZnlXZWJNb2R1bGVEZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maWd1cmF0aW9uRWRpdG9yQWN0aW9uTW9kaWZ5V2ViTW9kdWxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmZpZ3VyYXRpb25FZGl0b3JBY3Rpb25SZW1vdmVNaW1lTWFwcGluZ0Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmZpZ3VyYXRpb25FZGl0b3JBY3Rpb25SZW1vdmVNaW1lTWFwcGluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maWd1cmF0aW9uRWRpdG9yQWN0aW9uUmVtb3ZlV2ViTW9kdWxlRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlndXJhdGlvbkVkaXRvckFjdGlvblJlbW92ZVdlYk1vZHVsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZXJ2ZXJFZGl0b3JBY3Rpb25TZXREZWJ1Z01vZGVEZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZXJ2ZXJFZGl0b3JBY3Rpb25TZXREZWJ1Z01vZGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VydmVyRWRpdG9yQWN0aW9uU2V0U2VjdXJlRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VydmVyRWRpdG9yQWN0aW9uU2V0U2VjdXJlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlcnZlckVkaXRvckFjdGlvblNldFRlc3RFbnZpcm9ubWVudERlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlcnZlckVkaXRvckFjdGlvblNldFRlc3RFbnZpcm9ubWVudDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maWd1cmF0aW9uRWRpdG9yQWN0aW9uRWRpdFdlYk1vZHVsZURlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmZpZ3VyYXRpb25FZGl0b3JBY3Rpb25FZGl0V2ViTW9kdWxlUGF0aDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmaXhNb2R1bGVDb250ZXh0Um9vdERlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZpeE1vZHVsZUNvbnRleHRSb290OwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhUb21jYXRQbHVnaW4uUExVR0lOX0lEICsgIi5pbnRlcm5hbC5NZXNzYWdlcyIsIE1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9NZXNzYWdlcy5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9NZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjU0OGU2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvTWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIHJ1bnRpbWUgdGFyZ2V0Ci10YXJnZXQzMnJ1bnRpbWU9VG9tY2F0IHYzLjIgcnVudGltZQotdGFyZ2V0NDBydW50aW1lPVRvbWNhdCB2NC4wIHJ1bnRpbWUKLXRhcmdldDQxcnVudGltZT1Ub21jYXQgdjQuMSBydW50aW1lCi10YXJnZXQ1MHJ1bnRpbWU9VG9tY2F0IHY1LjAgcnVudGltZQotdGFyZ2V0NTVydW50aW1lPVRvbWNhdCB2NS41IHJ1bnRpbWUKLQotIyAtLS0tLS0tLS0tLS0tLS0gVGFza3MgKHByb2dyZXNzIG1vbml0b3JzKSAtLS0tLS0tLS0tLS0tLS0KLXNhdmluZ1Rhc2s9U2F2aW5nLi4uCi1sb2FkaW5nVGFzaz1Mb2FkaW5nLi4uCi11cGRhdGluZ0NvbmZpZ3VyYXRpb25UYXNrPVVwZGF0aW5nIHJ1bi10aW1lIGNvbmZpZ3VyYXRpb24uLi4KLXB1Ymxpc2hTZXJ2ZXJUYXNrPVB1Ymxpc2hpbmcgdG8gc2VydmVyLi4uCi1wdWJsaXNoQ29uZmlndXJhdGlvblRhc2s9UHVibGlzaGluZyB0aGUgY29uZmlndXJhdGlvbi4uLgotcHVibGlzaGVyUHVibGlzaFRhc2s9UHVibGlzaGluZyB7MH0uLi4KLWZpeE1vZHVsZUNvbnRleHRSb290PVVwZGF0ZSBjb250ZXh0IHJvb3QgZm9yIFdlYiBtb2R1bGUgezB9Ci1maXhNb2R1bGVDb250ZXh0Um9vdERlc2NyaXB0aW9uPVVwZGF0ZSB0aGUgY29udGV4dCByb290IG9mIHRoZSBXZWIgbW9kdWxlIHRvIG1hdGNoIHRoZSBjdXJyZW50IHNldHRpbmdzCi0KLXB1Ymxpc2hDb250ZXh0Q29uZmlnVGFzaz1QdWJsaXNoaW5nIE1FVEEtSU5GL2NvbnRleHQueG1sIGNvbmZpZ3VyYXRpb25zLi4uCi1jaGVja2luZ0NvbnRleHRUYXNrPUNoZWNraW5nIENvbnRleHQgezB9IGZvciBjb250ZXh0LnhtbC4uLgotc2F2aW5nQ29udGV4dENvbmZpZ1Rhc2s9U2F2aW5nIGNvbnRleHQgY29uZmlndXJhdGlvbiB1cGRhdGVzLi4uCi1zZXJ2ZXJQb3N0UHJvY2Vzc2luZ0NvbXBsZXRlPUNvbnRleHQgY29uZmlndXJhdGlvbnMgYWRkZWQuCi0KLWNsZWFudXBTZXJ2ZXJUYXNrPVJlbW92aW5nIG9ic29sZXRlIGZpbGVzIGZyb20gc2VydmVyLi4uCi1kZXRlY3RpbmdSZW1vdmVkUHJvamVjdHM9UHJlcGFyaW5nIGxpc3Qgb2YgcmVtb3ZlZCBwcm9qZWN0cy4uLgotZGVsZXRpbmdDb250ZXh0RmlsZXNUYXNrPURlbGV0aW5nIG9ic29sZXRlIGNvbnRleHQgZmlsZXMgZnJvbSBzZXJ2ZXIuLi4KLWRlbGV0aW5nQ29udGV4dEZpbGU9RGVsZXRpbmcgb2Jzb2xldGUgY29udGV4dCBmaWxlIHswfS4uLgotZGVsZXRlZENvbnRleHRGaWxlPUNvbnRleHQgZmlsZSB7MH0gcmVtb3ZlZAotcnVudGltZURpclByZXBhcmVkPVJ1bnRpbWUgZGlyZWN0b3J5IHByZXBhcmVkCi1jb3B5aW5nVGFzaz1Db3B5aW5nIGZyb20gezB9IHRvIHsxfQotZGVsZXRpbmdUYXNrPURlbGV0aW5nIHswfQotZXJyb3JDb3B5aW5nRmlsZT1FcnJvciBjb3B5aW5nIGZpbGUgdG8gezB9OiB7MX0KLQotIyBFZGl0b3IgY29tbWFuZHMgKHVzZWQgaW4gdW5kby9yZWRvIG1lbnVzKQotY29uZmlndXJhdGlvbkVkaXRvckFjdGlvbkFkZE1pbWVNYXBwaW5nPWFkZCBNSU1FIG1hcHBpbmcKLWNvbmZpZ3VyYXRpb25FZGl0b3JBY3Rpb25BZGRNaW1lTWFwcGluZ0Rlc2NyaXB0aW9uPUFkZCBhIE1JTUUgbWFwcGluZwotY29uZmlndXJhdGlvbkVkaXRvckFjdGlvbk1vZGlmeU1pbWVNYXBwaW5nPW1vZGlmeSBNSU1FIG1hcHBpbmcKLWNvbmZpZ3VyYXRpb25FZGl0b3JBY3Rpb25Nb2RpZnlNaW1lTWFwcGluZ0Rlc2NyaXB0aW9uPU1vZGlmeSB0aGUgTUlNRSBtYXBwaW5nCi1jb25maWd1cmF0aW9uRWRpdG9yQWN0aW9uUmVtb3ZlTWltZU1hcHBpbmc9cmVtb3ZlIE1JTUUgbWFwcGluZwotY29uZmlndXJhdGlvbkVkaXRvckFjdGlvblJlbW92ZU1pbWVNYXBwaW5nRGVzY3JpcHRpb249UmVtb3ZlIGEgTUlNRSBtYXBwaW5nCi1jb25maWd1cmF0aW9uRWRpdG9yQWN0aW9uQWRkV2ViTW9kdWxlPWFkZCBXZWIgbW9kdWxlCi1jb25maWd1cmF0aW9uRWRpdG9yQWN0aW9uQWRkV2ViTW9kdWxlRGVzY3JpcHRpb249QWRkIGEgV2ViIG1vZHVsZQotY29uZmlndXJhdGlvbkVkaXRvckFjdGlvbk1vZGlmeVdlYk1vZHVsZT1tb2RpZnkgV2ViIG1vZHVsZQotY29uZmlndXJhdGlvbkVkaXRvckFjdGlvbk1vZGlmeVdlYk1vZHVsZURlc2NyaXB0aW9uPU1vZGlmeSB0aGUgV2ViIG1vZHVsZQotY29uZmlndXJhdGlvbkVkaXRvckFjdGlvblJlbW92ZVdlYk1vZHVsZT1yZW1vdmUgV2ViIG1vZHVsZQotY29uZmlndXJhdGlvbkVkaXRvckFjdGlvblJlbW92ZVdlYk1vZHVsZURlc2NyaXB0aW9uPVJlbW92ZSBXZWIgbW9kdWxlIHswfQotY29uZmlndXJhdGlvbkVkaXRvckFjdGlvbk1vZGlmeVBvcnQ9c2V0IHBvcnQgbnVtYmVyCi1jb25maWd1cmF0aW9uRWRpdG9yQWN0aW9uTW9kaWZ5UG9ydERlc2NyaXB0aW9uPVNldCB0aGUgcG9ydCBudW1iZXIKLWNvbmZpZ3VyYXRpb25FZGl0b3JBY3Rpb25FZGl0V2ViTW9kdWxlUGF0aD1lZGl0IFdlYiBtb2R1bGUgcGF0aAotY29uZmlndXJhdGlvbkVkaXRvckFjdGlvbkVkaXRXZWJNb2R1bGVEZXNjcmlwdGlvbj1DaGFuZ2UgV2ViIG1vZHVsZSBwYXRoIGZyb20gezB9IHRvIHsxfQotCi0jIC0tLS0tLS0tLS0tLS0tLSBHZW5lcmFsIC0tLS0tLS0tLS0tLS0tLQotY2FuQWRkTW9kdWxlPVdlYiBtb2R1bGUgY2FuIGJlIGFkZGVkIHRvIHRoZSBzZXJ2ZXIuCi1wb3J0U2VydmVyPVRvbWNhdCBhZG1pbiBwb3J0Ci1wb3J0VW5rbm93bj11bmtub3duIHBvcnQKLQotIyAtLS0tLS0tLS0tLS0tLS0gRXJyb3JzIGFuZCBJbmZvIC0tLS0tLS0tLS0tLS0tLQotZXJyb3JJbnN0YWxsRGlyPVRoZSBUb21jYXQgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBpcyBub3QgY29ycmVjdC4gSXQgZG9lcyBub3QgcG9pbnQgdG8gYSB2YWxpZCBUb21jYXQgaW5zdGFsbGF0aW9uLgotZXJyb3JJbnN0YWxsRGlyVHJhaWxpbmdTbGFzaD1UaGUgVG9tY2F0IGluc3RhbGxhdGlvbiBkaXJlY3Rvcnkgc2hvdWxkIG5vdCBoYXZlIGEgdHJhaWxpbmcgc2xhc2guCi1lcnJvckpSRT1UaGUgSlJFIGNvdWxkIG5vdCBiZSBmb3VuZC4gRWRpdCB0aGUgc2VydmVyIGFuZCBjaGFuZ2UgdGhlIEpSRSBsb2NhdGlvbi4KLWVycm9yUG9ydEludmFsaWQ9VGhlIHNlcnZlciBjYW5ub3QgYmUgc3RhcnRlZCBiZWNhdXNlIG9uZSBvciBtb3JlIG9mIHRoZSBwb3J0cyBhcmUgaW52YWxpZC4gT3BlbiB0aGUgc2VydmVyIGVkaXRvciBhbmQgY29ycmVjdCB0aGUgaW52YWxpZCBwb3J0cy4KLWVycm9yUG9ydEluVXNlPVBvcnQgezB9IHJlcXVpcmVkIGJ5IHsxfSBpcyBhbHJlYWR5IGluIHVzZS4gVGhlIHNlcnZlciBtYXkgYWxyZWFkeSBiZSBydW5uaW5nIGluIGFub3RoZXIgcHJvY2Vzcywgb3IgYSBzeXN0ZW0gcHJvY2VzcyBtYXkgYmUgdXNpbmcgdGhlIHBvcnQuIFwKLSAgVG8gc3RhcnQgdGhpcyBzZXJ2ZXIgeW91IHdpbGwgbmVlZCB0byBzdG9wIHRoZSBvdGhlciBwcm9jZXNzIG9yIGNoYW5nZSB0aGUgcG9ydCBudW1iZXIocykuCi1lcnJvclBvcnRzSW5Vc2U9U2V2ZXJhbCBwb3J0cyAoezB9KSByZXF1aXJlZCBieSB7MX0gYXJlIGFscmVhZHkgaW4gdXNlLiBUaGUgc2VydmVyIG1heSBhbHJlYWR5IGJlIHJ1bm5pbmcgaW4gYW5vdGhlciBwcm9jZXNzLCBvciBhIHN5c3RlbSBwcm9jZXNzIG1heSBiZSB1c2luZyB0aGUgcG9ydC4gXAotICBUbyBzdGFydCB0aGlzIHNlcnZlciB5b3Ugd2lsbCBuZWVkIHRvIHN0b3AgdGhlIG90aGVyIHByb2Nlc3Mgb3IgY2hhbmdlIHRoZSBwb3J0IG51bWJlcihzKS4KLSMgdGhlIHswfSBpbiB0aGUgZm9sbG93aW5nIHR3byBsaW5lcyB3aWxsIGJlIHJlcGxhY2VkIHdpdGggYSBsb2NhdGlvbiAocGF0aCkgb2YgdGhlIG1pc3Npbmcgb3IgY29ycnVwdCBzZXJ2ZXIgY29uZmlndXJhdGlvbgotZXJyb3JOb0NvbmZpZ3VyYXRpb249VGhlIFRvbWNhdCBzZXJ2ZXIgY29uZmlndXJhdGlvbiBhdCB7MH0gaXMgbWlzc2luZy4gQ2hlY2sgdGhlIHNlcnZlciBmb3IgZXJyb3JzLgotZXJyb3JDb3VsZE5vdExvYWRDb25maWd1cmF0aW9uPUNvdWxkIG5vdCBsb2FkIHRoZSBUb21jYXQgc2VydmVyIGNvbmZpZ3VyYXRpb24gYXQgezB9LiBUaGUgY29uZmlndXJhdGlvbiBtYXkgYmUgY29ycnVwdCBvciBpbmNvbXBsZXRlLgotZXJyb3JDb3VsZE5vdFNhdmVDb25maWd1cmF0aW9uPUNvdWxkIG5vdCBzYXZlIHRoZSBUb21jYXQgc2VydmVyIGNvbmZpZ3VyYXRpb246IHswfS4KLWVycm9yUHVibGlzaENvbmZpZ3VyYXRpb249Q291bGQgbm90IHB1Ymxpc2ggc2VydmVyIGNvbmZpZ3VyYXRpb246IHswfS4KLWVycm9yQ291bGROb3REZWxldGVDb250ZXh0RmlsZT1Db3VsZCBub3QgZGVsZXRlIG9ic29sZXRlIGNvbnRleHQgZmlsZTogezB9Ci1lcnJvckNsZWFudXBTZXJ2ZXI9Q291bGQgbm90IGNsZWFuIHNlcnZlciBvZiBvYnNvbGV0ZSBmaWxlczogezB9Ci1lcnJvcldlYk1vZHVsZXNPbmx5PVRvbWNhdCBvbmx5IHN1cHBvcnRzIHJ1bm5pbmcgSjJFRSBXZWIgbW9kdWxlcy4KLWVycm9yTm9SdW50aW1lPUNhbm5vdCBhZGQgbW9kdWxlcyBiZWNhdXNlIHRoZXJlIGlzIG5vIHJ1bnRpbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzZXJ2ZXIuCi1lcnJvclNwZWMzMj1Ub21jYXQgdmVyc2lvbiAzLjIgb25seSBzdXBwb3J0cyBKMkVFIDEuMiBXZWIgbW9kdWxlcwotZXJyb3JTcGVjNDA9VG9tY2F0IHZlcnNpb24gNC4wIG9ubHkgc3VwcG9ydHMgSjJFRSAxLjIgYW5kIDEuMyBXZWIgbW9kdWxlcwotZXJyb3JTcGVjNDE9VG9tY2F0IHZlcnNpb24gNC4xIG9ubHkgc3VwcG9ydHMgSjJFRSAxLjIgYW5kIDEuMyBXZWIgbW9kdWxlcwotZXJyb3JTcGVjNTA9VG9tY2F0IHZlcnNpb24gNS4wIG9ubHkgc3VwcG9ydHMgSjJFRSAxLjIsIDEuMywgYW5kIDEuNCBXZWIgbW9kdWxlcwotZXJyb3JTcGVjNTU9VG9tY2F0IHZlcnNpb24gNS41IG9ubHkgc3VwcG9ydHMgSjJFRSAxLjIsIDEuMywgYW5kIDEuNCBXZWIgbW9kdWxlcwotZXJyb3JEdXBsaWNhdGVDb250ZXh0Um9vdD1Ud28gb3IgbW9yZSBXZWIgbW9kdWxlcyBkZWZpbmVkIGluIHRoZSBjb25maWd1cmF0aW9uIGhhdmUgdGhlIHNhbWUgY29udGV4dCByb290ICh7MH0pLiBcCi0gIFRvIHN0YXJ0IHRoaXMgc2VydmVyIHlvdSB3aWxsIG5lZWQgdG8gcmVtb3ZlIHRoZSBkdXBsaWNhdGUocykuCi1lcnJvckNvdWxkTm90TG9hZENvbnRleHRYbWw9Q291bGQgbm90IGxvYWQgdGhlIGNvbnRleHQgY29uZmlndXJhdGlvbiBmb3IgdGhlIHswfSBjb250ZXh0IGR1ZSB0byBhIHN5bnRheCBlcnJvciBvciBvdGhlciBleGNlcHRpb24uCi0KLXdhcm5pbmdKUkU9VG9tY2F0IHJlcXVpcmVzIGEgSmF2YSBTREsgaW4gb3JkZXIgdG8gY29tcGlsZSBKU1AgZmlsZXMuIEVuc3VyZSB0aGF0IHRoZSBKUkUgcHJlZmVyZW5jZSBzZXR0aW5ncyBwb2ludCB0byBhbiBTREsgaW5zdGFsbCBsb2NhdGlvbi4KLQotIyBBY3Rpb25zICh1c2VkIGluIHVuZG8vcmVkbyBtZW51cykKLXNlcnZlckVkaXRvckFjdGlvblNldFNlY3VyZT1zZXQgc2VjdXJpdHkKLXNlcnZlckVkaXRvckFjdGlvblNldFNlY3VyZURlc2NyaXB0aW9uPVNldCB0aGUgVG9tY2F0IHNlY3VyaXR5Ci1zZXJ2ZXJFZGl0b3JBY3Rpb25TZXREZWJ1Z01vZGU9c2V0IFRvbWNhdCBkZWJ1ZyBtb2RlCi1zZXJ2ZXJFZGl0b3JBY3Rpb25TZXREZWJ1Z01vZGVEZXNjcmlwdGlvbj1TZXQgVG9tY2F0IGluIGRlYnVnIG1vZGUKLXNlcnZlckVkaXRvckFjdGlvblNldFRlc3RFbnZpcm9ubWVudD1ydW4gbW9kdWxlcyBmcm9tIHdvcmtzcGFjZQotc2VydmVyRWRpdG9yQWN0aW9uU2V0VGVzdEVudmlyb25tZW50RGVzY3JpcHRpb249UnVuIG1vZHVsZXMgZnJvbSB0aGUgd29ya3NwYWNlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL01pbWVNYXBwaW5nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL01pbWVNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkM2ZiMmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9NaW1lTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsOwotCi0vKioKLSAqIEEgbWltZSBtYXBwaW5nLgotICovCi1wdWJsaWMgY2xhc3MgTWltZU1hcHBpbmcgaW1wbGVtZW50cyBJTWltZU1hcHBpbmcgewotCXByaXZhdGUgU3RyaW5nIGV4dGVuc2lvbjsKLQlwcml2YXRlIFN0cmluZyBtaW1lVHlwZTsKLQotCS8qKgotCSAqIE1pbWVNYXBwaW5nIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIGV4dGVuc2lvbiBhbiBleHRlbnNpb24KLQkgKiBAcGFyYW0gbWltZVR5cGUgYSBtaW1lIHR5cGUKLQkgKi8KLQlwdWJsaWMgTWltZU1hcHBpbmcoU3RyaW5nIGV4dGVuc2lvbiwgU3RyaW5nIG1pbWVUeXBlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZXh0ZW5zaW9uID0gZXh0ZW5zaW9uOwotCQl0aGlzLm1pbWVUeXBlID0gbWltZVR5cGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZXh0ZW5zaW9uLgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RXh0ZW5zaW9uKCkgewotCQlyZXR1cm4gZXh0ZW5zaW9uOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1pbWUgdHlwZS4KLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1pbWVUeXBlKCkgewotCQlyZXR1cm4gbWltZVR5cGU7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvUGluZ1RocmVhZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9QaW5nVGhyZWFkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmYjk1YTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9QaW5nVGhyZWFkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuSHR0cFVSTENvbm5lY3Rpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0LlVSTENvbm5lY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLS8qKgotICogVGhyZWFkIHVzZWQgdG8gcGluZyBzZXJ2ZXIgdG8gdGVzdCB3aGVuIGl0IGlzIHN0YXJ0ZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBQaW5nVGhyZWFkIHsKLQkvLyBkZWxheSBiZWZvcmUgcGluZ2luZyBzdGFydHMKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUElOR19ERUxBWSA9IDIwMDA7Ci0KLQkvLyBkZWxheSBiZXR3ZWVuIHBpbmdzCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBJTkdfSU5URVJWQUwgPSAyNTA7Ci0KLQkvLyBtYXhpbXVtIG51bWJlciBvZiBwaW5ncyBiZWZvcmUgZ2l2aW5nIHVwCi0JcHJpdmF0ZSBpbnQgbWF4UGluZ3MgPSA1NjsgLy8gdG90YWw6IDE2IHNlY29uZHMgKyBjb25uZWN0aW9uIHRpbWUKLQotCXByaXZhdGUgYm9vbGVhbiBzdG9wID0gZmFsc2U7Ci0JcHJpdmF0ZSBTdHJpbmcgdXJsOwotCXByaXZhdGUgSVNlcnZlciBzZXJ2ZXI7Ci0JcHJpdmF0ZSBUb21jYXRTZXJ2ZXJCZWhhdmlvdXIgYmVoYXZpb3VyOwotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IFBpbmdUaHJlYWQuCi0JICogCi0JICogQHBhcmFtIHNlcnZlcgotCSAqIEBwYXJhbSB1cmwKLQkgKiBAcGFyYW0gbWF4UGluZ3MKLQkgKiBAcGFyYW0gYmVoYXZpb3VyCi0JICovCi0JcHVibGljIFBpbmdUaHJlYWQoSVNlcnZlciBzZXJ2ZXIsIFN0cmluZyB1cmwsIGludCBtYXhQaW5ncywgVG9tY2F0U2VydmVyQmVoYXZpb3VyIGJlaGF2aW91cikgewotCQlzdXBlcigpOwotCQl0aGlzLnNlcnZlciA9IHNlcnZlcjsKLQkJdGhpcy51cmwgPSB1cmw7Ci0JCXRoaXMubWF4UGluZ3MgPSBtYXhQaW5nczsKLQkJdGhpcy5iZWhhdmlvdXIgPSBiZWhhdmlvdXI7Ci0JCVRocmVhZCB0ID0gbmV3IFRocmVhZCgiVG9tY2F0IFBpbmcgVGhyZWFkIikgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXBpbmcoKTsKLQkJCX0KLQkJfTsKLQkJdC5zZXREYWVtb24odHJ1ZSk7Ci0JCXQuc3RhcnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBQaW5nIHRoZSBzZXJ2ZXIgdW50aWwgaXQgaXMgc3RhcnRlZC4gVGhlbiBzZXQgdGhlIHNlcnZlcgotCSAqIHN0YXRlIHRvIFNUQVRFX1NUQVJURUQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGluZygpIHsKLQkJaW50IGNvdW50ID0gMDsKLQkJdHJ5IHsKLQkJCVRocmVhZC5zbGVlcChQSU5HX0RFTEFZKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCXdoaWxlICghc3RvcCkgewotCQkJdHJ5IHsKLQkJCQlpZiAoY291bnQgPT0gbWF4UGluZ3MpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCXNlcnZlci5zdG9wKGZhbHNlKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIlBpbmc6IGNvdWxkIG5vdCBzdG9wIHNlcnZlciIpOwotCQkJCQl9Ci0JCQkJCXN0b3AgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY291bnQrKzsKLQkJCQkKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJQaW5nOiBwaW5naW5nIik7Ci0JCQkJVVJMIHBpbmdVcmwgPSBuZXcgVVJMKHVybCk7Ci0JCQkJVVJMQ29ubmVjdGlvbiBjb25uID0gcGluZ1VybC5vcGVuQ29ubmVjdGlvbigpOwotCQkJCSgoSHR0cFVSTENvbm5lY3Rpb24pY29ubikuZ2V0UmVzcG9uc2VDb2RlKCk7Ci0JCi0JCQkJLy8gcGluZyB3b3JrZWQgLSBzZXJ2ZXIgaXMgdXAKLQkJCQlpZiAoIXN0b3ApIHsKLQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiUGluZzogc3VjY2VzcyIpOwotCQkJCQlUaHJlYWQuc2xlZXAoMjAwKTsKLQkJCQkJYmVoYXZpb3VyLnNldFNlcnZlclN0YXJ0ZWQoKTsKLQkJCQl9Ci0JCQkJc3RvcCA9IHRydWU7Ci0JCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZmUpIHsKLQkJCQl0cnkgewotCQkJCQlUaHJlYWQuc2xlZXAoMjAwKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkvLyBpZ25vcmUKLQkJCQl9Ci0JCQkJYmVoYXZpb3VyLnNldFNlcnZlclN0YXJ0ZWQoKTsKLQkJCQlzdG9wID0gdHJ1ZTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiUGluZzogZmFpbGVkIik7Ci0JCQkJLy8gcGluZ2luZyBmYWlsZWQKLQkJCQlpZiAoIXN0b3ApIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCVRocmVhZC5zbGVlcChQSU5HX0lOVEVSVkFMKTsKLQkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZTIpIHsKLQkJCQkJCS8vIGlnbm9yZQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVGVsbCB0aGUgcGluZ2luZyB0byBzdG9wLgotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoKSB7Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIlBpbmc6IHN0b3BwaW5nIik7Ci0JCXN0b3AgPSB0cnVlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1Byb2dyZXNzVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9Qcm9ncmVzc1V0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWVkYWRkNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1Byb2dyZXNzVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci0vKioKLSAqIFByb2dyZXNzIE1vbml0b3IgdXRpbGl0eS4KLSAqLwotcHVibGljIGNsYXNzIFByb2dyZXNzVXRpbCB7Ci0JLyoqCi0JICogUHJvZ3Jlc3NVdGlsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHJpdmF0ZSBQcm9ncmVzc1V0aWwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgdmFsaWQgcHJvZ3Jlc3MgbW9uaXRvci4KLQkgKgotCSAqIEBwYXJhbSBtb25pdG9yIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb2dyZXNzTW9uaXRvciBnZXRNb25pdG9yRm9yKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAobW9uaXRvciA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCXJldHVybiBtb25pdG9yOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHN1Yi1wcm9ncmVzcyBtb25pdG9yIHdpdGggdGhlIGdpdmVuIGFtb3VudCBvbiB0aGUKLQkgKiBjdXJyZW50IHByb2dyZXNzIG1vbml0b3IuCi0JICoKLQkgKiBAcGFyYW0gbW9uaXRvciBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcgotCSAqIEBwYXJhbSB0aWNrcyBpbnQKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvZ3Jlc3NNb25pdG9yIGdldFN1Yk1vbml0b3JGb3IoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBpbnQgdGlja3MpIHsKLQkJaWYgKG1vbml0b3IgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQlpZiAobW9uaXRvciBpbnN0YW5jZW9mIE51bGxQcm9ncmVzc01vbml0b3IpCi0JCQlyZXR1cm4gbW9uaXRvcjsKLQkJcmV0dXJuIG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgdGlja3MpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHN1Yi1wcm9ncmVzcyBtb25pdG9yIHdpdGggdGhlIGdpdmVuIGFtb3VudCBvbiB0aGUKLQkgKiBjdXJyZW50IHByb2dyZXNzIG1vbml0b3IuCi0JICoKLQkgKiBAcGFyYW0gbW9uaXRvciBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcgotCSAqIEBwYXJhbSB0aWNrcyBhIG51bWJlciBvZiB0aWNrcwotCSAqIEBwYXJhbSBzdHlsZSBhIHN0eWxlCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb2dyZXNzTW9uaXRvciBnZXRTdWJNb25pdG9yRm9yKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgaW50IHRpY2tzLCBpbnQgc3R5bGUpIHsKLQkJaWYgKG1vbml0b3IgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQlpZiAobW9uaXRvciBpbnN0YW5jZW9mIE51bGxQcm9ncmVzc01vbml0b3IpCi0JCQlyZXR1cm4gbW9uaXRvcjsKLQkJcmV0dXJuIG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgdGlja3MsIHN0eWxlKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9QdWJsaXNoT3BlcmF0aW9uMi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9QdWJsaXNoT3BlcmF0aW9uMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTE4MzI0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvUHVibGlzaE9wZXJhdGlvbjIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLlB1Ymxpc2hVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5JTW9kdWxlUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklNb2R1bGVSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5QdWJsaXNoT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5TZXJ2ZXJCZWhhdmlvdXJEZWxlZ2F0ZTsKLS8qKgotICogVG9tY2F0IHB1Ymxpc2ggaGVscGVyLgotICovCi1wdWJsaWMgY2xhc3MgUHVibGlzaE9wZXJhdGlvbjIgZXh0ZW5kcyBQdWJsaXNoT3BlcmF0aW9uIHsKLQlwcm90ZWN0ZWQgVG9tY2F0U2VydmVyQmVoYXZpb3VyIHNlcnZlcjsKLQlwcm90ZWN0ZWQgSU1vZHVsZVtdIG1vZHVsZTsKLQlwcm90ZWN0ZWQgaW50IGtpbmQ7Ci0JcHJvdGVjdGVkIGludCBkZWx0YUtpbmQ7Ci0KLQlwdWJsaWMgUHVibGlzaE9wZXJhdGlvbjIoVG9tY2F0U2VydmVyQmVoYXZpb3VyIHNlcnZlciwgaW50IGtpbmQsIElNb2R1bGVbXSBtb2R1bGUsIGludCBkZWx0YUtpbmQpIHsKLQkJc3VwZXIoIlB1Ymxpc2ggdG8gc2VydmVyIiwgIlB1Ymxpc2ggV2ViIG1vZHVsZSB0byBUb21jYXQgc2VydmVyIik7Ci0JCXRoaXMuc2VydmVyID0gc2VydmVyOwotCQl0aGlzLm1vZHVsZSA9IG1vZHVsZTsKLQkJdGhpcy5raW5kID0ga2luZDsKLQkJdGhpcy5kZWx0YUtpbmQgPSBkZWx0YUtpbmQ7Ci0JfQotCi0JcHVibGljIGludCBnZXRPcmRlcigpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcHVibGljIGludCBnZXRLaW5kKCkgewotCQlyZXR1cm4gUkVRVUlSRUQ7Ci0JfQotCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAobW9kdWxlLmxlbmd0aCA9PSAxKSB7IC8vIHdlYiBtb2R1bGUKLQkJCXB1Ymxpc2hEaXIobW9kdWxlWzBdLCBtb25pdG9yKTsKLQkJfSBlbHNlIHsgLy8gdXRpbGl0eSBtb2R1bGUKLQkJCXB1Ymxpc2hKYXIobW9uaXRvcik7Ci0JCX0KLQkJc2VydmVyLnNldE1vZHVsZVB1Ymxpc2hTdGF0ZTIobW9kdWxlLCBJU2VydmVyLlBVQkxJU0hfU1RBVEVfTk9ORSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHB1Ymxpc2hEaXIoSU1vZHVsZSBtb2R1bGUyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVBhdGggcGF0aCA9IHNlcnZlci5nZXRUZW1wRGlyZWN0b3J5KCkuYXBwZW5kKCJ3ZWJhcHBzIik7Ci0JCXBhdGggPSBwYXRoLmFwcGVuZChtb2R1bGUyLmdldE5hbWUoKSk7Ci0JCQotCQlpZiAoa2luZCA9PSBJU2VydmVyLlBVQkxJU0hfQ0xFQU4gfHwgZGVsdGFLaW5kID09IFNlcnZlckJlaGF2aW91ckRlbGVnYXRlLlJFTU9WRUQpIHsgLy8gY2xlYW4gYW5kIHJlcHVibGlzaCBmcm9tIHNjcmF0Y2gKLQkJCVB1Ymxpc2hVdGlsLmRlbGV0ZURpcmVjdG9yeShwYXRoLnRvRmlsZSgpLCBtb25pdG9yKTsKLQkJCQotCQkJaWYgKGRlbHRhS2luZCA9PSBTZXJ2ZXJCZWhhdmlvdXJEZWxlZ2F0ZS5SRU1PVkVEKQotCQkJCXJldHVybjsKLQkJfQotCQkKLQkJaWYgKGtpbmQgPT0gSVNlcnZlci5QVUJMSVNIX0NMRUFOIHx8IGtpbmQgPT0gSVNlcnZlci5QVUJMSVNIX0ZVTEwpIHsKLQkJCUlNb2R1bGVSZXNvdXJjZVtdIG1yID0gc2VydmVyLmdldFJlc291cmNlcyhtb2R1bGUpOwotCQkJUHVibGlzaFV0aWwuY29weShtciwgcGF0aCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCUlNb2R1bGVSZXNvdXJjZURlbHRhW10gZGVsdGEgPSBzZXJ2ZXIuZ2V0UHVibGlzaGVkUmVzb3VyY2VEZWx0YShtb2R1bGUpOwotCQkKLQkJaW50IHNpemUgPSBkZWx0YS5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlQdWJsaXNoVXRpbC5oYW5kbGVEZWx0YShraW5kLCBwYXRoLCBkZWx0YVtpXSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHVibGlzaEphcihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVBhdGggcGF0aCA9IHNlcnZlci5nZXRUZW1wRGlyZWN0b3J5KCkuYXBwZW5kKCJ3ZWJhcHBzIik7Ci0JCXBhdGggPSBwYXRoLmFwcGVuZChtb2R1bGVbMF0uZ2V0TmFtZSgpKS5hcHBlbmQoIldFQi1JTkYiKS5hcHBlbmQoImxpYiIpOwotCQlJUGF0aCBqYXJQYXRoID0gcGF0aC5hcHBlbmQobW9kdWxlWzFdLmdldE5hbWUoKSArICIuamFyIik7Ci0JCQotCQlpZiAoa2luZCA9PSBJU2VydmVyLlBVQkxJU0hfQ0xFQU4gfHwgZGVsdGFLaW5kID09IFNlcnZlckJlaGF2aW91ckRlbGVnYXRlLlJFTU9WRUQpIHsgLy8gY2xlYW4gYW5kIHJlcHVibGlzaCBmcm9tIHNjcmF0Y2gKLQkJCWlmIChqYXJQYXRoLnRvRmlsZSgpLmV4aXN0cygpKQotCQkJCWphclBhdGgudG9GaWxlKCkuZGVsZXRlKCk7Ci0JCQkKLQkJCWlmIChkZWx0YUtpbmQgPT0gU2VydmVyQmVoYXZpb3VyRGVsZWdhdGUuUkVNT1ZFRCkKLQkJCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGtpbmQgIT0gSVNlcnZlci5QVUJMSVNIX0NMRUFOICYmIGtpbmQgIT0gSVNlcnZlci5QVUJMSVNIX0ZVTEwpIHsKLQkJCS8vIGF2b2lkIGNoYW5nZXMgaWYgbm8gY2hhbmdlcyB0byBtb2R1bGUgc2luY2UgbGFzdCBwdWJsaXNoCi0JCQlJTW9kdWxlUmVzb3VyY2VEZWx0YVtdIGRlbHRhID0gc2VydmVyLmdldFB1Ymxpc2hlZFJlc291cmNlRGVsdGEobW9kdWxlKTsKLQkJCWlmIChkZWx0YSA9PSBudWxsIHx8IGRlbHRhLmxlbmd0aCA9PSAwKQotCQkJCXJldHVybjsKLQkJfQotCQkKLQkJLy8gbWFrZSBkaXJlY3RvcnkgaWYgaXQgZG9lc24ndCBleGlzdAotCQkKLQkJaWYgKCFwYXRoLnRvRmlsZSgpLmV4aXN0cygpKQotCQkJcGF0aC50b0ZpbGUoKS5ta2RpcnMoKTsKLQkJCi0JCUlNb2R1bGVSZXNvdXJjZVtdIG1yID0gc2VydmVyLmdldFJlc291cmNlcyhtb2R1bGUpOwotCQlQdWJsaXNoVXRpbC5jcmVhdGVaaXBGaWxlKG1yLCBqYXJQYXRoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9QdWJsaXNoVGFzay5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9QdWJsaXNoVGFzay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjNkNTU2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvUHVibGlzaFRhc2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLlB1Ymxpc2hPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLlB1Ymxpc2hUYXNrRGVsZWdhdGU7Ci0KLXB1YmxpYyBjbGFzcyBQdWJsaXNoVGFzayBleHRlbmRzIFB1Ymxpc2hUYXNrRGVsZWdhdGUgewotCXB1YmxpYyBQdWJsaXNoT3BlcmF0aW9uW10gZ2V0VGFza3MoSVNlcnZlciBzZXJ2ZXIsIGludCBraW5kLCBMaXN0IG1vZHVsZXMsIExpc3Qga2luZExpc3QpIHsKLQkJaWYgKG1vZHVsZXMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkKLQkJVG9tY2F0U2VydmVyQmVoYXZpb3VyIHRvbWNhdFNlcnZlciA9IChUb21jYXRTZXJ2ZXJCZWhhdmlvdXIpIHNlcnZlci5sb2FkQWRhcHRlcihUb21jYXRTZXJ2ZXJCZWhhdmlvdXIuY2xhc3MsIG51bGwpOwotCQlpZiAoIXRvbWNhdFNlcnZlci5nZXRUb21jYXRTZXJ2ZXIoKS5pc1Rlc3RFbnZpcm9ubWVudCgpKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlMaXN0IHRhc2tzID0gbmV3IEFycmF5TGlzdCgpOwotCQlpbnQgc2l6ZSA9IG1vZHVsZXMuc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJSU1vZHVsZVtdIG1vZHVsZSA9IChJTW9kdWxlW10pIG1vZHVsZXMuZ2V0KGkpOwotCQkJSW50ZWdlciBpbiA9IChJbnRlZ2VyKSBraW5kTGlzdC5nZXQoaSk7Ci0JCQl0YXNrcy5hZGQobmV3IFB1Ymxpc2hPcGVyYXRpb24yKHRvbWNhdFNlcnZlciwga2luZCwgbW9kdWxlLCBpbi5pbnRWYWx1ZSgpKSk7Ci0JCX0KLQkJCi0JCXJldHVybiAoUHVibGlzaE9wZXJhdGlvbltdKSB0YXNrcy50b0FycmF5KG5ldyBQdWJsaXNoT3BlcmF0aW9uW3Rhc2tzLnNpemUoKV0pOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1RvbWNhdDMyQ29uZmlndXJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9Ub21jYXQzMkNvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZiMjhmOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1RvbWNhdDMyQ29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC54bWwuRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbC5YTUxVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sLnNlcnZlcjMyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJQb3J0OwotLyoqCi0gKiBUb21jYXQgdjMuMiBzZXJ2ZXIgY29uZmlndXJhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIFRvbWNhdDMyQ29uZmlndXJhdGlvbiBleHRlbmRzIFRvbWNhdENvbmZpZ3VyYXRpb24gewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLnRvbWNhdC5jb25maWd1cmF0aW9uLjMyIjsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFBfSEFORExFUiA9ICJvcmcuYXBhY2hlLnRvbWNhdC5zZXJ2aWNlLmh0dHAuSHR0cENvbm5lY3Rpb25IYW5kbGVyIjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBUEFDSEVfSEFORExFUiA9ICJvcmcuYXBhY2hlLnRvbWNhdC5zZXJ2aWNlLmNvbm5lY3Rvci5BanAxMkNvbm5lY3Rpb25IYW5kbGVyIjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTU0xfU09DS0VUX0ZBQ1RPUlkgPSAib3JnLmFwYWNoZS50b21jYXQubmV0LlNTTFNvY2tldEZhY3RvcnkiOwotCi0JcHJvdGVjdGVkIFNlcnZlciBzZXJ2ZXI7Ci0JcHJvdGVjdGVkIEZhY3Rvcnkgc2VydmVyRmFjdG9yeTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1NlcnZlckRpcnR5OwotCi0JcHJvdGVjdGVkIFdlYkFwcERvY3VtZW50IHdlYkFwcERvY3VtZW50OwotCi0JcHJvdGVjdGVkIERvY3VtZW50IHRvbWNhdFVzZXJzRG9jdW1lbnQ7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHBvbGljeUZpbGU7Ci0KLQkvKioKLQkgKiBUb21jYXQzMkNvbmZpZ3VyYXRpb24gY29uc3RydWN0b3IuCi0JICogCi0JICogQHBhcmFtIHBhdGggYSBwYXRoCi0JICovCi0JcHVibGljIFRvbWNhdDMyQ29uZmlndXJhdGlvbihJRm9sZGVyIHBhdGgpIHsKLQkJc3VwZXIocGF0aCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWFpbiBzZXJ2ZXIgcG9ydC4KLQkgKiBAcmV0dXJuIFRvbWNhdFNlcnZlclBvcnQKLQkgKi8KLQlwdWJsaWMgU2VydmVyUG9ydCBnZXRNYWluUG9ydCgpIHsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBnZXRTZXJ2ZXJQb3J0cygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVNlcnZlclBvcnQgcG9ydCA9IChTZXJ2ZXJQb3J0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAocG9ydC5nZXROYW1lKCkuZXF1YWxzKCJIVFRQIENvbm5lY3RvciIpKQotCQkJCXJldHVybiBwb3J0OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHByZWZpeCB0aGF0IGlzIHVzZWQgaW4gZnJvbnQgb2YgdGhlCi0JICogd2ViIG1vZHVsZSBwYXRoIHByb3BlcnR5LiAoZS5nLiAid2ViYXBwcyIpCi0JICoKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERvY0Jhc2VQcmVmaXgoKSB7Ci0JCXJldHVybiAid2ViYXBwcy8iOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1pbWUgbWFwcGluZ3MuCi0JICogQHJldHVybiBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXB1YmxpYyBMaXN0IGdldE1pbWVNYXBwaW5ncygpIHsKLQkJaWYgKHdlYkFwcERvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IEFycmF5TGlzdCgwKTsKLQkJCi0JCXJldHVybiB3ZWJBcHBEb2N1bWVudC5nZXRNaW1lTWFwcGluZ3MoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZXJ2ZXIgb2JqZWN0IChyb290IG9mIHNlcnZlci54bWwpLgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuaW50ZXJuYWwueG1sLnNlcnZlcjMyLlNlcnZlcgotCSAqLwotCXB1YmxpYyBTZXJ2ZXIgZ2V0U2VydmVyKCkgewotCQlyZXR1cm4gc2VydmVyOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIFNlcnZlclBvcnRzIHRoYXQgdGhpcyBjb25maWd1cmF0aW9uIHVzZXMuCi0JICoKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHVibGljIExpc3QgZ2V0U2VydmVyUG9ydHMoKSB7Ci0JCUxpc3QgcG9ydHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCi0JCXRyeSB7Ci0JCQlpbnQgY291bnQgPSBzZXJ2ZXIuZ2V0Q29udGV4dE1hbmFnZXIoKS5nZXRDb25uZWN0b3JDb3VudCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQkJQ29ubmVjdG9yIGNvbm5lY3RvciA9IHNlcnZlci5nZXRDb250ZXh0TWFuYWdlcigpLmdldENvbm5lY3RvcihpKTsKLQkJCQlpbnQgcGFyYW1Db3VudCA9IGNvbm5lY3Rvci5nZXRQYXJhbWV0ZXJDb3VudCgpOwotCQkJCVN0cmluZyBoYW5kbGVyID0gbnVsbDsKLQkJCQlTdHJpbmcgbmFtZSA9IE1lc3NhZ2VzLnBvcnRVbmtub3duOwotCQkJCVN0cmluZyBzb2NrZXRGYWN0b3J5ID0gbnVsbDsKLQkJCQlTdHJpbmcgcHJvdG9jb2wgPSAiVENQSVAiOwotCQkJCWJvb2xlYW4gYWR2YW5jZWQgPSB0cnVlOwotCQkJCVN0cmluZ1tdIGNvbnRlbnRUeXBlcyA9IG51bGw7Ci0JCQkJaW50IHBvcnQgPSAtMTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHBhcmFtQ291bnQ7IGorKykgewotCQkJCQlQYXJhbWV0ZXIgcCA9IGNvbm5lY3Rvci5nZXRQYXJhbWV0ZXIoaik7Ci0JCQkJCWlmICgicG9ydCIuZXF1YWxzKHAuZ2V0TmFtZSgpKSkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlwb3J0ID0gSW50ZWdlci5wYXJzZUludChwLmdldFZhbHVlKCkpOwotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkvLyBpZ25vcmUKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIGlmICgiaGFuZGxlciIuZXF1YWxzKHAuZ2V0TmFtZSgpKSkKLQkJCQkJCWhhbmRsZXIgPSBwLmdldFZhbHVlKCk7Ci0JCQkJCWVsc2UgaWYgKCJzb2NrZXRGYWN0b3J5Ii5lcXVhbHMocC5nZXROYW1lKCkpKQotCQkJCQkJc29ja2V0RmFjdG9yeSA9IHAuZ2V0VmFsdWUoKTsKLQkJCQl9Ci0JCQkJaWYgKEhUVFBfSEFORExFUi5lcXVhbHMoaGFuZGxlcikpIHsKLQkJCQkJcHJvdG9jb2wgPSAiSFRUUCI7Ci0JCQkJCWNvbnRlbnRUeXBlcyA9IG5ldyBTdHJpbmdbXSB7ICJ3ZWIiLCAid2Vic2VydmljZXMiIH07Ci0JCQkJCWlmIChTU0xfU09DS0VUX0ZBQ1RPUlkuZXF1YWxzKHNvY2tldEZhY3RvcnkpKSB7Ci0JCQkJCQlwcm90b2NvbCA9ICJTU0wiOwotCQkJCQkJbmFtZSA9ICJTU0wgQ29ubmVjdG9yIjsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCW5hbWUgPSAiSFRUUCBDb25uZWN0b3IiOwotCQkJCQkJYWR2YW5jZWQgPSBmYWxzZTsKLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAoQVBBQ0hFX0hBTkRMRVIuZXF1YWxzKGhhbmRsZXIpKQotCQkJCQluYW1lID0gIkFwYWNoZSBDb25uZWN0b3IiOwotCQkJCWlmIChoYW5kbGVyICE9IG51bGwpCi0JCQkJCXBvcnRzLmFkZChuZXcgU2VydmVyUG9ydChpICsgIiIsIG5hbWUsIHBvcnQsIHByb3RvY29sLCBjb250ZW50VHlwZXMsIGFkdmFuY2VkKSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBnZXR0aW5nIHNlcnZlciBwb3J0cyIsIGUpOwotCQl9Ci0JCi0JCXJldHVybiBwb3J0czsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdG9tY2F0LXVzZXJzLnhtbCBkb2N1bWVudC4KLQkgKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uRG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgRG9jdW1lbnQgZ2V0VG9tY2F0VXNlcnNEb2N1bWVudCgpIHsKLQkJcmV0dXJuIHRvbWNhdFVzZXJzRG9jdW1lbnQ7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhIGxpc3Qgb2YgdGhlIHdlYiBtb2R1bGVzIGluIHRoaXMgc2VydmVyLgotCSAqIEByZXR1cm4gamF2YS51dGlsLkxpc3QKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRXZWJNb2R1bGVzKCkgewotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCi0JCXRyeSB7Ci0JCQlDb250ZXh0TWFuYWdlciBjb250ZXh0TWFuYWdlciA9IHNlcnZlci5nZXRDb250ZXh0TWFuYWdlcigpOwotCQotCQkJaW50IHNpemUgPSBjb250ZXh0TWFuYWdlci5nZXRDb250ZXh0Q291bnQoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJQ29udGV4dCBjb250ZXh0ID0gY29udGV4dE1hbmFnZXIuZ2V0Q29udGV4dChpKTsKLQkJCQlTdHJpbmcgcmVsb2FkID0gY29udGV4dC5nZXRSZWxvYWRhYmxlKCk7Ci0JCQkJaWYgKHJlbG9hZCA9PSBudWxsKQotCQkJCQlyZWxvYWQgPSAiZmFsc2UiOwotCQkJCVdlYk1vZHVsZSBtb2R1bGUgPSBuZXcgV2ViTW9kdWxlKGNvbnRleHQuZ2V0UGF0aCgpLCAKLQkJCQkJY29udGV4dC5nZXREb2NCYXNlKCksIGNvbnRleHQuZ2V0U291cmNlKCksCi0JCQkJCXJlbG9hZC5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikgPyB0cnVlIDogZmFsc2UpOwotCQkJCWxpc3QuYWRkKG1vZHVsZSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBnZXR0aW5nIHByb2plY3QgcmVmcyIsIGUpOwotCQl9Ci0JCi0JCXJldHVybiBsaXN0OwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIFRvbWNhdENvbmZpZ3VyYXRpb24jbG9hZChJUGF0aCwgSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkKElQYXRoIHBhdGgsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0cnkgewotCQkJbW9uaXRvciA9IFByb2dyZXNzVXRpbC5nZXRNb25pdG9yRm9yKG1vbml0b3IpOwotCQkJbW9uaXRvci5iZWdpblRhc2soTWVzc2FnZXMubG9hZGluZ1Rhc2ssIDUpOwotCQotCQkJLy8gY2hlY2sgZm9yIHRvbWNhdC5wb2xpY3kgdG8gdmVyaWZ5IHRoYXQgdGhpcyBpcyBhIHYzLjIgY29uZmlnCi0JCQlJbnB1dFN0cmVhbSBpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0ocGF0aC5hcHBlbmQoInRvbWNhdC5wb2xpY3kiKS50b0ZpbGUoKSk7Ci0JCQlpbi5yZWFkKCk7Ci0JCQlpbi5jbG9zZSgpOwotCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQkKLQkJCS8vIGNyZWF0ZSBzZXJ2ZXIueG1sCi0JCQlzZXJ2ZXJGYWN0b3J5ID0gbmV3IEZhY3RvcnkoKTsKLQkJCXNlcnZlckZhY3Rvcnkuc2V0UGFja2FnZU5hbWUoIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sLnNlcnZlcjMyIik7Ci0JCQlzZXJ2ZXIgPSAoU2VydmVyKSBzZXJ2ZXJGYWN0b3J5LmxvYWREb2N1bWVudChuZXcgRmlsZUlucHV0U3RyZWFtKHBhdGguYXBwZW5kKCJzZXJ2ZXIueG1sIikudG9GaWxlKCkpKTsKLQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQotCQkJd2ViQXBwRG9jdW1lbnQgPSBuZXcgV2ViQXBwRG9jdW1lbnQocGF0aC5hcHBlbmQoIndlYi54bWwiKSk7Ci0JCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQotCQkJdG9tY2F0VXNlcnNEb2N1bWVudCA9IFhNTFV0aWwuZ2V0RG9jdW1lbnRCdWlsZGVyKCkucGFyc2UobmV3IElucHV0U291cmNlKG5ldyBGaWxlSW5wdXRTdHJlYW0ocGF0aC5hcHBlbmQoInRvbWNhdC11c2Vycy54bWwiKS50b0ZpbGUoKSkpKTsKLQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQotCQkJLy8gbG9hZCBwb2xpY3kgZmlsZQotCQkJQnVmZmVyZWRSZWFkZXIgYnIgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQliciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIobmV3IEZpbGVJbnB1dFN0cmVhbShwYXRoLmFwcGVuZCgidG9tY2F0LnBvbGljeSIpLnRvRmlsZSgpKSkpOwotCQkJCVN0cmluZyB0ZW1wID0gYnIucmVhZExpbmUoKTsKLQkJCQlwb2xpY3lGaWxlID0gIiI7Ci0JCQkJd2hpbGUgKHRlbXAgIT0gbnVsbCkgewotCQkJCQlwb2xpY3lGaWxlICs9IHRlbXAgKyAiXG4iOwotCQkJCQl0ZW1wID0gYnIucmVhZExpbmUoKTsKLQkJCQl9Ci0JCQkJYnIuY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IGxvYWQgcG9saWN5IGZpbGUiLCBlKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJaWYgKGJyICE9IG51bGwpCi0JCQkJCWJyLmNsb3NlKCk7Ci0JCQl9Ci0JCQltb25pdG9yLndvcmtlZCgxKTsKLQkKLQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCQlyZXR1cm47Ci0JCi0JCQltb25pdG9yLmRvbmUoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBsb2FkIFRvbWNhdCB2My4yIGNvbmZpZ3VyYXRpb24gZnJvbSAiICsgcGF0aC50b09TU3RyaW5nKCkgKyAiOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBUb21jYXRQbHVnaW4uUExVR0lOX0lELCAwLCBOTFMuYmluZChNZXNzYWdlcy5lcnJvckNvdWxkTm90TG9hZENvbmZpZ3VyYXRpb24sIHBhdGgudG9PU1N0cmluZygpKSwgZSkpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgVG9tY2F0Q29uZmlndXJhdGlvbiNsb2FkKElGb2xkZXIsIElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgbG9hZChJRm9sZGVyIGZvbGRlciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQltb25pdG9yID0gUHJvZ3Jlc3NVdGlsLmdldE1vbml0b3JGb3IobW9uaXRvcik7Ci0JCQltb25pdG9yLmJlZ2luVGFzayhNZXNzYWdlcy5sb2FkaW5nVGFzaywgODAwKTsKLQkKLQkJCS8vIGNoZWNrIGZvciB0b21jYXQucG9saWN5IHRvIHZlcmlmeSB0aGF0IHRoaXMgaXMgYSB2My4yIGNvbmZpZwotCQkJSUZpbGUgZmlsZSA9IGZvbGRlci5nZXRGaWxlKCJ0b21jYXQucG9saWN5Iik7Ci0JCQlpZiAoIWZpbGUuZXhpc3RzKCkpCi0JCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yQ291bGROb3RMb2FkQ29uZmlndXJhdGlvbiwgZm9sZGVyLmdldEZ1bGxQYXRoKCkudG9PU1N0cmluZygpKSwgbnVsbCkpOwotCQotCQkJLy8gbG9hZCBzZXJ2ZXIueG1sCi0JCQlmaWxlID0gZm9sZGVyLmdldEZpbGUoInNlcnZlci54bWwiKTsKLQkJCUlucHV0U3RyZWFtIGluID0gZmlsZS5nZXRDb250ZW50cygpOwotCQkJc2VydmVyRmFjdG9yeSA9IG5ldyBGYWN0b3J5KCk7Ci0JCQlzZXJ2ZXJGYWN0b3J5LnNldFBhY2thZ2VOYW1lKCJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbC5zZXJ2ZXIzMiIpOwotCQkJc2VydmVyID0gKFNlcnZlcikgc2VydmVyRmFjdG9yeS5sb2FkRG9jdW1lbnQoaW4pOwotCQkJbW9uaXRvci53b3JrZWQoMjAwKTsKLQkKLQkJCS8vIGxvYWQgd2ViLnhtbAotCQkJZmlsZSA9IGZvbGRlci5nZXRGaWxlKCJ3ZWIueG1sIik7Ci0JCQl3ZWJBcHBEb2N1bWVudCA9IG5ldyBXZWJBcHBEb2N1bWVudChmaWxlKTsKLQkJCW1vbml0b3Iud29ya2VkKDIwMCk7Ci0JCi0JCQkvLyBsb2FkIHRvbWNhdC11c2Vycy54bWwKLQkJCWZpbGUgPSBmb2xkZXIuZ2V0RmlsZSgidG9tY2F0LXVzZXJzLnhtbCIpOwotCQkJaW4gPSBmaWxlLmdldENvbnRlbnRzKCk7Ci0JCQkKLQkJCXRvbWNhdFVzZXJzRG9jdW1lbnQgPSBYTUxVdGlsLmdldERvY3VtZW50QnVpbGRlcigpLnBhcnNlKG5ldyBJbnB1dFNvdXJjZShpbikpOwotCQkJbW9uaXRvci53b3JrZWQoMjAwKTsKLQkKLQkJCS8vIGxvYWQgdG9tY2F0LnBvbGljeQotCQkJZmlsZSA9IGZvbGRlci5nZXRGaWxlKCJ0b21jYXQucG9saWN5Iik7Ci0JCQlpbiA9IGZpbGUuZ2V0Q29udGVudHMoKTsKLQkJCUJ1ZmZlcmVkUmVhZGVyIGJyID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJYnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKGluKSk7Ci0JCQkJU3RyaW5nIHRlbXAgPSBici5yZWFkTGluZSgpOwotCQkJCXBvbGljeUZpbGUgPSAiIjsKLQkJCQl3aGlsZSAodGVtcCAhPSBudWxsKSB7Ci0JCQkJCXBvbGljeUZpbGUgKz0gdGVtcCArICJcbiI7Ci0JCQkJCXRlbXAgPSBici5yZWFkTGluZSgpOwotCQkJCX0KLQkJCQlici5jbG9zZSgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3QgbG9hZCBwb2xpY3kgZmlsZSIsIGUpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZiAoYnIgIT0gbnVsbCkKLQkJCQkJYnIuY2xvc2UoKTsKLQkJCX0KLQkJCW1vbml0b3Iud29ya2VkKDIwMCk7Ci0JCi0JCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiQ2FuY2VsbGVkIik7Ci0JCi0JCQltb25pdG9yLmRvbmUoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBsb2FkIFRvbWNhdCB2My4yIGNvbmZpZ3VyYXRpb24gZnJvbTogIiArIGZvbGRlci5nZXRGdWxsUGF0aCgpICsgIjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgVG9tY2F0UGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JDb3VsZE5vdExvYWRDb25maWd1cmF0aW9uLCBmb2xkZXIuZ2V0RnVsbFBhdGgoKS50b09TU3RyaW5nKCkpLCBlKSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogU2F2ZSB0aGUgaW5mb3JtYXRpb24gaGVsZCBieSB0aGlzIG9iamVjdCB0byB0aGUgZ2l2ZW4gZGlyZWN0b3J5LgotCSAqIAotCSAqIEBwYXJhbSBwYXRoIGEgcGF0aAotCSAqIEBwYXJhbSBmb3JjZURpcnR5IGlmIHRydWUsIHRoZSBmaWxlcyB3aWxsIGJlIHNhdmVkLCByZWdhcmRsZXNzCi0JICogIG9mIHdoZXRoZXIgdGhleSBoYXZlIGJlZW4gbW9kaWZpZWQKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzYXZlKElQYXRoIHBhdGgsIGJvb2xlYW4gZm9yY2VEaXJ0eSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQltb25pdG9yID0gUHJvZ3Jlc3NVdGlsLmdldE1vbml0b3JGb3IobW9uaXRvcik7Ci0JCQltb25pdG9yLmJlZ2luVGFzayhNZXNzYWdlcy5zYXZpbmdUYXNrLCA1KTsKLQkKLQkJCS8vIG1ha2Ugc3VyZSBkaXJlY3RvcnkgZXhpc3RzCi0JCQlpZiAoIXBhdGgudG9GaWxlKCkuZXhpc3RzKCkpIHsKLQkJCQlmb3JjZURpcnR5ID0gdHJ1ZTsKLQkJCQlwYXRoLnRvRmlsZSgpLm1rZGlyKCk7Ci0JCQl9Ci0JCQltb25pdG9yLndvcmtlZCgxKTsKLQkKLQkJCS8vIHNhdmUgZmlsZXMKLQkJCWlmIChmb3JjZURpcnR5IHx8IGlzU2VydmVyRGlydHkpCi0JCQkJc2VydmVyRmFjdG9yeS5zYXZlKHBhdGguYXBwZW5kKCJzZXJ2ZXIueG1sIikudG9PU1N0cmluZygpKTsKLQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQotCQkJd2ViQXBwRG9jdW1lbnQuc2F2ZShwYXRoLmFwcGVuZCgid2ViLnhtbCIpLnRvT1NTdHJpbmcoKSwgZm9yY2VEaXJ0eSk7Ci0JCQltb25pdG9yLndvcmtlZCgxKTsKLQkKLQkJCWlmIChmb3JjZURpcnR5KQotCQkJCVhNTFV0aWwuc2F2ZShwYXRoLmFwcGVuZCgidG9tY2F0LXVzZXJzLnhtbCIpLnRvT1NTdHJpbmcoKSwgdG9tY2F0VXNlcnNEb2N1bWVudCk7Ci0JCQltb25pdG9yLndvcmtlZCgxKTsKLQkKLQkJCWlmIChmb3JjZURpcnR5KSB7Ci0JCQkJQnVmZmVyZWRXcml0ZXIgYncgPSBuZXcgQnVmZmVyZWRXcml0ZXIobmV3IEZpbGVXcml0ZXIocGF0aC5hcHBlbmQoInRvbWNhdC5wb2xpY3kiKS50b0ZpbGUoKSkpOwotCQkJCWJ3LndyaXRlKHBvbGljeUZpbGUpOwotCQkJCWJ3LmNsb3NlKCk7Ci0JCQl9Ci0JCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCWlzU2VydmVyRGlydHkgPSBmYWxzZTsKLQkKLQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCQlyZXR1cm47Ci0JCQltb25pdG9yLmRvbmUoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBzYXZlIFRvbWNhdCB2My4yIGNvbmZpZ3VyYXRpb24gdG8gIiArIHBhdGgsIGUpOwotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBUb21jYXRQbHVnaW4uUExVR0lOX0lELCAwLCBOTFMuYmluZChNZXNzYWdlcy5lcnJvckNvdWxkTm90U2F2ZUNvbmZpZ3VyYXRpb24sIG5ldyBTdHJpbmdbXSB7ZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCl9KSwgZSkpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNhdmUoSVBhdGggcGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXNhdmUocGF0aCwgdHJ1ZSwgbW9uaXRvcik7Ci0JfQotCQotCS8qKgotCSAqIFNhdmUgdGhlIGluZm9ybWF0aW9uIGhlbGQgYnkgdGhpcyBvYmplY3QgdG8gdGhlIGdpdmVuIGRpcmVjdG9yeS4KLQkgKiAKLQkgKiBAcGFyYW0gZm9sZGVyIGEgZm9sZGVyCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZShJRm9sZGVyIGZvbGRlciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQltb25pdG9yID0gUHJvZ3Jlc3NVdGlsLmdldE1vbml0b3JGb3IobW9uaXRvcik7Ci0JCQltb25pdG9yLmJlZ2luVGFzayhNZXNzYWdlcy5zYXZpbmdUYXNrLCA5MDApOwotCQotCQkJaWYgKCFmb2xkZXIuZXhpc3RzKCkpCi0JCQkJZm9sZGVyLmNyZWF0ZSh0cnVlLCB0cnVlLCBQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yLCAxMDApKTsKLQkJCWVsc2UKLQkJCQltb25pdG9yLndvcmtlZCgxMDApOwotCQotCQkJLy8gc2F2ZSBzZXJ2ZXIueG1sCi0JCQlieXRlW10gZGF0YSA9IHNlcnZlckZhY3RvcnkuZ2V0Q29udGVudHMoKTsKLQkJCUlucHV0U3RyZWFtIGluID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGRhdGEpOwotCQkJSUZpbGUgZmlsZSA9IGZvbGRlci5nZXRGaWxlKCJzZXJ2ZXIueG1sIik7Ci0JCQlpZiAoZmlsZS5leGlzdHMoKSkgewotCQkJCWlmIChpc1NlcnZlckRpcnR5KQotCQkJCQlmaWxlLnNldENvbnRlbnRzKGluLCB0cnVlLCB0cnVlLCBQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yLCAyMDApKTsKLQkJCQllbHNlCi0JCQkJCW1vbml0b3Iud29ya2VkKDIwMCk7Ci0JCQl9IGVsc2UKLQkJCQlmaWxlLmNyZWF0ZShpbiwgdHJ1ZSwgUHJvZ3Jlc3NVdGlsLmdldFN1Yk1vbml0b3JGb3IobW9uaXRvciwgMjAwKSk7Ci0JCi0JCQkvLyBzYXZlIHdlYi54bWwKLQkJCWZpbGUgPSBmb2xkZXIuZ2V0RmlsZSgid2ViLnhtbCIpOwotCQkJd2ViQXBwRG9jdW1lbnQuc2F2ZShmaWxlLCBQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yLCAyMDApKTsKLQkKLQkJCS8vIHNhdmUgdG9tY2F0LXVzZXJzLnhtbAotCQkJZGF0YSA9IFhNTFV0aWwuZ2V0Q29udGVudHModG9tY2F0VXNlcnNEb2N1bWVudCk7Ci0JCQlpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShkYXRhKTsKLQkJCWZpbGUgPSBmb2xkZXIuZ2V0RmlsZSgidG9tY2F0LXVzZXJzLnhtbCIpOwotCQkJaWYgKGZpbGUuZXhpc3RzKCkpCi0JCQkJbW9uaXRvci53b3JrZWQoMjAwKTsKLQkJCQkvL2ZpbGUuc2V0Q29udGVudHMoaW4sIHRydWUsIHRydWUsIFByb2dyZXNzVXRpbC5nZXRTdWJNb25pdG9yRm9yKG1vbml0b3IsIDIwMCkpOwotCQkJZWxzZQotCQkJCWZpbGUuY3JlYXRlKGluLCB0cnVlLCBQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yLCAyMDApKTsKLQkKLQkJCS8vIHNhdmUgdG9tY2F0LnBvbGljeQotCQkJaW4gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ocG9saWN5RmlsZS5nZXRCeXRlcygpKTsKLQkJCWZpbGUgPSBmb2xkZXIuZ2V0RmlsZSgidG9tY2F0LnBvbGljeSIpOwotCQkJaWYgKGZpbGUuZXhpc3RzKCkpCi0JCQkJbW9uaXRvci53b3JrZWQoMjAwKTsKLQkJCQkvL2ZpbGUuc2V0Q29udGVudHMoaW4sIHRydWUsIHRydWUsIFByb2dyZXNzVXRpbC5nZXRTdWJNb25pdG9yRm9yKG1vbml0b3IsIDIwMCkpOwotCQkJZWxzZQotCQkJCWZpbGUuY3JlYXRlKGluLCB0cnVlLCBQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yLCAyMDApKTsKLQkKLQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCQlyZXR1cm47Ci0JCQltb25pdG9yLmRvbmUoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBzYXZlIFRvbWNhdCB2My4yIGNvbmZpZ3VyYXRpb24gdG8gIiArIGZvbGRlci5nZXRGdWxsUGF0aCgpLCBlKTsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgVG9tY2F0UGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JDb3VsZE5vdFNhdmVDb25maWd1cmF0aW9uLCBuZXcgU3RyaW5nW10ge2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpfSksIGUpKTsKLQkJfQotCX0KLQkKLQkKLQkvKioKLQkgKiBAc2VlIElUb21jYXRDb25maWd1cmF0aW9uV29ya2luZ0NvcHkjYWRkTWltZU1hcHBpbmcoaW50LCBJTWltZU1hcHBpbmcpCi0JICovCi0JcHVibGljIHZvaWQgYWRkTWltZU1hcHBpbmcoaW50IGluZGV4LCBJTWltZU1hcHBpbmcgbWFwKSB7Ci0JCXdlYkFwcERvY3VtZW50LmFkZE1pbWVNYXBwaW5nKGluZGV4LCBtYXApOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChBRERfTUFQUElOR19QUk9QRVJUWSwgbmV3IEludGVnZXIoaW5kZXgpLCBtYXApOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVRvbWNhdENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSNhZGRXZWJNb2R1bGUoaW50LCBJVG9tY2F0V2ViTW9kdWxlKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFdlYk1vZHVsZShpbnQgaW5kZXgsIElUb21jYXRXZWJNb2R1bGUgbW9kdWxlKSB7Ci0JCXRyeSB7Ci0JCQlDb250ZXh0TWFuYWdlciBjb250ZXh0TWFuYWdlciA9IHNlcnZlci5nZXRDb250ZXh0TWFuYWdlcigpOwotCQkJQ29udGV4dCBjb250ZXh0ID0gKENvbnRleHQpIGNvbnRleHRNYW5hZ2VyLmNyZWF0ZUVsZW1lbnQoaW5kZXgsICJDb250ZXh0Iik7Ci0JCi0JCQljb250ZXh0LnNldFBhdGgobW9kdWxlLmdldFBhdGgoKSk7Ci0JCQljb250ZXh0LnNldERvY0Jhc2UobW9kdWxlLmdldERvY3VtZW50QmFzZSgpKTsKLQkJCWNvbnRleHQuc2V0UmVsb2FkYWJsZShtb2R1bGUuaXNSZWxvYWRhYmxlKCkgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLQkJCWlmIChtb2R1bGUuZ2V0TWVtZW50bygpICE9IG51bGwgJiYgbW9kdWxlLmdldE1lbWVudG8oKS5sZW5ndGgoKSA+IDApCi0JCQkJY29udGV4dC5zZXRTb3VyY2UobW9kdWxlLmdldE1lbWVudG8oKSk7Ci0JCQlpc1NlcnZlckRpcnR5ID0gdHJ1ZTsKLQkJCWZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KEFERF9XRUJfTU9EVUxFX1BST1BFUlRZLCBudWxsLCBtb2R1bGUpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgYWRkaW5nIHdlYiBtb2R1bGUiLCBlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIExvY2FsaXplIHRoZSB3ZWIgcHJvamVjdHMgaW4gdGhpcyBjb25maWd1cmF0aW9uLgotCSAqCi0JICogQHBhcmFtIHBhdGggYSBwYXRoCi0JICogQHBhcmFtIHNlcnZlcjIgYSBzZXJ2ZXIgdHlwZQotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvcgotCSAqLwotCXB1YmxpYyB2b2lkIGxvY2FsaXplQ29uZmlndXJhdGlvbihJUGF0aCBwYXRoLCBUb21jYXRTZXJ2ZXIgc2VydmVyMiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXRyeSB7Ci0JCQltb25pdG9yID0gUHJvZ3Jlc3NVdGlsLmdldE1vbml0b3JGb3IobW9uaXRvcik7Ci0JCQltb25pdG9yLmJlZ2luVGFzayhNZXNzYWdlcy51cGRhdGluZ0NvbmZpZ3VyYXRpb25UYXNrLCAxMDApOwotCQkJCi0JCQlUb21jYXQzMkNvbmZpZ3VyYXRpb24gY29uZmlnID0gbmV3IFRvbWNhdDMyQ29uZmlndXJhdGlvbihudWxsKTsKLQkJCWNvbmZpZy5sb2FkKHBhdGgsIFByb2dyZXNzVXRpbC5nZXRTdWJNb25pdG9yRm9yKG1vbml0b3IsIDMwKSk7Ci0JCQkKLQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCQlyZXR1cm47Ci0JCQkKLQkJCWlmIChzZXJ2ZXIyLmlzVGVzdEVudmlyb25tZW50KCkpIHsKLQkJCQlJUGF0aCB0b21jYXRQYXRoID0gcGF0aC5yZW1vdmVMYXN0U2VnbWVudHMoMSk7Ci0JCQkJY29uZmlnLnNlcnZlci5nZXRDb250ZXh0TWFuYWdlcigpLnNldEhvbWUodG9tY2F0UGF0aC50b09TU3RyaW5nKCkpOwotCQkJCWNvbmZpZy5pc1NlcnZlckRpcnR5ID0gdHJ1ZTsKLQkJCX0KLQkJCW1vbml0b3Iud29ya2VkKDQwKTsKLQkJCQotCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJCXJldHVybjsKLQkJCQotCQkJY29uZmlnLnNhdmUocGF0aCwgZmFsc2UsIFByb2dyZXNzVXRpbC5nZXRTdWJNb25pdG9yRm9yKG1vbml0b3IsIDMwKSk7Ci0JCQkKLQkJCWlmICghbW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJbW9uaXRvci5kb25lKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBsb2NhbGl6aW5nIGNvbmZpZ3VyYXRpb24iLCBlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENoYW5nZSB0aGUgZXh0ZW5zaW9uIG9mIGEgbWltZSBtYXBwaW5nLgotCSAqIAotCSAqIEBwYXJhbSBpbmRleAotCSAqIEBwYXJhbSBtYXAKLQkgKi8KLQlwdWJsaWMgdm9pZCBtb2RpZnlNaW1lTWFwcGluZyhpbnQgaW5kZXgsIElNaW1lTWFwcGluZyBtYXApIHsKLQkJd2ViQXBwRG9jdW1lbnQubW9kaWZ5TWltZU1hcHBpbmcoaW5kZXgsIG1hcCk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KE1PRElGWV9NQVBQSU5HX1BST1BFUlRZLCBuZXcgSW50ZWdlcihpbmRleCksIG1hcCk7Ci0JfQotCQotCS8qKgotCSAqIE1vZGlmeSB0aGUgcG9ydCB3aXRoIHRoZSBnaXZlbiBpZC4KLQkgKgotCSAqIEBwYXJhbSBpZCBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIHBvcnQgaW50Ci0JICovCi0JcHVibGljIHZvaWQgbW9kaWZ5U2VydmVyUG9ydChTdHJpbmcgaWQsIGludCBwb3J0KSB7Ci0JCXRyeSB7Ci0JCQlpbnQgY29uID0gSW50ZWdlci5wYXJzZUludChpZCk7Ci0JCQlDb25uZWN0b3IgY29ubmVjdG9yID0gc2VydmVyLmdldENvbnRleHRNYW5hZ2VyKCkuZ2V0Q29ubmVjdG9yKGNvbik7Ci0JCi0JCQlpbnQgc2l6ZSA9IGNvbm5lY3Rvci5nZXRQYXJhbWV0ZXJDb3VudCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlQYXJhbWV0ZXIgcCA9IGNvbm5lY3Rvci5nZXRQYXJhbWV0ZXIoaSk7Ci0JCQkJaWYgKCJwb3J0Ii5lcXVhbHMocC5nZXROYW1lKCkpKSB7Ci0JCQkJCXAuc2V0VmFsdWUocG9ydCArICIiKTsKLQkJCQkJaXNTZXJ2ZXJEaXJ0eSA9IHRydWU7Ci0JCQkJCWZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KE1PRElGWV9QT1JUX1BST1BFUlRZLCBpZCwgbmV3IEludGVnZXIocG9ydCkpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgbW9kaWZ5aW5nIHNlcnZlciBwb3J0ICIgKyBpZCwgZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ2hhbmdlIGEgd2ViIG1vZHVsZS4KLQkgKiBAcGFyYW0gaW5kZXggaW50Ci0JICogQHBhcmFtIGRvY0Jhc2UgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBwYXRoIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gcmVsb2FkYWJsZSBib29sZWFuCi0JICovCi0JcHVibGljIHZvaWQgbW9kaWZ5V2ViTW9kdWxlKGludCBpbmRleCwgU3RyaW5nIGRvY0Jhc2UsIFN0cmluZyBwYXRoLCBib29sZWFuIHJlbG9hZGFibGUpIHsKLQkJdHJ5IHsKLQkJCUNvbnRleHRNYW5hZ2VyIGNvbnRleHRNYW5hZ2VyID0gc2VydmVyLmdldENvbnRleHRNYW5hZ2VyKCk7Ci0JCQlDb250ZXh0IGNvbnRleHQgPSBjb250ZXh0TWFuYWdlci5nZXRDb250ZXh0KGluZGV4KTsKLQkJCWNvbnRleHQuc2V0UGF0aChwYXRoKTsKLQkJCWNvbnRleHQuc2V0RG9jQmFzZShkb2NCYXNlKTsKLQkJCWNvbnRleHQuc2V0UmVsb2FkYWJsZShyZWxvYWRhYmxlID8gInRydWUiIDogImZhbHNlIik7Ci0JCQlpc1NlcnZlckRpcnR5ID0gdHJ1ZTsKLQkJCVdlYk1vZHVsZSBtb2R1bGUgPSBuZXcgV2ViTW9kdWxlKHBhdGgsIGRvY0Jhc2UsIG51bGwsIHJlbG9hZGFibGUpOwotCQkJZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQoTU9ESUZZX1dFQl9NT0RVTEVfUFJPUEVSVFksIG5ldyBJbnRlZ2VyKGluZGV4KSwgbW9kdWxlKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIG1vZGlmeWluZyB3ZWIgbW9kdWxlICIgKyBpbmRleCwgZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmVtb3ZlcyBhIG1pbWUgbWFwcGluZy4KLQkgKiBAcGFyYW0gaW5kZXggaW50Ci0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTWltZU1hcHBpbmcoaW50IGluZGV4KSB7Ci0JCXdlYkFwcERvY3VtZW50LnJlbW92ZU1pbWVNYXBwaW5nKGluZGV4KTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQoUkVNT1ZFX01BUFBJTkdfUFJPUEVSVFksIG51bGwsIG5ldyBJbnRlZ2VyKGluZGV4KSk7Ci0JfQotCQotCS8qKgotCSAqIFJlbW92ZXMgYSB3ZWIgbW9kdWxlLgotCSAqIEBwYXJhbSBpbmRleCBpbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVXZWJNb2R1bGUoaW50IGluZGV4KSB7Ci0JCXRyeSB7Ci0JCQlDb250ZXh0TWFuYWdlciBjb250ZXh0TWFuYWdlciA9IHNlcnZlci5nZXRDb250ZXh0TWFuYWdlcigpOwotCQkJY29udGV4dE1hbmFnZXIucmVtb3ZlRWxlbWVudCgiQ29udGV4dCIsIGluZGV4KTsKLQkJCWlzU2VydmVyRGlydHkgPSB0cnVlOwotCQkJZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQoUkVNT1ZFX1dFQl9NT0RVTEVfUFJPUEVSVFksIG51bGwsIG5ldyBJbnRlZ2VyKGluZGV4KSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciByZW1vdmluZyB3ZWIgbW9kdWxlICIgKyBpbmRleCwgZSk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9Ub21jYXQzMkhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvVG9tY2F0MzJIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzZDkzNjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9Ub21jYXQzMkhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLaAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkphdmFSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotLyoqCi0gKiBUb21jYXQgMzIgaGFuZGxlci4KLSAqLwotcHVibGljIGNsYXNzIFRvbWNhdDMySGFuZGxlciBpbXBsZW1lbnRzIElUb21jYXRWZXJzaW9uSGFuZGxlciB7Ci0JLyoqCi0JICogQHNlZSBJVG9tY2F0VmVyc2lvbkhhbmRsZXIjdmVyaWZ5SW5zdGFsbFBhdGgoSVBhdGgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmVyaWZ5SW5zdGFsbFBhdGgoSVBhdGggaW5zdGFsbFBhdGgpIHsKLQkJcmV0dXJuIFRvbWNhdFBsdWdpbi52ZXJpZnlJbnN0YWxsUGF0aChpbnN0YWxsUGF0aCwgVG9tY2F0UGx1Z2luLlRPTUNBVF8zMik7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgSVRvbWNhdFZlcnNpb25IYW5kbGVyI2dldFJ1bnRpbWVDbGFzcygpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSdW50aW1lQ2xhc3MoKSB7Ci0JCXJldHVybiAib3JnLmFwYWNoZS50b21jYXQuc3RhcnR1cC5Ub21jYXQiOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVRvbWNhdFZlcnNpb25IYW5kbGVyI2dldFJ1bnRpbWVDbGFzc3BhdGgoSVBhdGgpCi0JICovCi0JcHVibGljIExpc3QgZ2V0UnVudGltZUNsYXNzcGF0aChJUGF0aCBpbnN0YWxsUGF0aCkgewotCQlMaXN0IGNwID0gbmV3IEFycmF5TGlzdCgpOwotCQkvLyBhZGQgYWxsIGphcnMgZnJvbSB0aGUgVG9tY2F0IGxpYiBkaXJlY3RvcnkKLQkJRmlsZSBsaWJEaXIgPSBpbnN0YWxsUGF0aC5hcHBlbmQoImxpYiIpLnRvRmlsZSgpOwotCQlpZiAobGliRGlyLmV4aXN0cygpKSB7Ci0JCQlTdHJpbmdbXSBsaWJzID0gbGliRGlyLmxpc3QoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlicy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChsaWJzW2ldLmVuZHNXaXRoKCJqYXIiKSkgewotCQkJCQlJUGF0aCBwYXRoID0gaW5zdGFsbFBhdGguYXBwZW5kKCJsaWIiKS5hcHBlbmQobGlic1tpXSk7Ci0JCQkJCWNwLmFkZChKYXZhUnVudGltZS5uZXdBcmNoaXZlUnVudGltZUNsYXNzcGF0aEVudHJ5KHBhdGgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gY3A7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJVG9tY2F0VmVyc2lvbkhhbmRsZXIjZ2V0UnVudGltZVByb2dyYW1Bcmd1bWVudHMoSVBhdGgsIGJvb2xlYW4sIGJvb2xlYW4pCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldFJ1bnRpbWVQcm9ncmFtQXJndW1lbnRzKElQYXRoIGNvbmZpZ1BhdGgsIGJvb2xlYW4gZGVidWcsIGJvb2xlYW4gc3RhcnRpbmcpIHsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoY29uZmlnUGF0aCAhPSBudWxsKSB7Ci0JCQlsaXN0LmFkZCgiLWYgXCIiICsgY29uZmlnUGF0aC5hcHBlbmQoImNvbmYiKS5hcHBlbmQoInNlcnZlci54bWwiKS50b09TU3RyaW5nKCkgKyAiXCIiKTsKLQkJfQotCQkKLQkJaWYgKCFzdGFydGluZykKLQkJCWxpc3QuYWRkKCItc3RvcCIpOwotCQkKLQkJU3RyaW5nW10gcyA9IG5ldyBTdHJpbmdbbGlzdC5zaXplKCldOwotCQlsaXN0LnRvQXJyYXkocyk7Ci0JCXJldHVybiBzOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVRvbWNhdFZlcnNpb25IYW5kbGVyI2dldFJ1bnRpbWVWTUFyZ3VtZW50cyhJUGF0aCwgSVBhdGgsIGJvb2xlYW4pCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldFJ1bnRpbWVWTUFyZ3VtZW50cyhJUGF0aCBpbnN0YWxsUGF0aCwgSVBhdGggY29uZmlnUGF0aCwgYm9vbGVhbiBpc1Rlc3RFbnYpIHsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlsaXN0LmFkZCgiLUR0b21jYXQuaG9tZT1cIiIgKyBpbnN0YWxsUGF0aC50b09TU3RyaW5nKCkgKyAiXCIiKTsKLQkJCi0JCVN0cmluZ1tdIHMgPSBuZXcgU3RyaW5nW2xpc3Quc2l6ZSgpXTsKLQkJbGlzdC50b0FycmF5KHMpOwotCQlyZXR1cm4gczsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFJ1bnRpbWVQb2xpY3lGaWxlKElQYXRoIGNvbmZpZ1BhdGgpIHsKLQkJcmV0dXJuIGNvbmZpZ1BhdGguYXBwZW5kKCJjb25mIikuYXBwZW5kKCJ0b21jYXQucG9saWN5IikudG9PU1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVRvbWNhdFZlcnNpb25IYW5kbGVyI2NhbkFkZE1vZHVsZShJTW9kdWxlKQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGNhbkFkZE1vZHVsZShJTW9kdWxlIG1vZHVsZSkgewotCQlpZiAoIjIuMiIuZXF1YWxzKG1vZHVsZS5nZXRNb2R1bGVUeXBlKCkuZ2V0VmVyc2lvbigpKSkKLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkKLQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgVG9tY2F0UGx1Z2luLlBMVUdJTl9JRCwgMCwgTWVzc2FnZXMuZXJyb3JTcGVjMzIsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVRvbWNhdFZlcnNpb25IYW5kbGVyI2dldFJ1bnRpbWVCYXNlRGlyZWN0b3J5KFRvbWNhdFNlcnZlckJlaGF2aW91cikKLQkgKi8KLQlwdWJsaWMgSVBhdGggZ2V0UnVudGltZUJhc2VEaXJlY3RvcnkoVG9tY2F0U2VydmVyQmVoYXZpb3VyIHNlcnZlckJlaGF2aW91cikgewotCQlyZXR1cm4gc2VydmVyQmVoYXZpb3VyLmdldFNlcnZlcigpLmdldFJ1bnRpbWUoKS5nZXRMb2NhdGlvbigpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1RvbWNhdDQwQ29uZmlndXJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9Ub21jYXQ0MENvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFmYjExMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1RvbWNhdDQwQ29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotoCoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sLkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC54bWwuWE1MVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbC5zZXJ2ZXI0MC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJQb3J0OwotLyoqCi0gKiBUb21jYXQgdjQuMCBzZXJ2ZXIgY29uZmlndXJhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIFRvbWNhdDQwQ29uZmlndXJhdGlvbiBleHRlbmRzIFRvbWNhdENvbmZpZ3VyYXRpb24gewotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfU0VSVklDRSA9ICJUb21jYXQtU3RhbmRhbG9uZSI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUF9DT05ORUNUT1IgPSAib3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3IuaHR0cC5IdHRwQ29ubmVjdG9yIjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTU0xfU09DS0VUX0ZBQ1RPUlkgPSAib3JnLmFwYWNoZS5jYXRhbGluYS5uZXQuU1NMU2VydmVyU29ja2V0RmFjdG9yeSI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9DT05ORUNUT1IgPSAib3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3IudGVzdC5IdHRwQ29ubmVjdG9yIjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBUEFDSEVfQ09OTkVDVE9SID0gIm9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLndhcnAuV2FycENvbm5lY3RvciI7Ci0KLQlwcm90ZWN0ZWQgU2VydmVyIHNlcnZlcjsKLQlwcm90ZWN0ZWQgRmFjdG9yeSBzZXJ2ZXJGYWN0b3J5OwotCXByb3RlY3RlZCBib29sZWFuIGlzU2VydmVyRGlydHk7Ci0KLQlwcm90ZWN0ZWQgV2ViQXBwRG9jdW1lbnQgd2ViQXBwRG9jdW1lbnQ7Ci0KLQlwcm90ZWN0ZWQgRG9jdW1lbnQgdG9tY2F0VXNlcnNEb2N1bWVudDsKLQotCXByb3RlY3RlZCBTdHJpbmcgcG9saWN5RmlsZTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1BvbGljeURpcnR5OwotCi0JLyoqCi0JICogVG9tY2F0NDBDb25maWd1cmF0aW9uIGNvbnN0cnVjdG9yLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoIGEgcGF0aAotCSAqLwotCXB1YmxpYyBUb21jYXQ0MENvbmZpZ3VyYXRpb24oSUZvbGRlciBwYXRoKSB7Ci0JCXN1cGVyKHBhdGgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcG9ydCBudW1iZXIuCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgU2VydmVyUG9ydCBnZXRNYWluUG9ydCgpIHsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBnZXRTZXJ2ZXJQb3J0cygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVNlcnZlclBvcnQgcG9ydCA9IChTZXJ2ZXJQb3J0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAocG9ydC5nZXROYW1lKCkuZXF1YWxzKCJIVFRQIENvbm5lY3RvciIpKQotCQkJCXJldHVybiBwb3J0OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtaW1lIG1hcHBpbmdzLgotCSAqIEByZXR1cm4gamF2YS51dGlsLkxpc3QKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRNaW1lTWFwcGluZ3MoKSB7Ci0JCXJldHVybiB3ZWJBcHBEb2N1bWVudC5nZXRNaW1lTWFwcGluZ3MoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBTZXJ2ZXJQb3J0cyB0aGF0IHRoaXMgY29uZmlndXJhdGlvbiB1c2VzLgotCSAqCi0JICogQHJldHVybiBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFNlcnZlclBvcnRzKCkgewotCQlMaXN0IHBvcnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQotCQkvLyBmaXJzdCBhZGQgc2VydmVyIHBvcnQKLQkJdHJ5IHsKLQkJCWludCBwb3J0ID0gSW50ZWdlci5wYXJzZUludChzZXJ2ZXIuZ2V0UG9ydCgpKTsKLQkJCXBvcnRzLmFkZChuZXcgU2VydmVyUG9ydCgic2VydmVyIiwgTWVzc2FnZXMucG9ydFNlcnZlciwgcG9ydCwgIlRDUElQIikpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQkKLQkJLy8gYWRkIGNvbm5lY3RvcnMKLQkJdHJ5IHsKLQkJCWludCBzaXplID0gc2VydmVyLmdldFNlcnZpY2VDb3VudCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlTZXJ2aWNlIHNlcnZpY2UgPSBzZXJ2ZXIuZ2V0U2VydmljZShpKTsKLQkJCQlpbnQgc2l6ZTIgPSBzZXJ2aWNlLmdldENvbm5lY3RvckNvdW50KCk7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBzaXplMjsgaisrKSB7Ci0JCQkJCUNvbm5lY3RvciBjb25uZWN0b3IgPSBzZXJ2aWNlLmdldENvbm5lY3RvcihqKTsKLQkJCQkJU3RyaW5nIGNsYXNzTmFtZSA9IGNvbm5lY3Rvci5nZXRDbGFzc05hbWUoKTsKLQkJCQkJU3RyaW5nIG5hbWUgPSBNZXNzYWdlcy5wb3J0VW5rbm93bjsKLQkJCQkJU3RyaW5nIHByb3RvY29sID0gIlRDUElQIjsKLQkJCQkJYm9vbGVhbiBhZHZhbmNlZCA9IHRydWU7Ci0JCQkJCVN0cmluZ1tdIGNvbnRlbnRUeXBlcyA9IG51bGw7Ci0JCQkJCWludCBwb3J0ID0gLTE7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlwb3J0ID0gSW50ZWdlci5wYXJzZUludChjb25uZWN0b3IuZ2V0UG9ydCgpKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIGlnbm9yZQotCQkJCQl9Ci0JCQkJCWlmIChIVFRQX0NPTk5FQ1RPUi5lcXVhbHMoY2xhc3NOYW1lKSkgewotCQkJCQkJbmFtZSA9ICJIVFRQIENvbm5lY3RvciI7Ci0JCQkJCQlwcm90b2NvbCA9ICJIVFRQIjsKLQkJCQkJCWNvbnRlbnRUeXBlcyA9IG5ldyBTdHJpbmdbXSB7ICJ3ZWIiLCAid2Vic2VydmljZXMiIH07Ci0JCQkJCQkvLyBjaGVjayBmb3IgU1NMIGNvbm5lY3RvcgotCQkJCQkJdHJ5IHsKLQkJCQkJCQlFbGVtZW50IGVsZW1lbnQgPSBjb25uZWN0b3IuZ2V0U3ViRWxlbWVudCgiRmFjdG9yeSIpOwotCQkJCQkJCWlmIChTU0xfU09DS0VUX0ZBQ1RPUlkuZXF1YWxzKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJjbGFzc05hbWUiKSkpIHsKLQkJCQkJCQkJbmFtZSA9ICJTU0wgQ29ubmVjdG9yIjsKLQkJCQkJCQkJcHJvdG9jb2wgPSAiU1NMIjsKLQkJCQkJCQl9Ci0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCS8vIGlnbm9yZQotCQkJCQkJfQotCQkJCQkJaWYgKCJIVFRQIi5lcXVhbHMocHJvdG9jb2wpKQotCQkJCQkJCWFkdmFuY2VkID0gZmFsc2U7Ci0JCQkJCX0gZWxzZSBpZiAoQVBBQ0hFX0NPTk5FQ1RPUi5lcXVhbHMoY2xhc3NOYW1lKSkKLQkJCQkJCW5hbWUgPSAiQXBhY2hlIENvbm5lY3RvciI7Ci0JCQkJCWlmIChjbGFzc05hbWUgIT0gbnVsbCAmJiBjbGFzc05hbWUubGVuZ3RoKCkgPiAwKQotCQkJCQkJcG9ydHMuYWRkKG5ldyBTZXJ2ZXJQb3J0KGkgKyAiLyIgKyBqLCBuYW1lLCBwb3J0LCBwcm90b2NvbCwgY29udGVudFR5cGVzLCBhZHZhbmNlZCkpOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGdldHRpbmcgc2VydmVyIHBvcnRzIiwgZSk7Ci0JCX0KLQkJcmV0dXJuIHBvcnRzOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IG9mIHRoZSB3ZWIgbW9kdWxlcyBpbiB0aGlzIHNlcnZlci4KLQkgKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHVibGljIExpc3QgZ2V0V2ViTW9kdWxlcygpIHsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQotCQl0cnkgewotCQkJaW50IHNpemUgPSBzZXJ2ZXIuZ2V0U2VydmljZUNvdW50KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCVNlcnZpY2Ugc2VydmljZSA9IHNlcnZlci5nZXRTZXJ2aWNlKGkpOwotCQkJCWlmIChzZXJ2aWNlLmdldE5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKERFRkFVTFRfU0VSVklDRSkpIHsKLQkJCQkJRW5naW5lIGVuZ2luZSA9IHNlcnZpY2UuZ2V0RW5naW5lKCk7Ci0JCQkJCUhvc3QgaG9zdCA9IGVuZ2luZS5nZXRIb3N0KCk7Ci0JCQkJCWludCBzaXplMiA9IGhvc3QuZ2V0Q29udGV4dENvdW50KCk7Ci0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgc2l6ZTI7IGorKykgewotCQkJCQkJQ29udGV4dCBjb250ZXh0ID0gaG9zdC5nZXRDb250ZXh0KGopOwotCQkJCQkJU3RyaW5nIHJlbG9hZCA9IGNvbnRleHQuZ2V0UmVsb2FkYWJsZSgpOwotCQkJCQkJaWYgKHJlbG9hZCA9PSBudWxsKQotCQkJCQkJCXJlbG9hZCA9ICJmYWxzZSI7Ci0JCQkJCQlXZWJNb2R1bGUgbW9kdWxlID0gbmV3IFdlYk1vZHVsZShjb250ZXh0LmdldFBhdGgoKSwgCi0JCQkJCQkJY29udGV4dC5nZXREb2NCYXNlKCksIGNvbnRleHQuZ2V0U291cmNlKCksCi0JCQkJCQkJcmVsb2FkLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSA/IHRydWUgOiBmYWxzZSk7Ci0JCQkJCQlsaXN0LmFkZChtb2R1bGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgZ2V0dGluZyBtb2R1bGVzIiwgZSk7Ci0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGltcG9ydEZyb21QYXRoKElQYXRoIHBhdGgsIGJvb2xlYW4gaXNUZXN0RW52LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJbG9hZChwYXRoLCBtb25pdG9yKTsKLQkJCi0JCS8vIGZvciB0ZXN0IGVudmlyb25tZW50LCByZW1vdmUgZXhpc3RpbmcgY29udGV4dHMgc2luY2UgYSBzZXBhcmF0ZQotCQkvLyBjYXRhbGluYS5iYXNlIHdpbGwgYmUgdXNlZAotCQlpZiAoaXNUZXN0RW52KSB7Ci0JCQlpbnQgc2l6ZSA9IHNlcnZlci5nZXRTZXJ2aWNlQ291bnQoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJU2VydmljZSBzZXJ2aWNlID0gc2VydmVyLmdldFNlcnZpY2UoaSk7Ci0JCQkJaWYgKHNlcnZpY2UuZ2V0TmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoREVGQVVMVF9TRVJWSUNFKSkgewotCQkJCQlIb3N0IGhvc3QgPSBzZXJ2aWNlLmdldEVuZ2luZSgpLmdldEhvc3QoKTsKLQkJCQkJaW50IHNpemUyID0gaG9zdC5nZXRDb250ZXh0Q291bnQoKTsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBzaXplMjsgaisrKSB7Ci0JCQkJCQlob3N0LnJlbW92ZUVsZW1lbnQoIkNvbnRleHQiLCAwKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgVG9tY2F0Q29uZmlndXJhdGlvbiNsb2FkKElQYXRoLCBJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWQoSVBhdGggcGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQltb25pdG9yID0gUHJvZ3Jlc3NVdGlsLmdldE1vbml0b3JGb3IobW9uaXRvcik7Ci0JCQltb25pdG9yLmJlZ2luVGFzayhNZXNzYWdlcy5sb2FkaW5nVGFzaywgNSk7Ci0JCQkKLQkJCS8vIGNoZWNrIGZvciBjYXRhbGluYS5wb2xpY3kgdG8gdmVyaWZ5IHRoYXQgdGhpcyBpcyBhIHY0LjAgY29uZmlnCi0JCQlJbnB1dFN0cmVhbSBpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0ocGF0aC5hcHBlbmQoImNhdGFsaW5hLnBvbGljeSIpLnRvRmlsZSgpKTsKLQkJCWluLnJlYWQoKTsKLQkJCWluLmNsb3NlKCk7Ci0JCQltb25pdG9yLndvcmtlZCgxKTsKLQkKLQkJCXNlcnZlckZhY3RvcnkgPSBuZXcgRmFjdG9yeSgpOwotCQkJc2VydmVyRmFjdG9yeS5zZXRQYWNrYWdlTmFtZSgib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC54bWwuc2VydmVyNDAiKTsKLQkJCXNlcnZlciA9IChTZXJ2ZXIpIHNlcnZlckZhY3RvcnkubG9hZERvY3VtZW50KG5ldyBGaWxlSW5wdXRTdHJlYW0ocGF0aC5hcHBlbmQoInNlcnZlci54bWwiKS50b0ZpbGUoKSkpOwotCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0KLQkJCXdlYkFwcERvY3VtZW50ID0gbmV3IFdlYkFwcERvY3VtZW50KHBhdGguYXBwZW5kKCJ3ZWIueG1sIikpOwotCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCi0JCQl0b21jYXRVc2Vyc0RvY3VtZW50ID0gWE1MVXRpbC5nZXREb2N1bWVudEJ1aWxkZXIoKS5wYXJzZShuZXcgSW5wdXRTb3VyY2UobmV3IEZpbGVJbnB1dFN0cmVhbShwYXRoLmFwcGVuZCgidG9tY2F0LXVzZXJzLnhtbCIpLnRvRmlsZSgpKSkpOwotCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQotCQkJLy8gbG9hZCBwb2xpY3kgZmlsZQotCQkJQnVmZmVyZWRSZWFkZXIgYnIgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQliciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIobmV3IEZpbGVJbnB1dFN0cmVhbShwYXRoLmFwcGVuZCgiY2F0YWxpbmEucG9saWN5IikudG9GaWxlKCkpKSk7Ci0JCQkJU3RyaW5nIHRlbXAgPSBici5yZWFkTGluZSgpOwotCQkJCXBvbGljeUZpbGUgPSAiIjsKLQkJCQl3aGlsZSAodGVtcCAhPSBudWxsKSB7Ci0JCQkJCXBvbGljeUZpbGUgKz0gdGVtcCArICJcbiI7Ci0JCQkJCXRlbXAgPSBici5yZWFkTGluZSgpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIkNvdWxkIG5vdCBsb2FkIHBvbGljeSBmaWxlIiwgZSk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWlmIChiciAhPSBudWxsKQotCQkJCQlici5jbG9zZSgpOwotCQkJfQotCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCi0JCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJcmV0dXJuOwotCQkJbW9uaXRvci5kb25lKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiQ291bGQgbm90IGxvYWQgVG9tY2F0IHY0LjAgY29uZmlndXJhdGlvbiBmcm9tICIgKyBwYXRoLnRvT1NTdHJpbmcoKSArICI6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yQ291bGROb3RMb2FkQ29uZmlndXJhdGlvbiwgcGF0aC50b09TU3RyaW5nKCkpLCBlKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFRvbWNhdENvbmZpZ3VyYXRpb24jbG9hZChJRm9sZGVyLCBJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWQoSUZvbGRlciBmb2xkZXIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0cnkgewotCQkJbW9uaXRvciA9IFByb2dyZXNzVXRpbC5nZXRNb25pdG9yRm9yKG1vbml0b3IpOwotCQkJbW9uaXRvci5iZWdpblRhc2soTWVzc2FnZXMubG9hZGluZ1Rhc2ssIDgwMCk7Ci0JCi0JCQkvLyBjaGVjayBmb3IgY2F0YWxpbmEucG9saWN5IHRvIHZlcmlmeSB0aGF0IHRoaXMgaXMgYSB2NC4wIGNvbmZpZwotCQkJSUZpbGUgZmlsZSA9IGZvbGRlci5nZXRGaWxlKCJjYXRhbGluYS5wb2xpY3kiKTsKLQkJCWlmICghZmlsZS5leGlzdHMoKSkKLQkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgVG9tY2F0UGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JDb3VsZE5vdExvYWRDb25maWd1cmF0aW9uLCBmb2xkZXIuZ2V0RnVsbFBhdGgoKS50b09TU3RyaW5nKCkpLCBudWxsKSk7Ci0JCi0JCQkvLyBsb2FkIHNlcnZlci54bWwKLQkJCWZpbGUgPSBmb2xkZXIuZ2V0RmlsZSgic2VydmVyLnhtbCIpOwotCQkJSW5wdXRTdHJlYW0gaW4gPSBmaWxlLmdldENvbnRlbnRzKCk7Ci0JCQlzZXJ2ZXJGYWN0b3J5ID0gbmV3IEZhY3RvcnkoKTsKLQkJCXNlcnZlckZhY3Rvcnkuc2V0UGFja2FnZU5hbWUoIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sLnNlcnZlcjQwIik7Ci0JCQlzZXJ2ZXIgPSAoU2VydmVyKSBzZXJ2ZXJGYWN0b3J5LmxvYWREb2N1bWVudChpbik7Ci0JCQltb25pdG9yLndvcmtlZCgyMDApOwotCQotCQkJLy8gbG9hZCB3ZWIueG1sCi0JCQlmaWxlID0gZm9sZGVyLmdldEZpbGUoIndlYi54bWwiKTsKLQkJCXdlYkFwcERvY3VtZW50ID0gbmV3IFdlYkFwcERvY3VtZW50KGZpbGUpOwotCQkJbW9uaXRvci53b3JrZWQoMjAwKTsKLQkKLQkJCS8vIGxvYWQgdG9tY2F0LXVzZXJzLnhtbAotCQkJZmlsZSA9IGZvbGRlci5nZXRGaWxlKCJ0b21jYXQtdXNlcnMueG1sIik7Ci0JCQlpbiA9IGZpbGUuZ2V0Q29udGVudHMoKTsKLQkJCQotCQkJdG9tY2F0VXNlcnNEb2N1bWVudCA9IFhNTFV0aWwuZ2V0RG9jdW1lbnRCdWlsZGVyKCkucGFyc2UobmV3IElucHV0U291cmNlKGluKSk7Ci0JCQltb25pdG9yLndvcmtlZCgyMDApOwotCQkKLQkJCS8vIGxvYWQgY2F0YWxpbmEucG9saWN5Ci0JCQlmaWxlID0gZm9sZGVyLmdldEZpbGUoImNhdGFsaW5hLnBvbGljeSIpOwotCQkJaW4gPSBmaWxlLmdldENvbnRlbnRzKCk7Ci0JCQlCdWZmZXJlZFJlYWRlciBiciA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpbikpOwotCQkJCVN0cmluZyB0ZW1wID0gYnIucmVhZExpbmUoKTsKLQkJCQlwb2xpY3lGaWxlID0gIiI7Ci0JCQkJd2hpbGUgKHRlbXAgIT0gbnVsbCkgewotCQkJCQlwb2xpY3lGaWxlICs9IHRlbXAgKyAiXG4iOwotCQkJCQl0ZW1wID0gYnIucmVhZExpbmUoKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJDb3VsZCBub3QgbG9hZCBwb2xpY3kgZmlsZSIsIGUpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZiAoYnIgIT0gbnVsbCkKLQkJCQkJYnIuY2xvc2UoKTsKLQkJCX0KLQkJCW1vbml0b3Iud29ya2VkKDIwMCk7Ci0JCi0JCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiQ2FuY2VsbGVkIik7Ci0JCQltb25pdG9yLmRvbmUoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJDb3VsZCBub3QgcmVsb2FkIFRvbWNhdCB2NC4wIGNvbmZpZ3VyYXRpb24gZnJvbTogIiArIGZvbGRlci5nZXRGdWxsUGF0aCgpICsgIjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgVG9tY2F0UGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JDb3VsZE5vdExvYWRDb25maWd1cmF0aW9uLCBmb2xkZXIuZ2V0RnVsbFBhdGgoKS50b09TU3RyaW5nKCkpLCBlKSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogU2F2ZSB0byB0aGUgZ2l2ZW4gZGlyZWN0b3J5LgotCSAqIAotCSAqIEBwYXJhbSBwYXRoIGEgcGF0aAotCSAqIEBwYXJhbSBmb3JjZURpcnR5IGJvb2xlYW4KLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IKLQkgKiBAZXhjZXB0aW9uIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzYXZlKElQYXRoIHBhdGgsIGJvb2xlYW4gZm9yY2VEaXJ0eSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQltb25pdG9yID0gUHJvZ3Jlc3NVdGlsLmdldE1vbml0b3JGb3IobW9uaXRvcik7Ci0JCQltb25pdG9yLmJlZ2luVGFzayhNZXNzYWdlcy5zYXZpbmdUYXNrLCAzKTsKLQkKLQkJCS8vIG1ha2Ugc3VyZSBkaXJlY3RvcnkgZXhpc3RzCi0JCQlpZiAoIXBhdGgudG9GaWxlKCkuZXhpc3RzKCkpIHsKLQkJCQlmb3JjZURpcnR5ID0gdHJ1ZTsKLQkJCQlwYXRoLnRvRmlsZSgpLm1rZGlyKCk7Ci0JCQl9Ci0JCQltb25pdG9yLndvcmtlZCgxKTsKLQkKLQkJCS8vIHNhdmUgZmlsZXMKLQkJCWlmIChmb3JjZURpcnR5IHx8IGlzU2VydmVyRGlydHkpCi0JCQkJc2VydmVyRmFjdG9yeS5zYXZlKHBhdGguYXBwZW5kKCJzZXJ2ZXIueG1sIikudG9PU1N0cmluZygpKTsKLQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQotCQkJLy9pZiAoZm9yY2VEaXJ0eSB8fCBpc1dlYkFwcERpcnR5KQotCQkJLy8Jd2ViQXBwRmFjdG9yeS5zYXZlKGRpclBhdGggKyAid2ViLnhtbCIpOwotCQkJLy93ZWJBcHBEb2N1bWVudC5zYXZlKHBhdGgudG9PU1N0cmluZygpLCBmb3JjZURpcnR5IHx8IGlzUG9saWN5RGlydHkpOwotCQkJd2ViQXBwRG9jdW1lbnQuc2F2ZShwYXRoLmFwcGVuZCgid2ViLnhtbCIpLnRvT1NTdHJpbmcoKSwgZm9yY2VEaXJ0eSk7Ci0JCQltb25pdG9yLndvcmtlZCgxKTsKLQkKLQkJCWlmIChmb3JjZURpcnR5KQotCQkJCVhNTFV0aWwuc2F2ZShwYXRoLmFwcGVuZCgidG9tY2F0LXVzZXJzLnhtbCIpLnRvT1NTdHJpbmcoKSwgdG9tY2F0VXNlcnNEb2N1bWVudCk7Ci0JCQltb25pdG9yLndvcmtlZCgxKTsKLQkKLQkJCWlmIChmb3JjZURpcnR5IHx8IGlzUG9saWN5RGlydHkpIHsKLQkJCQlCdWZmZXJlZFdyaXRlciBidyA9IG5ldyBCdWZmZXJlZFdyaXRlcihuZXcgRmlsZVdyaXRlcihwYXRoLmFwcGVuZCgiY2F0YWxpbmEucG9saWN5IikudG9GaWxlKCkpKTsKLQkJCQlidy53cml0ZShwb2xpY3lGaWxlKTsKLQkJCQlidy5jbG9zZSgpOwotCQkJfQotCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQlpc1NlcnZlckRpcnR5ID0gZmFsc2U7Ci0JCQlpc1BvbGljeURpcnR5ID0gZmFsc2U7Ci0JCi0JCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJcmV0dXJuOwotCQkJbW9uaXRvci5kb25lKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3Qgc2F2ZSBUb21jYXQgdjQuMCBjb25maWd1cmF0aW9uIHRvICIgKyBwYXRoLCBlKTsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgVG9tY2F0UGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JDb3VsZE5vdFNhdmVDb25maWd1cmF0aW9uLCBuZXcgU3RyaW5nW10ge2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpfSksIGUpKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBzYXZlKElQYXRoIHBhdGgsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlzYXZlKHBhdGgsIHRydWUsIG1vbml0b3IpOwotCX0KLQotCS8qKgotCSAqIFNhdmUgdGhlIGluZm9ybWF0aW9uIGhlbGQgYnkgdGhpcyBvYmplY3QgdG8gdGhlIGdpdmVuIGRpcmVjdG9yeS4KLQkgKgotCSAqIEBwYXJhbSBmb2xkZXIgYSBmb2xkZXIKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlKElGb2xkZXIgZm9sZGVyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCW1vbml0b3IgPSBQcm9ncmVzc1V0aWwuZ2V0TW9uaXRvckZvcihtb25pdG9yKTsKLQkJCW1vbml0b3IuYmVnaW5UYXNrKE1lc3NhZ2VzLnNhdmluZ1Rhc2ssIDkwMCk7Ci0JCi0JCQkvLyBzYXZlIHNlcnZlci54bWwKLQkJCWJ5dGVbXSBkYXRhID0gc2VydmVyRmFjdG9yeS5nZXRDb250ZW50cygpOwotCQkJSW5wdXRTdHJlYW0gaW4gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oZGF0YSk7Ci0JCQlJRmlsZSBmaWxlID0gZm9sZGVyLmdldEZpbGUoInNlcnZlci54bWwiKTsKLQkJCWlmIChmaWxlLmV4aXN0cygpKSB7Ci0JCQkJaWYgKGlzU2VydmVyRGlydHkpCi0JCQkJCWZpbGUuc2V0Q29udGVudHMoaW4sIHRydWUsIHRydWUsIFByb2dyZXNzVXRpbC5nZXRTdWJNb25pdG9yRm9yKG1vbml0b3IsIDIwMCkpOwotCQkJCWVsc2UKLQkJCQkJbW9uaXRvci53b3JrZWQoMjAwKTsKLQkJCX0gZWxzZQotCQkJCWZpbGUuY3JlYXRlKGluLCB0cnVlLCBQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yLCAyMDApKTsKLQkKLQkJCS8vIHNhdmUgd2ViLnhtbAotCQkJd2ViQXBwRG9jdW1lbnQuc2F2ZShmb2xkZXIuZ2V0RmlsZSgid2ViLnhtbCIpLCBQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yLCAyMDApKTsKLQkKLQkJCS8vIHNhdmUgdG9tY2F0LXVzZXJzLnhtbAotCQkJZGF0YSA9IFhNTFV0aWwuZ2V0Q29udGVudHModG9tY2F0VXNlcnNEb2N1bWVudCk7Ci0JCQlpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShkYXRhKTsKLQkJCWZpbGUgPSBmb2xkZXIuZ2V0RmlsZSgidG9tY2F0LXVzZXJzLnhtbCIpOwotCQkJaWYgKGZpbGUuZXhpc3RzKCkpCi0JCQkJbW9uaXRvci53b3JrZWQoMjAwKTsKLQkJCQkvL2ZpbGUuc2V0Q29udGVudHMoaW4sIHRydWUsIHRydWUsIFByb2dyZXNzVXRpbC5nZXRTdWJNb25pdG9yRm9yKG1vbml0b3IsIDIwMCkpOwotCQkJZWxzZQotCQkJCWZpbGUuY3JlYXRlKGluLCB0cnVlLCBQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yLCAyMDApKTsKLQkKLQkJCS8vIHNhdmUgY2F0YWxpbmEucG9saWN5Ci0JCQlpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShwb2xpY3lGaWxlLmdldEJ5dGVzKCkpOwotCQkJZmlsZSA9IGZvbGRlci5nZXRGaWxlKCJjYXRhbGluYS5wb2xpY3kiKTsKLQkJCWlmIChmaWxlLmV4aXN0cygpKQotCQkJCW1vbml0b3Iud29ya2VkKDIwMCk7Ci0JCQkJLy9maWxlLnNldENvbnRlbnRzKGluLCB0cnVlLCB0cnVlLCBQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yLCAyMDApKTsKLQkJCWVsc2UKLQkJCQlmaWxlLmNyZWF0ZShpbiwgdHJ1ZSwgUHJvZ3Jlc3NVdGlsLmdldFN1Yk1vbml0b3JGb3IobW9uaXRvciwgMjAwKSk7Ci0JCi0JCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJcmV0dXJuOwotCQkJbW9uaXRvci5kb25lKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3Qgc2F2ZSBUb21jYXQgdjQuMCBjb25maWd1cmF0aW9uIHRvICIgKyBmb2xkZXIudG9TdHJpbmcoKSwgZSk7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yQ291bGROb3RTYXZlQ29uZmlndXJhdGlvbiwgbmV3IFN0cmluZ1tdIHtlLmdldExvY2FsaXplZE1lc3NhZ2UoKX0pLCBlKSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBJVG9tY2F0Q29uZmlndXJhdGlvbldvcmtpbmdDb3B5I2FkZE1pbWVNYXBwaW5nKGludCwgSU1pbWVNYXBwaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZE1pbWVNYXBwaW5nKGludCBpbmRleCwgSU1pbWVNYXBwaW5nIG1hcCkgewotCQl3ZWJBcHBEb2N1bWVudC5hZGRNaW1lTWFwcGluZyhpbmRleCwgbWFwKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQoQUREX01BUFBJTkdfUFJPUEVSVFksIG5ldyBJbnRlZ2VyKGluZGV4KSwgbWFwKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElUb21jYXRDb25maWd1cmF0aW9uV29ya2luZ0NvcHkjYWRkV2ViTW9kdWxlKGludCwgSVRvbWNhdFdlYk1vZHVsZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRXZWJNb2R1bGUoaW50IGluZGV4LCBJVG9tY2F0V2ViTW9kdWxlIG1vZHVsZSkgewotCQl0cnkgewotCQkJaW50IHNpemUgPSBzZXJ2ZXIuZ2V0U2VydmljZUNvdW50KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCVNlcnZpY2Ugc2VydmljZSA9IHNlcnZlci5nZXRTZXJ2aWNlKGkpOwotCQkJCWlmIChzZXJ2aWNlLmdldE5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKERFRkFVTFRfU0VSVklDRSkpIHsKLQkJCQkJRW5naW5lIGVuZ2luZSA9IHNlcnZpY2UuZ2V0RW5naW5lKCk7Ci0JCQkJCUhvc3QgaG9zdCA9IGVuZ2luZS5nZXRIb3N0KCk7Ci0JCQkJCUNvbnRleHQgY29udGV4dCA9IChDb250ZXh0KSBob3N0LmNyZWF0ZUVsZW1lbnQoaW5kZXgsICJDb250ZXh0Iik7Ci0JCQkJCWNvbnRleHQuc2V0RG9jQmFzZShtb2R1bGUuZ2V0RG9jdW1lbnRCYXNlKCkpOwotCQkJCQljb250ZXh0LnNldFBhdGgobW9kdWxlLmdldFBhdGgoKSk7Ci0JCQkJCWNvbnRleHQuc2V0UmVsb2FkYWJsZShtb2R1bGUuaXNSZWxvYWRhYmxlKCkgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLQkJCQkJaWYgKG1vZHVsZS5nZXRNZW1lbnRvKCkgIT0gbnVsbCAmJiBtb2R1bGUuZ2V0TWVtZW50bygpLmxlbmd0aCgpID4gMCkKLQkJCQkJCWNvbnRleHQuc2V0U291cmNlKG1vZHVsZS5nZXRNZW1lbnRvKCkpOwotCQkJCQlpc1NlcnZlckRpcnR5ID0gdHJ1ZTsKLQkJCQkJZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQoQUREX1dFQl9NT0RVTEVfUFJPUEVSVFksIG51bGwsIG1vZHVsZSk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBhZGRpbmcgd2ViIG1vZHVsZSAiICsgbW9kdWxlLmdldFBhdGgoKSwgZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDaGFuZ2UgdGhlIGV4dGVuc2lvbiBvZiBhIG1pbWUgbWFwcGluZy4KLQkgKiAKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiBAcGFyYW0gbWFwCi0JICovCi0JcHVibGljIHZvaWQgbW9kaWZ5TWltZU1hcHBpbmcoaW50IGluZGV4LCBJTWltZU1hcHBpbmcgbWFwKSB7Ci0JCXdlYkFwcERvY3VtZW50Lm1vZGlmeU1pbWVNYXBwaW5nKGluZGV4LCBtYXApOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChNT0RJRllfTUFQUElOR19QUk9QRVJUWSwgbmV3IEludGVnZXIoaW5kZXgpLCBtYXApOwotCX0KLQkKLQkvKioKLQkgKiBNb2RpZnkgdGhlIHBvcnQgd2l0aCB0aGUgZ2l2ZW4gaWQuCi0JICoKLQkgKiBAcGFyYW0gaWQgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBwb3J0IGludAotCSAqLwotCXB1YmxpYyB2b2lkIG1vZGlmeVNlcnZlclBvcnQoU3RyaW5nIGlkLCBpbnQgcG9ydCkgewotCQl0cnkgewotCQkJaWYgKCJzZXJ2ZXIiLmVxdWFscyhpZCkpIHsKLQkJCQlzZXJ2ZXIuc2V0UG9ydChwb3J0ICsgIiIpOwotCQkJCWlzU2VydmVyRGlydHkgPSB0cnVlOwotCQkJCWZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KE1PRElGWV9QT1JUX1BST1BFUlRZLCBpZCwgbmV3IEludGVnZXIocG9ydCkpOwotCQkJCXJldHVybjsKLQkJCX0KLQkKLQkJCWludCBpID0gaWQuaW5kZXhPZigiLyIpOwotCQkJaW50IHNlcnZOdW0gPSBJbnRlZ2VyLnBhcnNlSW50KGlkLnN1YnN0cmluZygwLCBpKSk7Ci0JCQlpbnQgY29ubk51bSA9IEludGVnZXIucGFyc2VJbnQoaWQuc3Vic3RyaW5nKGkgKyAxKSk7Ci0JCQkKLQkJCVNlcnZpY2Ugc2VydmljZSA9IHNlcnZlci5nZXRTZXJ2aWNlKHNlcnZOdW0pOwotCQkJQ29ubmVjdG9yIGNvbm5lY3RvciA9IHNlcnZpY2UuZ2V0Q29ubmVjdG9yKGNvbm5OdW0pOwotCQkJY29ubmVjdG9yLnNldFBvcnQocG9ydCArICIiKTsKLQkJCWlzU2VydmVyRGlydHkgPSB0cnVlOwotCQkJZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQoTU9ESUZZX1BPUlRfUFJPUEVSVFksIGlkLCBuZXcgSW50ZWdlcihwb3J0KSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBtb2RpZnlpbmcgc2VydmVyIHBvcnQgIiArIGlkLCBlKTsKLQkJfQotCX0KLQkvKioKLQkgKiBDaGFuZ2UgYSB3ZWIgbW9kdWxlLgotCSAqIEBwYXJhbSBpbmRleCBpbnQKLQkgKiBAcGFyYW0gZG9jQmFzZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIHBhdGggamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSByZWxvYWRhYmxlIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgdm9pZCBtb2RpZnlXZWJNb2R1bGUoaW50IGluZGV4LCBTdHJpbmcgZG9jQmFzZSwgU3RyaW5nIHBhdGgsIGJvb2xlYW4gcmVsb2FkYWJsZSkgewotCQl0cnkgewotCQkJaW50IHNpemUgPSBzZXJ2ZXIuZ2V0U2VydmljZUNvdW50KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCVNlcnZpY2Ugc2VydmljZSA9IHNlcnZlci5nZXRTZXJ2aWNlKGkpOwotCQkJCWlmIChzZXJ2aWNlLmdldE5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKERFRkFVTFRfU0VSVklDRSkpIHsKLQkJCQkJRW5naW5lIGVuZ2luZSA9IHNlcnZpY2UuZ2V0RW5naW5lKCk7Ci0JCQkJCUhvc3QgaG9zdCA9IGVuZ2luZS5nZXRIb3N0KCk7Ci0JCQkJCUNvbnRleHQgY29udGV4dCA9IGhvc3QuZ2V0Q29udGV4dChpbmRleCk7Ci0JCQkJCWNvbnRleHQuc2V0UGF0aChwYXRoKTsKLQkJCQkJY29udGV4dC5zZXREb2NCYXNlKGRvY0Jhc2UpOwotCQkJCQljb250ZXh0LnNldFJlbG9hZGFibGUocmVsb2FkYWJsZSA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotCQkJCQlpc1NlcnZlckRpcnR5ID0gdHJ1ZTsKLQkJCQkJV2ViTW9kdWxlIG1vZHVsZSA9IG5ldyBXZWJNb2R1bGUocGF0aCwgZG9jQmFzZSwgbnVsbCwgcmVsb2FkYWJsZSk7Ci0JCQkJCWZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KE1PRElGWV9XRUJfTU9EVUxFX1BST1BFUlRZLCBuZXcgSW50ZWdlcihpbmRleCksIG1vZHVsZSk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBtb2RpZnlpbmcgd2ViIG1vZHVsZSAiICsgaW5kZXgsIGUpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJlbW92ZXMgYSBtaW1lIG1hcHBpbmcuCi0JICogQHBhcmFtIGluZGV4IGludAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZU1pbWVNYXBwaW5nKGludCBpbmRleCkgewotCQl3ZWJBcHBEb2N1bWVudC5yZW1vdmVNaW1lTWFwcGluZyhpbmRleCk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KFJFTU9WRV9NQVBQSU5HX1BST1BFUlRZLCBudWxsLCBuZXcgSW50ZWdlcihpbmRleCkpOwotCX0KLQkKLQkvKioKLQkgKiBSZW1vdmVzIGEgd2ViIG1vZHVsZS4KLQkgKiBAcGFyYW0gaW5kZXggaW50Ci0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlV2ViTW9kdWxlKGludCBpbmRleCkgewotCQl0cnkgewotCQkJaW50IHNpemUgPSBzZXJ2ZXIuZ2V0U2VydmljZUNvdW50KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCVNlcnZpY2Ugc2VydmljZSA9IHNlcnZlci5nZXRTZXJ2aWNlKGkpOwotCQkJCWlmIChzZXJ2aWNlLmdldE5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKERFRkFVTFRfU0VSVklDRSkpIHsKLQkJCQkJRW5naW5lIGVuZ2luZSA9IHNlcnZpY2UuZ2V0RW5naW5lKCk7Ci0JCQkJCUhvc3QgaG9zdCA9IGVuZ2luZS5nZXRIb3N0KCk7Ci0JCQkJCWhvc3QucmVtb3ZlRWxlbWVudCgiQ29udGV4dCIsIGluZGV4KTsKLQkJCQkJaXNTZXJ2ZXJEaXJ0eSA9IHRydWU7Ci0JCQkJCWZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KFJFTU9WRV9XRUJfTU9EVUxFX1BST1BFUlRZLCBudWxsLCBuZXcgSW50ZWdlcihpbmRleCkpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgcmVtb3ZpbmcgbW9kdWxlIHJlZiAiICsgaW5kZXgsIGUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIElTdGF0dXMgcHJlcGFyZVJ1bnRpbWVEaXJlY3RvcnkoSVBhdGggY29uZkRpcikgewotCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FUiwgIlByZXBhcmluZyBydW50aW1lIGRpcmVjdG9yeSIpOwotCQkvLyBQcmVwYXJlIGEgY2F0YWxpbmEuYmFzZSBkaXJlY3Rvcnkgc3RydWN0dXJlCi0JCUZpbGUgdGVtcCA9IGNvbmZEaXIuYXBwZW5kKCJjb25mIikudG9GaWxlKCk7Ci0JCWlmICghdGVtcC5leGlzdHMoKSkKLQkJCXRlbXAubWtkaXJzKCk7Ci0JCXRlbXAgPSBjb25mRGlyLmFwcGVuZCgibG9ncyIpLnRvRmlsZSgpOwotCQlpZiAoIXRlbXAuZXhpc3RzKCkpCi0JCQl0ZW1wLm1rZGlycygpOwotCQl0ZW1wID0gY29uZkRpci5hcHBlbmQoInRlbXAiKS50b0ZpbGUoKTsKLQkJaWYgKCF0ZW1wLmV4aXN0cygpKQotCQkJdGVtcC5ta2RpcnMoKTsKLQkJSVBhdGggdGVtcFBhdGggPSBjb25mRGlyLmFwcGVuZCgid2ViYXBwcy9ST09UL1dFQi1JTkYiKTsKLQkJdGVtcCA9IHRlbXBQYXRoLnRvRmlsZSgpOwotCQlpZiAoIXRlbXAuZXhpc3RzKCkpCi0JCQl0ZW1wLm1rZGlycygpOwotCQl0ZW1wID0gdGVtcFBhdGguYXBwZW5kKCJ3ZWIueG1sIikudG9GaWxlKCk7Ci0JCWlmICghdGVtcC5leGlzdHMoKSkgewotCQkJRmlsZVdyaXRlciBmdzsKLQkJCXRyeSB7Ci0JCQkJZncgPSBuZXcgRmlsZVdyaXRlcih0ZW1wKTsKLQkJCQlmdy53cml0ZShERUZBVUxUX1dFQlhNTF9TRVJWTEVUMjMpOwotCQkJCWZ3LmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIlVuYWJsZSB0byBjcmVhdGUgd2ViLnhtbCBmb3IgUk9PVCBjb250ZXh0LiIsIGUpOwotCQkJfQotCQl9Ci0JCXRlbXAgPSBjb25mRGlyLmFwcGVuZCgid29yayIpLnRvRmlsZSgpOwotCQlpZiAoIXRlbXAuZXhpc3RzKCkpCi0JCQl0ZW1wLm1rZGlycygpOwotCQkKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7CQkKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9Ub21jYXQ0MEhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvVG9tY2F0NDBIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiNGNjY2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9Ub21jYXQ0MEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLaAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSmF2YVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7Ci0vKioKLSAqIFRvbWNhdCA0MCBoYW5kbGVyLgotICovCi1wdWJsaWMgY2xhc3MgVG9tY2F0NDBIYW5kbGVyIGltcGxlbWVudHMgSVRvbWNhdFZlcnNpb25IYW5kbGVyIHsKLQkvKioKLQkgKiBAc2VlIElUb21jYXRWZXJzaW9uSGFuZGxlciN2ZXJpZnlJbnN0YWxsUGF0aChJUGF0aCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2ZXJpZnlJbnN0YWxsUGF0aChJUGF0aCBpbnN0YWxsUGF0aCkgewotCQlpZiAoaW5zdGFsbFBhdGggPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlpZiAoIVRvbWNhdFBsdWdpbi52ZXJpZnlUb21jYXRWZXJzaW9uRnJvbVBhdGgoaW5zdGFsbFBhdGgsIFRvbWNhdFBsdWdpbi5UT01DQVRfNDApKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gVG9tY2F0UGx1Z2luLnZlcmlmeUluc3RhbGxQYXRoKGluc3RhbGxQYXRoLCBUb21jYXRQbHVnaW4uVE9NQ0FUXzQwKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBJVG9tY2F0VmVyc2lvbkhhbmRsZXIjZ2V0UnVudGltZUNsYXNzKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJ1bnRpbWVDbGFzcygpIHsKLQkJcmV0dXJuICJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0YXJ0dXAuQm9vdHN0cmFwIjsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBJVG9tY2F0VmVyc2lvbkhhbmRsZXIjZ2V0UnVudGltZUNsYXNzcGF0aChJUGF0aCkKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRSdW50aW1lQ2xhc3NwYXRoKElQYXRoIGluc3RhbGxQYXRoKSB7Ci0JCUxpc3QgY3AgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQotCQkvLyA0LjAgLSBhZGQgYm9vdHN0cmFwLmphciBmcm9tIHRoZSBUb21jYXQgYmluIGRpcmVjdG9yeQotCQlJUGF0aCBiaW5QYXRoID0gaW5zdGFsbFBhdGguYXBwZW5kKCJiaW4iKTsKLQkJaWYgKGJpblBhdGgudG9GaWxlKCkuZXhpc3RzKCkpIHsKLQkJCUlQYXRoIHBhdGggPSBiaW5QYXRoLmFwcGVuZCgiYm9vdHN0cmFwLmphciIpOwotCQkJY3AuYWRkKEphdmFSdW50aW1lLm5ld0FyY2hpdmVSdW50aW1lQ2xhc3NwYXRoRW50cnkocGF0aCkpOwotCQl9Ci0JCQotCQlyZXR1cm4gY3A7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJVG9tY2F0VmVyc2lvbkhhbmRsZXIjZ2V0UnVudGltZVByb2dyYW1Bcmd1bWVudHMoSVBhdGgsIGJvb2xlYW4sIGJvb2xlYW4pCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldFJ1bnRpbWVQcm9ncmFtQXJndW1lbnRzKElQYXRoIGNvbmZpZ1BhdGgsIGJvb2xlYW4gZGVidWcsIGJvb2xlYW4gc3RhcnRpbmcpIHsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkKLQkJaWYgKGRlYnVnKQotCQkJbGlzdC5hZGQoIi1kZWJ1ZyIpOwotCQkKLQkJaWYgKHN0YXJ0aW5nKQotCQkJbGlzdC5hZGQoInN0YXJ0Iik7Ci0JCWVsc2UKLQkJCWxpc3QuYWRkKCJzdG9wIik7Ci0JCQotCQlTdHJpbmdbXSBzID0gbmV3IFN0cmluZ1tsaXN0LnNpemUoKV07Ci0JCWxpc3QudG9BcnJheShzKTsKLQkJcmV0dXJuIHM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJVG9tY2F0VmVyc2lvbkhhbmRsZXIjZ2V0UnVudGltZVZNQXJndW1lbnRzKElQYXRoLCBJUGF0aCwgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0UnVudGltZVZNQXJndW1lbnRzKElQYXRoIGluc3RhbGxQYXRoLCBJUGF0aCBjb25maWdQYXRoLCBib29sZWFuIGlzVGVzdEVudikgewotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmIChpc1Rlc3RFbnYpCi0JCQlsaXN0LmFkZCgiLURjYXRhbGluYS5iYXNlPVwiIiArIGNvbmZpZ1BhdGgudG9PU1N0cmluZygpICsgIlwiIik7Ci0JCWVsc2UgCi0JCQlsaXN0LmFkZCgiLURjYXRhbGluYS5iYXNlPVwiIiArIGluc3RhbGxQYXRoLnRvT1NTdHJpbmcoKSArICJcIiIpOwotCQlsaXN0LmFkZCgiLURjYXRhbGluYS5ob21lPVwiIiArIGluc3RhbGxQYXRoLnRvT1NTdHJpbmcoKSArICJcIiIpOwotCQlTdHJpbmcgZW5kb3JzZWQgPSBpbnN0YWxsUGF0aC5hcHBlbmQoImJpbiIpLnRvT1NTdHJpbmcoKSArCi0JCQlpbnN0YWxsUGF0aC5hcHBlbmQoImNvbW1vbiIpLmFwcGVuZCgibGliIikudG9PU1N0cmluZygpOwotCQlsaXN0LmFkZCgiLURqYXZhLmVuZG9yc2VkLmRpcnM9XCIiICsgZW5kb3JzZWQgKyAiXCIiKTsKLQkJCi0JCVN0cmluZ1tdIHMgPSBuZXcgU3RyaW5nW2xpc3Quc2l6ZSgpXTsKLQkJbGlzdC50b0FycmF5KHMpOwotCQlyZXR1cm4gczsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFJ1bnRpbWVQb2xpY3lGaWxlKElQYXRoIGNvbmZpZ1BhdGgpIHsKLQkJcmV0dXJuIGNvbmZpZ1BhdGguYXBwZW5kKCJjb25mIikuYXBwZW5kKCJjYXRhbGluYS5wb2xpY3kiKS50b09TU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJVG9tY2F0VmVyc2lvbkhhbmRsZXIjY2FuQWRkTW9kdWxlKElNb2R1bGUpCi0JICovCi0JcHVibGljIElTdGF0dXMgY2FuQWRkTW9kdWxlKElNb2R1bGUgbW9kdWxlKSB7Ci0JCVN0cmluZyB2ZXJzaW9uID0gbW9kdWxlLmdldE1vZHVsZVR5cGUoKS5nZXRWZXJzaW9uKCk7Ci0JCWlmICgiMi4yIi5lcXVhbHModmVyc2lvbikgfHwgIjIuMyIuZXF1YWxzKHZlcnNpb24pKQotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQotCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBUb21jYXRQbHVnaW4uUExVR0lOX0lELCAwLCBNZXNzYWdlcy5lcnJvclNwZWM0MCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJVG9tY2F0VmVyc2lvbkhhbmRsZXIjZ2V0UnVudGltZUJhc2VEaXJlY3RvcnkoVG9tY2F0U2VydmVyQmVoYXZpb3VyKQotCSAqLwotCXB1YmxpYyBJUGF0aCBnZXRSdW50aW1lQmFzZURpcmVjdG9yeShUb21jYXRTZXJ2ZXJCZWhhdmlvdXIgc2VydmVyQmVoYXZpb3VyKSB7Ci0JCWlmIChzZXJ2ZXJCZWhhdmlvdXIuZ2V0VG9tY2F0U2VydmVyKCkuaXNUZXN0RW52aXJvbm1lbnQoKSkKLQkJCXJldHVybiBzZXJ2ZXJCZWhhdmlvdXIuZ2V0VGVtcERpcmVjdG9yeSgpOwotCQlyZXR1cm4gc2VydmVyQmVoYXZpb3VyLmdldFNlcnZlcigpLmdldFJ1bnRpbWUoKS5nZXRMb2NhdGlvbigpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1RvbWNhdDQxQ29uZmlndXJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9Ub21jYXQ0MUNvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGYwMmU5ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1RvbWNhdDQxQ29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotoCoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC54bWwuRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbC5YTUxVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sLnNlcnZlcjQwLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJQb3J0OwotLyoqCi0gKiBUb21jYXQgdjQuMSBzZXJ2ZXIgY29uZmlndXJhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIFRvbWNhdDQxQ29uZmlndXJhdGlvbiBleHRlbmRzIFRvbWNhdENvbmZpZ3VyYXRpb24gewotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfU0VSVklDRSA9ICJUb21jYXQtU3RhbmRhbG9uZSI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUF9DT05ORUNUT1IgPSAib3JnLmFwYWNoZS5jb3lvdGUudG9tY2F0NC5Db3lvdGVDb25uZWN0b3IiOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEpLX1BST1RPQ09MX0hBTkRMRVIgPSAib3JnLmFwYWNoZS5qay5zZXJ2ZXIuSmtDb3lvdGVIYW5kbGVyIjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTU0xfU09DS0VUX0ZBQ1RPUlkgPSAib3JnLmFwYWNoZS5jb3lvdGUudG9tY2F0NC5Db3lvdGVTZXJ2ZXJTb2NrZXRGYWN0b3J5IjsKLQkvL3Byb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfQ09OTkVDVE9SID0gIm9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLnRlc3QuSHR0cENvbm5lY3RvciI7Ci0JLy9vcmcuYXBhY2hlLmFqcC50b21jYXQ0LkFqcDEzQ29ubmVjdG9yCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBBQ0hFX0NPTk5FQ1RPUiA9ICJvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbm5lY3Rvci53YXJwLldhcnBDb25uZWN0b3IiOwotCi0JcHJvdGVjdGVkIFNlcnZlciBzZXJ2ZXI7Ci0JcHJvdGVjdGVkIEZhY3Rvcnkgc2VydmVyRmFjdG9yeTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1NlcnZlckRpcnR5OwotCi0JcHJvdGVjdGVkIFdlYkFwcERvY3VtZW50IHdlYkFwcERvY3VtZW50OwotCi0JcHJvdGVjdGVkIERvY3VtZW50IHRvbWNhdFVzZXJzRG9jdW1lbnQ7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHBvbGljeUZpbGU7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaXNQb2xpY3lEaXJ0eTsKLQotCS8qKgotCSAqIFRvbWNhdDQxQ29uZmlndXJhdGlvbiBjb25zdHJ1Y3Rvci4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aCBhIHBhdGgKLQkgKi8KLQlwdWJsaWMgVG9tY2F0NDFDb25maWd1cmF0aW9uKElGb2xkZXIgcGF0aCkgewotCQlzdXBlcihwYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHBvcnQgbnVtYmVyLgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIFNlcnZlclBvcnQgZ2V0TWFpblBvcnQoKSB7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZ2V0U2VydmVyUG9ydHMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlTZXJ2ZXJQb3J0IHBvcnQgPSAoU2VydmVyUG9ydCkgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKHBvcnQuZ2V0TmFtZSgpLmVxdWFscygiSFRUUCBDb25uZWN0b3IiKSkKLQkJCQlyZXR1cm4gcG9ydDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWltZSBtYXBwaW5ncy4KLQkgKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHVibGljIExpc3QgZ2V0TWltZU1hcHBpbmdzKCkgewotCQlyZXR1cm4gd2ViQXBwRG9jdW1lbnQuZ2V0TWltZU1hcHBpbmdzKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGxpc3Qgb2YgU2VydmVyUG9ydHMgdGhhdCB0aGlzIGNvbmZpZ3VyYXRpb24gdXNlcy4KLQkgKgotCSAqIEByZXR1cm4gamF2YS51dGlsLkxpc3QKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRTZXJ2ZXJQb3J0cygpIHsKLQkJTGlzdCBwb3J0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkKLQkJLy8gZmlyc3QgYWRkIHNlcnZlciBwb3J0Ci0JCXRyeSB7Ci0JCQlpbnQgcG9ydCA9IEludGVnZXIucGFyc2VJbnQoc2VydmVyLmdldFBvcnQoKSk7Ci0JCQlwb3J0cy5hZGQobmV3IFNlcnZlclBvcnQoInNlcnZlciIsIE1lc3NhZ2VzLnBvcnRTZXJ2ZXIsIHBvcnQsICJUQ1BJUCIpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCi0JCS8vIGFkZCBjb25uZWN0b3JzCi0JCXRyeSB7Ci0JCQlpbnQgc2l6ZSA9IHNlcnZlci5nZXRTZXJ2aWNlQ291bnQoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJU2VydmljZSBzZXJ2aWNlID0gc2VydmVyLmdldFNlcnZpY2UoaSk7Ci0JCQkJaW50IHNpemUyID0gc2VydmljZS5nZXRDb25uZWN0b3JDb3VudCgpOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgc2l6ZTI7IGorKykgewotCQkJCQlDb25uZWN0b3IgY29ubmVjdG9yID0gc2VydmljZS5nZXRDb25uZWN0b3Ioaik7Ci0JCQkJCVN0cmluZyBjbGFzc05hbWUgPSBjb25uZWN0b3IuZ2V0Q2xhc3NOYW1lKCk7Ci0JCQkJCVN0cmluZyBuYW1lID0gY2xhc3NOYW1lOwotCQkJCQlTdHJpbmcgcHJvdG9jb2wgPSAiVENQSVAiOwotCQkJCQlib29sZWFuIGFkdmFuY2VkID0gdHJ1ZTsKLQkJCQkJU3RyaW5nW10gY29udGVudFR5cGVzID0gbnVsbDsKLQkJCQkJaW50IHBvcnQgPSAtMTsKLQkJCQkJdHJ5IHsKLQkJCQkJCXBvcnQgPSBJbnRlZ2VyLnBhcnNlSW50KGNvbm5lY3Rvci5nZXRQb3J0KCkpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJLy8gaWdub3JlCi0JCQkJCX0KLQkJCQkJaWYgKEhUVFBfQ09OTkVDVE9SLmVxdWFscyhjbGFzc05hbWUpKSB7Ci0JCQkJCQluYW1lID0gIkhUVFAgQ29ubmVjdG9yIjsKLQkJCQkJCXByb3RvY29sID0gIkhUVFAiOwotCQkJCQkJY29udGVudFR5cGVzID0gbmV3IFN0cmluZ1tdIHsgIndlYiIsICJ3ZWJzZXJ2aWNlcyIgfTsKLQkJCQkJCS8vIGNoZWNrIGZvciBBSlAvMS4zIENveW90ZSBjb25uZWN0b3IKLQkJCQkJCVN0cmluZyBwcm90b2NvbEhhbmRsZXIgPSBjb25uZWN0b3IuZ2V0UHJvdG9jb2xIYW5kbGVyQ2xhc3NOYW1lKCk7Ci0JCQkJCQlpZiAoSktfUFJPVE9DT0xfSEFORExFUi5lcXVhbHMocHJvdG9jb2xIYW5kbGVyKSkgewotCQkJCQkJCW5hbWUgPSAiQUpQLzEuMyBDb25uZWN0b3IiOwotCQkJCQkJCXByb3RvY29sID0gIkFKUC8xLjMiOyAKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJLy8gYXNzdW1lIEhUVFAsIGNoZWNrIGZvciBIVFRQIFNTTCBjb25uZWN0b3IKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlFbGVtZW50IGVsZW1lbnQgPSBjb25uZWN0b3IuZ2V0U3ViRWxlbWVudCgiRmFjdG9yeSIpOwotCQkJCQkJCQlpZiAoU1NMX1NPQ0tFVF9GQUNUT1JZLmVxdWFscyhlbGVtZW50LmdldEF0dHJpYnV0ZSgiY2xhc3NOYW1lIikpKSB7Ci0JCQkJCQkJCQluYW1lID0gIlNTTCBDb25uZWN0b3IiOwotCQkJCQkJCQkJcHJvdG9jb2wgPSAiU1NMIjsKLQkJCQkJCQkJfQotCQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCS8vIGlnbm9yZQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWlmICgiSFRUUCIuZXF1YWxzKHByb3RvY29sKSkKLQkJCQkJCQlhZHZhbmNlZCA9IGZhbHNlOwotCQkJCQl9IGVsc2UgaWYgKEFQQUNIRV9DT05ORUNUT1IuZXF1YWxzKGNsYXNzTmFtZSkpCi0JCQkJCQluYW1lID0gIkFwYWNoZSBDb25uZWN0b3IiOwotCQkJCQlpZiAoY2xhc3NOYW1lICE9IG51bGwgJiYgY2xhc3NOYW1lLmxlbmd0aCgpID4gMCkKLQkJCQkJCXBvcnRzLmFkZChuZXcgU2VydmVyUG9ydChpICsgIi8iICsgaiwgbmFtZSwgcG9ydCwgcHJvdG9jb2wsIGNvbnRlbnRUeXBlcywgYWR2YW5jZWQpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBnZXR0aW5nIHNlcnZlciBwb3J0cyIsIGUpOwotCQl9Ci0JCXJldHVybiBwb3J0czsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCBvZiB0aGUgd2ViIG1vZHVsZXMgaW4gdGhpcyBzZXJ2ZXIuCi0JICogQHJldHVybiBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFdlYk1vZHVsZXMoKSB7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkKLQkJdHJ5IHsKLQkJCWludCBzaXplID0gc2VydmVyLmdldFNlcnZpY2VDb3VudCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlTZXJ2aWNlIHNlcnZpY2UgPSBzZXJ2ZXIuZ2V0U2VydmljZShpKTsKLQkJCQlpZiAoc2VydmljZS5nZXROYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShERUZBVUxUX1NFUlZJQ0UpKSB7Ci0JCQkJCUVuZ2luZSBlbmdpbmUgPSBzZXJ2aWNlLmdldEVuZ2luZSgpOwotCQkJCQlIb3N0IGhvc3QgPSBlbmdpbmUuZ2V0SG9zdCgpOwotCQkJCQlpbnQgc2l6ZTIgPSBob3N0LmdldENvbnRleHRDb3VudCgpOwotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHNpemUyOyBqKyspIHsKLQkJCQkJCUNvbnRleHQgY29udGV4dCA9IGhvc3QuZ2V0Q29udGV4dChqKTsKLQkJCQkJCVN0cmluZyByZWxvYWQgPSBjb250ZXh0LmdldFJlbG9hZGFibGUoKTsKLQkJCQkJCWlmIChyZWxvYWQgPT0gbnVsbCkKLQkJCQkJCQlyZWxvYWQgPSAiZmFsc2UiOwotCQkJCQkJV2ViTW9kdWxlIG1vZHVsZSA9IG5ldyBXZWJNb2R1bGUoY29udGV4dC5nZXRQYXRoKCksIAotCQkJCQkJCWNvbnRleHQuZ2V0RG9jQmFzZSgpLCBjb250ZXh0LmdldFNvdXJjZSgpLAotCQkJCQkJCXJlbG9hZC5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikgPyB0cnVlIDogZmFsc2UpOwotCQkJCQkJbGlzdC5hZGQobW9kdWxlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGdldHRpbmcgcHJvamVjdCByZWZzIiwgZSk7Ci0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGltcG9ydEZyb21QYXRoKElQYXRoIHBhdGgsIGJvb2xlYW4gaXNUZXN0RW52LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJbG9hZChwYXRoLCBtb25pdG9yKTsKLQkJCi0JCS8vIGZvciB0ZXN0IGVudmlyb25tZW50LCByZW1vdmUgZXhpc3RpbmcgY29udGV4dHMgc2luY2UgYSBzZXBhcmF0ZQotCQkvLyBjYXRhbGluYS5iYXNlIHdpbGwgYmUgdXNlZAotCQlpZiAoaXNUZXN0RW52KSB7Ci0JCQlpbnQgc2l6ZSA9IHNlcnZlci5nZXRTZXJ2aWNlQ291bnQoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJU2VydmljZSBzZXJ2aWNlID0gc2VydmVyLmdldFNlcnZpY2UoaSk7Ci0JCQkJaWYgKHNlcnZpY2UuZ2V0TmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoREVGQVVMVF9TRVJWSUNFKSkgewotCQkJCQlIb3N0IGhvc3QgPSBzZXJ2aWNlLmdldEVuZ2luZSgpLmdldEhvc3QoKTsKLQkJCQkJaW50IHNpemUyID0gaG9zdC5nZXRDb250ZXh0Q291bnQoKTsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBzaXplMjsgaisrKSB7Ci0JCQkJCQlob3N0LnJlbW92ZUVsZW1lbnQoIkNvbnRleHQiLCAwKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBAc2VlIFRvbWNhdENvbmZpZ3VyYXRpb24jbG9hZChJUGF0aCwgSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkKElQYXRoIHBhdGgsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0cnkgewotCQkJbW9uaXRvciA9IFByb2dyZXNzVXRpbC5nZXRNb25pdG9yRm9yKG1vbml0b3IpOwotCQkJbW9uaXRvci5iZWdpblRhc2soTWVzc2FnZXMubG9hZGluZ1Rhc2ssIDUpOwotCQkJCi0JCQkvLyBjaGVjayBmb3IgY2F0YWxpbmEucG9saWN5IHRvIHZlcmlmeSB0aGF0IHRoaXMgaXMgYSB2NC4wIGNvbmZpZwotCQkJSW5wdXRTdHJlYW0gaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHBhdGguYXBwZW5kKCJjYXRhbGluYS5wb2xpY3kiKS50b0ZpbGUoKSk7Ci0JCQlpbi5yZWFkKCk7Ci0JCQlpbi5jbG9zZSgpOwotCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0KLQkJCXNlcnZlckZhY3RvcnkgPSBuZXcgRmFjdG9yeSgpOwotCQkJc2VydmVyRmFjdG9yeS5zZXRQYWNrYWdlTmFtZSgib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC54bWwuc2VydmVyNDAiKTsKLQkJCXNlcnZlciA9IChTZXJ2ZXIpIHNlcnZlckZhY3RvcnkubG9hZERvY3VtZW50KG5ldyBGaWxlSW5wdXRTdHJlYW0ocGF0aC5hcHBlbmQoInNlcnZlci54bWwiKS50b0ZpbGUoKSkpOwotCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0KLQkJCXdlYkFwcERvY3VtZW50ID0gbmV3IFdlYkFwcERvY3VtZW50KHBhdGguYXBwZW5kKCJ3ZWIueG1sIikpOwotCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCi0JCQl0b21jYXRVc2Vyc0RvY3VtZW50ID0gWE1MVXRpbC5nZXREb2N1bWVudEJ1aWxkZXIoKS5wYXJzZShuZXcgSW5wdXRTb3VyY2UobmV3IEZpbGVJbnB1dFN0cmVhbShwYXRoLmFwcGVuZCgidG9tY2F0LXVzZXJzLnhtbCIpLnRvRmlsZSgpKSkpOwotCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQotCQkJLy8gbG9hZCBwb2xpY3kgZmlsZQotCQkJQnVmZmVyZWRSZWFkZXIgYnIgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQliciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIobmV3IEZpbGVJbnB1dFN0cmVhbShwYXRoLmFwcGVuZCgiY2F0YWxpbmEucG9saWN5IikudG9GaWxlKCkpKSk7Ci0JCQkJU3RyaW5nIHRlbXAgPSBici5yZWFkTGluZSgpOwotCQkJCXBvbGljeUZpbGUgPSAiIjsKLQkJCQl3aGlsZSAodGVtcCAhPSBudWxsKSB7Ci0JCQkJCXBvbGljeUZpbGUgKz0gdGVtcCArICJcbiI7Ci0JCQkJCXRlbXAgPSBici5yZWFkTGluZSgpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIkNvdWxkIG5vdCBsb2FkIHBvbGljeSBmaWxlIiwgZSk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWlmIChiciAhPSBudWxsKQotCQkJCQlici5jbG9zZSgpOwotCQkJfQotCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCi0JCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJcmV0dXJuOwotCQkJbW9uaXRvci5kb25lKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiQ291bGQgbm90IGxvYWQgVG9tY2F0IHY0LjAgY29uZmlndXJhdGlvbiBmcm9tICIgKyBwYXRoLnRvT1NTdHJpbmcoKSArICI6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yQ291bGROb3RMb2FkQ29uZmlndXJhdGlvbiwgcGF0aC50b09TU3RyaW5nKCkpLCBlKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFRvbWNhdENvbmZpZ3VyYXRpb24jbG9hZChJRm9sZGVyLCBJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWQoSUZvbGRlciBmb2xkZXIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0cnkgewotCQkJbW9uaXRvciA9IFByb2dyZXNzVXRpbC5nZXRNb25pdG9yRm9yKG1vbml0b3IpOwotCQkJbW9uaXRvci5iZWdpblRhc2soTWVzc2FnZXMubG9hZGluZ1Rhc2ssIDgwMCk7Ci0JCi0JCQkvLyBjaGVjayBmb3IgY2F0YWxpbmEucG9saWN5IHRvIHZlcmlmeSB0aGF0IHRoaXMgaXMgYSB2NC4wIGNvbmZpZwotCQkJSUZpbGUgZmlsZSA9IGZvbGRlci5nZXRGaWxlKCJjYXRhbGluYS5wb2xpY3kiKTsKLQkJCWlmICghZmlsZS5leGlzdHMoKSkKLQkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgVG9tY2F0UGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JDb3VsZE5vdExvYWRDb25maWd1cmF0aW9uLCBmb2xkZXIuZ2V0RnVsbFBhdGgoKS50b09TU3RyaW5nKCkpLCBudWxsKSk7Ci0JCi0JCQkvLyBsb2FkIHNlcnZlci54bWwKLQkJCWZpbGUgPSBmb2xkZXIuZ2V0RmlsZSgic2VydmVyLnhtbCIpOwotCQkJSW5wdXRTdHJlYW0gaW4gPSBmaWxlLmdldENvbnRlbnRzKCk7Ci0JCQlzZXJ2ZXJGYWN0b3J5ID0gbmV3IEZhY3RvcnkoKTsKLQkJCXNlcnZlckZhY3Rvcnkuc2V0UGFja2FnZU5hbWUoIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sLnNlcnZlcjQwIik7Ci0JCQlzZXJ2ZXIgPSAoU2VydmVyKSBzZXJ2ZXJGYWN0b3J5LmxvYWREb2N1bWVudChpbik7Ci0JCQltb25pdG9yLndvcmtlZCgyMDApOwotCQotCQkJLy8gbG9hZCB3ZWIueG1sCi0JCQlmaWxlID0gZm9sZGVyLmdldEZpbGUoIndlYi54bWwiKTsKLQkJCXdlYkFwcERvY3VtZW50ID0gbmV3IFdlYkFwcERvY3VtZW50KGZpbGUpOwotCQkJbW9uaXRvci53b3JrZWQoMjAwKTsKLQkKLQkJCS8vIGxvYWQgdG9tY2F0LXVzZXJzLnhtbAotCQkJZmlsZSA9IGZvbGRlci5nZXRGaWxlKCJ0b21jYXQtdXNlcnMueG1sIik7Ci0JCQlpbiA9IGZpbGUuZ2V0Q29udGVudHMoKTsKLQotCQkJdG9tY2F0VXNlcnNEb2N1bWVudCA9IFhNTFV0aWwuZ2V0RG9jdW1lbnRCdWlsZGVyKCkucGFyc2UobmV3IElucHV0U291cmNlKGluKSk7Ci0JCQltb25pdG9yLndvcmtlZCgyMDApOwotCQkKLQkJCS8vIGxvYWQgY2F0YWxpbmEucG9saWN5Ci0JCQlmaWxlID0gZm9sZGVyLmdldEZpbGUoImNhdGFsaW5hLnBvbGljeSIpOwotCQkJaW4gPSBmaWxlLmdldENvbnRlbnRzKCk7Ci0JCQlCdWZmZXJlZFJlYWRlciBiciA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpbikpOwotCQkJCVN0cmluZyB0ZW1wID0gYnIucmVhZExpbmUoKTsKLQkJCQlwb2xpY3lGaWxlID0gIiI7Ci0JCQkJd2hpbGUgKHRlbXAgIT0gbnVsbCkgewotCQkJCQlwb2xpY3lGaWxlICs9IHRlbXAgKyAiXG4iOwotCQkJCQl0ZW1wID0gYnIucmVhZExpbmUoKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJDb3VsZCBub3QgbG9hZCBwb2xpY3kgZmlsZSIsIGUpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZiAoYnIgIT0gbnVsbCkKLQkJCQkJYnIuY2xvc2UoKTsKLQkJCX0KLQkJCW1vbml0b3Iud29ya2VkKDIwMCk7Ci0JCi0JCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiQ2FuY2VsbGVkIik7Ci0JCQltb25pdG9yLmRvbmUoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJDb3VsZCBub3QgcmVsb2FkIFRvbWNhdCB2NC4xIGNvbmZpZ3VyYXRpb24gZnJvbTogIiArIGZvbGRlci5nZXRGdWxsUGF0aCgpICsgIjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgVG9tY2F0UGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JDb3VsZE5vdExvYWRDb25maWd1cmF0aW9uLCBmb2xkZXIuZ2V0RnVsbFBhdGgoKS50b09TU3RyaW5nKCkpLCBlKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTYXZlIHRvIHRoZSBnaXZlbiBkaXJlY3RvcnkuCi0JICogCi0JICogQHBhcmFtIHBhdGggYSBwYXRoCi0JICogQHBhcmFtIGZvcmNlRGlydHkgYm9vbGVhbgotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvcgotCSAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNhdmUoSVBhdGggcGF0aCwgYm9vbGVhbiBmb3JjZURpcnR5LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCW1vbml0b3IgPSBQcm9ncmVzc1V0aWwuZ2V0TW9uaXRvckZvcihtb25pdG9yKTsKLQkJCW1vbml0b3IuYmVnaW5UYXNrKE1lc3NhZ2VzLnNhdmluZ1Rhc2ssIDMpOwotCQotCQkJLy8gbWFrZSBzdXJlIGRpcmVjdG9yeSBleGlzdHMKLQkJCWlmICghcGF0aC50b0ZpbGUoKS5leGlzdHMoKSkgewotCQkJCWZvcmNlRGlydHkgPSB0cnVlOwotCQkJCXBhdGgudG9GaWxlKCkubWtkaXIoKTsKLQkJCX0KLQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQotCQkJLy8gc2F2ZSBmaWxlcwotCQkJaWYgKGZvcmNlRGlydHkgfHwgaXNTZXJ2ZXJEaXJ0eSkKLQkJCQlzZXJ2ZXJGYWN0b3J5LnNhdmUocGF0aC5hcHBlbmQoInNlcnZlci54bWwiKS50b09TU3RyaW5nKCkpOwotCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCi0JCQkvL2lmIChmb3JjZURpcnR5IHx8IGlzV2ViQXBwRGlydHkpCi0JCQkvLwl3ZWJBcHBGYWN0b3J5LnNhdmUoZGlyUGF0aCArICJ3ZWIueG1sIik7Ci0JCQkvL3dlYkFwcERvY3VtZW50LnNhdmUocGF0aC50b09TU3RyaW5nKCksIGZvcmNlRGlydHkgfHwgaXNQb2xpY3lEaXJ0eSk7Ci0JCQl3ZWJBcHBEb2N1bWVudC5zYXZlKHBhdGguYXBwZW5kKCJ3ZWIueG1sIikudG9PU1N0cmluZygpLCBmb3JjZURpcnR5KTsKLQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQotCQkJaWYgKGZvcmNlRGlydHkpCi0JCQkJWE1MVXRpbC5zYXZlKHBhdGguYXBwZW5kKCJ0b21jYXQtdXNlcnMueG1sIikudG9PU1N0cmluZygpLCB0b21jYXRVc2Vyc0RvY3VtZW50KTsKLQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQotCQkJaWYgKGZvcmNlRGlydHkgfHwgaXNQb2xpY3lEaXJ0eSkgewotCQkJCUJ1ZmZlcmVkV3JpdGVyIGJ3ID0gbmV3IEJ1ZmZlcmVkV3JpdGVyKG5ldyBGaWxlV3JpdGVyKHBhdGguYXBwZW5kKCJjYXRhbGluYS5wb2xpY3kiKS50b0ZpbGUoKSkpOwotCQkJCWJ3LndyaXRlKHBvbGljeUZpbGUpOwotCQkJCWJ3LmNsb3NlKCk7Ci0JCQl9Ci0JCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCWlzU2VydmVyRGlydHkgPSBmYWxzZTsKLQkJCWlzUG9saWN5RGlydHkgPSBmYWxzZTsKLQkKLQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCQlyZXR1cm47Ci0JCQltb25pdG9yLmRvbmUoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBzYXZlIFRvbWNhdCB2NC4xIGNvbmZpZ3VyYXRpb24gdG8gIiArIHBhdGgsIGUpOwotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBUb21jYXRQbHVnaW4uUExVR0lOX0lELCAwLCBOTFMuYmluZChNZXNzYWdlcy5lcnJvckNvdWxkTm90U2F2ZUNvbmZpZ3VyYXRpb24sIG5ldyBTdHJpbmdbXSB7ZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCl9KSwgZSkpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNhdmUoSVBhdGggcGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXNhdmUocGF0aCwgdHJ1ZSwgbW9uaXRvcik7Ci0JfQotCi0JLyoqCi0JICogU2F2ZSB0aGUgaW5mb3JtYXRpb24gaGVsZCBieSB0aGlzIG9iamVjdCB0byB0aGUgZ2l2ZW4gZGlyZWN0b3J5LgotCSAqCi0JICogQHBhcmFtIGZvbGRlciBhIGZvbGRlcgotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvcgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmUoSUZvbGRlciBmb2xkZXIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0cnkgewotCQkJbW9uaXRvciA9IFByb2dyZXNzVXRpbC5nZXRNb25pdG9yRm9yKG1vbml0b3IpOwotCQkJbW9uaXRvci5iZWdpblRhc2soTWVzc2FnZXMuc2F2aW5nVGFzaywgOTAwKTsKLQkKLQkJCS8vIHNhdmUgc2VydmVyLnhtbAotCQkJYnl0ZVtdIGRhdGEgPSBzZXJ2ZXJGYWN0b3J5LmdldENvbnRlbnRzKCk7Ci0JCQlJbnB1dFN0cmVhbSBpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShkYXRhKTsKLQkJCUlGaWxlIGZpbGUgPSBmb2xkZXIuZ2V0RmlsZSgic2VydmVyLnhtbCIpOwotCQkJaWYgKGZpbGUuZXhpc3RzKCkpIHsKLQkJCQlpZiAoaXNTZXJ2ZXJEaXJ0eSkKLQkJCQkJZmlsZS5zZXRDb250ZW50cyhpbiwgdHJ1ZSwgdHJ1ZSwgUHJvZ3Jlc3NVdGlsLmdldFN1Yk1vbml0b3JGb3IobW9uaXRvciwgMjAwKSk7Ci0JCQkJZWxzZQotCQkJCQltb25pdG9yLndvcmtlZCgyMDApOwotCQkJfSBlbHNlCi0JCQkJZmlsZS5jcmVhdGUoaW4sIHRydWUsIFByb2dyZXNzVXRpbC5nZXRTdWJNb25pdG9yRm9yKG1vbml0b3IsIDIwMCkpOwotCQotCQkJLy8gc2F2ZSB3ZWIueG1sCi0JCQl3ZWJBcHBEb2N1bWVudC5zYXZlKGZvbGRlci5nZXRGaWxlKCJ3ZWIueG1sIiksIFByb2dyZXNzVXRpbC5nZXRTdWJNb25pdG9yRm9yKG1vbml0b3IsIDIwMCkpOwotCQotCQkJLy8gc2F2ZSB0b21jYXQtdXNlcnMueG1sCi0JCQlkYXRhID0gWE1MVXRpbC5nZXRDb250ZW50cyh0b21jYXRVc2Vyc0RvY3VtZW50KTsKLQkJCWluID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGRhdGEpOwotCQkJZmlsZSA9IGZvbGRlci5nZXRGaWxlKCJ0b21jYXQtdXNlcnMueG1sIik7Ci0JCQlpZiAoZmlsZS5leGlzdHMoKSkKLQkJCQltb25pdG9yLndvcmtlZCgyMDApOwotCQkJCS8vZmlsZS5zZXRDb250ZW50cyhpbiwgdHJ1ZSwgdHJ1ZSwgUHJvZ3Jlc3NVdGlsLmdldFN1Yk1vbml0b3JGb3IobW9uaXRvciwgMjAwKSk7Ci0JCQllbHNlCi0JCQkJZmlsZS5jcmVhdGUoaW4sIHRydWUsIFByb2dyZXNzVXRpbC5nZXRTdWJNb25pdG9yRm9yKG1vbml0b3IsIDIwMCkpOwotCQotCQkJLy8gc2F2ZSBjYXRhbGluYS5wb2xpY3kKLQkJCWluID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHBvbGljeUZpbGUuZ2V0Qnl0ZXMoKSk7Ci0JCQlmaWxlID0gZm9sZGVyLmdldEZpbGUoImNhdGFsaW5hLnBvbGljeSIpOwotCQkJaWYgKGZpbGUuZXhpc3RzKCkpCi0JCQkJbW9uaXRvci53b3JrZWQoMjAwKTsKLQkJCQkvL2ZpbGUuc2V0Q29udGVudHMoaW4sIHRydWUsIHRydWUsIFByb2dyZXNzVXRpbC5nZXRTdWJNb25pdG9yRm9yKG1vbml0b3IsIDIwMCkpOwotCQkJZWxzZQotCQkJCWZpbGUuY3JlYXRlKGluLCB0cnVlLCBQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yLCAyMDApKTsKLQkKLQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCQlyZXR1cm47Ci0JCQltb25pdG9yLmRvbmUoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBzYXZlIFRvbWNhdCB2NC4xIGNvbmZpZ3VyYXRpb24gdG8gIiArIGZvbGRlci50b1N0cmluZygpLCBlKTsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgVG9tY2F0UGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JDb3VsZE5vdFNhdmVDb25maWd1cmF0aW9uLCBuZXcgU3RyaW5nW10ge2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpfSksIGUpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBoYXNNREJMaXN0ZW5lcihTZXJ2ZXIgc2VydmVyKSB7Ci0JCWlmIChzZXJ2ZXIgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCWludCBjb3VudCA9IHNlcnZlci5nZXRMaXN0ZW5lckNvdW50KCk7Ci0JCWlmIChjb3VudCA9PSAwKQotCQkJcmV0dXJuIGZhbHNlOwotCQkJCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQkJTGlzdGVuZXIgbGlzdGVuZXIgPSBzZXJ2ZXIuZ2V0TGlzdGVuZXIoaSk7Ci0JCQlpZiAobGlzdGVuZXIgIT0gbnVsbCAmJiBsaXN0ZW5lci5nZXRDbGFzc05hbWUoKSAhPSBudWxsICYmIGxpc3RlbmVyLmdldENsYXNzTmFtZSgpLmluZGV4T2YoIm1iZWFuIikgPj0gMCkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgSVRvbWNhdENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSNhZGRNaW1lTWFwcGluZyhpbnQsIElNaW1lTWFwcGluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRNaW1lTWFwcGluZyhpbnQgaW5kZXgsIElNaW1lTWFwcGluZyBtYXApIHsKLQkJd2ViQXBwRG9jdW1lbnQuYWRkTWltZU1hcHBpbmcoaW5kZXgsIG1hcCk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KEFERF9NQVBQSU5HX1BST1BFUlRZLCBuZXcgSW50ZWdlcihpbmRleCksIG1hcCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJVG9tY2F0Q29uZmlndXJhdGlvbldvcmtpbmdDb3B5I2FkZFdlYk1vZHVsZShpbnQsIElUb21jYXRXZWJNb2R1bGUpCi0JICovCi0JcHVibGljIHZvaWQgYWRkV2ViTW9kdWxlKGludCBpbmRleCwgSVRvbWNhdFdlYk1vZHVsZSBtb2R1bGUpIHsKLQkJdHJ5IHsKLQkJCWludCBzaXplID0gc2VydmVyLmdldFNlcnZpY2VDb3VudCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlTZXJ2aWNlIHNlcnZpY2UgPSBzZXJ2ZXIuZ2V0U2VydmljZShpKTsKLQkJCQlpZiAoc2VydmljZS5nZXROYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShERUZBVUxUX1NFUlZJQ0UpKSB7Ci0JCQkJCUVuZ2luZSBlbmdpbmUgPSBzZXJ2aWNlLmdldEVuZ2luZSgpOwotCQkJCQlIb3N0IGhvc3QgPSBlbmdpbmUuZ2V0SG9zdCgpOwotCQkJCQlDb250ZXh0IGNvbnRleHQgPSAoQ29udGV4dCkgaG9zdC5jcmVhdGVFbGVtZW50KGluZGV4LCAiQ29udGV4dCIpOwotCQkJCQljb250ZXh0LnNldERvY0Jhc2UobW9kdWxlLmdldERvY3VtZW50QmFzZSgpKTsKLQkJCQkJY29udGV4dC5zZXRQYXRoKG1vZHVsZS5nZXRQYXRoKCkpOwotCQkJCQljb250ZXh0LnNldFJlbG9hZGFibGUobW9kdWxlLmlzUmVsb2FkYWJsZSgpID8gInRydWUiIDogImZhbHNlIik7Ci0JCQkJCWlmIChtb2R1bGUuZ2V0TWVtZW50bygpICE9IG51bGwgJiYgbW9kdWxlLmdldE1lbWVudG8oKS5sZW5ndGgoKSA+IDApCi0JCQkJCQljb250ZXh0LnNldFNvdXJjZShtb2R1bGUuZ2V0TWVtZW50bygpKTsKLQkJCQkJaXNTZXJ2ZXJEaXJ0eSA9IHRydWU7Ci0JCQkJCWZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KEFERF9XRUJfTU9EVUxFX1BST1BFUlRZLCBudWxsLCBtb2R1bGUpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgYWRkaW5nIHdlYiBtb2R1bGUgIiArIG1vZHVsZS5nZXRQYXRoKCksIGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2hhbmdlIHRoZSBleHRlbnNpb24gb2YgYSBtaW1lIG1hcHBpbmcuCi0JICogCi0JICogQHBhcmFtIGluZGV4Ci0JICogQHBhcmFtIG1hcAotCSAqLwotCXB1YmxpYyB2b2lkIG1vZGlmeU1pbWVNYXBwaW5nKGludCBpbmRleCwgSU1pbWVNYXBwaW5nIG1hcCkgewotCQl3ZWJBcHBEb2N1bWVudC5tb2RpZnlNaW1lTWFwcGluZyhpbmRleCwgbWFwKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQoTU9ESUZZX01BUFBJTkdfUFJPUEVSVFksIG5ldyBJbnRlZ2VyKGluZGV4KSwgbWFwKTsKLQl9Ci0JCi0JLyoqCi0JICogTW9kaWZ5IHRoZSBwb3J0IHdpdGggdGhlIGdpdmVuIGlkLgotCSAqCi0JICogQHBhcmFtIGlkIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gcG9ydCBpbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBtb2RpZnlTZXJ2ZXJQb3J0KFN0cmluZyBpZCwgaW50IHBvcnQpIHsKLQkJdHJ5IHsKLQkJCWlmICgic2VydmVyIi5lcXVhbHMoaWQpKSB7Ci0JCQkJc2VydmVyLnNldFBvcnQocG9ydCArICIiKTsKLQkJCQlpc1NlcnZlckRpcnR5ID0gdHJ1ZTsKLQkJCQlmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChNT0RJRllfUE9SVF9QUk9QRVJUWSwgaWQsIG5ldyBJbnRlZ2VyKHBvcnQpKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCi0JCQlpbnQgaSA9IGlkLmluZGV4T2YoIi8iKTsKLQkJCWludCBzZXJ2TnVtID0gSW50ZWdlci5wYXJzZUludChpZC5zdWJzdHJpbmcoMCwgaSkpOwotCQkJaW50IGNvbm5OdW0gPSBJbnRlZ2VyLnBhcnNlSW50KGlkLnN1YnN0cmluZyhpICsgMSkpOwotCQkJCi0JCQlTZXJ2aWNlIHNlcnZpY2UgPSBzZXJ2ZXIuZ2V0U2VydmljZShzZXJ2TnVtKTsKLQkJCUNvbm5lY3RvciBjb25uZWN0b3IgPSBzZXJ2aWNlLmdldENvbm5lY3Rvcihjb25uTnVtKTsKLQkJCWNvbm5lY3Rvci5zZXRQb3J0KHBvcnQgKyAiIik7Ci0JCQlpc1NlcnZlckRpcnR5ID0gdHJ1ZTsKLQkJCWZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KE1PRElGWV9QT1JUX1BST1BFUlRZLCBpZCwgbmV3IEludGVnZXIocG9ydCkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgbW9kaWZ5aW5nIHNlcnZlciBwb3J0ICIgKyBpZCwgZSk7Ci0JCX0KLQl9Ci0JLyoqCi0JICogQ2hhbmdlIGEgd2ViIG1vZHVsZS4KLQkgKiBAcGFyYW0gaW5kZXggaW50Ci0JICogQHBhcmFtIGRvY0Jhc2UgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBwYXRoIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gcmVsb2FkYWJsZSBib29sZWFuCi0JICovCi0JcHVibGljIHZvaWQgbW9kaWZ5V2ViTW9kdWxlKGludCBpbmRleCwgU3RyaW5nIGRvY0Jhc2UsIFN0cmluZyBwYXRoLCBib29sZWFuIHJlbG9hZGFibGUpIHsKLQkJdHJ5IHsKLQkJCWludCBzaXplID0gc2VydmVyLmdldFNlcnZpY2VDb3VudCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlTZXJ2aWNlIHNlcnZpY2UgPSBzZXJ2ZXIuZ2V0U2VydmljZShpKTsKLQkJCQlpZiAoc2VydmljZS5nZXROYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShERUZBVUxUX1NFUlZJQ0UpKSB7Ci0JCQkJCUVuZ2luZSBlbmdpbmUgPSBzZXJ2aWNlLmdldEVuZ2luZSgpOwotCQkJCQlIb3N0IGhvc3QgPSBlbmdpbmUuZ2V0SG9zdCgpOwotCQkJCQlDb250ZXh0IGNvbnRleHQgPSBob3N0LmdldENvbnRleHQoaW5kZXgpOwotCQkJCQljb250ZXh0LnNldFBhdGgocGF0aCk7Ci0JCQkJCWNvbnRleHQuc2V0RG9jQmFzZShkb2NCYXNlKTsKLQkJCQkJY29udGV4dC5zZXRSZWxvYWRhYmxlKHJlbG9hZGFibGUgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLQkJCQkJaXNTZXJ2ZXJEaXJ0eSA9IHRydWU7Ci0JCQkJCVdlYk1vZHVsZSBtb2R1bGUgPSBuZXcgV2ViTW9kdWxlKHBhdGgsIGRvY0Jhc2UsIG51bGwsIHJlbG9hZGFibGUpOwotCQkJCQlmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChNT0RJRllfV0VCX01PRFVMRV9QUk9QRVJUWSwgbmV3IEludGVnZXIoaW5kZXgpLCBtb2R1bGUpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgbW9kaWZ5aW5nIHdlYiBtb2R1bGUgIiArIGluZGV4LCBlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYSBtaW1lIG1hcHBpbmcuCi0JICogQHBhcmFtIGluZGV4IGludAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZU1pbWVNYXBwaW5nKGludCBpbmRleCkgewotCQl3ZWJBcHBEb2N1bWVudC5yZW1vdmVNaW1lTWFwcGluZyhpbmRleCk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KFJFTU9WRV9NQVBQSU5HX1BST1BFUlRZLCBudWxsLCBuZXcgSW50ZWdlcihpbmRleCkpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYSB3ZWIgbW9kdWxlLgotCSAqIEBwYXJhbSBpbmRleCBpbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVXZWJNb2R1bGUoaW50IGluZGV4KSB7Ci0JCXRyeSB7Ci0JCQlpbnQgc2l6ZSA9IHNlcnZlci5nZXRTZXJ2aWNlQ291bnQoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJU2VydmljZSBzZXJ2aWNlID0gc2VydmVyLmdldFNlcnZpY2UoaSk7Ci0JCQkJaWYgKHNlcnZpY2UuZ2V0TmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoREVGQVVMVF9TRVJWSUNFKSkgewotCQkJCQlFbmdpbmUgZW5naW5lID0gc2VydmljZS5nZXRFbmdpbmUoKTsKLQkJCQkJSG9zdCBob3N0ID0gZW5naW5lLmdldEhvc3QoKTsKLQkJCQkJaG9zdC5yZW1vdmVFbGVtZW50KCJDb250ZXh0IiwgaW5kZXgpOwotCQkJCQlpc1NlcnZlckRpcnR5ID0gdHJ1ZTsKLQkJCQkJZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQoUkVNT1ZFX1dFQl9NT0RVTEVfUFJPUEVSVFksIG51bGwsIG5ldyBJbnRlZ2VyKGluZGV4KSk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciByZW1vdmluZyBtb2R1bGUgcmVmICIgKyBpbmRleCwgZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgSVN0YXR1cyBwdWJsaXNoQ29udGV4dENvbmZpZyhJUGF0aCBiYXNlRGlyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJbW9uaXRvciA9IFByb2dyZXNzVXRpbC5nZXRNb25pdG9yRm9yKG1vbml0b3IpOwotCQltb25pdG9yLmJlZ2luVGFzayhNZXNzYWdlcy5wdWJsaXNoQ29uZmlndXJhdGlvblRhc2ssIDMwMCk7Ci0KLQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVIsICJBcHBseSBjb250ZXh0IGNvbmZpZ3VyYXRpb25zIik7Ci0JCUlQYXRoIGNvbmZEaXIgPSBiYXNlRGlyLmFwcGVuZCgiY29uZiIpOwotCQlJUGF0aCB3ZWJhcHBzRGlyID0gYmFzZURpci5hcHBlbmQoIndlYmFwcHMiKTsKLQkJdHJ5IHsKLQkJCW1vbml0b3Iuc3ViVGFzayhNZXNzYWdlcy5wdWJsaXNoQ29udGV4dENvbmZpZ1Rhc2spOwotCQkJRmFjdG9yeSBmYWN0b3J5ID0gbmV3IEZhY3RvcnkoKTsKLQkJCWZhY3Rvcnkuc2V0UGFja2FnZU5hbWUoIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sLnNlcnZlcjQwIik7Ci0JCQlTZXJ2ZXIgcHVibGlzaGVkU2VydmVyID0gKFNlcnZlcikgZmFjdG9yeS5sb2FkRG9jdW1lbnQobmV3IEZpbGVJbnB1dFN0cmVhbShjb25mRGlyLmFwcGVuZCgic2VydmVyLnhtbCIpLnRvRmlsZSgpKSk7Ci0JCQltb25pdG9yLndvcmtlZCgxMDApOwotCQkJCi0JCQlib29sZWFuIG1vZGlmaWVkID0gZmFsc2U7Ci0KLQkJCU11bHRpU3RhdHVzIG1zID0gbmV3IE11bHRpU3RhdHVzKFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsIDAsIE1lc3NhZ2VzLnB1Ymxpc2hDb250ZXh0Q29uZmlnVGFzaywgbnVsbCk7Ci0JCQlpbnQgc2l6ZSA9IHB1Ymxpc2hlZFNlcnZlci5nZXRTZXJ2aWNlQ291bnQoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJU2VydmljZSBzZXJ2aWNlID0gcHVibGlzaGVkU2VydmVyLmdldFNlcnZpY2UoaSk7Ci0JCQkJaWYgKHNlcnZpY2UuZ2V0TmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoREVGQVVMVF9TRVJWSUNFKSkgewotCQkJCQlFbmdpbmUgZW5naW5lID0gc2VydmljZS5nZXRFbmdpbmUoKTsKLQkJCQkJSG9zdCBob3N0ID0gZW5naW5lLmdldEhvc3QoKTsKLQkJCQkJaW50IHNpemUyID0gaG9zdC5nZXRDb250ZXh0Q291bnQoKTsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBzaXplMjsgaisrKSB7Ci0JCQkJCQlDb250ZXh0IGNvbnRleHQgPSBob3N0LmdldENvbnRleHQoaik7Ci0JCQkJCQltb25pdG9yLnN1YlRhc2soTkxTLmJpbmQoTWVzc2FnZXMuY2hlY2tpbmdDb250ZXh0VGFzaywKLQkJCQkJCQkJbmV3IFN0cmluZ1tdIHtjb250ZXh0LmdldFBhdGgoKX0pKTsKLQkJCQkJCWlmIChhZGRDb250ZXh0Q29uZmlnKHdlYmFwcHNEaXIsIGNvbnRleHQsIG1zKSkgewotCQkJCQkJCW1vZGlmaWVkID0gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCW1vbml0b3Iud29ya2VkKDEwMCk7Ci0JCQlpZiAobW9kaWZpZWQpIHsKLQkJCQltb25pdG9yLnN1YlRhc2soTWVzc2FnZXMuc2F2aW5nQ29udGV4dENvbmZpZ1Rhc2spOwotCQkJCWZhY3Rvcnkuc2F2ZShjb25mRGlyLmFwcGVuZCgic2VydmVyLnhtbCIpLnRvT1NTdHJpbmcoKSk7Ci0JCQl9Ci0JCQltb25pdG9yLmRvbmUoKTsKLQkJCQotCQkJLy8gSWYgcHJvYmxlbShzKSBvY2N1cnJlZCBhZGRpbmcgY29udGV4dCBjb25maWd1cmF0aW9ucywgcmV0dXJuIGVycm9yIHN0YXR1cwotCQkJaWYgKG1zLmdldENoaWxkcmVuKCkubGVuZ3RoID4gMCkgewotCQkJCXJldHVybiBtczsKLQkJCX0KLQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVSLCAiU2VydmVyLnhtbCB1cGRhdGVkIHdpdGggY29udGV4dC54bWwgY29uZmlndXJhdGlvbnMiKTsKLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIkNvdWxkIG5vdCBhcHBseSBjb250ZXh0IGNvbmZpZ3VyYXRpb25zIHRvIHB1Ymxpc2hlZCBUb21jYXQgdjUuMCBjb25maWd1cmF0aW9uIGZyb20gIiArIGNvbmZEaXIudG9PU1N0cmluZygpICsgIjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yUHVibGlzaENvbmZpZ3VyYXRpb24sIG5ldyBTdHJpbmdbXSB7ZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCl9KSwgZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogSWYgdGhlIHNwZWNpZmllZCBDb250ZXh0IGlzIGxpbmtlZCB0byBhIHByb2plY3QsIHRyeSB0bwotCSAqIHVwZGF0ZSBpdCB3aXRoIGFueSBjb25maWd1cmF0aW9uIGZyb20gYSBNRVRBLUlORi9jb250ZXh0LnhtbCBmb3VuZAotCSAqIHJlbGF0aXZlIHRvIHRoZSBzcGVjaWZpZWQgd2ViIGFwcGxpY2F0aW9ucyBkaXJlY3RvcnkgYW5kIGNvbnRleHQgZG9jQmFzZS4KLQkgKiBAcGFyYW0gd2ViYXBwc0RpciBQYXRoIHRvIHNlcnZlcidzIHdlYiBhcHBsaWNhdGlvbnMgZGlyZWN0b3J5LgotCSAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgb2JqZWN0IHRvIHJlY2VpdmUgY29udGV4dC54bWwgY29udGVudHMuCi0JICogQHBhcmFtIG1zIE11bHRpU3RhdHVzIG9iamVjdCB0byByZWNlaXZlIGVycm9yIHN0YXR1cy4KLQkgKiBAcmV0dXJuIFJldHVybnMgdHJ1ZSBpZiBjb250ZXh0IGlzIG1vZGlmaWVkLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFkZENvbnRleHRDb25maWcoSVBhdGggd2ViYXBwc0RpciwgQ29udGV4dCBjb250ZXh0LCBNdWx0aVN0YXR1cyBtcykgewotCQlib29sZWFuIG1vZGlmaWVkID0gZmFsc2U7Ci0JCVN0cmluZyBzb3VyY2UgPSBjb250ZXh0LmdldFNvdXJjZSgpOwotCQlpZiAoc291cmNlICE9IG51bGwgJiYgc291cmNlLmxlbmd0aCgpID4gMCApCi0JCXsKLQkJCVN0cmluZyBkb2NCYXNlID0gY29udGV4dC5nZXREb2NCYXNlKCk7Ci0JCQl0cnkgewotCQkJCUNvbnRleHQgY29udGV4dENvbmZpZyA9IGxvYWRDb250ZXh0Q29uZmlnKHdlYmFwcHNEaXIuYXBwZW5kKGRvY0Jhc2UpKTsKLQkJCQlpZiAobnVsbCAhPSBjb250ZXh0Q29uZmlnKSB7Ci0JCQkJCWlmIChjb250ZXh0Lmhhc0NoaWxkTm9kZXMoKSkKLQkJCQkJCWNvbnRleHQucmVtb3ZlQ2hpbGRyZW4oKTsKLQkJCQkJY29udGV4dENvbmZpZy5jb3B5Q2hpbGRyZW5Ubyhjb250ZXh0KTsKLQkJCQkJTWFwIGF0dHJzID0gY29udGV4dENvbmZpZy5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQkJCUl0ZXJhdG9yIGl0ZXIgPSBhdHRycy5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQkJCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQkJCVN0cmluZyBuYW1lID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0JCQkJCQlpZiAoIW5hbWUuZXF1YWxzSWdub3JlQ2FzZSgicGF0aCIpCi0JCQkJCQkJCSYmICFuYW1lLmVxdWFsc0lnbm9yZUNhc2UoImRvY0Jhc2UiKQotCQkJCQkJCQkmJiAhbmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJzb3VyY2UiKSkgewotCQkJCQkJCVN0cmluZyB2YWx1ZSA9IChTdHJpbmcpYXR0cnMuZ2V0KG5hbWUpOwotCQkJCQkJCWNvbnRleHQuc2V0QXR0cmlidXRlVmFsdWUobmFtZSwgdmFsdWUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCW1vZGlmaWVkID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVN0cmluZyBjb250ZXh0UGF0aCA9IGNvbnRleHQuZ2V0UGF0aCgpOwotCQkJCWlmIChjb250ZXh0UGF0aC5zdGFydHNXaXRoKCIvIikpIHsKLQkJCQkJY29udGV4dFBhdGggPSBjb250ZXh0UGF0aC5zdWJzdHJpbmcoMSk7Ci0JCQkJfQotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIHJlYWRpbmcgY29udGV4dC54bWwgZmlsZSBmb3IgIiArIGNvbnRleHRQYXRoLCBlKTsKLQkJCQlJU3RhdHVzIHMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsIDAsCi0JCQkJCQlOTFMuYmluZChNZXNzYWdlcy5lcnJvckNvdWxkTm90TG9hZENvbnRleHRYbWwsIGNvbnRleHRQYXRoKSwgZSk7Ci0JCQkJbXMuYWRkKHMpOwotCQkJfQotCQl9Ci0JCXJldHVybiBtb2RpZmllZDsKLQl9Ci0JCi0JLyoqCi0JICogVHJpZXMgdG8gcmVhZCBhIE1FVEEtSU5GL2NvbnRleHQueG1sIGZpbGUgcmVsYXRpdmUgdG8gdGhlCi0JICogc3BlY2lmaWVkIHdlYiBhcHBsaWNhdGlvbiBwYXRoLiAgSWYgZm91bmQsIGl0IGNyZWF0ZXMgYSBDb250ZXh0IG9iamVjdAotCSAqIGNvbnRhaW5pbmcgdGhlIGNvbnRleHRzIG9mIHRoYXQgZmlsZS4KLQkgKiBAcGFyYW0gd2ViYXBwRGlyIFBhdGggdG8gdGhlIHdlYiBhcHBsaWNhdGlvbgotCSAqIEByZXR1cm4gQ29udGV4dCBlbGVtZW50IGNyZWF0ZWQgZnJvbSBjb250ZXh0LnhtbCwgb3IgbnVsbCBpZiBub3QgZm91bmQuCi0JICogQHRocm93cyBTQVhFeGNlcHRpb24gSWYgdGhlcmUgaXMgYSBlcnJvciBwYXJzaW5nIHRoZSBYTUwuIAotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gSWYgdGhlcmUgaXMgYW4gZXJyb3IgcmVhZGluZyB0aGUgZmlsZS4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29udGV4dCBsb2FkQ29udGV4dENvbmZpZyhJUGF0aCB3ZWJhcHBEaXIpIHRocm93cyBJT0V4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uIHsKLQkJRmlsZSBjb250ZXh0WE1MID0gbmV3IEZpbGUod2ViYXBwRGlyLnRvT1NTdHJpbmcoKSsgRmlsZS5zZXBhcmF0b3IgKyAiTUVUQS1JTkYiICsgRmlsZS5zZXBhcmF0b3IgKyAiY29udGV4dC54bWwiKTsKLQkJaWYgKGNvbnRleHRYTUwuZXhpc3RzKCkpIHsKLQkJCXRyeSB7Ci0JCQkJSW5wdXRTdHJlYW0gaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGNvbnRleHRYTUwpOwotCQkJCUZhY3RvcnkgY3R4RmFjdG9yeSA9IG5ldyBGYWN0b3J5KCk7Ci0JCQkJY3R4RmFjdG9yeS5zZXRQYWNrYWdlTmFtZSgib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC54bWwuc2VydmVyNDAiKTsKLQkJCQlDb250ZXh0IGN0eCA9IChDb250ZXh0KWN0eEZhY3RvcnkubG9hZERvY3VtZW50KGlzKTsKLQkJCQlpcy5jbG9zZSgpOwotCQkJCXJldHVybiBjdHg7Ci0JCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJCS8vIElnbm9yZSwgc2hvdWxkIG5ldmVyIG9jY3VyCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0gCX0KLQkKLQlwcm90ZWN0ZWQgSVN0YXR1cyBwcmVwYXJlUnVudGltZURpcmVjdG9yeShJUGF0aCBjb25mRGlyKSB7Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVSLCAiUHJlcGFyaW5nIHJ1bnRpbWUgZGlyZWN0b3J5Iik7Ci0JCS8vIFByZXBhcmUgYSBjYXRhbGluYS5iYXNlIGRpcmVjdG9yeSBzdHJ1Y3R1cmUKLQkJRmlsZSB0ZW1wID0gY29uZkRpci5hcHBlbmQoImNvbmYiKS50b0ZpbGUoKTsKLQkJaWYgKCF0ZW1wLmV4aXN0cygpKQotCQkJdGVtcC5ta2RpcnMoKTsKLQkJdGVtcCA9IGNvbmZEaXIuYXBwZW5kKCJsb2dzIikudG9GaWxlKCk7Ci0JCWlmICghdGVtcC5leGlzdHMoKSkKLQkJCXRlbXAubWtkaXJzKCk7Ci0JCXRlbXAgPSBjb25mRGlyLmFwcGVuZCgidGVtcCIpLnRvRmlsZSgpOwotCQlpZiAoIXRlbXAuZXhpc3RzKCkpCi0JCQl0ZW1wLm1rZGlycygpOwotCQlJUGF0aCB0ZW1wUGF0aCA9IGNvbmZEaXIuYXBwZW5kKCJ3ZWJhcHBzL1JPT1QvV0VCLUlORiIpOwotCQl0ZW1wID0gdGVtcFBhdGgudG9GaWxlKCk7Ci0JCWlmICghdGVtcC5leGlzdHMoKSkKLQkJCXRlbXAubWtkaXJzKCk7Ci0JCXRlbXAgPSB0ZW1wUGF0aC5hcHBlbmQoIndlYi54bWwiKS50b0ZpbGUoKTsKLQkJaWYgKCF0ZW1wLmV4aXN0cygpKSB7Ci0JCQlGaWxlV3JpdGVyIGZ3OwotCQkJdHJ5IHsKLQkJCQlmdyA9IG5ldyBGaWxlV3JpdGVyKHRlbXApOwotCQkJCWZ3LndyaXRlKERFRkFVTFRfV0VCWE1MX1NFUlZMRVQyMyk7Ci0JCQkJZncuY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiVW5hYmxlIHRvIGNyZWF0ZSB3ZWIueG1sIGZvciBST09UIGNvbnRleHQuIiwgZSk7Ci0JCQl9Ci0JCX0KLQkJdGVtcCA9IGNvbmZEaXIuYXBwZW5kKCJ3b3JrIikudG9GaWxlKCk7Ci0JCWlmICghdGVtcC5leGlzdHMoKSkKLQkJCXRlbXAubWtkaXJzKCk7Ci0JCQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsJCQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1RvbWNhdDQxSGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9Ub21jYXQ0MUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjA2ZWYyMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1RvbWNhdDQxSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotoCoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KYXZhUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKLS8qKgotICogVG9tY2F0IDQxIGhhbmRsZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBUb21jYXQ0MUhhbmRsZXIgaW1wbGVtZW50cyBJVG9tY2F0VmVyc2lvbkhhbmRsZXIgewotCS8qKgotCSAqIEBzZWUgSVRvbWNhdFZlcnNpb25IYW5kbGVyI3ZlcmlmeUluc3RhbGxQYXRoKElQYXRoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZlcmlmeUluc3RhbGxQYXRoKElQYXRoIGluc3RhbGxQYXRoKSB7Ci0JCWlmIChpbnN0YWxsUGF0aCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWlmICghVG9tY2F0UGx1Z2luLnZlcmlmeVRvbWNhdFZlcnNpb25Gcm9tUGF0aChpbnN0YWxsUGF0aCwgVG9tY2F0UGx1Z2luLlRPTUNBVF80MSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBUb21jYXRQbHVnaW4udmVyaWZ5SW5zdGFsbFBhdGgoaW5zdGFsbFBhdGgsIFRvbWNhdFBsdWdpbi5UT01DQVRfNDEpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIElUb21jYXRWZXJzaW9uSGFuZGxlciNnZXRSdW50aW1lQ2xhc3MoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UnVudGltZUNsYXNzKCkgewotCQlyZXR1cm4gIm9yZy5hcGFjaGUuY2F0YWxpbmEuc3RhcnR1cC5Cb290c3RyYXAiOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIElUb21jYXRWZXJzaW9uSGFuZGxlciNnZXRSdW50aW1lQ2xhc3NwYXRoKElQYXRoKQotCSAqLwotCXB1YmxpYyBMaXN0IGdldFJ1bnRpbWVDbGFzc3BhdGgoSVBhdGggaW5zdGFsbFBhdGgpIHsKLQkJTGlzdCBjcCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCi0JCS8vIDQuMSAtIGFkZCBib290c3RyYXAuamFyIGZyb20gdGhlIFRvbWNhdCBiaW4gZGlyZWN0b3J5Ci0JCUlQYXRoIGJpblBhdGggPSBpbnN0YWxsUGF0aC5hcHBlbmQoImJpbiIpOwotCQlpZiAoYmluUGF0aC50b0ZpbGUoKS5leGlzdHMoKSkgewotCQkJSVBhdGggcGF0aCA9IGJpblBhdGguYXBwZW5kKCJib290c3RyYXAuamFyIik7Ci0JCQljcC5hZGQoSmF2YVJ1bnRpbWUubmV3QXJjaGl2ZVJ1bnRpbWVDbGFzc3BhdGhFbnRyeShwYXRoKSk7Ci0JCX0KLQkJCi0JCXJldHVybiBjcDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElUb21jYXRWZXJzaW9uSGFuZGxlciNnZXRSdW50aW1lUHJvZ3JhbUFyZ3VtZW50cyhJUGF0aCwgYm9vbGVhbiwgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0UnVudGltZVByb2dyYW1Bcmd1bWVudHMoSVBhdGggY29uZmlnUGF0aCwgYm9vbGVhbiBkZWJ1ZywgYm9vbGVhbiBzdGFydGluZykgewotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQotCQlpZiAoZGVidWcpCi0JCQlsaXN0LmFkZCgiLWRlYnVnIik7Ci0JCQotCQlpZiAoc3RhcnRpbmcpCi0JCQlsaXN0LmFkZCgic3RhcnQiKTsKLQkJZWxzZQotCQkJbGlzdC5hZGQoInN0b3AiKTsKLQkJCi0JCVN0cmluZ1tdIHRlbXAgPSBuZXcgU3RyaW5nW2xpc3Quc2l6ZSgpXTsKLQkJbGlzdC50b0FycmF5KHRlbXApOwotCQlyZXR1cm4gdGVtcDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElUb21jYXRWZXJzaW9uSGFuZGxlciNnZXRSdW50aW1lVk1Bcmd1bWVudHMoSVBhdGgsIElQYXRoLCBib29sZWFuKQotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRSdW50aW1lVk1Bcmd1bWVudHMoSVBhdGggaW5zdGFsbFBhdGgsIElQYXRoIGNvbmZpZ1BhdGgsIGJvb2xlYW4gaXNUZXN0RW52KSB7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKGlzVGVzdEVudikKLQkJCWxpc3QuYWRkKCItRGNhdGFsaW5hLmJhc2U9XCIiICsgY29uZmlnUGF0aC50b09TU3RyaW5nKCkgKyAiXCIiKTsKLQkJZWxzZSAKLQkJCWxpc3QuYWRkKCItRGNhdGFsaW5hLmJhc2U9XCIiICsgaW5zdGFsbFBhdGgudG9PU1N0cmluZygpICsgIlwiIik7Ci0JCWxpc3QuYWRkKCItRGNhdGFsaW5hLmhvbWU9XCIiICsgaW5zdGFsbFBhdGgudG9PU1N0cmluZygpICsgIlwiIik7Ci0JCWxpc3QuYWRkKCItRGphdmEuZW5kb3JzZWQuZGlycz1cIiIgKyBpbnN0YWxsUGF0aC5hcHBlbmQoImNvbW1vbiIpLmFwcGVuZCgiZW5kb3JzZWQiKS50b09TU3RyaW5nKCkgKyAiXCIiKTsKLQkJCi0JCVN0cmluZ1tdIHMgPSBuZXcgU3RyaW5nW2xpc3Quc2l6ZSgpXTsKLQkJbGlzdC50b0FycmF5KHMpOwotCQlyZXR1cm4gczsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFJ1bnRpbWVQb2xpY3lGaWxlKElQYXRoIGNvbmZpZ1BhdGgpIHsKLQkJcmV0dXJuIGNvbmZpZ1BhdGguYXBwZW5kKCJjb25mIikuYXBwZW5kKCJjYXRhbGluYS5wb2xpY3kiKS50b09TU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJVG9tY2F0VmVyc2lvbkhhbmRsZXIjY2FuQWRkTW9kdWxlKElNb2R1bGUpCi0JICovCi0JcHVibGljIElTdGF0dXMgY2FuQWRkTW9kdWxlKElNb2R1bGUgbW9kdWxlKSB7Ci0JCVN0cmluZyB2ZXJzaW9uID0gbW9kdWxlLmdldE1vZHVsZVR5cGUoKS5nZXRWZXJzaW9uKCk7Ci0JCWlmICgiMi4yIi5lcXVhbHModmVyc2lvbikgfHwgIjIuMyIuZXF1YWxzKHZlcnNpb24pKQotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQotCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBUb21jYXRQbHVnaW4uUExVR0lOX0lELCAwLCBNZXNzYWdlcy5lcnJvclNwZWM0MSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJVG9tY2F0VmVyc2lvbkhhbmRsZXIjZ2V0UnVudGltZUJhc2VEaXJlY3RvcnkoVG9tY2F0U2VydmVyQmVoYXZpb3VyKQotCSAqLwotCXB1YmxpYyBJUGF0aCBnZXRSdW50aW1lQmFzZURpcmVjdG9yeShUb21jYXRTZXJ2ZXJCZWhhdmlvdXIgc2VydmVyQmVoYXZpb3VyKSB7Ci0JCWlmIChzZXJ2ZXJCZWhhdmlvdXIuZ2V0VG9tY2F0U2VydmVyKCkuaXNUZXN0RW52aXJvbm1lbnQoKSkKLQkJCXJldHVybiBzZXJ2ZXJCZWhhdmlvdXIuZ2V0VGVtcERpcmVjdG9yeSgpOwotCQlyZXR1cm4gc2VydmVyQmVoYXZpb3VyLmdldFNlcnZlcigpLmdldFJ1bnRpbWUoKS5nZXRMb2NhdGlvbigpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1RvbWNhdDUwQ29uZmlndXJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9Ub21jYXQ1MENvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc5Njc0NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1RvbWNhdDUwQ29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotoCoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbC5GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sLlhNTFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC54bWwuc2VydmVyNDAuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJQb3J0OwotLyoqCi0gKiBUb21jYXQgdjUuMCBzZXJ2ZXIgY29uZmlndXJhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIFRvbWNhdDUwQ29uZmlndXJhdGlvbiBleHRlbmRzIFRvbWNhdENvbmZpZ3VyYXRpb24gewotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfU0VSVklDRSA9ICJDYXRhbGluYSI7Ci0JcHJvdGVjdGVkIFNlcnZlciBzZXJ2ZXI7Ci0JcHJvdGVjdGVkIEZhY3Rvcnkgc2VydmVyRmFjdG9yeTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1NlcnZlckRpcnR5OwotCi0JcHJvdGVjdGVkIFdlYkFwcERvY3VtZW50IHdlYkFwcERvY3VtZW50OwotCi0JcHJvdGVjdGVkIERvY3VtZW50IHRvbWNhdFVzZXJzRG9jdW1lbnQ7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHBvbGljeUZpbGU7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaXNQb2xpY3lEaXJ0eTsKLQotCS8qKgotCSAqIFRvbWNhdDUwQ29uZmlndXJhdGlvbiBjb25zdHJ1Y3Rvci4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aCBhIHBhdGgKLQkgKi8KLQlwdWJsaWMgVG9tY2F0NTBDb25maWd1cmF0aW9uKElGb2xkZXIgcGF0aCkgewotCQlzdXBlcihwYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHBvcnQgbnVtYmVyLgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIFNlcnZlclBvcnQgZ2V0TWFpblBvcnQoKSB7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZ2V0U2VydmVyUG9ydHMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlTZXJ2ZXJQb3J0IHBvcnQgPSAoU2VydmVyUG9ydCkgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKHBvcnQuZ2V0TmFtZSgpLmVxdWFscygiSFRUUCIpKQotCQkJCXJldHVybiBwb3J0OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtaW1lIG1hcHBpbmdzLgotCSAqIEByZXR1cm4gamF2YS51dGlsLkxpc3QKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRNaW1lTWFwcGluZ3MoKSB7Ci0JCXJldHVybiB3ZWJBcHBEb2N1bWVudC5nZXRNaW1lTWFwcGluZ3MoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBTZXJ2ZXJQb3J0cyB0aGF0IHRoaXMgY29uZmlndXJhdGlvbiB1c2VzLgotCSAqCi0JICogQHJldHVybiBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFNlcnZlclBvcnRzKCkgewotCQlMaXN0IHBvcnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQotCQkvLyBmaXJzdCBhZGQgc2VydmVyIHBvcnQKLQkJdHJ5IHsKLQkJCWludCBwb3J0ID0gSW50ZWdlci5wYXJzZUludChzZXJ2ZXIuZ2V0UG9ydCgpKTsKLQkJCXBvcnRzLmFkZChuZXcgU2VydmVyUG9ydCgic2VydmVyIiwgTWVzc2FnZXMucG9ydFNlcnZlciwgcG9ydCwgIlRDUElQIikpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQkKLQkJLy8gYWRkIGNvbm5lY3RvcnMKLQkJdHJ5IHsKLQkJCWludCBzaXplID0gc2VydmVyLmdldFNlcnZpY2VDb3VudCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlTZXJ2aWNlIHNlcnZpY2UgPSBzZXJ2ZXIuZ2V0U2VydmljZShpKTsKLQkJCQlpbnQgc2l6ZTIgPSBzZXJ2aWNlLmdldENvbm5lY3RvckNvdW50KCk7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBzaXplMjsgaisrKSB7Ci0JCQkJCUNvbm5lY3RvciBjb25uZWN0b3IgPSBzZXJ2aWNlLmdldENvbm5lY3RvcihqKTsKLQkJCQkJU3RyaW5nIG5hbWUgPSAiSFRUUCI7Ci0JCQkJCVN0cmluZyBwcm90b2NvbDIgPSAiSFRUUCI7Ci0JCQkJCWJvb2xlYW4gYWR2YW5jZWQgPSB0cnVlOwotCQkJCQlTdHJpbmdbXSBjb250ZW50VHlwZXMgPSBudWxsOwotCQkJCQlpbnQgcG9ydCA9IC0xOwotCQkJCQl0cnkgewotCQkJCQkJcG9ydCA9IEludGVnZXIucGFyc2VJbnQoY29ubmVjdG9yLmdldFBvcnQoKSk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBpZ25vcmUKLQkJCQkJfQotCQkJCQlTdHJpbmcgcHJvdG9jb2wgPSBjb25uZWN0b3IuZ2V0UHJvdG9jb2woKTsKLQkJCQkJaWYgKHByb3RvY29sICE9IG51bGwgJiYgcHJvdG9jb2wubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQluYW1lID0gcHJvdG9jb2w7Ci0JCQkJCQlwcm90b2NvbDIgPSBwcm90b2NvbDsgCi0JCQkJCX0KLQkJCQkJaWYgKCJIVFRQIi5lcXVhbHMocHJvdG9jb2wpKQotCQkJCQkJY29udGVudFR5cGVzID0gbmV3IFN0cmluZ1tdIHsgIndlYiIsICJ3ZWJzZXJ2aWNlcyIgfTsKLQkJCQkJU3RyaW5nIHNlY3VyZSA9IGNvbm5lY3Rvci5nZXRTZWN1cmUoKTsKLQkJCQkJaWYgKHNlY3VyZSAhPSBudWxsICYmIHNlY3VyZS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCW5hbWUgPSAiU1NMIjsKLQkJCQkJCXByb3RvY29sMiA9ICJTU0wiOwotCQkJCQl9IGVsc2UKLQkJCQkJCWFkdmFuY2VkID0gZmFsc2U7Ci0JCQkJCXBvcnRzLmFkZChuZXcgU2VydmVyUG9ydChpICsiLyIgKyBqLCBuYW1lLCBwb3J0LCBwcm90b2NvbDIsIGNvbnRlbnRUeXBlcywgYWR2YW5jZWQpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBnZXR0aW5nIHNlcnZlciBwb3J0cyIsIGUpOwotCQl9Ci0JCXJldHVybiBwb3J0czsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCBvZiB0aGUgd2ViIG1vZHVsZXMgaW4gdGhpcyBzZXJ2ZXIuCi0JICogQHJldHVybiBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFdlYk1vZHVsZXMoKSB7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkKLQkJdHJ5IHsKLQkJCWludCBzaXplID0gc2VydmVyLmdldFNlcnZpY2VDb3VudCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlTZXJ2aWNlIHNlcnZpY2UgPSBzZXJ2ZXIuZ2V0U2VydmljZShpKTsKLQkJCQlpZiAoc2VydmljZS5nZXROYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShERUZBVUxUX1NFUlZJQ0UpKSB7Ci0JCQkJCUVuZ2luZSBlbmdpbmUgPSBzZXJ2aWNlLmdldEVuZ2luZSgpOwotCQkJCQlIb3N0IGhvc3QgPSBlbmdpbmUuZ2V0SG9zdCgpOwotCQkJCQlpbnQgc2l6ZTIgPSBob3N0LmdldENvbnRleHRDb3VudCgpOwotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHNpemUyOyBqKyspIHsKLQkJCQkJCUNvbnRleHQgY29udGV4dCA9IGhvc3QuZ2V0Q29udGV4dChqKTsKLQkJCQkJCVN0cmluZyByZWxvYWQgPSBjb250ZXh0LmdldFJlbG9hZGFibGUoKTsKLQkJCQkJCWlmIChyZWxvYWQgPT0gbnVsbCkKLQkJCQkJCQlyZWxvYWQgPSAiZmFsc2UiOwotCQkJCQkJV2ViTW9kdWxlIG1vZHVsZSA9IG5ldyBXZWJNb2R1bGUoY29udGV4dC5nZXRQYXRoKCksIAotCQkJCQkJCWNvbnRleHQuZ2V0RG9jQmFzZSgpLCBjb250ZXh0LmdldFNvdXJjZSgpLAotCQkJCQkJCXJlbG9hZC5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikgPyB0cnVlIDogZmFsc2UpOwotCQkJCQkJbGlzdC5hZGQobW9kdWxlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGdldHRpbmcgcHJvamVjdCByZWZzIiwgZSk7Ci0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgVG9tY2F0Q29uZmlndXJhdGlvbiNsb2FkKElQYXRoLCBJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWQoSVBhdGggcGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQltb25pdG9yID0gUHJvZ3Jlc3NVdGlsLmdldE1vbml0b3JGb3IobW9uaXRvcik7Ci0JCQltb25pdG9yLmJlZ2luVGFzayhNZXNzYWdlcy5sb2FkaW5nVGFzaywgNSk7Ci0JCQkKLQkJCS8vIGNoZWNrIGZvciBjYXRhbGluYS5wb2xpY3kgdG8gdmVyaWZ5IHRoYXQgdGhpcyBpcyBhIHY1LjAgY29uZmlnCi0JCQlJbnB1dFN0cmVhbSBpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0ocGF0aC5hcHBlbmQoImNhdGFsaW5hLnBvbGljeSIpLnRvRmlsZSgpKTsKLQkJCWluLnJlYWQoKTsKLQkJCWluLmNsb3NlKCk7Ci0JCQltb25pdG9yLndvcmtlZCgxKTsKLQotCQkJc2VydmVyRmFjdG9yeSA9IG5ldyBGYWN0b3J5KCk7Ci0JCQlzZXJ2ZXJGYWN0b3J5LnNldFBhY2thZ2VOYW1lKCJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbC5zZXJ2ZXI0MCIpOwotCQkJc2VydmVyID0gKFNlcnZlcikgc2VydmVyRmFjdG9yeS5sb2FkRG9jdW1lbnQobmV3IEZpbGVJbnB1dFN0cmVhbShwYXRoLmFwcGVuZCgic2VydmVyLnhtbCIpLnRvRmlsZSgpKSk7Ci0JCQltb25pdG9yLndvcmtlZCgxKTsKLQotCQkJd2ViQXBwRG9jdW1lbnQgPSBuZXcgV2ViQXBwRG9jdW1lbnQocGF0aC5hcHBlbmQoIndlYi54bWwiKSk7Ci0JCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQotCQkJdG9tY2F0VXNlcnNEb2N1bWVudCA9IFhNTFV0aWwuZ2V0RG9jdW1lbnRCdWlsZGVyKCkucGFyc2UobmV3IElucHV0U291cmNlKG5ldyBGaWxlSW5wdXRTdHJlYW0ocGF0aC5hcHBlbmQoInRvbWNhdC11c2Vycy54bWwiKS50b0ZpbGUoKSkpKTsKLQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJCi0JCQkvLyBsb2FkIHBvbGljeSBmaWxlCi0JCQlCdWZmZXJlZFJlYWRlciBiciA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihuZXcgRmlsZUlucHV0U3RyZWFtKHBhdGguYXBwZW5kKCJjYXRhbGluYS5wb2xpY3kiKS50b0ZpbGUoKSkpKTsKLQkJCQlTdHJpbmcgdGVtcCA9IGJyLnJlYWRMaW5lKCk7Ci0JCQkJcG9saWN5RmlsZSA9ICIiOwotCQkJCXdoaWxlICh0ZW1wICE9IG51bGwpIHsKLQkJCQkJcG9saWN5RmlsZSArPSB0ZW1wICsgIlxuIjsKLQkJCQkJdGVtcCA9IGJyLnJlYWRMaW5lKCk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiQ291bGQgbm90IGxvYWQgcG9saWN5IGZpbGUiLCBlKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJaWYgKGJyICE9IG51bGwpCi0JCQkJCWJyLmNsb3NlKCk7Ci0JCQl9Ci0JCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQotCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJCXJldHVybjsKLQkJCW1vbml0b3IuZG9uZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIkNvdWxkIG5vdCBsb2FkIFRvbWNhdCB2NS4wIGNvbmZpZ3VyYXRpb24gZnJvbSAiICsgcGF0aC50b09TU3RyaW5nKCkgKyAiOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBUb21jYXRQbHVnaW4uUExVR0lOX0lELCAwLCBOTFMuYmluZChNZXNzYWdlcy5lcnJvckNvdWxkTm90TG9hZENvbmZpZ3VyYXRpb24sIHBhdGgudG9PU1N0cmluZygpKSwgZSkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgaW1wb3J0RnJvbVBhdGgoSVBhdGggcGF0aCwgYm9vbGVhbiBpc1Rlc3RFbnYsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlsb2FkKHBhdGgsIG1vbml0b3IpOwotCQkKLQkJLy8gZm9yIHRlc3QgZW52aXJvbm1lbnQsIHJlbW92ZSBleGlzdGluZyBjb250ZXh0cyBzaW5jZSBhIHNlcGFyYXRlCi0JCS8vIGNhdGFsaW5hLmJhc2Ugd2lsbCBiZSB1c2VkCi0JCWlmIChpc1Rlc3RFbnYpIHsKLQkJCWludCBzaXplID0gc2VydmVyLmdldFNlcnZpY2VDb3VudCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlTZXJ2aWNlIHNlcnZpY2UgPSBzZXJ2ZXIuZ2V0U2VydmljZShpKTsKLQkJCQlpZiAoc2VydmljZS5nZXROYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShERUZBVUxUX1NFUlZJQ0UpKSB7Ci0JCQkJCUhvc3QgaG9zdCA9IHNlcnZpY2UuZ2V0RW5naW5lKCkuZ2V0SG9zdCgpOwotCQkJCQlpbnQgc2l6ZTIgPSBob3N0LmdldENvbnRleHRDb3VudCgpOwotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHNpemUyOyBqKyspIHsKLQkJCQkJCWhvc3QucmVtb3ZlRWxlbWVudCgiQ29udGV4dCIsIDApOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBUb21jYXRDb25maWd1cmF0aW9uI2xvYWQoSUZvbGRlciwgSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkKElGb2xkZXIgZm9sZGVyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCW1vbml0b3IgPSBQcm9ncmVzc1V0aWwuZ2V0TW9uaXRvckZvcihtb25pdG9yKTsKLQkJCW1vbml0b3IuYmVnaW5UYXNrKE1lc3NhZ2VzLmxvYWRpbmdUYXNrLCA4MDApOwotCQotCQkJLy8gY2hlY2sgZm9yIGNhdGFsaW5hLnBvbGljeSB0byB2ZXJpZnkgdGhhdCB0aGlzIGlzIGEgdjQuMCBjb25maWcKLQkJCUlGaWxlIGZpbGUgPSBmb2xkZXIuZ2V0RmlsZSgiY2F0YWxpbmEucG9saWN5Iik7Ci0JCQlpZiAoIWZpbGUuZXhpc3RzKCkpCi0JCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yQ291bGROb3RMb2FkQ29uZmlndXJhdGlvbiwgZm9sZGVyLmdldEZ1bGxQYXRoKCkudG9PU1N0cmluZygpKSwgbnVsbCkpOwotCQotCQkJLy8gbG9hZCBzZXJ2ZXIueG1sCi0JCQlmaWxlID0gZm9sZGVyLmdldEZpbGUoInNlcnZlci54bWwiKTsKLQkJCUlucHV0U3RyZWFtIGluID0gZmlsZS5nZXRDb250ZW50cygpOwotCQkJc2VydmVyRmFjdG9yeSA9IG5ldyBGYWN0b3J5KCk7Ci0JCQlzZXJ2ZXJGYWN0b3J5LnNldFBhY2thZ2VOYW1lKCJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbC5zZXJ2ZXI0MCIpOwotCQkJc2VydmVyID0gKFNlcnZlcikgc2VydmVyRmFjdG9yeS5sb2FkRG9jdW1lbnQoaW4pOwotCQkJbW9uaXRvci53b3JrZWQoMjAwKTsKLQkKLQkJCS8vIGxvYWQgd2ViLnhtbAotCQkJZmlsZSA9IGZvbGRlci5nZXRGaWxlKCJ3ZWIueG1sIik7Ci0JCQl3ZWJBcHBEb2N1bWVudCA9IG5ldyBXZWJBcHBEb2N1bWVudChmaWxlKTsKLQkJCW1vbml0b3Iud29ya2VkKDIwMCk7Ci0JCi0JCQkvLyBsb2FkIHRvbWNhdC11c2Vycy54bWwKLQkJCWZpbGUgPSBmb2xkZXIuZ2V0RmlsZSgidG9tY2F0LXVzZXJzLnhtbCIpOwotCQkJaW4gPSBmaWxlLmdldENvbnRlbnRzKCk7Ci0JCQkKLQkJCXRvbWNhdFVzZXJzRG9jdW1lbnQgPSBYTUxVdGlsLmdldERvY3VtZW50QnVpbGRlcigpLnBhcnNlKG5ldyBJbnB1dFNvdXJjZShpbikpOwotCQkJbW9uaXRvci53b3JrZWQoMjAwKTsKLQkJCi0JCQkvLyBsb2FkIGNhdGFsaW5hLnBvbGljeQotCQkJZmlsZSA9IGZvbGRlci5nZXRGaWxlKCJjYXRhbGluYS5wb2xpY3kiKTsKLQkJCWluID0gZmlsZS5nZXRDb250ZW50cygpOwotCQkJQnVmZmVyZWRSZWFkZXIgYnIgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQliciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW4pKTsKLQkJCQlTdHJpbmcgdGVtcCA9IGJyLnJlYWRMaW5lKCk7Ci0JCQkJcG9saWN5RmlsZSA9ICIiOwotCQkJCXdoaWxlICh0ZW1wICE9IG51bGwpIHsKLQkJCQkJcG9saWN5RmlsZSArPSB0ZW1wICsgIlxuIjsKLQkJCQkJdGVtcCA9IGJyLnJlYWRMaW5lKCk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiQ291bGQgbm90IGxvYWQgcG9saWN5IGZpbGUiLCBlKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJaWYgKGJyICE9IG51bGwpCi0JCQkJCWJyLmNsb3NlKCk7Ci0JCQl9Ci0JCQltb25pdG9yLndvcmtlZCgyMDApOwotCQotCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJCXRocm93IG5ldyBFeGNlcHRpb24oIkNhbmNlbGxlZCIpOwotCQkJbW9uaXRvci5kb25lKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiQ291bGQgbm90IHJlbG9hZCBUb21jYXQgdjUuMCBjb25maWd1cmF0aW9uIGZyb206ICIgKyBmb2xkZXIuZ2V0RnVsbFBhdGgoKSArICI6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yQ291bGROb3RMb2FkQ29uZmlndXJhdGlvbiwgZm9sZGVyLmdldEZ1bGxQYXRoKCkudG9PU1N0cmluZygpKSwgZSkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2F2ZSB0byB0aGUgZ2l2ZW4gZGlyZWN0b3J5LgotCSAqIEBwYXJhbSBwYXRoIGEgcGF0aAotCSAqIEBwYXJhbSBmb3JjZURpcnR5IGJvb2xlYW4KLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IKLQkgKiBAZXhjZXB0aW9uIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzYXZlKElQYXRoIHBhdGgsIGJvb2xlYW4gZm9yY2VEaXJ0eSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQltb25pdG9yID0gUHJvZ3Jlc3NVdGlsLmdldE1vbml0b3JGb3IobW9uaXRvcik7Ci0JCQltb25pdG9yLmJlZ2luVGFzayhNZXNzYWdlcy5zYXZpbmdUYXNrLCAzKTsKLQkKLQkJCS8vIG1ha2Ugc3VyZSBkaXJlY3RvcnkgZXhpc3RzCi0JCQlpZiAoIXBhdGgudG9GaWxlKCkuZXhpc3RzKCkpIHsKLQkJCQlmb3JjZURpcnR5ID0gdHJ1ZTsKLQkJCQlwYXRoLnRvRmlsZSgpLm1rZGlyKCk7Ci0JCQl9Ci0JCQltb25pdG9yLndvcmtlZCgxKTsKLQkKLQkJCS8vIHNhdmUgZmlsZXMKLQkJCWlmIChmb3JjZURpcnR5IHx8IGlzU2VydmVyRGlydHkpCi0JCQkJc2VydmVyRmFjdG9yeS5zYXZlKHBhdGguYXBwZW5kKCJzZXJ2ZXIueG1sIikudG9PU1N0cmluZygpKTsKLQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQotCQkJLy9pZiAoZm9yY2VEaXJ0eSB8fCBpc1dlYkFwcERpcnR5KQotCQkJLy8Jd2ViQXBwRmFjdG9yeS5zYXZlKGRpclBhdGggKyAid2ViLnhtbCIpOwotCQkJLy93ZWJBcHBEb2N1bWVudC5zYXZlKHBhdGgudG9PU1N0cmluZygpLCBmb3JjZURpcnR5IHx8IGlzUG9saWN5RGlydHkpOwotCQkJd2ViQXBwRG9jdW1lbnQuc2F2ZShwYXRoLmFwcGVuZCgid2ViLnhtbCIpLnRvT1NTdHJpbmcoKSwgZm9yY2VEaXJ0eSk7Ci0JCQltb25pdG9yLndvcmtlZCgxKTsKLQkKLQkJCWlmIChmb3JjZURpcnR5KQotCQkJCVhNTFV0aWwuc2F2ZShwYXRoLmFwcGVuZCgidG9tY2F0LXVzZXJzLnhtbCIpLnRvT1NTdHJpbmcoKSwgdG9tY2F0VXNlcnNEb2N1bWVudCk7Ci0JCQltb25pdG9yLndvcmtlZCgxKTsKLQkKLQkJCWlmIChmb3JjZURpcnR5IHx8IGlzUG9saWN5RGlydHkpIHsKLQkJCQlCdWZmZXJlZFdyaXRlciBidyA9IG5ldyBCdWZmZXJlZFdyaXRlcihuZXcgRmlsZVdyaXRlcihwYXRoLmFwcGVuZCgiY2F0YWxpbmEucG9saWN5IikudG9GaWxlKCkpKTsKLQkJCQlidy53cml0ZShwb2xpY3lGaWxlKTsKLQkJCQlidy5jbG9zZSgpOwotCQkJfQotCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQlpc1NlcnZlckRpcnR5ID0gZmFsc2U7Ci0JCQlpc1BvbGljeURpcnR5ID0gZmFsc2U7Ci0JCi0JCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJcmV0dXJuOwotCQkJbW9uaXRvci5kb25lKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3Qgc2F2ZSBUb21jYXQgdjUuMCBjb25maWd1cmF0aW9uIHRvICIgKyBwYXRoLCBlKTsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgVG9tY2F0UGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JDb3VsZE5vdFNhdmVDb25maWd1cmF0aW9uLCBuZXcgU3RyaW5nW10ge2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpfSksIGUpKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBzYXZlKElQYXRoIHBhdGgsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlzYXZlKHBhdGgsIHRydWUsIG1vbml0b3IpOwotCX0KLQotCS8qKgotCSAqIFNhdmUgdGhlIGluZm9ybWF0aW9uIGhlbGQgYnkgdGhpcyBvYmplY3QgdG8gdGhlIGdpdmVuIGRpcmVjdG9yeS4KLQkgKgotCSAqIEBwYXJhbSBmb2xkZXIgYSBmb2xkZXIKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlKElGb2xkZXIgZm9sZGVyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCW1vbml0b3IgPSBQcm9ncmVzc1V0aWwuZ2V0TW9uaXRvckZvcihtb25pdG9yKTsKLQkJCW1vbml0b3IuYmVnaW5UYXNrKE1lc3NhZ2VzLnNhdmluZ1Rhc2ssIDkwMCk7Ci0JCi0JCQkvLyBzYXZlIHNlcnZlci54bWwKLQkJCWJ5dGVbXSBkYXRhID0gc2VydmVyRmFjdG9yeS5nZXRDb250ZW50cygpOwotCQkJSW5wdXRTdHJlYW0gaW4gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oZGF0YSk7Ci0JCQlJRmlsZSBmaWxlID0gZm9sZGVyLmdldEZpbGUoInNlcnZlci54bWwiKTsKLQkJCWlmIChmaWxlLmV4aXN0cygpKSB7Ci0JCQkJaWYgKGlzU2VydmVyRGlydHkpCi0JCQkJCWZpbGUuc2V0Q29udGVudHMoaW4sIHRydWUsIHRydWUsIFByb2dyZXNzVXRpbC5nZXRTdWJNb25pdG9yRm9yKG1vbml0b3IsIDIwMCkpOwotCQkJCWVsc2UKLQkJCQkJbW9uaXRvci53b3JrZWQoMjAwKTsKLQkJCX0gZWxzZQotCQkJCWZpbGUuY3JlYXRlKGluLCB0cnVlLCBQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yLCAyMDApKTsKLQkKLQkJCS8vIHNhdmUgd2ViLnhtbAotCQkJd2ViQXBwRG9jdW1lbnQuc2F2ZShmb2xkZXIuZ2V0RmlsZSgid2ViLnhtbCIpLCBQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yLCAyMDApKTsKLQkKLQkJCS8vIHNhdmUgdG9tY2F0LXVzZXJzLnhtbAotCQkJZGF0YSA9IFhNTFV0aWwuZ2V0Q29udGVudHModG9tY2F0VXNlcnNEb2N1bWVudCk7Ci0JCQlpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShkYXRhKTsKLQkJCWZpbGUgPSBmb2xkZXIuZ2V0RmlsZSgidG9tY2F0LXVzZXJzLnhtbCIpOwotCQkJaWYgKGZpbGUuZXhpc3RzKCkpCi0JCQkJbW9uaXRvci53b3JrZWQoMjAwKTsKLQkJCQkvL2ZpbGUuc2V0Q29udGVudHMoaW4sIHRydWUsIHRydWUsIFByb2dyZXNzVXRpbC5nZXRTdWJNb25pdG9yRm9yKG1vbml0b3IsIDIwMCkpOwotCQkJZWxzZQotCQkJCWZpbGUuY3JlYXRlKGluLCB0cnVlLCBQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yLCAyMDApKTsKLQkKLQkJCS8vIHNhdmUgY2F0YWxpbmEucG9saWN5Ci0JCQlpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShwb2xpY3lGaWxlLmdldEJ5dGVzKCkpOwotCQkJZmlsZSA9IGZvbGRlci5nZXRGaWxlKCJjYXRhbGluYS5wb2xpY3kiKTsKLQkJCWlmIChmaWxlLmV4aXN0cygpKQotCQkJCW1vbml0b3Iud29ya2VkKDIwMCk7Ci0JCQkJLy9maWxlLnNldENvbnRlbnRzKGluLCB0cnVlLCB0cnVlLCBQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yLCAyMDApKTsKLQkJCWVsc2UKLQkJCQlmaWxlLmNyZWF0ZShpbiwgdHJ1ZSwgUHJvZ3Jlc3NVdGlsLmdldFN1Yk1vbml0b3JGb3IobW9uaXRvciwgMjAwKSk7Ci0JCi0JCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJcmV0dXJuOwotCQkJbW9uaXRvci5kb25lKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3Qgc2F2ZSBUb21jYXQgdjUuMCBjb25maWd1cmF0aW9uIHRvICIgKyBmb2xkZXIudG9TdHJpbmcoKSwgZSk7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yQ291bGROb3RTYXZlQ29uZmlndXJhdGlvbiwgbmV3IFN0cmluZ1tdIHtlLmdldExvY2FsaXplZE1lc3NhZ2UoKX0pLCBlKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaGFzTURCTGlzdGVuZXIoU2VydmVyIHNlcnZlcikgewotCQlpZiAoc2VydmVyID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQlpbnQgY291bnQgPSBzZXJ2ZXIuZ2V0TGlzdGVuZXJDb3VudCgpOwotCQlpZiAoY291bnQgPT0gMCkKLQkJCXJldHVybiBmYWxzZTsKLQkJCQotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJCUxpc3RlbmVyIGxpc3RlbmVyID0gc2VydmVyLmdldExpc3RlbmVyKGkpOwotCQkJaWYgKGxpc3RlbmVyICE9IG51bGwgJiYgbGlzdGVuZXIuZ2V0Q2xhc3NOYW1lKCkgIT0gbnVsbCAmJiBsaXN0ZW5lci5nZXRDbGFzc05hbWUoKS5pbmRleE9mKCJtYmVhbiIpID49IDApCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIElUb21jYXRDb25maWd1cmF0aW9uV29ya2luZ0NvcHkjYWRkTWltZU1hcHBpbmcoaW50LCBJTWltZU1hcHBpbmcpCi0JICovCi0JcHVibGljIHZvaWQgYWRkTWltZU1hcHBpbmcoaW50IGluZGV4LCBJTWltZU1hcHBpbmcgbWFwKSB7Ci0JCXdlYkFwcERvY3VtZW50LmFkZE1pbWVNYXBwaW5nKGluZGV4LCBtYXApOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChBRERfTUFQUElOR19QUk9QRVJUWSwgbmV3IEludGVnZXIoaW5kZXgpLCBtYXApOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVRvbWNhdENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSNhZGRXZWJNb2R1bGUoaW50LCBJVG9tY2F0V2ViTW9kdWxlKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFdlYk1vZHVsZShpbnQgaW5kZXgsIElUb21jYXRXZWJNb2R1bGUgbW9kdWxlKSB7Ci0JCXRyeSB7Ci0JCQlpbnQgc2l6ZSA9IHNlcnZlci5nZXRTZXJ2aWNlQ291bnQoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJU2VydmljZSBzZXJ2aWNlID0gc2VydmVyLmdldFNlcnZpY2UoaSk7Ci0JCQkJaWYgKHNlcnZpY2UuZ2V0TmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoREVGQVVMVF9TRVJWSUNFKSkgewotCQkJCQlFbmdpbmUgZW5naW5lID0gc2VydmljZS5nZXRFbmdpbmUoKTsKLQkJCQkJSG9zdCBob3N0ID0gZW5naW5lLmdldEhvc3QoKTsKLQkJCQkJQ29udGV4dCBjb250ZXh0ID0gKENvbnRleHQpIGhvc3QuY3JlYXRlRWxlbWVudChpbmRleCwgIkNvbnRleHQiKTsKLQkJCQkJY29udGV4dC5zZXREb2NCYXNlKG1vZHVsZS5nZXREb2N1bWVudEJhc2UoKSk7Ci0JCQkJCWNvbnRleHQuc2V0UGF0aChtb2R1bGUuZ2V0UGF0aCgpKTsKLQkJCQkJY29udGV4dC5zZXRSZWxvYWRhYmxlKG1vZHVsZS5pc1JlbG9hZGFibGUoKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotCQkJCQlpZiAobW9kdWxlLmdldE1lbWVudG8oKSAhPSBudWxsICYmIG1vZHVsZS5nZXRNZW1lbnRvKCkubGVuZ3RoKCkgPiAwKQotCQkJCQkJY29udGV4dC5zZXRTb3VyY2UobW9kdWxlLmdldE1lbWVudG8oKSk7Ci0JCQkJCWlzU2VydmVyRGlydHkgPSB0cnVlOwotCQkJCQlmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChBRERfV0VCX01PRFVMRV9QUk9QRVJUWSwgbnVsbCwgbW9kdWxlKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGFkZGluZyB3ZWIgbW9kdWxlICIgKyBtb2R1bGUuZ2V0UGF0aCgpLCBlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENoYW5nZSB0aGUgZXh0ZW5zaW9uIG9mIGEgbWltZSBtYXBwaW5nLgotCSAqIAotCSAqIEBwYXJhbSBpbmRleAotCSAqIEBwYXJhbSBtYXAKLQkgKi8KLQlwdWJsaWMgdm9pZCBtb2RpZnlNaW1lTWFwcGluZyhpbnQgaW5kZXgsIElNaW1lTWFwcGluZyBtYXApIHsKLQkJd2ViQXBwRG9jdW1lbnQubW9kaWZ5TWltZU1hcHBpbmcoaW5kZXgsIG1hcCk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KE1PRElGWV9NQVBQSU5HX1BST1BFUlRZLCBuZXcgSW50ZWdlcihpbmRleCksIG1hcCk7Ci0JfQotCi0JLyoqCi0JICogTW9kaWZ5IHRoZSBwb3J0IHdpdGggdGhlIGdpdmVuIGlkLgotCSAqCi0JICogQHBhcmFtIGlkIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gcG9ydCBpbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBtb2RpZnlTZXJ2ZXJQb3J0KFN0cmluZyBpZCwgaW50IHBvcnQpIHsKLQkJdHJ5IHsKLQkJCWlmICgic2VydmVyIi5lcXVhbHMoaWQpKSB7Ci0JCQkJc2VydmVyLnNldFBvcnQocG9ydCArICIiKTsKLQkJCQlpc1NlcnZlckRpcnR5ID0gdHJ1ZTsKLQkJCQlmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChNT0RJRllfUE9SVF9QUk9QRVJUWSwgaWQsIG5ldyBJbnRlZ2VyKHBvcnQpKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCi0JCQlpbnQgaSA9IGlkLmluZGV4T2YoIi8iKTsKLQkJCWludCBzZXJ2TnVtID0gSW50ZWdlci5wYXJzZUludChpZC5zdWJzdHJpbmcoMCwgaSkpOwotCQkJaW50IGNvbm5OdW0gPSBJbnRlZ2VyLnBhcnNlSW50KGlkLnN1YnN0cmluZyhpICsgMSkpOwotCQkJCi0JCQlTZXJ2aWNlIHNlcnZpY2UgPSBzZXJ2ZXIuZ2V0U2VydmljZShzZXJ2TnVtKTsKLQkJCUNvbm5lY3RvciBjb25uZWN0b3IgPSBzZXJ2aWNlLmdldENvbm5lY3Rvcihjb25uTnVtKTsKLQkJCWNvbm5lY3Rvci5zZXRQb3J0KHBvcnQgKyAiIik7Ci0JCQlpc1NlcnZlckRpcnR5ID0gdHJ1ZTsKLQkJCWZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KE1PRElGWV9QT1JUX1BST1BFUlRZLCBpZCwgbmV3IEludGVnZXIocG9ydCkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgbW9kaWZ5aW5nIHNlcnZlciBwb3J0ICIgKyBpZCwgZSk7Ci0JCX0KLQl9Ci0JLyoqCi0JICogQ2hhbmdlIGEgd2ViIG1vZHVsZS4KLQkgKiBAcGFyYW0gaW5kZXggaW50Ci0JICogQHBhcmFtIGRvY0Jhc2UgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBwYXRoIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gcmVsb2FkYWJsZSBib29sZWFuCi0JICovCi0JcHVibGljIHZvaWQgbW9kaWZ5V2ViTW9kdWxlKGludCBpbmRleCwgU3RyaW5nIGRvY0Jhc2UsIFN0cmluZyBwYXRoLCBib29sZWFuIHJlbG9hZGFibGUpIHsKLQkJdHJ5IHsKLQkJCWludCBzaXplID0gc2VydmVyLmdldFNlcnZpY2VDb3VudCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlTZXJ2aWNlIHNlcnZpY2UgPSBzZXJ2ZXIuZ2V0U2VydmljZShpKTsKLQkJCQlpZiAoc2VydmljZS5nZXROYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShERUZBVUxUX1NFUlZJQ0UpKSB7Ci0JCQkJCUVuZ2luZSBlbmdpbmUgPSBzZXJ2aWNlLmdldEVuZ2luZSgpOwotCQkJCQlIb3N0IGhvc3QgPSBlbmdpbmUuZ2V0SG9zdCgpOwotCQkJCQlDb250ZXh0IGNvbnRleHQgPSBob3N0LmdldENvbnRleHQoaW5kZXgpOwotCQkJCQljb250ZXh0LnNldFBhdGgocGF0aCk7Ci0JCQkJCWNvbnRleHQuc2V0RG9jQmFzZShkb2NCYXNlKTsKLQkJCQkJY29udGV4dC5zZXRSZWxvYWRhYmxlKHJlbG9hZGFibGUgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLQkJCQkJaXNTZXJ2ZXJEaXJ0eSA9IHRydWU7Ci0JCQkJCVdlYk1vZHVsZSBtb2R1bGUgPSBuZXcgV2ViTW9kdWxlKHBhdGgsIGRvY0Jhc2UsIG51bGwsIHJlbG9hZGFibGUpOwotCQkJCQlmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChNT0RJRllfV0VCX01PRFVMRV9QUk9QRVJUWSwgbmV3IEludGVnZXIoaW5kZXgpLCBtb2R1bGUpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgbW9kaWZ5aW5nIHdlYiBtb2R1bGUgIiArIGluZGV4LCBlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYSBtaW1lIG1hcHBpbmcuCi0JICogQHBhcmFtIGluZGV4IGludAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZU1pbWVNYXBwaW5nKGludCBpbmRleCkgewotCQl3ZWJBcHBEb2N1bWVudC5yZW1vdmVNaW1lTWFwcGluZyhpbmRleCk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KFJFTU9WRV9NQVBQSU5HX1BST1BFUlRZLCBudWxsLCBuZXcgSW50ZWdlcihpbmRleCkpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYSB3ZWIgbW9kdWxlLgotCSAqIEBwYXJhbSBpbmRleCBpbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVXZWJNb2R1bGUoaW50IGluZGV4KSB7Ci0JCXRyeSB7Ci0JCQlpbnQgc2l6ZSA9IHNlcnZlci5nZXRTZXJ2aWNlQ291bnQoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJU2VydmljZSBzZXJ2aWNlID0gc2VydmVyLmdldFNlcnZpY2UoaSk7Ci0JCQkJaWYgKHNlcnZpY2UuZ2V0TmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoREVGQVVMVF9TRVJWSUNFKSkgewotCQkJCQlFbmdpbmUgZW5naW5lID0gc2VydmljZS5nZXRFbmdpbmUoKTsKLQkJCQkJSG9zdCBob3N0ID0gZW5naW5lLmdldEhvc3QoKTsKLQkJCQkJaG9zdC5yZW1vdmVFbGVtZW50KCJDb250ZXh0IiwgaW5kZXgpOwotCQkJCQlpc1NlcnZlckRpcnR5ID0gdHJ1ZTsKLQkJCQkJZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQoUkVNT1ZFX1dFQl9NT0RVTEVfUFJPUEVSVFksIG51bGwsIG5ldyBJbnRlZ2VyKGluZGV4KSk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciByZW1vdmluZyBtb2R1bGUgcmVmICIgKyBpbmRleCwgZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgSVN0YXR1cyBwdWJsaXNoQ29udGV4dENvbmZpZyhJUGF0aCBiYXNlRGlyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJbW9uaXRvciA9IFByb2dyZXNzVXRpbC5nZXRNb25pdG9yRm9yKG1vbml0b3IpOwotCQltb25pdG9yLmJlZ2luVGFzayhNZXNzYWdlcy5wdWJsaXNoQ29uZmlndXJhdGlvblRhc2ssIDMwMCk7Ci0KLQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVIsICJBcHBseSBjb250ZXh0IGNvbmZpZ3VyYXRpb25zIik7Ci0JCUlQYXRoIGNvbmZEaXIgPSBiYXNlRGlyLmFwcGVuZCgiY29uZiIpOwotCQlJUGF0aCB3ZWJhcHBzRGlyID0gYmFzZURpci5hcHBlbmQoIndlYmFwcHMiKTsKLQkJdHJ5IHsKLQkJCW1vbml0b3Iuc3ViVGFzayhNZXNzYWdlcy5wdWJsaXNoQ29udGV4dENvbmZpZ1Rhc2spOwotCQkJRmFjdG9yeSBmYWN0b3J5ID0gbmV3IEZhY3RvcnkoKTsKLQkJCWZhY3Rvcnkuc2V0UGFja2FnZU5hbWUoIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sLnNlcnZlcjQwIik7Ci0JCQlTZXJ2ZXIgcHVibGlzaGVkU2VydmVyID0gKFNlcnZlcikgZmFjdG9yeS5sb2FkRG9jdW1lbnQobmV3IEZpbGVJbnB1dFN0cmVhbShjb25mRGlyLmFwcGVuZCgic2VydmVyLnhtbCIpLnRvRmlsZSgpKSk7Ci0JCQltb25pdG9yLndvcmtlZCgxMDApOwotCi0JCQlib29sZWFuIG1vZGlmaWVkID0gZmFsc2U7Ci0KLQkJCU11bHRpU3RhdHVzIG1zID0gbmV3IE11bHRpU3RhdHVzKFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsIDAsIE1lc3NhZ2VzLnB1Ymxpc2hDb250ZXh0Q29uZmlnVGFzaywgbnVsbCk7Ci0JCQlpbnQgc2l6ZSA9IHB1Ymxpc2hlZFNlcnZlci5nZXRTZXJ2aWNlQ291bnQoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJU2VydmljZSBzZXJ2aWNlID0gcHVibGlzaGVkU2VydmVyLmdldFNlcnZpY2UoaSk7Ci0JCQkJaWYgKHNlcnZpY2UuZ2V0TmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoREVGQVVMVF9TRVJWSUNFKSkgewotCQkJCQlFbmdpbmUgZW5naW5lID0gc2VydmljZS5nZXRFbmdpbmUoKTsKLQkJCQkJSG9zdCBob3N0ID0gZW5naW5lLmdldEhvc3QoKTsKLQkJCQkJaW50IHNpemUyID0gaG9zdC5nZXRDb250ZXh0Q291bnQoKTsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBzaXplMjsgaisrKSB7Ci0JCQkJCQlDb250ZXh0IGNvbnRleHQgPSBob3N0LmdldENvbnRleHQoaik7Ci0JCQkJCQltb25pdG9yLnN1YlRhc2soTkxTLmJpbmQoTWVzc2FnZXMuY2hlY2tpbmdDb250ZXh0VGFzaywKLQkJCQkJCQkJbmV3IFN0cmluZ1tdIHtjb250ZXh0LmdldFBhdGgoKX0pKTsKLQkJCQkJCWlmIChhZGRDb250ZXh0Q29uZmlnKHdlYmFwcHNEaXIsIGNvbnRleHQsIG1zKSkgewotCQkJCQkJCW1vZGlmaWVkID0gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCW1vbml0b3Iud29ya2VkKDEwMCk7Ci0JCQlpZiAobW9kaWZpZWQpIHsKLQkJCQltb25pdG9yLnN1YlRhc2soTWVzc2FnZXMuc2F2aW5nQ29udGV4dENvbmZpZ1Rhc2spOwotCQkJCWZhY3Rvcnkuc2F2ZShjb25mRGlyLmFwcGVuZCgic2VydmVyLnhtbCIpLnRvT1NTdHJpbmcoKSk7Ci0JCQl9Ci0JCQltb25pdG9yLmRvbmUoKTsKLQkJCQotCQkJLy8gSWYgcHJvYmxlbShzKSBvY2N1cnJlZCBhZGRpbmcgY29udGV4dCBjb25maWd1cmF0aW9ucywgcmV0dXJuIGVycm9yIHN0YXR1cwotCQkJaWYgKG1zLmdldENoaWxkcmVuKCkubGVuZ3RoID4gMCkgewotCQkJCXJldHVybiBtczsKLQkJCX0KLQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVSLCAiU2VydmVyLnhtbCB1cGRhdGVkIHdpdGggY29udGV4dC54bWwgY29uZmlndXJhdGlvbnMiKTsKLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIkNvdWxkIG5vdCBhcHBseSBjb250ZXh0IGNvbmZpZ3VyYXRpb25zIHRvIHB1Ymxpc2hlZCBUb21jYXQgdjUuMCBjb25maWd1cmF0aW9uIGZyb20gIiArIGNvbmZEaXIudG9PU1N0cmluZygpICsgIjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yUHVibGlzaENvbmZpZ3VyYXRpb24sIG5ldyBTdHJpbmdbXSB7ZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCl9KSwgZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogSWYgdGhlIHNwZWNpZmllZCBDb250ZXh0IGlzIGxpbmtlZCB0byBhIHByb2plY3QsIHRyeSB0bwotCSAqIHVwZGF0ZSBpdCB3aXRoIGFueSBjb25maWd1cmF0aW9uIGZyb20gYSBNRVRBLUlORi9jb250ZXh0LnhtbCBmb3VuZAotCSAqIHJlbGF0aXZlIHRvIHRoZSBzcGVjaWZpZWQgd2ViIGFwcGxpY2F0aW9ucyBkaXJlY3RvcnkgYW5kIGNvbnRleHQgZG9jQmFzZS4KLQkgKiBAcGFyYW0gd2ViYXBwc0RpciBQYXRoIHRvIHNlcnZlcidzIHdlYiBhcHBsaWNhdGlvbnMgZGlyZWN0b3J5LgotCSAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgb2JqZWN0IHRvIHJlY2VpdmUgY29udGV4dC54bWwgY29udGVudHMuCi0JICogQHBhcmFtIG1zIE11bHRpU3RhdHVzIG9iamVjdCB0byByZWNlaXZlIGVycm9yIHN0YXR1cy4KLQkgKiBAcmV0dXJuIFJldHVybnMgdHJ1ZSBpZiBjb250ZXh0IGlzIG1vZGlmaWVkLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFkZENvbnRleHRDb25maWcoSVBhdGggd2ViYXBwc0RpciwgQ29udGV4dCBjb250ZXh0LCBNdWx0aVN0YXR1cyBtcykgewotCQlib29sZWFuIG1vZGlmaWVkID0gZmFsc2U7Ci0JCVN0cmluZyBzb3VyY2UgPSBjb250ZXh0LmdldFNvdXJjZSgpOwotCQlpZiAoc291cmNlICE9IG51bGwgJiYgc291cmNlLmxlbmd0aCgpID4gMCApCi0JCXsKLQkJCVN0cmluZyBkb2NCYXNlID0gY29udGV4dC5nZXREb2NCYXNlKCk7Ci0JCQl0cnkgewotCQkJCUNvbnRleHQgY29udGV4dENvbmZpZyA9IGxvYWRDb250ZXh0Q29uZmlnKHdlYmFwcHNEaXIuYXBwZW5kKGRvY0Jhc2UpKTsKLQkJCQlpZiAobnVsbCAhPSBjb250ZXh0Q29uZmlnKSB7Ci0JCQkJCWlmIChjb250ZXh0Lmhhc0NoaWxkTm9kZXMoKSkKLQkJCQkJCWNvbnRleHQucmVtb3ZlQ2hpbGRyZW4oKTsKLQkJCQkJY29udGV4dENvbmZpZy5jb3B5Q2hpbGRyZW5Ubyhjb250ZXh0KTsKLQkJCQkJTWFwIGF0dHJzID0gY29udGV4dENvbmZpZy5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQkJCUl0ZXJhdG9yIGl0ZXIgPSBhdHRycy5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQkJCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQkJCVN0cmluZyBuYW1lID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0JCQkJCQlpZiAoIW5hbWUuZXF1YWxzSWdub3JlQ2FzZSgicGF0aCIpCi0JCQkJCQkJCSYmICFuYW1lLmVxdWFsc0lnbm9yZUNhc2UoImRvY0Jhc2UiKQotCQkJCQkJCQkmJiAhbmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJzb3VyY2UiKSkgewotCQkJCQkJCVN0cmluZyB2YWx1ZSA9IChTdHJpbmcpYXR0cnMuZ2V0KG5hbWUpOwotCQkJCQkJCWNvbnRleHQuc2V0QXR0cmlidXRlVmFsdWUobmFtZSwgdmFsdWUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCW1vZGlmaWVkID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVN0cmluZyBjb250ZXh0UGF0aCA9IGNvbnRleHQuZ2V0UGF0aCgpOwotCQkJCWlmIChjb250ZXh0UGF0aC5zdGFydHNXaXRoKCIvIikpIHsKLQkJCQkJY29udGV4dFBhdGggPSBjb250ZXh0UGF0aC5zdWJzdHJpbmcoMSk7Ci0JCQkJfQotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIHJlYWRpbmcgY29udGV4dC54bWwgZmlsZSBmb3IgIiArIGNvbnRleHRQYXRoLCBlKTsKLQkJCQlJU3RhdHVzIHMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsIDAsCi0JCQkJCQlOTFMuYmluZChNZXNzYWdlcy5lcnJvckNvdWxkTm90TG9hZENvbnRleHRYbWwsIGNvbnRleHRQYXRoKSwgZSk7Ci0JCQkJbXMuYWRkKHMpOwotCQkJfQotCQl9Ci0JCXJldHVybiBtb2RpZmllZDsKLQl9Ci0JCi0JLyoqCi0JICogVHJpZXMgdG8gcmVhZCBhIE1FVEEtSU5GL2NvbnRleHQueG1sIGZpbGUgcmVsYXRpdmUgdG8gdGhlCi0JICogc3BlY2lmaWVkIHdlYiBhcHBsaWNhdGlvbiBwYXRoLiAgSWYgZm91bmQsIGl0IGNyZWF0ZXMgYSBDb250ZXh0IG9iamVjdAotCSAqIGNvbnRhaW5pbmcgdGhlIGNvbnRleHRzIG9mIHRoYXQgZmlsZS4KLQkgKiBAcGFyYW0gd2ViYXBwRGlyIFBhdGggdG8gdGhlIHdlYiBhcHBsaWNhdGlvbgotCSAqIEByZXR1cm4gQ29udGV4dCBlbGVtZW50IGNyZWF0ZWQgZnJvbSBjb250ZXh0LnhtbCwgb3IgbnVsbCBpZiBub3QgZm91bmQuCi0JICogQHRocm93cyBTQVhFeGNlcHRpb24gSWYgdGhlcmUgaXMgYSBlcnJvciBwYXJzaW5nIHRoZSBYTUwuIAotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gSWYgdGhlcmUgaXMgYW4gZXJyb3IgcmVhZGluZyB0aGUgZmlsZS4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29udGV4dCBsb2FkQ29udGV4dENvbmZpZyhJUGF0aCB3ZWJhcHBEaXIpIHRocm93cyBJT0V4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uIHsKLQkJRmlsZSBjb250ZXh0WE1MID0gbmV3IEZpbGUod2ViYXBwRGlyLnRvT1NTdHJpbmcoKSsgRmlsZS5zZXBhcmF0b3IgKyAiTUVUQS1JTkYiICsgRmlsZS5zZXBhcmF0b3IgKyAiY29udGV4dC54bWwiKTsKLQkJaWYgKGNvbnRleHRYTUwuZXhpc3RzKCkpIHsKLQkJCXRyeSB7Ci0JCQkJSW5wdXRTdHJlYW0gaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGNvbnRleHRYTUwpOwotCQkJCUZhY3RvcnkgY3R4RmFjdG9yeSA9IG5ldyBGYWN0b3J5KCk7Ci0JCQkJY3R4RmFjdG9yeS5zZXRQYWNrYWdlTmFtZSgib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC54bWwuc2VydmVyNDAiKTsKLQkJCQlDb250ZXh0IGN0eCA9IChDb250ZXh0KWN0eEZhY3RvcnkubG9hZERvY3VtZW50KGlzKTsKLQkJCQlpcy5jbG9zZSgpOwotCQkJCXJldHVybiBjdHg7Ci0JCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJCS8vIElnbm9yZSwgc2hvdWxkIG5ldmVyIG9jY3VyCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0gCX0KLQotCXByb3RlY3RlZCBJU3RhdHVzIGNsZWFudXBTZXJ2ZXIoSVBhdGggY29uZkRpciwgSVBhdGggaW5zdGFsbERpciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCU11bHRpU3RhdHVzIG1zID0gbmV3IE11bHRpU3RhdHVzKFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsIDAsIE1lc3NhZ2VzLmNsZWFudXBTZXJ2ZXJUYXNrLCBudWxsKTsKLQkJbW9uaXRvciA9IFByb2dyZXNzVXRpbC5nZXRNb25pdG9yRm9yKG1vbml0b3IpOwotCQltb25pdG9yLmJlZ2luVGFzayhNZXNzYWdlcy5jbGVhbnVwU2VydmVyVGFzaywgMjAwKTsKLQotCQl0cnkgewotCQkJbW9uaXRvci5zdWJUYXNrKE1lc3NhZ2VzLmRldGVjdGluZ1JlbW92ZWRQcm9qZWN0cyk7Ci0KLQkJCS8vIFRyeSB0byByZWFkIG9sZCBzZXJ2ZXIgY29uZmlndXJhdGlvbgotCQkJRmFjdG9yeSBmYWN0b3J5ID0gbmV3IEZhY3RvcnkoKTsKLQkJCWZhY3Rvcnkuc2V0UGFja2FnZU5hbWUoIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sLnNlcnZlcjQwIik7Ci0JCQlGaWxlIHNlcnZlckZpbGUgPSBjb25mRGlyLmFwcGVuZCgiY29uZiIpLmFwcGVuZCgic2VydmVyLnhtbCIpLnRvRmlsZSgpOwotCQkJaWYgKHNlcnZlckZpbGUuZXhpc3RzKCkpIHsKLQkJCQlTZXJ2ZXIgb2xkU2VydmVyID0gKFNlcnZlcikgZmFjdG9yeS5sb2FkRG9jdW1lbnQobmV3IEZpbGVJbnB1dFN0cmVhbShzZXJ2ZXJGaWxlKSk7Ci0JCQkJCi0JCQkJLy8gQmVnaW4gYnVpbGRpbmcgcGF0aCB0byBjb250ZXh0IGRpcmVjdG9yeQotCQkJCUlQYXRoIGNvbnRleHREaXIgPSBjb25mRGlyLmFwcGVuZCgiY29uZiIpOwotCi0JCQkJLy8gQ29sbGVjdCBwYXRocyBvZiBvbGQgd2ViIG1vZHVsZXMgbWFuYWdlZCBieSBXVFAKLQkJCQlTZXQgb2xkUGF0aHMgPSBuZXcgSGFzaFNldCgpOwotCQkJCWludCBzaXplID0gb2xkU2VydmVyLmdldFNlcnZpY2VDb3VudCgpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJCVNlcnZpY2Ugc2VydmljZSA9IG9sZFNlcnZlci5nZXRTZXJ2aWNlKGkpOwotCQkJCQlpZiAoc2VydmljZS5nZXROYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShERUZBVUxUX1NFUlZJQ0UpKSB7Ci0JCQkJCQlFbmdpbmUgZW5naW5lID0gc2VydmljZS5nZXRFbmdpbmUoKTsKLQkJCQkJCUhvc3QgaG9zdCA9IGVuZ2luZS5nZXRIb3N0KCk7Ci0JCQkJCQkvLyBGaW5pc2ggcGF0aCB0byBjb250ZXh0IGRpcmVjdG9yeQotCQkJCQkJY29udGV4dERpciA9IGNvbnRleHREaXIuYXBwZW5kKGVuZ2luZS5nZXROYW1lKCkpLmFwcGVuZChob3N0LmdldE5hbWUoKSk7Ci0JCQkJCQlpbnQgc2l6ZTIgPSBob3N0LmdldENvbnRleHRDb3VudCgpOwotCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBzaXplMjsgaisrKSB7Ci0JCQkJCQkJQ29udGV4dCBjb250ZXh0ID0gaG9zdC5nZXRDb250ZXh0KGopOwotCQkJCQkJCVN0cmluZyBzb3VyY2UgPSBjb250ZXh0LmdldFNvdXJjZSgpOwotCQkJCQkJCWlmIChzb3VyY2UgIT0gbnVsbCAmJiBzb3VyY2UubGVuZ3RoKCkgPiAwICkJewotCQkJCQkJCQlvbGRQYXRocy5hZGQoY29udGV4dC5nZXRQYXRoKCkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIFJlbW92ZSBwYXRocyBmb3Igd2ViIG1vZHVsZXMgdGhhdCBhcmUgc3RheWluZyBhcm91bmQKLQkJCQlMaXN0IG1vZHVsZXMgPSBnZXRXZWJNb2R1bGVzKCk7Ci0JCQkJc2l6ZSA9IG1vZHVsZXMuc2l6ZSgpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJCVdlYk1vZHVsZSBtb2R1bGUgPSAoV2ViTW9kdWxlKSBtb2R1bGVzLmdldChpKTsKLQkJCQkJb2xkUGF0aHMucmVtb3ZlKG1vZHVsZS5nZXRQYXRoKCkpOwotCQkJCX0KLQkJCQltb25pdG9yLndvcmtlZCgxMDApOwotCi0JCQkJLy8gRGVsZXRlIGNvbnRleHQgZmlsZXMgZm9yIG1hbmFnZWQgd2ViIG1vZHVsZXMgdGhhdCBoYXZlIGdvbmUgYXdheQotCQkJCWlmIChvbGRQYXRocy5zaXplKCkgPiAwICkgewotCQkJCQlJUHJvZ3Jlc3NNb25pdG9yIHN1Yk1vbml0b3IgPSBQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yLCAxMDApOwotCQkJCQlzdWJNb25pdG9yLmJlZ2luVGFzayhNZXNzYWdlcy5kZWxldGluZ0NvbnRleHRGaWxlc1Rhc2ssIG9sZFBhdGhzLnNpemUoKSAqIDEwMCk7Ci0JCQkJCQotCQkJCQlJdGVyYXRvciBpdGVyID0gb2xkUGF0aHMuaXRlcmF0b3IoKTsKLQkJCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJCQkvLyBEZXJpdmUgdGhlIGNvbnRleHQgZmlsZSBuYW1lIGZyb20gdGhlIHBhdGggKyAiLnhtbCIsIG1pbnVzIHRoZSBsZWFkaW5nICcvJwotCQkJCQkJU3RyaW5nIGZpbGVOYW1lID0gKFN0cmluZylpdGVyLm5leHQoKTsKLQkJCQkJCWlmIChmaWxlTmFtZS5sZW5ndGgoKSA+IDApCi0JCQkJCQkJZmlsZU5hbWUgPSBmaWxlTmFtZS5zdWJzdHJpbmcoMSkgKyAiLnhtbCI7Ci0JCQkJCQllbHNlCi0JCQkJCQkJZmlsZU5hbWUgPSAiUk9PVC54bWwiOwotCQkJCQkJSVBhdGggY29udGV4dFBhdGggPSBjb250ZXh0RGlyLmFwcGVuZChmaWxlTmFtZSk7Ci0JCQkJCQlGaWxlIGNvbnRleHRGaWxlID0gY29udGV4dFBhdGgudG9GaWxlKCk7Ci0JCQkJCQlpZiAoY29udGV4dEZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJCQlzdWJNb25pdG9yLnN1YlRhc2soTkxTLmJpbmQoTWVzc2FnZXMuZGVsZXRpbmdDb250ZXh0RmlsZSwgZmlsZU5hbWUpKTsKLQkJCQkJCQlpZiAoY29udGV4dEZpbGUuZGVsZXRlKCkpIHsKLQkJCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVIsICJMZWZ0b3ZlciBjb250ZXh0IGZpbGUgIiArIGZpbGVOYW1lICsgIiBkZWxldGVkLiIpOwotCQkJCQkJCQltcy5hZGQobmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBUb21jYXRQbHVnaW4uUExVR0lOX0lELCAwLAotCQkJCQkJCQkJCU5MUy5iaW5kKE1lc3NhZ2VzLmRlbGV0ZWRDb250ZXh0RmlsZSwgZmlsZU5hbWUpLCBudWxsKSk7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IGRlbGV0ZSBvYnNvbGV0ZSBjb250ZXh0IGZpbGUgIiArIGNvbnRleHRQYXRoLnRvT1NTdHJpbmcoKSk7Ci0JCQkJCQkJCW1zLmFkZChuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsIDAsCi0JCQkJCQkJCQkJTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JDb3VsZE5vdERlbGV0ZUNvbnRleHRGaWxlLCBjb250ZXh0UGF0aC50b09TU3RyaW5nKCkpLCBudWxsKSk7Ci0JCQkJCQkJfQotCQkJCQkJCXN1Yk1vbml0b3Iud29ya2VkKDEwMCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJc3ViTW9uaXRvci5kb25lKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbW9uaXRvci53b3JrZWQoMTAwKTsKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBFbHNlIG5vIHNlcnZlci54bWwuICBBc3N1bWUgZmlyc3QgcHVibGlzaCB0byBuZXcgdGVtcCBkaXJlY3RvcnkKLQkJCWVsc2UgewotCQkJCW1vbml0b3Iud29ya2VkKDIwMCk7Ci0JCQl9Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FUiwgIlNlcnZlciBjbGVhbmVkIik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3QgY2xlYW51cCBzZXJ2ZXIgYXQgIiArIGNvbmZEaXIudG9PU1N0cmluZygpICsgIjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCW1zLmFkZChuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsIDAsCi0JCQkJCU5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yQ2xlYW51cFNlcnZlciwgbmV3IFN0cmluZ1tdIHtlLmdldExvY2FsaXplZE1lc3NhZ2UoKX0pLCBlKSk7Ci0JCX0KLQkJCi0JCW1vbml0b3IuZG9uZSgpOwotCQlyZXR1cm4gbXM7Ci0JfQotCi0JcHJvdGVjdGVkIElTdGF0dXMgcHJlcGFyZVJ1bnRpbWVEaXJlY3RvcnkoSVBhdGggY29uZkRpcikgewotCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FUiwgIlByZXBhcmluZyBydW50aW1lIGRpcmVjdG9yeSIpOwotCQkvLyBQcmVwYXJlIGEgY2F0YWxpbmEuYmFzZSBkaXJlY3Rvcnkgc3RydWN0dXJlCi0JCUZpbGUgdGVtcCA9IGNvbmZEaXIuYXBwZW5kKCJjb25mIikudG9GaWxlKCk7Ci0JCWlmICghdGVtcC5leGlzdHMoKSkKLQkJCXRlbXAubWtkaXJzKCk7Ci0JCXRlbXAgPSBjb25mRGlyLmFwcGVuZCgibG9ncyIpLnRvRmlsZSgpOwotCQlpZiAoIXRlbXAuZXhpc3RzKCkpCi0JCQl0ZW1wLm1rZGlycygpOwotCQl0ZW1wID0gY29uZkRpci5hcHBlbmQoInRlbXAiKS50b0ZpbGUoKTsKLQkJaWYgKCF0ZW1wLmV4aXN0cygpKQotCQkJdGVtcC5ta2RpcnMoKTsKLQkJSVBhdGggdGVtcFBhdGggPSBjb25mRGlyLmFwcGVuZCgid2ViYXBwcy9ST09UL1dFQi1JTkYiKTsKLQkJdGVtcCA9IHRlbXBQYXRoLnRvRmlsZSgpOwotCQlpZiAoIXRlbXAuZXhpc3RzKCkpCi0JCQl0ZW1wLm1rZGlycygpOwotCQl0ZW1wID0gdGVtcFBhdGguYXBwZW5kKCJ3ZWIueG1sIikudG9GaWxlKCk7Ci0JCWlmICghdGVtcC5leGlzdHMoKSkgewotCQkJRmlsZVdyaXRlciBmdzsKLQkJCXRyeSB7Ci0JCQkJZncgPSBuZXcgRmlsZVdyaXRlcih0ZW1wKTsKLQkJCQlmdy53cml0ZShERUZBVUxUX1dFQlhNTF9TRVJWTEVUMjQpOwotCQkJCWZ3LmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIlVuYWJsZSB0byBjcmVhdGUgd2ViLnhtbCBmb3IgUk9PVCBjb250ZXh0LiIsIGUpOwotCQkJfQotCQl9Ci0JCXRlbXAgPSBjb25mRGlyLmFwcGVuZCgid29yayIpLnRvRmlsZSgpOwotCQlpZiAoIXRlbXAuZXhpc3RzKCkpCi0JCQl0ZW1wLm1rZGlycygpOwotCi0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwkJCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvVG9tY2F0NTBIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1RvbWNhdDUwSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGVmMzVlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvVG9tY2F0NTBIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi2gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkphdmFSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotLyoqCi0gKiBUb21jYXQgNTAgaGFuZGxlci4KLSAqLwotcHVibGljIGNsYXNzIFRvbWNhdDUwSGFuZGxlciBpbXBsZW1lbnRzIElUb21jYXRWZXJzaW9uSGFuZGxlciB7Ci0JLyoqCi0JICogQHNlZSBJVG9tY2F0VmVyc2lvbkhhbmRsZXIjdmVyaWZ5SW5zdGFsbFBhdGgoSVBhdGgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmVyaWZ5SW5zdGFsbFBhdGgoSVBhdGggaW5zdGFsbFBhdGgpIHsKLQkJaWYgKGluc3RhbGxQYXRoID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLWlmICghVG9tY2F0UGx1Z2luLnZlcmlmeVRvbWNhdFZlcnNpb25Gcm9tUGF0aChpbnN0YWxsUGF0aCwgVG9tY2F0UGx1Z2luLlRPTUNBVF81MCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBUb21jYXRQbHVnaW4udmVyaWZ5SW5zdGFsbFBhdGgoaW5zdGFsbFBhdGgsIFRvbWNhdFBsdWdpbi5UT01DQVRfNTApOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIElUb21jYXRWZXJzaW9uSGFuZGxlciNnZXRSdW50aW1lQ2xhc3MoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UnVudGltZUNsYXNzKCkgewotCQlyZXR1cm4gIm9yZy5hcGFjaGUuY2F0YWxpbmEuc3RhcnR1cC5Cb290c3RyYXAiOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIElUb21jYXRWZXJzaW9uSGFuZGxlciNnZXRSdW50aW1lQ2xhc3NwYXRoKElQYXRoKQotCSAqLwotCXB1YmxpYyBMaXN0IGdldFJ1bnRpbWVDbGFzc3BhdGgoSVBhdGggaW5zdGFsbFBhdGgpIHsKLQkJTGlzdCBjcCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCi0JCS8vIDUuMCAtIGFkZCBib290c3RyYXAuamFyIGZyb20gdGhlIFRvbWNhdCBiaW4gZGlyZWN0b3J5Ci0JCUlQYXRoIGJpblBhdGggPSBpbnN0YWxsUGF0aC5hcHBlbmQoImJpbiIpOwotCQlpZiAoYmluUGF0aC50b0ZpbGUoKS5leGlzdHMoKSkgewotCQkJSVBhdGggcGF0aCA9IGJpblBhdGguYXBwZW5kKCJib290c3RyYXAuamFyIik7Ci0JCQljcC5hZGQoSmF2YVJ1bnRpbWUubmV3QXJjaGl2ZVJ1bnRpbWVDbGFzc3BhdGhFbnRyeShwYXRoKSk7Ci0JCX0KLQkJCi0JCXJldHVybiBjcDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElUb21jYXRWZXJzaW9uSGFuZGxlciNnZXRSdW50aW1lUHJvZ3JhbUFyZ3VtZW50cyhJUGF0aCwgYm9vbGVhbiwgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0UnVudGltZVByb2dyYW1Bcmd1bWVudHMoSVBhdGggY29uZmlnUGF0aCwgYm9vbGVhbiBkZWJ1ZywgYm9vbGVhbiBzdGFydGluZykgewotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQotCQlpZiAoZGVidWcpCi0JCQlsaXN0LmFkZCgiLWRlYnVnIik7Ci0JCQotCQlpZiAoc3RhcnRpbmcpCi0JCQlsaXN0LmFkZCgic3RhcnQiKTsKLQkJZWxzZQotCQkJbGlzdC5hZGQoInN0b3AiKTsKLQkJCi0JCVN0cmluZ1tdIHRlbXAgPSBuZXcgU3RyaW5nW2xpc3Quc2l6ZSgpXTsKLQkJbGlzdC50b0FycmF5KHRlbXApOwotCQlyZXR1cm4gdGVtcDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElUb21jYXRWZXJzaW9uSGFuZGxlciNnZXRSdW50aW1lVk1Bcmd1bWVudHMoSVBhdGgsIElQYXRoLCBib29sZWFuKQotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRSdW50aW1lVk1Bcmd1bWVudHMoSVBhdGggaW5zdGFsbFBhdGgsIElQYXRoIGNvbmZpZ1BhdGgsIGJvb2xlYW4gaXNUZXN0RW52KSB7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKGlzVGVzdEVudikKLQkJCWxpc3QuYWRkKCItRGNhdGFsaW5hLmJhc2U9XCIiICsgY29uZmlnUGF0aC50b09TU3RyaW5nKCkgKyAiXCIiKTsKLQkJZWxzZSAKLQkJCWxpc3QuYWRkKCItRGNhdGFsaW5hLmJhc2U9XCIiICsgaW5zdGFsbFBhdGgudG9PU1N0cmluZygpICsgIlwiIik7Ci0JCWxpc3QuYWRkKCItRGNhdGFsaW5hLmhvbWU9XCIiICsgaW5zdGFsbFBhdGgudG9PU1N0cmluZygpICsgIlwiIik7Ci0JCWxpc3QuYWRkKCItRGphdmEuZW5kb3JzZWQuZGlycz1cIiIgKyBpbnN0YWxsUGF0aC5hcHBlbmQoImNvbW1vbiIpLmFwcGVuZCgiZW5kb3JzZWQiKS50b09TU3RyaW5nKCkgKyAiXCIiKTsKLQkJCi0JCVN0cmluZ1tdIHMgPSBuZXcgU3RyaW5nW2xpc3Quc2l6ZSgpXTsKLQkJbGlzdC50b0FycmF5KHMpOwotCQlyZXR1cm4gczsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFJ1bnRpbWVQb2xpY3lGaWxlKElQYXRoIGNvbmZpZ1BhdGgpIHsKLQkJcmV0dXJuIGNvbmZpZ1BhdGguYXBwZW5kKCJjb25mIikuYXBwZW5kKCJjYXRhbGluYS5wb2xpY3kiKS50b09TU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJVG9tY2F0VmVyc2lvbkhhbmRsZXIjY2FuQWRkTW9kdWxlKElNb2R1bGUpCi0JICovCi0JcHVibGljIElTdGF0dXMgY2FuQWRkTW9kdWxlKElNb2R1bGUgbW9kdWxlKSB7Ci0JCVN0cmluZyB2ZXJzaW9uID0gbW9kdWxlLmdldE1vZHVsZVR5cGUoKS5nZXRWZXJzaW9uKCk7Ci0JCWlmICgiMi4yIi5lcXVhbHModmVyc2lvbikgfHwgIjIuMyIuZXF1YWxzKHZlcnNpb24pIHx8ICIyLjQiLmVxdWFscyh2ZXJzaW9uKSkKLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkKLQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgVG9tY2F0UGx1Z2luLlBMVUdJTl9JRCwgMCwgTWVzc2FnZXMuZXJyb3JTcGVjNTAsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVRvbWNhdFZlcnNpb25IYW5kbGVyI2dldFJ1bnRpbWVCYXNlRGlyZWN0b3J5KFRvbWNhdFNlcnZlckJlaGF2aW91cikKLQkgKi8KLQlwdWJsaWMgSVBhdGggZ2V0UnVudGltZUJhc2VEaXJlY3RvcnkoVG9tY2F0U2VydmVyQmVoYXZpb3VyIHNlcnZlckJlaGF2aW91cikgewotCQlpZiAoc2VydmVyQmVoYXZpb3VyLmdldFRvbWNhdFNlcnZlcigpLmlzVGVzdEVudmlyb25tZW50KCkpCi0JCQlyZXR1cm4gc2VydmVyQmVoYXZpb3VyLmdldFRlbXBEaXJlY3RvcnkoKTsKLQkJcmV0dXJuIHNlcnZlckJlaGF2aW91ci5nZXRTZXJ2ZXIoKS5nZXRSdW50aW1lKCkuZ2V0TG9jYXRpb24oKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9Ub21jYXQ1NUNvbmZpZ3VyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvVG9tY2F0NTVDb25maWd1cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3YWI4YzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9Ub21jYXQ1NUNvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLaAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sLkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC54bWwuWE1MVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbC5zZXJ2ZXI0MC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclBvcnQ7Ci0vKioKLSAqIFRvbWNhdCB2NS41IHNlcnZlciBjb25maWd1cmF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgVG9tY2F0NTVDb25maWd1cmF0aW9uIGV4dGVuZHMgVG9tY2F0Q29uZmlndXJhdGlvbiB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9TRVJWSUNFID0gIkNhdGFsaW5hIjsKLQlwcm90ZWN0ZWQgU2VydmVyIHNlcnZlcjsKLQlwcm90ZWN0ZWQgRmFjdG9yeSBzZXJ2ZXJGYWN0b3J5OwotCXByb3RlY3RlZCBib29sZWFuIGlzU2VydmVyRGlydHk7Ci0KLQlwcm90ZWN0ZWQgV2ViQXBwRG9jdW1lbnQgd2ViQXBwRG9jdW1lbnQ7Ci0KLQlwcm90ZWN0ZWQgRG9jdW1lbnQgdG9tY2F0VXNlcnNEb2N1bWVudDsKLQotCXByb3RlY3RlZCBTdHJpbmcgcG9saWN5RmlsZTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1BvbGljeURpcnR5OwotCi0JLyoqCi0JICogVG9tY2F0NTVDb25maWd1cmF0aW9uIGNvbnN0cnVjdG9yLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoIGEgcGF0aAotCSAqLwotCXB1YmxpYyBUb21jYXQ1NUNvbmZpZ3VyYXRpb24oSUZvbGRlciBwYXRoKSB7Ci0JCXN1cGVyKHBhdGgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcG9ydCBudW1iZXIuCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgU2VydmVyUG9ydCBnZXRNYWluUG9ydCgpIHsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBnZXRTZXJ2ZXJQb3J0cygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVNlcnZlclBvcnQgcG9ydCA9IChTZXJ2ZXJQb3J0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAocG9ydC5nZXROYW1lKCkuZXF1YWxzKCJIVFRQIikpCi0JCQkJcmV0dXJuIHBvcnQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1pbWUgbWFwcGluZ3MuCi0JICogQHJldHVybiBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXB1YmxpYyBMaXN0IGdldE1pbWVNYXBwaW5ncygpIHsKLQkJcmV0dXJuIHdlYkFwcERvY3VtZW50LmdldE1pbWVNYXBwaW5ncygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIFNlcnZlclBvcnRzIHRoYXQgdGhpcyBjb25maWd1cmF0aW9uIHVzZXMuCi0JICoKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHVibGljIExpc3QgZ2V0U2VydmVyUG9ydHMoKSB7Ci0JCUxpc3QgcG9ydHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCi0JCS8vIGZpcnN0IGFkZCBzZXJ2ZXIgcG9ydAotCQl0cnkgewotCQkJaW50IHBvcnQgPSBJbnRlZ2VyLnBhcnNlSW50KHNlcnZlci5nZXRQb3J0KCkpOwotCQkJcG9ydHMuYWRkKG5ldyBTZXJ2ZXJQb3J0KCJzZXJ2ZXIiLCBNZXNzYWdlcy5wb3J0U2VydmVyLCBwb3J0LCAiVENQSVAiKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQotCQkvLyBhZGQgY29ubmVjdG9ycwotCQl0cnkgewotCQkJaW50IHNpemUgPSBzZXJ2ZXIuZ2V0U2VydmljZUNvdW50KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCVNlcnZpY2Ugc2VydmljZSA9IHNlcnZlci5nZXRTZXJ2aWNlKGkpOwotCQkJCWludCBzaXplMiA9IHNlcnZpY2UuZ2V0Q29ubmVjdG9yQ291bnQoKTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHNpemUyOyBqKyspIHsKLQkJCQkJQ29ubmVjdG9yIGNvbm5lY3RvciA9IHNlcnZpY2UuZ2V0Q29ubmVjdG9yKGopOwotCQkJCQlTdHJpbmcgbmFtZSA9ICJIVFRQIjsKLQkJCQkJU3RyaW5nIHByb3RvY29sMiA9ICJUQ1BJUCI7Ci0JCQkJCWJvb2xlYW4gYWR2YW5jZWQgPSB0cnVlOwotCQkJCQlTdHJpbmdbXSBjb250ZW50VHlwZXMgPSBudWxsOwotCQkJCQlpbnQgcG9ydCA9IC0xOwotCQkJCQl0cnkgewotCQkJCQkJcG9ydCA9IEludGVnZXIucGFyc2VJbnQoY29ubmVjdG9yLmdldFBvcnQoKSk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBpZ25vcmUKLQkJCQkJfQotCQkJCQlTdHJpbmcgcHJvdG9jb2wgPSBjb25uZWN0b3IuZ2V0UHJvdG9jb2woKTsKLQkJCQkJaWYgKHByb3RvY29sICE9IG51bGwgJiYgcHJvdG9jb2wubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQluYW1lID0gcHJvdG9jb2w7Ci0JCQkJCQlwcm90b2NvbDIgPSBwcm90b2NvbDsgCi0JCQkJCX0KLQkJCQkJaWYgKCJIVFRQIi5lcXVhbHMocHJvdG9jb2wpKQotCQkJCQkJY29udGVudFR5cGVzID0gbmV3IFN0cmluZ1tdIHsgIndlYiIsICJ3ZWJzZXJ2aWNlcyIgfTsKLQkJCQkJU3RyaW5nIHNlY3VyZSA9IGNvbm5lY3Rvci5nZXRTZWN1cmUoKTsKLQkJCQkJaWYgKHNlY3VyZSAhPSBudWxsICYmIHNlY3VyZS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCW5hbWUgPSAiU1NMIjsKLQkJCQkJCXByb3RvY29sMiA9ICJTU0wiOwotCQkJCQl9IGVsc2UKLQkJCQkJCWFkdmFuY2VkID0gZmFsc2U7Ci0JCQkJCXBvcnRzLmFkZChuZXcgU2VydmVyUG9ydChpICsiLyIgKyBqLCBuYW1lLCBwb3J0LCBwcm90b2NvbDIsIGNvbnRlbnRUeXBlcywgYWR2YW5jZWQpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBnZXR0aW5nIHNlcnZlciBwb3J0cyIsIGUpOwotCQl9Ci0JCXJldHVybiBwb3J0czsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCBvZiB0aGUgd2ViIG1vZHVsZXMgaW4gdGhpcyBzZXJ2ZXIuCi0JICogQHJldHVybiBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFdlYk1vZHVsZXMoKSB7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkKLQkJdHJ5IHsKLQkJCWludCBzaXplID0gc2VydmVyLmdldFNlcnZpY2VDb3VudCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlTZXJ2aWNlIHNlcnZpY2UgPSBzZXJ2ZXIuZ2V0U2VydmljZShpKTsKLQkJCQlpZiAoc2VydmljZS5nZXROYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShERUZBVUxUX1NFUlZJQ0UpKSB7Ci0JCQkJCUVuZ2luZSBlbmdpbmUgPSBzZXJ2aWNlLmdldEVuZ2luZSgpOwotCQkJCQlIb3N0IGhvc3QgPSBlbmdpbmUuZ2V0SG9zdCgpOwotCQkJCQlpbnQgc2l6ZTIgPSBob3N0LmdldENvbnRleHRDb3VudCgpOwotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHNpemUyOyBqKyspIHsKLQkJCQkJCUNvbnRleHQgY29udGV4dCA9IGhvc3QuZ2V0Q29udGV4dChqKTsKLQkJCQkJCVN0cmluZyByZWxvYWQgPSBjb250ZXh0LmdldFJlbG9hZGFibGUoKTsKLQkJCQkJCWlmIChyZWxvYWQgPT0gbnVsbCkKLQkJCQkJCQlyZWxvYWQgPSAiZmFsc2UiOwotCQkJCQkJV2ViTW9kdWxlIG1vZHVsZSA9IG5ldyBXZWJNb2R1bGUoY29udGV4dC5nZXRQYXRoKCksIAotCQkJCQkJCWNvbnRleHQuZ2V0RG9jQmFzZSgpLCBjb250ZXh0LmdldFNvdXJjZSgpLAotCQkJCQkJCXJlbG9hZC5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikgPyB0cnVlIDogZmFsc2UpOwotCQkJCQkJbGlzdC5hZGQobW9kdWxlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGdldHRpbmcgcHJvamVjdCByZWZzIiwgZSk7Ci0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgVG9tY2F0Q29uZmlndXJhdGlvbiNsb2FkKElQYXRoLCBJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWQoSVBhdGggcGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQltb25pdG9yID0gUHJvZ3Jlc3NVdGlsLmdldE1vbml0b3JGb3IobW9uaXRvcik7Ci0JCQltb25pdG9yLmJlZ2luVGFzayhNZXNzYWdlcy5sb2FkaW5nVGFzaywgNSk7Ci0JCQkKLQkJCS8vIGNoZWNrIGZvciBjYXRhbGluYS5wb2xpY3kgdG8gdmVyaWZ5IHRoYXQgdGhpcyBpcyBhIHY1LjUgY29uZmlnCi0JCQlJbnB1dFN0cmVhbSBpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0ocGF0aC5hcHBlbmQoImNhdGFsaW5hLnBvbGljeSIpLnRvRmlsZSgpKTsKLQkJCWluLnJlYWQoKTsKLQkJCWluLmNsb3NlKCk7Ci0JCQltb25pdG9yLndvcmtlZCgxKTsKLQotCQkJc2VydmVyRmFjdG9yeSA9IG5ldyBGYWN0b3J5KCk7Ci0JCQlzZXJ2ZXJGYWN0b3J5LnNldFBhY2thZ2VOYW1lKCJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbC5zZXJ2ZXI0MCIpOwotCQkJc2VydmVyID0gKFNlcnZlcikgc2VydmVyRmFjdG9yeS5sb2FkRG9jdW1lbnQobmV3IEZpbGVJbnB1dFN0cmVhbShwYXRoLmFwcGVuZCgic2VydmVyLnhtbCIpLnRvRmlsZSgpKSk7Ci0JCQltb25pdG9yLndvcmtlZCgxKTsKLQotCQkJd2ViQXBwRG9jdW1lbnQgPSBuZXcgV2ViQXBwRG9jdW1lbnQocGF0aC5hcHBlbmQoIndlYi54bWwiKSk7Ci0JCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQotCQkJdG9tY2F0VXNlcnNEb2N1bWVudCA9IFhNTFV0aWwuZ2V0RG9jdW1lbnRCdWlsZGVyKCkucGFyc2UobmV3IElucHV0U291cmNlKG5ldyBGaWxlSW5wdXRTdHJlYW0ocGF0aC5hcHBlbmQoInRvbWNhdC11c2Vycy54bWwiKS50b0ZpbGUoKSkpKTsKLQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJCi0JCQkvLyBsb2FkIHBvbGljeSBmaWxlCi0JCQlCdWZmZXJlZFJlYWRlciBiciA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihuZXcgRmlsZUlucHV0U3RyZWFtKHBhdGguYXBwZW5kKCJjYXRhbGluYS5wb2xpY3kiKS50b0ZpbGUoKSkpKTsKLQkJCQlTdHJpbmcgdGVtcCA9IGJyLnJlYWRMaW5lKCk7Ci0JCQkJcG9saWN5RmlsZSA9ICIiOwotCQkJCXdoaWxlICh0ZW1wICE9IG51bGwpIHsKLQkJCQkJcG9saWN5RmlsZSArPSB0ZW1wICsgIlxuIjsKLQkJCQkJdGVtcCA9IGJyLnJlYWRMaW5lKCk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiQ291bGQgbm90IGxvYWQgcG9saWN5IGZpbGUiLCBlKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJaWYgKGJyICE9IG51bGwpCi0JCQkJCWJyLmNsb3NlKCk7Ci0JCQl9Ci0JCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQotCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJCXJldHVybjsKLQkJCW1vbml0b3IuZG9uZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIkNvdWxkIG5vdCBsb2FkIFRvbWNhdCB2NS41IGNvbmZpZ3VyYXRpb24gZnJvbSAiICsgcGF0aC50b09TU3RyaW5nKCkgKyAiOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBUb21jYXRQbHVnaW4uUExVR0lOX0lELCAwLCBOTFMuYmluZChNZXNzYWdlcy5lcnJvckNvdWxkTm90TG9hZENvbmZpZ3VyYXRpb24sIHBhdGgudG9PU1N0cmluZygpKSwgZSkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgaW1wb3J0RnJvbVBhdGgoSVBhdGggcGF0aCwgYm9vbGVhbiBpc1Rlc3RFbnYsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlsb2FkKHBhdGgsIG1vbml0b3IpOwotCQkKLQkJLy8gZm9yIHRlc3QgZW52aXJvbm1lbnQsIHJlbW92ZSBleGlzdGluZyBjb250ZXh0cyBzaW5jZSBhIHNlcGFyYXRlCi0JCS8vIGNhdGFsaW5hLmJhc2Ugd2lsbCBiZSB1c2VkCi0JCWlmIChpc1Rlc3RFbnYpIHsKLQkJCWludCBzaXplID0gc2VydmVyLmdldFNlcnZpY2VDb3VudCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlTZXJ2aWNlIHNlcnZpY2UgPSBzZXJ2ZXIuZ2V0U2VydmljZShpKTsKLQkJCQlpZiAoc2VydmljZS5nZXROYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShERUZBVUxUX1NFUlZJQ0UpKSB7Ci0JCQkJCUhvc3QgaG9zdCA9IHNlcnZpY2UuZ2V0RW5naW5lKCkuZ2V0SG9zdCgpOwotCQkJCQlpbnQgc2l6ZTIgPSBob3N0LmdldENvbnRleHRDb3VudCgpOwotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHNpemUyOyBqKyspIHsKLQkJCQkJCWhvc3QucmVtb3ZlRWxlbWVudCgiQ29udGV4dCIsIDApOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBUb21jYXRDb25maWd1cmF0aW9uI2xvYWQoSUZvbGRlciwgSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkKElGb2xkZXIgZm9sZGVyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCW1vbml0b3IgPSBQcm9ncmVzc1V0aWwuZ2V0TW9uaXRvckZvcihtb25pdG9yKTsKLQkJCW1vbml0b3IuYmVnaW5UYXNrKE1lc3NhZ2VzLmxvYWRpbmdUYXNrLCA4MDApOwotCQotCQkJLy8gY2hlY2sgZm9yIGNhdGFsaW5hLnBvbGljeSB0byB2ZXJpZnkgdGhhdCB0aGlzIGlzIGEgdjQuMCBjb25maWcKLQkJCUlGaWxlIGZpbGUgPSBmb2xkZXIuZ2V0RmlsZSgiY2F0YWxpbmEucG9saWN5Iik7Ci0JCQlpZiAoIWZpbGUuZXhpc3RzKCkpCi0JCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yQ291bGROb3RMb2FkQ29uZmlndXJhdGlvbiwgZm9sZGVyLmdldEZ1bGxQYXRoKCkudG9PU1N0cmluZygpKSwgbnVsbCkpOwotCQotCQkJLy8gbG9hZCBzZXJ2ZXIueG1sCi0JCQlmaWxlID0gZm9sZGVyLmdldEZpbGUoInNlcnZlci54bWwiKTsKLQkJCUlucHV0U3RyZWFtIGluID0gZmlsZS5nZXRDb250ZW50cygpOwotCQkJc2VydmVyRmFjdG9yeSA9IG5ldyBGYWN0b3J5KCk7Ci0JCQlzZXJ2ZXJGYWN0b3J5LnNldFBhY2thZ2VOYW1lKCJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbC5zZXJ2ZXI0MCIpOwotCQkJc2VydmVyID0gKFNlcnZlcikgc2VydmVyRmFjdG9yeS5sb2FkRG9jdW1lbnQoaW4pOwotCQkJbW9uaXRvci53b3JrZWQoMjAwKTsKLQkKLQkJCS8vIGxvYWQgd2ViLnhtbAotCQkJZmlsZSA9IGZvbGRlci5nZXRGaWxlKCJ3ZWIueG1sIik7Ci0JCQl3ZWJBcHBEb2N1bWVudCA9IG5ldyBXZWJBcHBEb2N1bWVudChmaWxlKTsKLQkJCW1vbml0b3Iud29ya2VkKDIwMCk7Ci0JCi0JCQkvLyBsb2FkIHRvbWNhdC11c2Vycy54bWwKLQkJCWZpbGUgPSBmb2xkZXIuZ2V0RmlsZSgidG9tY2F0LXVzZXJzLnhtbCIpOwotCQkJaW4gPSBmaWxlLmdldENvbnRlbnRzKCk7Ci0JCQkKLQkJCXRvbWNhdFVzZXJzRG9jdW1lbnQgPSBYTUxVdGlsLmdldERvY3VtZW50QnVpbGRlcigpLnBhcnNlKG5ldyBJbnB1dFNvdXJjZShpbikpOwotCQkJbW9uaXRvci53b3JrZWQoMjAwKTsKLQkJCi0JCQkvLyBsb2FkIGNhdGFsaW5hLnBvbGljeQotCQkJZmlsZSA9IGZvbGRlci5nZXRGaWxlKCJjYXRhbGluYS5wb2xpY3kiKTsKLQkJCWluID0gZmlsZS5nZXRDb250ZW50cygpOwotCQkJQnVmZmVyZWRSZWFkZXIgYnIgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQliciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW4pKTsKLQkJCQlTdHJpbmcgdGVtcCA9IGJyLnJlYWRMaW5lKCk7Ci0JCQkJcG9saWN5RmlsZSA9ICIiOwotCQkJCXdoaWxlICh0ZW1wICE9IG51bGwpIHsKLQkJCQkJcG9saWN5RmlsZSArPSB0ZW1wICsgIlxuIjsKLQkJCQkJdGVtcCA9IGJyLnJlYWRMaW5lKCk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiQ291bGQgbm90IGxvYWQgcG9saWN5IGZpbGUiLCBlKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJaWYgKGJyICE9IG51bGwpCi0JCQkJCWJyLmNsb3NlKCk7Ci0JCQl9Ci0JCQltb25pdG9yLndvcmtlZCgyMDApOwotCQotCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJCXRocm93IG5ldyBFeGNlcHRpb24oIkNhbmNlbGxlZCIpOwotCQkJbW9uaXRvci5kb25lKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiQ291bGQgbm90IHJlbG9hZCBUb21jYXQgdjUuNSBjb25maWd1cmF0aW9uIGZyb206ICIgKyBmb2xkZXIuZ2V0RnVsbFBhdGgoKSArICI6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yQ291bGROb3RMb2FkQ29uZmlndXJhdGlvbiwgZm9sZGVyLmdldEZ1bGxQYXRoKCkudG9PU1N0cmluZygpKSwgZSkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2F2ZSB0byB0aGUgZ2l2ZW4gZGlyZWN0b3J5LgotCSAqIEBwYXJhbSBwYXRoIGEgcGF0aAotCSAqIEBwYXJhbSBmb3JjZURpcnR5IGJvb2xlYW4KLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IKLQkgKiBAZXhjZXB0aW9uIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzYXZlKElQYXRoIHBhdGgsIGJvb2xlYW4gZm9yY2VEaXJ0eSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQltb25pdG9yID0gUHJvZ3Jlc3NVdGlsLmdldE1vbml0b3JGb3IobW9uaXRvcik7Ci0JCQltb25pdG9yLmJlZ2luVGFzayhNZXNzYWdlcy5zYXZpbmdUYXNrLCAzKTsKLQkKLQkJCS8vIG1ha2Ugc3VyZSBkaXJlY3RvcnkgZXhpc3RzCi0JCQlpZiAoIXBhdGgudG9GaWxlKCkuZXhpc3RzKCkpIHsKLQkJCQlmb3JjZURpcnR5ID0gdHJ1ZTsKLQkJCQlwYXRoLnRvRmlsZSgpLm1rZGlyKCk7Ci0JCQl9Ci0JCQltb25pdG9yLndvcmtlZCgxKTsKLQkKLQkJCS8vIHNhdmUgZmlsZXMKLQkJCWlmIChmb3JjZURpcnR5IHx8IGlzU2VydmVyRGlydHkpCi0JCQkJc2VydmVyRmFjdG9yeS5zYXZlKHBhdGguYXBwZW5kKCJzZXJ2ZXIueG1sIikudG9PU1N0cmluZygpKTsKLQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQotCQkJLy9pZiAoZm9yY2VEaXJ0eSB8fCBpc1dlYkFwcERpcnR5KQotCQkJLy8Jd2ViQXBwRmFjdG9yeS5zYXZlKGRpclBhdGggKyAid2ViLnhtbCIpOwotCQkJLy93ZWJBcHBEb2N1bWVudC5zYXZlKHBhdGgudG9PU1N0cmluZygpLCBmb3JjZURpcnR5IHx8IGlzUG9saWN5RGlydHkpOwotCQkJd2ViQXBwRG9jdW1lbnQuc2F2ZShwYXRoLmFwcGVuZCgid2ViLnhtbCIpLnRvT1NTdHJpbmcoKSwgZm9yY2VEaXJ0eSk7Ci0JCQltb25pdG9yLndvcmtlZCgxKTsKLQkKLQkJCWlmIChmb3JjZURpcnR5KQotCQkJCVhNTFV0aWwuc2F2ZShwYXRoLmFwcGVuZCgidG9tY2F0LXVzZXJzLnhtbCIpLnRvT1NTdHJpbmcoKSwgdG9tY2F0VXNlcnNEb2N1bWVudCk7Ci0JCQltb25pdG9yLndvcmtlZCgxKTsKLQkKLQkJCWlmIChmb3JjZURpcnR5IHx8IGlzUG9saWN5RGlydHkpIHsKLQkJCQlCdWZmZXJlZFdyaXRlciBidyA9IG5ldyBCdWZmZXJlZFdyaXRlcihuZXcgRmlsZVdyaXRlcihwYXRoLmFwcGVuZCgiY2F0YWxpbmEucG9saWN5IikudG9GaWxlKCkpKTsKLQkJCQlidy53cml0ZShwb2xpY3lGaWxlKTsKLQkJCQlidy5jbG9zZSgpOwotCQkJfQotCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQlpc1NlcnZlckRpcnR5ID0gZmFsc2U7Ci0JCQlpc1BvbGljeURpcnR5ID0gZmFsc2U7Ci0JCi0JCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJcmV0dXJuOwotCQkJbW9uaXRvci5kb25lKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3Qgc2F2ZSBUb21jYXQgdjUuNSBjb25maWd1cmF0aW9uIHRvICIgKyBwYXRoLCBlKTsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgVG9tY2F0UGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JDb3VsZE5vdFNhdmVDb25maWd1cmF0aW9uLCBuZXcgU3RyaW5nW10ge2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpfSksIGUpKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBzYXZlKElQYXRoIHBhdGgsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlzYXZlKHBhdGgsIHRydWUsIG1vbml0b3IpOwotCX0KLQotCS8qKgotCSAqIFNhdmUgdGhlIGluZm9ybWF0aW9uIGhlbGQgYnkgdGhpcyBvYmplY3QgdG8gdGhlIGdpdmVuIGRpcmVjdG9yeS4KLQkgKgotCSAqIEBwYXJhbSBmb2xkZXIgYSBmb2xkZXIKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlKElGb2xkZXIgZm9sZGVyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCW1vbml0b3IgPSBQcm9ncmVzc1V0aWwuZ2V0TW9uaXRvckZvcihtb25pdG9yKTsKLQkJCW1vbml0b3IuYmVnaW5UYXNrKE1lc3NhZ2VzLnNhdmluZ1Rhc2ssIDkwMCk7Ci0JCi0JCQkvLyBzYXZlIHNlcnZlci54bWwKLQkJCWJ5dGVbXSBkYXRhID0gc2VydmVyRmFjdG9yeS5nZXRDb250ZW50cygpOwotCQkJSW5wdXRTdHJlYW0gaW4gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oZGF0YSk7Ci0JCQlJRmlsZSBmaWxlID0gZm9sZGVyLmdldEZpbGUoInNlcnZlci54bWwiKTsKLQkJCWlmIChmaWxlLmV4aXN0cygpKSB7Ci0JCQkJaWYgKGlzU2VydmVyRGlydHkpCi0JCQkJCWZpbGUuc2V0Q29udGVudHMoaW4sIHRydWUsIHRydWUsIFByb2dyZXNzVXRpbC5nZXRTdWJNb25pdG9yRm9yKG1vbml0b3IsIDIwMCkpOwotCQkJCWVsc2UKLQkJCQkJbW9uaXRvci53b3JrZWQoMjAwKTsKLQkJCX0gZWxzZQotCQkJCWZpbGUuY3JlYXRlKGluLCB0cnVlLCBQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yLCAyMDApKTsKLQkKLQkJCS8vIHNhdmUgd2ViLnhtbAotCQkJd2ViQXBwRG9jdW1lbnQuc2F2ZShmb2xkZXIuZ2V0RmlsZSgid2ViLnhtbCIpLCBQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yLCAyMDApKTsKLQkKLQkJCS8vIHNhdmUgdG9tY2F0LXVzZXJzLnhtbAotCQkJZGF0YSA9IFhNTFV0aWwuZ2V0Q29udGVudHModG9tY2F0VXNlcnNEb2N1bWVudCk7Ci0JCQlpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShkYXRhKTsKLQkJCWZpbGUgPSBmb2xkZXIuZ2V0RmlsZSgidG9tY2F0LXVzZXJzLnhtbCIpOwotCQkJaWYgKGZpbGUuZXhpc3RzKCkpCi0JCQkJbW9uaXRvci53b3JrZWQoMjAwKTsKLQkJCQkvL2ZpbGUuc2V0Q29udGVudHMoaW4sIHRydWUsIHRydWUsIFByb2dyZXNzVXRpbC5nZXRTdWJNb25pdG9yRm9yKG1vbml0b3IsIDIwMCkpOwotCQkJZWxzZQotCQkJCWZpbGUuY3JlYXRlKGluLCB0cnVlLCBQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yLCAyMDApKTsKLQkKLQkJCS8vIHNhdmUgY2F0YWxpbmEucG9saWN5Ci0JCQlpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShwb2xpY3lGaWxlLmdldEJ5dGVzKCkpOwotCQkJZmlsZSA9IGZvbGRlci5nZXRGaWxlKCJjYXRhbGluYS5wb2xpY3kiKTsKLQkJCWlmIChmaWxlLmV4aXN0cygpKQotCQkJCW1vbml0b3Iud29ya2VkKDIwMCk7Ci0JCQkJLy9maWxlLnNldENvbnRlbnRzKGluLCB0cnVlLCB0cnVlLCBQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yLCAyMDApKTsKLQkJCWVsc2UKLQkJCQlmaWxlLmNyZWF0ZShpbiwgdHJ1ZSwgUHJvZ3Jlc3NVdGlsLmdldFN1Yk1vbml0b3JGb3IobW9uaXRvciwgMjAwKSk7Ci0JCi0JCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJcmV0dXJuOwotCQkJbW9uaXRvci5kb25lKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3Qgc2F2ZSBUb21jYXQgdjUuNSBjb25maWd1cmF0aW9uIHRvICIgKyBmb2xkZXIudG9TdHJpbmcoKSwgZSk7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yQ291bGROb3RTYXZlQ29uZmlndXJhdGlvbiwgbmV3IFN0cmluZ1tdIHtlLmdldExvY2FsaXplZE1lc3NhZ2UoKX0pLCBlKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaGFzTURCTGlzdGVuZXIoU2VydmVyIHNlcnZlcikgewotCQlpZiAoc2VydmVyID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQlpbnQgY291bnQgPSBzZXJ2ZXIuZ2V0TGlzdGVuZXJDb3VudCgpOwotCQlpZiAoY291bnQgPT0gMCkKLQkJCXJldHVybiBmYWxzZTsKLQkJCQotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJCUxpc3RlbmVyIGxpc3RlbmVyID0gc2VydmVyLmdldExpc3RlbmVyKGkpOwotCQkJaWYgKGxpc3RlbmVyICE9IG51bGwgJiYgbGlzdGVuZXIuZ2V0Q2xhc3NOYW1lKCkgIT0gbnVsbCAmJiBsaXN0ZW5lci5nZXRDbGFzc05hbWUoKS5pbmRleE9mKCJtYmVhbiIpID49IDApCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIElUb21jYXRDb25maWd1cmF0aW9uV29ya2luZ0NvcHkjYWRkTWltZU1hcHBpbmcoaW50LCBJTWltZU1hcHBpbmcpCi0JICovCi0JcHVibGljIHZvaWQgYWRkTWltZU1hcHBpbmcoaW50IGluZGV4LCBJTWltZU1hcHBpbmcgbWFwKSB7Ci0JCXdlYkFwcERvY3VtZW50LmFkZE1pbWVNYXBwaW5nKGluZGV4LCBtYXApOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChBRERfTUFQUElOR19QUk9QRVJUWSwgbmV3IEludGVnZXIoaW5kZXgpLCBtYXApOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVRvbWNhdENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSNhZGRXZWJNb2R1bGUoaW50LCBJVG9tY2F0V2ViTW9kdWxlKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFdlYk1vZHVsZShpbnQgaW5kZXgsIElUb21jYXRXZWJNb2R1bGUgbW9kdWxlKSB7Ci0JCXRyeSB7Ci0JCQlpbnQgc2l6ZSA9IHNlcnZlci5nZXRTZXJ2aWNlQ291bnQoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJU2VydmljZSBzZXJ2aWNlID0gc2VydmVyLmdldFNlcnZpY2UoaSk7Ci0JCQkJaWYgKHNlcnZpY2UuZ2V0TmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoREVGQVVMVF9TRVJWSUNFKSkgewotCQkJCQlFbmdpbmUgZW5naW5lID0gc2VydmljZS5nZXRFbmdpbmUoKTsKLQkJCQkJSG9zdCBob3N0ID0gZW5naW5lLmdldEhvc3QoKTsKLQkJCQkJQ29udGV4dCBjb250ZXh0ID0gKENvbnRleHQpIGhvc3QuY3JlYXRlRWxlbWVudChpbmRleCwgIkNvbnRleHQiKTsKLQkJCQkJY29udGV4dC5zZXREb2NCYXNlKG1vZHVsZS5nZXREb2N1bWVudEJhc2UoKSk7Ci0JCQkJCWNvbnRleHQuc2V0UGF0aChtb2R1bGUuZ2V0UGF0aCgpKTsKLQkJCQkJY29udGV4dC5zZXRSZWxvYWRhYmxlKG1vZHVsZS5pc1JlbG9hZGFibGUoKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotCQkJCQlpZiAobW9kdWxlLmdldE1lbWVudG8oKSAhPSBudWxsICYmIG1vZHVsZS5nZXRNZW1lbnRvKCkubGVuZ3RoKCkgPiAwKQotCQkJCQkJY29udGV4dC5zZXRTb3VyY2UobW9kdWxlLmdldE1lbWVudG8oKSk7Ci0JCQkJCWlzU2VydmVyRGlydHkgPSB0cnVlOwotCQkJCQlmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChBRERfV0VCX01PRFVMRV9QUk9QRVJUWSwgbnVsbCwgbW9kdWxlKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGFkZGluZyB3ZWIgbW9kdWxlICIgKyBtb2R1bGUuZ2V0UGF0aCgpLCBlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENoYW5nZSB0aGUgZXh0ZW5zaW9uIG9mIGEgbWltZSBtYXBwaW5nLgotCSAqIAotCSAqIEBwYXJhbSBpbmRleAotCSAqIEBwYXJhbSBtYXAKLQkgKi8KLQlwdWJsaWMgdm9pZCBtb2RpZnlNaW1lTWFwcGluZyhpbnQgaW5kZXgsIElNaW1lTWFwcGluZyBtYXApIHsKLQkJd2ViQXBwRG9jdW1lbnQubW9kaWZ5TWltZU1hcHBpbmcoaW5kZXgsIG1hcCk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KE1PRElGWV9NQVBQSU5HX1BST1BFUlRZLCBuZXcgSW50ZWdlcihpbmRleCksIG1hcCk7Ci0JfQotCi0JLyoqCi0JICogTW9kaWZ5IHRoZSBwb3J0IHdpdGggdGhlIGdpdmVuIGlkLgotCSAqCi0JICogQHBhcmFtIGlkIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gcG9ydCBpbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBtb2RpZnlTZXJ2ZXJQb3J0KFN0cmluZyBpZCwgaW50IHBvcnQpIHsKLQkJdHJ5IHsKLQkJCWlmICgic2VydmVyIi5lcXVhbHMoaWQpKSB7Ci0JCQkJc2VydmVyLnNldFBvcnQocG9ydCArICIiKTsKLQkJCQlpc1NlcnZlckRpcnR5ID0gdHJ1ZTsKLQkJCQlmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChNT0RJRllfUE9SVF9QUk9QRVJUWSwgaWQsIG5ldyBJbnRlZ2VyKHBvcnQpKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCi0JCQlpbnQgaSA9IGlkLmluZGV4T2YoIi8iKTsKLQkJCWludCBzZXJ2TnVtID0gSW50ZWdlci5wYXJzZUludChpZC5zdWJzdHJpbmcoMCwgaSkpOwotCQkJaW50IGNvbm5OdW0gPSBJbnRlZ2VyLnBhcnNlSW50KGlkLnN1YnN0cmluZyhpICsgMSkpOwotCQkJCi0JCQlTZXJ2aWNlIHNlcnZpY2UgPSBzZXJ2ZXIuZ2V0U2VydmljZShzZXJ2TnVtKTsKLQkJCUNvbm5lY3RvciBjb25uZWN0b3IgPSBzZXJ2aWNlLmdldENvbm5lY3Rvcihjb25uTnVtKTsKLQkJCWNvbm5lY3Rvci5zZXRQb3J0KHBvcnQgKyAiIik7Ci0JCQlpc1NlcnZlckRpcnR5ID0gdHJ1ZTsKLQkJCWZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KE1PRElGWV9QT1JUX1BST1BFUlRZLCBpZCwgbmV3IEludGVnZXIocG9ydCkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgbW9kaWZ5aW5nIHNlcnZlciBwb3J0ICIgKyBpZCwgZSk7Ci0JCX0KLQl9Ci0JLyoqCi0JICogQ2hhbmdlIGEgd2ViIG1vZHVsZS4KLQkgKiBAcGFyYW0gaW5kZXggaW50Ci0JICogQHBhcmFtIGRvY0Jhc2UgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBwYXRoIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gcmVsb2FkYWJsZSBib29sZWFuCi0JICovCi0JcHVibGljIHZvaWQgbW9kaWZ5V2ViTW9kdWxlKGludCBpbmRleCwgU3RyaW5nIGRvY0Jhc2UsIFN0cmluZyBwYXRoLCBib29sZWFuIHJlbG9hZGFibGUpIHsKLQkJdHJ5IHsKLQkJCWludCBzaXplID0gc2VydmVyLmdldFNlcnZpY2VDb3VudCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlTZXJ2aWNlIHNlcnZpY2UgPSBzZXJ2ZXIuZ2V0U2VydmljZShpKTsKLQkJCQlpZiAoc2VydmljZS5nZXROYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShERUZBVUxUX1NFUlZJQ0UpKSB7Ci0JCQkJCUVuZ2luZSBlbmdpbmUgPSBzZXJ2aWNlLmdldEVuZ2luZSgpOwotCQkJCQlIb3N0IGhvc3QgPSBlbmdpbmUuZ2V0SG9zdCgpOwotCQkJCQlDb250ZXh0IGNvbnRleHQgPSBob3N0LmdldENvbnRleHQoaW5kZXgpOwotCQkJCQljb250ZXh0LnNldFBhdGgocGF0aCk7Ci0JCQkJCWNvbnRleHQuc2V0RG9jQmFzZShkb2NCYXNlKTsKLQkJCQkJY29udGV4dC5zZXRSZWxvYWRhYmxlKHJlbG9hZGFibGUgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLQkJCQkJaXNTZXJ2ZXJEaXJ0eSA9IHRydWU7Ci0JCQkJCVdlYk1vZHVsZSBtb2R1bGUgPSBuZXcgV2ViTW9kdWxlKHBhdGgsIGRvY0Jhc2UsIG51bGwsIHJlbG9hZGFibGUpOwotCQkJCQlmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChNT0RJRllfV0VCX01PRFVMRV9QUk9QRVJUWSwgbmV3IEludGVnZXIoaW5kZXgpLCBtb2R1bGUpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgbW9kaWZ5aW5nIHdlYiBtb2R1bGUgIiArIGluZGV4LCBlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYSBtaW1lIG1hcHBpbmcuCi0JICogQHBhcmFtIGluZGV4IGludAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZU1pbWVNYXBwaW5nKGludCBpbmRleCkgewotCQl3ZWJBcHBEb2N1bWVudC5yZW1vdmVNaW1lTWFwcGluZyhpbmRleCk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KFJFTU9WRV9NQVBQSU5HX1BST1BFUlRZLCBudWxsLCBuZXcgSW50ZWdlcihpbmRleCkpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYSB3ZWIgbW9kdWxlLgotCSAqIEBwYXJhbSBpbmRleCBpbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVXZWJNb2R1bGUoaW50IGluZGV4KSB7Ci0JCXRyeSB7Ci0JCQlpbnQgc2l6ZSA9IHNlcnZlci5nZXRTZXJ2aWNlQ291bnQoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJU2VydmljZSBzZXJ2aWNlID0gc2VydmVyLmdldFNlcnZpY2UoaSk7Ci0JCQkJaWYgKHNlcnZpY2UuZ2V0TmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoREVGQVVMVF9TRVJWSUNFKSkgewotCQkJCQlFbmdpbmUgZW5naW5lID0gc2VydmljZS5nZXRFbmdpbmUoKTsKLQkJCQkJSG9zdCBob3N0ID0gZW5naW5lLmdldEhvc3QoKTsKLQkJCQkJaG9zdC5yZW1vdmVFbGVtZW50KCJDb250ZXh0IiwgaW5kZXgpOwotCQkJCQlpc1NlcnZlckRpcnR5ID0gdHJ1ZTsKLQkJCQkJZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQoUkVNT1ZFX1dFQl9NT0RVTEVfUFJPUEVSVFksIG51bGwsIG5ldyBJbnRlZ2VyKGluZGV4KSk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciByZW1vdmluZyBtb2R1bGUgcmVmICIgKyBpbmRleCwgZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgSVN0YXR1cyBwdWJsaXNoQ29udGV4dENvbmZpZyhJUGF0aCBiYXNlRGlyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJbW9uaXRvciA9IFByb2dyZXNzVXRpbC5nZXRNb25pdG9yRm9yKG1vbml0b3IpOwotCQltb25pdG9yLmJlZ2luVGFzayhNZXNzYWdlcy5wdWJsaXNoQ29uZmlndXJhdGlvblRhc2ssIDMwMCk7Ci0KLQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVIsICJBcHBseSBjb250ZXh0IGNvbmZpZ3VyYXRpb25zIik7Ci0JCUlQYXRoIGNvbmZEaXIgPSBiYXNlRGlyLmFwcGVuZCgiY29uZiIpOwotCQlJUGF0aCB3ZWJhcHBzRGlyID0gYmFzZURpci5hcHBlbmQoIndlYmFwcHMiKTsKLQkJdHJ5IHsKLQkJCW1vbml0b3Iuc3ViVGFzayhNZXNzYWdlcy5wdWJsaXNoQ29udGV4dENvbmZpZ1Rhc2spOwotCQkJRmFjdG9yeSBmYWN0b3J5ID0gbmV3IEZhY3RvcnkoKTsKLQkJCWZhY3Rvcnkuc2V0UGFja2FnZU5hbWUoIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sLnNlcnZlcjQwIik7Ci0JCQlTZXJ2ZXIgcHVibGlzaGVkU2VydmVyID0gKFNlcnZlcikgZmFjdG9yeS5sb2FkRG9jdW1lbnQobmV3IEZpbGVJbnB1dFN0cmVhbShjb25mRGlyLmFwcGVuZCgic2VydmVyLnhtbCIpLnRvRmlsZSgpKSk7Ci0JCQltb25pdG9yLndvcmtlZCgxMDApOwotCQkJCi0JCQlib29sZWFuIG1vZGlmaWVkID0gZmFsc2U7Ci0KLQkJCU11bHRpU3RhdHVzIG1zID0gbmV3IE11bHRpU3RhdHVzKFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsIDAsIE1lc3NhZ2VzLnB1Ymxpc2hDb250ZXh0Q29uZmlnVGFzaywgbnVsbCk7Ci0JCQlpbnQgc2l6ZSA9IHB1Ymxpc2hlZFNlcnZlci5nZXRTZXJ2aWNlQ291bnQoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJU2VydmljZSBzZXJ2aWNlID0gcHVibGlzaGVkU2VydmVyLmdldFNlcnZpY2UoaSk7Ci0JCQkJaWYgKHNlcnZpY2UuZ2V0TmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoREVGQVVMVF9TRVJWSUNFKSkgewotCQkJCQlFbmdpbmUgZW5naW5lID0gc2VydmljZS5nZXRFbmdpbmUoKTsKLQkJCQkJSG9zdCBob3N0ID0gZW5naW5lLmdldEhvc3QoKTsKLQkJCQkJaW50IHNpemUyID0gaG9zdC5nZXRDb250ZXh0Q291bnQoKTsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBzaXplMjsgaisrKSB7Ci0JCQkJCQlDb250ZXh0IGNvbnRleHQgPSBob3N0LmdldENvbnRleHQoaik7Ci0JCQkJCQltb25pdG9yLnN1YlRhc2soTkxTLmJpbmQoTWVzc2FnZXMuY2hlY2tpbmdDb250ZXh0VGFzaywKLQkJCQkJCQkJbmV3IFN0cmluZ1tdIHtjb250ZXh0LmdldFBhdGgoKX0pKTsKLQkJCQkJCWlmIChhZGRDb250ZXh0Q29uZmlnKHdlYmFwcHNEaXIsIGNvbnRleHQsIG1zKSkgewotCQkJCQkJCW1vZGlmaWVkID0gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCW1vbml0b3Iud29ya2VkKDEwMCk7Ci0JCQlpZiAobW9kaWZpZWQpIHsKLQkJCQltb25pdG9yLnN1YlRhc2soTWVzc2FnZXMuc2F2aW5nQ29udGV4dENvbmZpZ1Rhc2spOwotCQkJCWZhY3Rvcnkuc2F2ZShjb25mRGlyLmFwcGVuZCgic2VydmVyLnhtbCIpLnRvT1NTdHJpbmcoKSk7Ci0JCQl9Ci0JCQltb25pdG9yLmRvbmUoKTsKLQkJCQotCQkJLy8gSWYgcHJvYmxlbShzKSBvY2N1cnJlZCBhZGRpbmcgY29udGV4dCBjb25maWd1cmF0aW9ucywgcmV0dXJuIGVycm9yIHN0YXR1cwotCQkJaWYgKG1zLmdldENoaWxkcmVuKCkubGVuZ3RoID4gMCkgewotCQkJCXJldHVybiBtczsKLQkJCX0KLQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVSLCAiU2VydmVyLnhtbCB1cGRhdGVkIHdpdGggY29udGV4dC54bWwgY29uZmlndXJhdGlvbnMiKTsKLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIkNvdWxkIG5vdCBhcHBseSBjb250ZXh0IGNvbmZpZ3VyYXRpb25zIHRvIHB1Ymxpc2hlZCBUb21jYXQgdjUuNSBjb25maWd1cmF0aW9uIGZyb20gIiArIGNvbmZEaXIudG9PU1N0cmluZygpICsgIjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yUHVibGlzaENvbmZpZ3VyYXRpb24sIG5ldyBTdHJpbmdbXSB7ZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCl9KSwgZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogSWYgdGhlIHNwZWNpZmllZCBDb250ZXh0IGlzIGxpbmtlZCB0byBhIHByb2plY3QsIHRyeSB0bwotCSAqIHVwZGF0ZSBpdCB3aXRoIGFueSBjb25maWd1cmF0aW9uIGZyb20gYSBNRVRBLUlORi9jb250ZXh0LnhtbCBmb3VuZAotCSAqIHJlbGF0aXZlIHRvIHRoZSBzcGVjaWZpZWQgd2ViIGFwcGxpY2F0aW9ucyBkaXJlY3RvcnkgYW5kIGNvbnRleHQgZG9jQmFzZS4KLQkgKiBAcGFyYW0gd2ViYXBwc0RpciBQYXRoIHRvIHNlcnZlcidzIHdlYiBhcHBsaWNhdGlvbnMgZGlyZWN0b3J5LgotCSAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgb2JqZWN0IHRvIHJlY2VpdmUgY29udGV4dC54bWwgY29udGVudHMuCi0JICogQHBhcmFtIG1zIE11bHRpU3RhdHVzIG9iamVjdCB0byByZWNlaXZlIGVycm9yIHN0YXR1cy4KLQkgKiBAcmV0dXJuIFJldHVybnMgdHJ1ZSBpZiBjb250ZXh0IGlzIG1vZGlmaWVkLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFkZENvbnRleHRDb25maWcoSVBhdGggd2ViYXBwc0RpciwgQ29udGV4dCBjb250ZXh0LCBNdWx0aVN0YXR1cyBtcykgewotCQlib29sZWFuIG1vZGlmaWVkID0gZmFsc2U7Ci0JCVN0cmluZyBzb3VyY2UgPSBjb250ZXh0LmdldFNvdXJjZSgpOwotCQlpZiAoc291cmNlICE9IG51bGwgJiYgc291cmNlLmxlbmd0aCgpID4gMCApCi0JCXsKLQkJCVN0cmluZyBkb2NCYXNlID0gY29udGV4dC5nZXREb2NCYXNlKCk7Ci0JCQl0cnkgewotCQkJCUNvbnRleHQgY29udGV4dENvbmZpZyA9IGxvYWRDb250ZXh0Q29uZmlnKHdlYmFwcHNEaXIuYXBwZW5kKGRvY0Jhc2UpKTsKLQkJCQlpZiAobnVsbCAhPSBjb250ZXh0Q29uZmlnKSB7Ci0JCQkJCWlmIChjb250ZXh0Lmhhc0NoaWxkTm9kZXMoKSkKLQkJCQkJCWNvbnRleHQucmVtb3ZlQ2hpbGRyZW4oKTsKLQkJCQkJY29udGV4dENvbmZpZy5jb3B5Q2hpbGRyZW5Ubyhjb250ZXh0KTsKLQkJCQkJTWFwIGF0dHJzID0gY29udGV4dENvbmZpZy5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQkJCUl0ZXJhdG9yIGl0ZXIgPSBhdHRycy5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQkJCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQkJCVN0cmluZyBuYW1lID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0JCQkJCQlpZiAoIW5hbWUuZXF1YWxzSWdub3JlQ2FzZSgicGF0aCIpCi0JCQkJCQkJCSYmICFuYW1lLmVxdWFsc0lnbm9yZUNhc2UoImRvY0Jhc2UiKQotCQkJCQkJCQkmJiAhbmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJzb3VyY2UiKSkgewotCQkJCQkJCVN0cmluZyB2YWx1ZSA9IChTdHJpbmcpYXR0cnMuZ2V0KG5hbWUpOwotCQkJCQkJCWNvbnRleHQuc2V0QXR0cmlidXRlVmFsdWUobmFtZSwgdmFsdWUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCW1vZGlmaWVkID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVN0cmluZyBjb250ZXh0UGF0aCA9IGNvbnRleHQuZ2V0UGF0aCgpOwotCQkJCWlmIChjb250ZXh0UGF0aC5zdGFydHNXaXRoKCIvIikpIHsKLQkJCQkJY29udGV4dFBhdGggPSBjb250ZXh0UGF0aC5zdWJzdHJpbmcoMSk7Ci0JCQkJfQotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIHJlYWRpbmcgY29udGV4dC54bWwgZmlsZSBmb3IgIiArIGNvbnRleHRQYXRoLCBlKTsKLQkJCQlJU3RhdHVzIHMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsIDAsCi0JCQkJCQlOTFMuYmluZChNZXNzYWdlcy5lcnJvckNvdWxkTm90TG9hZENvbnRleHRYbWwsIGNvbnRleHRQYXRoKSwgZSk7Ci0JCQkJbXMuYWRkKHMpOwotCQkJfQotCQl9Ci0JCXJldHVybiBtb2RpZmllZDsKLQl9Ci0JCi0JLyoqCi0JICogVHJpZXMgdG8gcmVhZCBhIE1FVEEtSU5GL2NvbnRleHQueG1sIGZpbGUgcmVsYXRpdmUgdG8gdGhlCi0JICogc3BlY2lmaWVkIHdlYiBhcHBsaWNhdGlvbiBwYXRoLiAgSWYgZm91bmQsIGl0IGNyZWF0ZXMgYSBDb250ZXh0IG9iamVjdAotCSAqIGNvbnRhaW5pbmcgdGhlIGNvbnRleHRzIG9mIHRoYXQgZmlsZS4KLQkgKiBAcGFyYW0gd2ViYXBwRGlyIFBhdGggdG8gdGhlIHdlYiBhcHBsaWNhdGlvbgotCSAqIEByZXR1cm4gQ29udGV4dCBlbGVtZW50IGNyZWF0ZWQgZnJvbSBjb250ZXh0LnhtbCwgb3IgbnVsbCBpZiBub3QgZm91bmQuCi0JICogQHRocm93cyBTQVhFeGNlcHRpb24gSWYgdGhlcmUgaXMgYSBlcnJvciBwYXJzaW5nIHRoZSBYTUwuIAotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gSWYgdGhlcmUgaXMgYW4gZXJyb3IgcmVhZGluZyB0aGUgZmlsZS4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29udGV4dCBsb2FkQ29udGV4dENvbmZpZyhJUGF0aCB3ZWJhcHBEaXIpIHRocm93cyBJT0V4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uIHsKLQkJRmlsZSBjb250ZXh0WE1MID0gbmV3IEZpbGUod2ViYXBwRGlyLnRvT1NTdHJpbmcoKSsgRmlsZS5zZXBhcmF0b3IgKyAiTUVUQS1JTkYiICsgRmlsZS5zZXBhcmF0b3IgKyAiY29udGV4dC54bWwiKTsKLQkJaWYgKGNvbnRleHRYTUwuZXhpc3RzKCkpIHsKLQkJCXRyeSB7Ci0JCQkJSW5wdXRTdHJlYW0gaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGNvbnRleHRYTUwpOwotCQkJCUZhY3RvcnkgY3R4RmFjdG9yeSA9IG5ldyBGYWN0b3J5KCk7Ci0JCQkJY3R4RmFjdG9yeS5zZXRQYWNrYWdlTmFtZSgib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC54bWwuc2VydmVyNDAiKTsKLQkJCQlDb250ZXh0IGN0eCA9IChDb250ZXh0KWN0eEZhY3RvcnkubG9hZERvY3VtZW50KGlzKTsKLQkJCQlpcy5jbG9zZSgpOwotCQkJCXJldHVybiBjdHg7Ci0JCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJCS8vIElnbm9yZSwgc2hvdWxkIG5ldmVyIG9jY3VyCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0gCX0KLQotCXByb3RlY3RlZCBJU3RhdHVzIHByZXBhcmVSdW50aW1lRGlyZWN0b3J5KElQYXRoIGNvbmZEaXIpIHsKLQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVIsICJQcmVwYXJpbmcgcnVudGltZSBkaXJlY3RvcnkiKTsKLQkJLy8gUHJlcGFyZSBhIGNhdGFsaW5hLmJhc2UgZGlyZWN0b3J5IHN0cnVjdHVyZQotCQlGaWxlIHRlbXAgPSBjb25mRGlyLmFwcGVuZCgiY29uZiIpLnRvRmlsZSgpOwotCQlpZiAoIXRlbXAuZXhpc3RzKCkpCi0JCQl0ZW1wLm1rZGlycygpOwotCQl0ZW1wID0gY29uZkRpci5hcHBlbmQoImxvZ3MiKS50b0ZpbGUoKTsKLQkJaWYgKCF0ZW1wLmV4aXN0cygpKQotCQkJdGVtcC5ta2RpcnMoKTsKLQkJdGVtcCA9IGNvbmZEaXIuYXBwZW5kKCJ0ZW1wIikudG9GaWxlKCk7Ci0JCWlmICghdGVtcC5leGlzdHMoKSkKLQkJCXRlbXAubWtkaXJzKCk7Ci0JCUlQYXRoIHRlbXBQYXRoID0gY29uZkRpci5hcHBlbmQoIndlYmFwcHMvUk9PVC9XRUItSU5GIik7Ci0JCXRlbXAgPSB0ZW1wUGF0aC50b0ZpbGUoKTsKLQkJaWYgKCF0ZW1wLmV4aXN0cygpKQotCQkJdGVtcC5ta2RpcnMoKTsKLQkJdGVtcCA9IHRlbXBQYXRoLmFwcGVuZCgid2ViLnhtbCIpLnRvRmlsZSgpOwotCQlpZiAoIXRlbXAuZXhpc3RzKCkpIHsKLQkJCUZpbGVXcml0ZXIgZnc7Ci0JCQl0cnkgewotCQkJCWZ3ID0gbmV3IEZpbGVXcml0ZXIodGVtcCk7Ci0JCQkJZncud3JpdGUoREVGQVVMVF9XRUJYTUxfU0VSVkxFVDI0KTsKLQkJCQlmdy5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJVbmFibGUgdG8gY3JlYXRlIHdlYi54bWwgZm9yIFJPT1QgY29udGV4dC4iLCBlKTsKLQkJCX0KLQkJfQotCQl0ZW1wID0gY29uZkRpci5hcHBlbmQoIndvcmsiKS50b0ZpbGUoKTsKLQkJaWYgKCF0ZW1wLmV4aXN0cygpKQotCQkJdGVtcC5ta2RpcnMoKTsKLQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsJCQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1RvbWNhdDU1SGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9Ub21jYXQ1NUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGYxYjhmMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1RvbWNhdDU1SGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi2gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotLyoqCi0gKiBUb21jYXQgNTUgaGFuZGxlci4KLSAqLwotcHVibGljIGNsYXNzIFRvbWNhdDU1SGFuZGxlciBleHRlbmRzIFRvbWNhdDUwSGFuZGxlciB7Ci0JLyoqCi0JICogQHNlZSBJVG9tY2F0VmVyc2lvbkhhbmRsZXIjdmVyaWZ5SW5zdGFsbFBhdGgoSVBhdGgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmVyaWZ5SW5zdGFsbFBhdGgoSVBhdGggaW5zdGFsbFBhdGgpIHsKLQkJaWYgKGluc3RhbGxQYXRoID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJaWYgKCFUb21jYXRQbHVnaW4udmVyaWZ5VG9tY2F0VmVyc2lvbkZyb21QYXRoKGluc3RhbGxQYXRoLCBUb21jYXRQbHVnaW4uVE9NQ0FUXzU1KSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIFRvbWNhdFBsdWdpbi52ZXJpZnlJbnN0YWxsUGF0aChpbnN0YWxsUGF0aCwgVG9tY2F0UGx1Z2luLlRPTUNBVF81NSk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgSVRvbWNhdFZlcnNpb25IYW5kbGVyI2NhbkFkZE1vZHVsZShJTW9kdWxlKQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGNhbkFkZE1vZHVsZShJTW9kdWxlIG1vZHVsZSkgewotCQlTdHJpbmcgdmVyc2lvbiA9IG1vZHVsZS5nZXRNb2R1bGVUeXBlKCkuZ2V0VmVyc2lvbigpOwotCQlpZiAoIjIuMiIuZXF1YWxzKHZlcnNpb24pIHx8ICIyLjMiLmVxdWFscyh2ZXJzaW9uKSB8fCAiMi40Ii5lcXVhbHModmVyc2lvbikpCi0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCi0JCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsIDAsIE1lc3NhZ2VzLmVycm9yU3BlYzU1LCBudWxsKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9Ub21jYXRDb25maWd1cmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1RvbWNhdENvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZjZTk5Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1RvbWNhdENvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLklXZWJNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJQb3J0OwotLyoqCi0gKiBHZW5lcmljIFRvbWNhdCBzZXJ2ZXIgY29uZmlndXJhdGlvbi4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFRvbWNhdENvbmZpZ3VyYXRpb24gaW1wbGVtZW50cyBJVG9tY2F0Q29uZmlndXJhdGlvbiwgSVRvbWNhdENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9QUk9QRVJUWSA9ICJuYW1lIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQT1JUX1BST1BFUlRZID0gInBvcnQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1PRElGWV9QT1JUX1BST1BFUlRZID0gIm1vZGlmeVBvcnQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFERF9NQVBQSU5HX1BST1BFUlRZID0gImFkZE1hcHBpbmciOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTU9WRV9NQVBQSU5HX1BST1BFUlRZID0gInJlbW92ZU1hcHBpbmciOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1PRElGWV9NQVBQSU5HX1BST1BFUlRZID0gIm1vZGlmeU1hcHBpbmciOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1PRElGWV9XRUJfTU9EVUxFX1BST1BFUlRZID0gIm1vZGlmeVdlYk1vZHVsZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUREX1dFQl9NT0RVTEVfUFJPUEVSVFkgPSAiYWRkV2ViTW9kdWxlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRU1PVkVfV0VCX01PRFVMRV9QUk9QRVJUWSA9ICJyZW1vdmVXZWJNb2R1bGUiOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfV0VCWE1MX1NFUlZMRVQyMyA9IAotCQkiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG4iICsKLQkJIjwhRE9DVFlQRSB3ZWItYXBwIFBVQkxJQyBcIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBXZWIgQXBwbGljYXRpb24gMi4zLy9FTlwiIFwiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvd2ViLWFwcF8yXzMuZHRkXCI+XG4iICsKLQkJIjx3ZWItYXBwPlxuPC93ZWItYXBwPiI7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9XRUJYTUxfU0VSVkxFVDI0ID0gCi0JIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PlxuIiArCi0JIjx3ZWItYXBwIGlkPVwiV2ViQXBwX0lEXCIgdmVyc2lvbj1cIjIuNFwiIHhtbG5zPVwiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZVwiIHhtbG5zOnhzaT1cImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlXCIgeHNpOnNjaGVtYUxvY2F0aW9uPVwiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL3dlYi1hcHBfMl80LnhzZFwiPlxuIiArCi0JIjwvd2ViLWFwcD4iOwotCQotCXByb3RlY3RlZCBJRm9sZGVyIGNvbmZpZ1BhdGg7Ci0KLQkvLyBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXJzCi0JcHJpdmF0ZSB0cmFuc2llbnQgTGlzdCBwcm9wZXJ0eUxpc3RlbmVyczsKLQotCS8qKgotCSAqIFRvbWNhdENvbmZpZ3VyYXRpb24gY29uc3RydWN0b3IuCi0JICogCi0JICogQHBhcmFtIHBhdGggYSBwYXRoCi0JICovCi0JcHVibGljIFRvbWNhdENvbmZpZ3VyYXRpb24oSUZvbGRlciBwYXRoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuY29uZmlnUGF0aCA9IHBhdGg7Ci0JCS8qdHJ5IHsKLQkJCWxvYWQoY29uZmlnUGF0aCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfSovCi0JfQotCQotCXByb3RlY3RlZCBJRm9sZGVyIGdldEZvbGRlcigpIHsKLQkJcmV0dXJuIGNvbmZpZ1BhdGg7Ci0JfQotCi0JLyoqCi0JICogQ29waWVzIGFsbCBmaWxlcyBmcm9tIHRoZSBnaXZlbiBkaXJlY3RvcnkgaW4gdGhlIHdvcmtiZW5jaAotCSAqIHRvIHRoZSBnaXZlbiBsb2NhdGlvbi4gIENhbiBiZSBvdmVycmlkZGVuIGJ5IHZlcnNpb24gc3BlY2lmaWMKLQkgKiBjbGFzcyB0byBtb2RpZnkgb3IgZW5oYW5jZSB3aGF0IHB1Ymxpc2ggZG9lcy4KLQkgKiAKLQkgKiBAcGFyYW0gdG9tY2F0RGlyIERlc3RpbmF0aW9uIHRvbWNhdCBkaXJlY3RvcnkuICBFcXVpdmFsZW50IHRvIGNhdGFsaW5hLmJhc2UKLQkgKiAgICAgICAgICAgICAgICAgIGZvciBUb21jYXQgNC54IGFuZCB1cC4KLQkgKiBAcGFyYW0gZG9CYWNrdXAgQmFja3VwIGV4aXN0aW5nIGNvbmZpZ3VyYXRpb24gZmlsZXMgKHRydWUgaWYgbm90IHRlc3QgbW9kZSkuCi0JICogQHBhcmFtIG1vbml0b3IgUHJvZ3Jlc3MgbW9uaXRvciB0byB1c2UKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzCi0JICovCi0JcHJvdGVjdGVkIElTdGF0dXMgYmFja3VwQW5kUHVibGlzaChJUGF0aCB0b21jYXREaXIsIGJvb2xlYW4gZG9CYWNrdXAsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlNdWx0aVN0YXR1cyBtcyA9IG5ldyBNdWx0aVN0YXR1cyhUb21jYXRQbHVnaW4uUExVR0lOX0lELCAwLCBNZXNzYWdlcy5wdWJsaXNoQ29uZmlndXJhdGlvblRhc2ssIG51bGwpOwotCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FUiwgIkJhY2t1cCBhbmQgcHVibGlzaCIpOwotCQltb25pdG9yID0gUHJvZ3Jlc3NVdGlsLmdldE1vbml0b3JGb3IobW9uaXRvcik7Ci0KLQkJdHJ5IHsKLQkJCUlQYXRoIGJhY2t1cCA9IG51bGw7Ci0JCQlpZiAoZG9CYWNrdXApIHsKLQkJCQkvLyBjcmVhdGUgYmFja3VwIGRpcmVjdG9yeQotCQkJCWJhY2t1cCA9IHRvbWNhdERpci5hcHBlbmQoImJhY2t1cCIpOwotCQkJCWlmICghYmFja3VwLnRvRmlsZSgpLmV4aXN0cygpKQotCQkJCQliYWNrdXAudG9GaWxlKCkubWtkaXIoKTsKLQkJCX0KLQkJCWJhY2t1cEZvbGRlcihnZXRGb2xkZXIoKSwgdG9tY2F0RGlyLmFwcGVuZCgiY29uZiIpLCBiYWNrdXAsIG1zLCBtb25pdG9yKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgImJhY2t1cEFuZFB1Ymxpc2goKSBlcnJvciIsIGUpOwotCQkJSVN0YXR1cyBzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBUb21jYXRQbHVnaW4uUExVR0lOX0lELCAwLCBOTFMuYmluZChNZXNzYWdlcy5lcnJvclB1Ymxpc2hDb25maWd1cmF0aW9uLCBuZXcgU3RyaW5nW10ge2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpfSksIGUpOwotCQkJbXMuYWRkKHMpOwotCQl9Ci0KLQkJbW9uaXRvci5kb25lKCk7Ci0JCXJldHVybiBtczsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYmFja3VwRm9sZGVyKElGb2xkZXIgZm9sZGVyLCBJUGF0aCBjb25mRGlyLCBJUGF0aCBiYWNrdXAsIE11bHRpU3RhdHVzIG1zLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVJlc291cmNlW10gY2hpbGRyZW4gPSBmb2xkZXIubWVtYmVycygpOwotCQlpZiAoY2hpbGRyZW4gPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCWludCBzaXplID0gY2hpbGRyZW4ubGVuZ3RoOwotCQltb25pdG9yLmJlZ2luVGFzayhNZXNzYWdlcy5wdWJsaXNoQ29uZmlndXJhdGlvblRhc2ssIHNpemUgKiAxMDApOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJaWYgKGNoaWxkcmVuW2ldIGluc3RhbmNlb2YgSUZpbGUpIHsKLQkJCQl0cnkgewotCQkJCQlJRmlsZSBmaWxlID0gKElGaWxlKSBjaGlsZHJlbltpXTsKLQkJCQkJU3RyaW5nIG5hbWUgPSBmaWxlLmdldE5hbWUoKTsKLQkJCQkJbW9uaXRvci5zdWJUYXNrKE5MUy5iaW5kKE1lc3NhZ2VzLnB1Ymxpc2hlclB1Ymxpc2hUYXNrLCBuZXcgU3RyaW5nW10ge25hbWV9KSk7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIlB1Ymxpc2hpbmcgIiArIG5hbWUpOwotCi0JCQkJCS8vIGJhY2t1cCBhbmQgY29weSBmaWxlCi0JCQkJCWJvb2xlYW4gY29weSA9IHRydWU7Ci0JCQkJCWlmIChiYWNrdXAgIT0gbnVsbCAmJiAhKGJhY2t1cC5hcHBlbmQobmFtZSkudG9GaWxlKCkuZXhpc3RzKCkpKSB7Ci0JCQkJCQlJU3RhdHVzIHN0YXR1cyA9IEZpbGVVdGlsLmNvcHlGaWxlKGNvbmZEaXIuYXBwZW5kKG5hbWUpLnRvT1NTdHJpbmcoKSwgYmFja3VwICsgRmlsZS5zZXBhcmF0b3IgKyBuYW1lKTsKLQkJCQkJCW1zLmFkZChzdGF0dXMpOwotCQkJCQkJaWYgKCFzdGF0dXMuaXNPSygpKQotCQkJCQkJCWNvcHkgPSBmYWxzZTsKLQkJCQkJfQotCQkJCQkKLQkJCQkJaWYgKGNvcHkpIHsKLQkJCQkJCUlucHV0U3RyZWFtIGluID0gZmlsZS5nZXRDb250ZW50cygpOwotCQkJCQkJbXMuYWRkKEZpbGVVdGlsLmNvcHlGaWxlKGluLCBjb25mRGlyLmFwcGVuZChuYW1lKS50b09TU3RyaW5nKCkpKTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgImJhY2t1cEFuZFB1Ymxpc2goKSBlcnJvciIsIGUpOwotCQkJCQltcy5hZGQobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBUb21jYXRQbHVnaW4uUExVR0lOX0lELCAwLCBOTFMuYmluZChNZXNzYWdlcy5lcnJvclB1Ymxpc2hDb25maWd1cmF0aW9uLCBuZXcgU3RyaW5nW10ge2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpfSksIGUpKTsKLQkJCQl9Ci0JCQl9Ci0JCQltb25pdG9yLndvcmtlZCgxMDApOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGJhY2t1cFBhdGgoSVBhdGggcGF0aCwgSVBhdGggY29uZkRpciwgSVBhdGggYmFja3VwLCBNdWx0aVN0YXR1cyBtcywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCUZpbGVbXSBmaWxlcyA9IHBhdGgudG9GaWxlKCkubGlzdEZpbGVzKCk7Ci0JCWlmIChmaWxlcyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkJCi0JCWludCBzaXplID0gZmlsZXMubGVuZ3RoOwotCQltb25pdG9yLmJlZ2luVGFzayhNZXNzYWdlcy5wdWJsaXNoQ29uZmlndXJhdGlvblRhc2ssIHNpemUgKiAxMDApOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJdHJ5IHsKLQkJCQlGaWxlIGZpbGUgPSBmaWxlc1tpXTsKLQkJCQlTdHJpbmcgbmFtZSA9IGZpbGUuZ2V0TmFtZSgpOwotCQkJCW1vbml0b3Iuc3ViVGFzayhOTFMuYmluZChNZXNzYWdlcy5wdWJsaXNoZXJQdWJsaXNoVGFzaywgbmV3IFN0cmluZ1tdIHtuYW1lfSkpOwotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIlB1Ymxpc2hpbmcgIiArIG5hbWUpOwotCi0JCQkJLy8gYmFja3VwIGFuZCBjb3B5IGZpbGUKLQkJCQlib29sZWFuIGNvcHkgPSB0cnVlOwotCQkJCWlmIChiYWNrdXAgIT0gbnVsbCAmJiAhKGJhY2t1cC5hcHBlbmQobmFtZSkudG9GaWxlKCkuZXhpc3RzKCkpKSB7Ci0JCQkJCUlTdGF0dXMgc3RhdHVzID0gRmlsZVV0aWwuY29weUZpbGUoY29uZkRpci5hcHBlbmQobmFtZSkudG9PU1N0cmluZygpLCBiYWNrdXAgKyBGaWxlLnNlcGFyYXRvciArIG5hbWUpOwotCQkJCQltcy5hZGQoc3RhdHVzKTsKLQkJCQkJaWYgKCFzdGF0dXMuaXNPSygpKQotCQkJCQkJY29weSA9IGZhbHNlOwotCQkJCX0KLQkJCQkKLQkJCQlpZiAoY29weSkKLQkJCQkJbXMuYWRkKEZpbGVVdGlsLmNvcHlGaWxlKGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIGNvbmZEaXIuYXBwZW5kKG5hbWUpLnRvT1NTdHJpbmcoKSkpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJiYWNrdXBBbmRQdWJsaXNoKCkgZXJyb3IiLCBlKTsKLQkJCQltcy5hZGQobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBUb21jYXRQbHVnaW4uUExVR0lOX0lELCAwLCBOTFMuYmluZChNZXNzYWdlcy5lcnJvclB1Ymxpc2hDb25maWd1cmF0aW9uLCBuZXcgU3RyaW5nW10ge2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpfSksIGUpKTsKLQkJCX0KLQkJCW1vbml0b3Iud29ya2VkKDEwMCk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIElTdGF0dXMgcHVibGlzaENvbnRleHRDb25maWcoSVBhdGggYmFzZURpciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCS8vIERlZmF1bHQgaW1wbGVtZW50YXRpb24gYXNzdW1lcyBub3RoaW5nIHRvIGRvCi0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQotCQotCXByb3RlY3RlZCBJU3RhdHVzIGNsZWFudXBTZXJ2ZXIoSVBhdGggY29uZkRpciwgSVBhdGggaW5zdGFsbERpciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCS8vIERlZmF1bHQgaW1wbGVtZW50YXRpb24gYXNzdW1lcyBub3RoaW5nIHRvIGNsZWFuCi0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQkKLQlwcm90ZWN0ZWQgSVN0YXR1cyBwcmVwYXJlUnVudGltZURpcmVjdG9yeShJUGF0aCBjb25mRGlyKSB7Ci0JCUZpbGUgdGVtcCA9IGNvbmZEaXIuYXBwZW5kKCJjb25mIikudG9GaWxlKCk7Ci0JCWlmICghdGVtcC5leGlzdHMoKSkKLQkJCXRlbXAubWtkaXJzKCk7Ci0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7CQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgbG9jYWxpemVDb25maWd1cmF0aW9uKElQYXRoIHBhdGgsIFRvbWNhdFNlcnZlciBzZXJ2ZXIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWFpbiBzZXJ2ZXIgcG9ydC4KLQkgKiBAcmV0dXJuIFNlcnZlclBvcnQKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgU2VydmVyUG9ydCBnZXRNYWluUG9ydCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcHJlZml4IHRoYXQgaXMgdXNlZCBpbiBmcm9udCBvZiB0aGUKLQkgKiB3ZWIgbW9kdWxlIHBhdGggcHJvcGVydHkuIChlLmcuICJ3ZWJhcHBzIikKLQkgKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RG9jQmFzZVByZWZpeCgpIHsKLQkJcmV0dXJuICIiOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhcnRpYWwgVVJMIGFwcGxpY2FibGUgdG8gdGhpcyBtb2R1bGUuCi0JICogCi0JICogQHBhcmFtIHdlYk1vZHVsZSBhIHdlYiBtb2R1bGUKLQkgKiBAcmV0dXJuIHRoZSBwYXJ0aWFsIFVSTAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0V2ViTW9kdWxlVVJMKElNb2R1bGUgd2ViTW9kdWxlKSB7Ci0JCVdlYk1vZHVsZSBtb2R1bGUgPSBnZXRXZWJNb2R1bGUod2ViTW9kdWxlKTsKLQkJaWYgKG1vZHVsZSAhPSBudWxsKQotCQkJcmV0dXJuIG1vZHVsZS5nZXRQYXRoKCk7Ci0JCQotCQlJV2ViTW9kdWxlIHdlYk1vZHVsZTIgPSAoSVdlYk1vZHVsZSkgd2ViTW9kdWxlLmxvYWRBZGFwdGVyKElXZWJNb2R1bGUuY2xhc3MsIG51bGwpOwotCQlyZXR1cm4gIi8iICsgd2ViTW9kdWxlMi5nZXRDb250ZXh0Um9vdCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGdpdmVuIG1vZHVsZSBmcm9tIHRoZSBjb25maWcuCi0JICoKLQkgKiBAcGFyYW0gbW9kdWxlIGEgd2ViIG1vZHVsZQotCSAqIEByZXR1cm4gYSB3ZWIgbW9kdWxlCi0JICovCi0JcHJvdGVjdGVkIFdlYk1vZHVsZSBnZXRXZWJNb2R1bGUoSU1vZHVsZSBtb2R1bGUpIHsKLQkJaWYgKG1vZHVsZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCi0JCVN0cmluZyBtZW1lbnRvID0gbW9kdWxlLmdldElkKCk7Ci0JCi0JCUxpc3QgbW9kdWxlcyA9IGdldFdlYk1vZHVsZXMoKTsKLQkJaW50IHNpemUgPSBtb2R1bGVzLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCVdlYk1vZHVsZSB3ZWJNb2R1bGUgPSAoV2ViTW9kdWxlKSBtb2R1bGVzLmdldChpKTsKLQkJCWlmIChtZW1lbnRvLmVxdWFscyh3ZWJNb2R1bGUuZ2V0TWVtZW50bygpKSkgewotCQkJCXJldHVybiB3ZWJNb2R1bGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgc2F2ZShJRm9sZGVyIGZvbGRlciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQkKLQlwcm90ZWN0ZWQgdm9pZCBmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlpZiAocHJvcGVydHlMaXN0ZW5lcnMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkKLQkJUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCA9IG5ldyBQcm9wZXJ0eUNoYW5nZUV2ZW50KHRoaXMsIHByb3BlcnR5TmFtZSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKLQkJdHJ5IHsKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gcHJvcGVydHlMaXN0ZW5lcnMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQl0cnkgewotCQkJCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJbGlzdGVuZXIucHJvcGVydHlDaGFuZ2UoZXZlbnQpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGZpcmluZyBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnQiLCBlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBpbiBwcm9wZXJ0eSBldmVudCIsIGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lciB0byB0aGlzIHNlcnZlci4KLQkgKgotCSAqIEBwYXJhbSBsaXN0ZW5lciBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKHByb3BlcnR5TGlzdGVuZXJzID09IG51bGwpCi0JCQlwcm9wZXJ0eUxpc3RlbmVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcHJvcGVydHlMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGEgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyIGZyb20gdGhpcyBzZXJ2ZXIuCi0JICoKLQkgKiBAcGFyYW0gbGlzdGVuZXIgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChwcm9wZXJ0eUxpc3RlbmVycyAhPSBudWxsKQotCQkJcHJvcGVydHlMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbXBvcnRGcm9tUGF0aChJUGF0aCBwYXRoLCBib29sZWFuIGlzVGVzdEVudiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWxvYWQocGF0aCwgbW9uaXRvcik7Ci0JfQotCi0JLypwdWJsaWMgdm9pZCBpbXBvcnRGcm9tUnVudGltZShJUnVudGltZSBydW50aW1lLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJbG9hZChydW50aW1lLmdldExvY2F0aW9uKCkuYXBwZW5kKCJjb25mIiksIG1vbml0b3IpOwotCX0qLwotCQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGxvYWQoSVBhdGggcGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBsb2FkKElGb2xkZXIgZm9sZGVyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCQotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIGFkZFdlYk1vZHVsZShpbnQgaW5kZXgsIElUb21jYXRXZWJNb2R1bGUgbW9kdWxlKTsKLQkKLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCByZW1vdmVXZWJNb2R1bGUoaW50IGluZGV4KTsKLQotCS8qKgotCSAqIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdC4KLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIlRvbWNhdENvbmZpZ3VyYXRpb25bIiArIHRoaXMgKyAiXSI7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvVG9tY2F0TGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1RvbWNhdExhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2UyNmRiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvVG9tY2F0TGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJVdGlsOwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFRvbWNhdExhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZSBleHRlbmRzIEFic3RyYWN0SmF2YUxhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZSB7Ci0KLQlwdWJsaWMgdm9pZCBsYXVuY2goSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiwgU3RyaW5nIG1vZGUsIElMYXVuY2ggbGF1bmNoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVNlcnZlciBzZXJ2ZXIgPSBTZXJ2ZXJVdGlsLmdldFNlcnZlcihjb25maWd1cmF0aW9uKTsKLQkJaWYgKHNlcnZlciA9PSBudWxsKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJMYXVuY2ggY29uZmlndXJhdGlvbiBjb3VsZCBub3QgZmluZCBzZXJ2ZXIiKTsKLQkJCS8vIHRocm93IENvcmVFeGNlcHRpb24oKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCVRvbWNhdFNlcnZlckJlaGF2aW91ciB0b21jYXRTZXJ2ZXIgPSAoVG9tY2F0U2VydmVyQmVoYXZpb3VyKSBzZXJ2ZXIubG9hZEFkYXB0ZXIoVG9tY2F0U2VydmVyQmVoYXZpb3VyLmNsYXNzLCBudWxsKTsKLQkJdG9tY2F0U2VydmVyLnNldHVwTGF1bmNoKGxhdW5jaCwgbW9kZSwgbW9uaXRvcik7Ci0JCQotCQlTdHJpbmcgbWFpblR5cGVOYW1lID0gdG9tY2F0U2VydmVyLmdldFJ1bnRpbWVDbGFzcygpOwotCi0JCUlWTUluc3RhbGwgdm0gPSB2ZXJpZnlWTUluc3RhbGwoY29uZmlndXJhdGlvbik7Ci0KLQkJSVZNUnVubmVyIHJ1bm5lciA9IHZtLmdldFZNUnVubmVyKG1vZGUpOwotCi0JCUZpbGUgd29ya2luZ0RpciA9IHZlcmlmeVdvcmtpbmdEaXJlY3RvcnkoY29uZmlndXJhdGlvbik7Ci0JCVN0cmluZyB3b3JraW5nRGlyTmFtZSA9IG51bGw7Ci0JCWlmICh3b3JraW5nRGlyICE9IG51bGwpCi0JCQl3b3JraW5nRGlyTmFtZSA9IHdvcmtpbmdEaXIuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCQotCQkvLyBQcm9ncmFtICYgVk0gYXJncwotCQlTdHJpbmcgcGdtQXJncyA9IGdldFByb2dyYW1Bcmd1bWVudHMoY29uZmlndXJhdGlvbik7Ci0JCVN0cmluZyB2bUFyZ3MgPSBnZXRWTUFyZ3VtZW50cyhjb25maWd1cmF0aW9uKTsKLQotCQlFeGVjdXRpb25Bcmd1bWVudHMgZXhlY0FyZ3MgPSBuZXcgRXhlY3V0aW9uQXJndW1lbnRzKHZtQXJncywgcGdtQXJncyk7Ci0JCQotCQkvLyBWTS1zcGVjaWZpYyBhdHRyaWJ1dGVzCi0JCU1hcCB2bUF0dHJpYnV0ZXNNYXAgPSBnZXRWTVNwZWNpZmljQXR0cmlidXRlc01hcChjb25maWd1cmF0aW9uKTsKLQkJCi0JCS8vIENsYXNzcGF0aAotCQlTdHJpbmdbXSBjbGFzc3BhdGggPSBnZXRDbGFzc3BhdGgoY29uZmlndXJhdGlvbik7Ci0JCQotCQkvLyBDcmVhdGUgVk0gY29uZmlnCi0JCVZNUnVubmVyQ29uZmlndXJhdGlvbiBydW5Db25maWcgPSBuZXcgVk1SdW5uZXJDb25maWd1cmF0aW9uKG1haW5UeXBlTmFtZSwgY2xhc3NwYXRoKTsKLQkJcnVuQ29uZmlnLnNldFByb2dyYW1Bcmd1bWVudHMoZXhlY0FyZ3MuZ2V0UHJvZ3JhbUFyZ3VtZW50c0FycmF5KCkpOwotCQlydW5Db25maWcuc2V0Vk1Bcmd1bWVudHMoZXhlY0FyZ3MuZ2V0Vk1Bcmd1bWVudHNBcnJheSgpKTsKLQkJcnVuQ29uZmlnLnNldFdvcmtpbmdEaXJlY3Rvcnkod29ya2luZ0Rpck5hbWUpOwotCQlydW5Db25maWcuc2V0Vk1TcGVjaWZpY0F0dHJpYnV0ZXNNYXAodm1BdHRyaWJ1dGVzTWFwKTsKLQotCQkvLyBCb290cGF0aAotCQlTdHJpbmdbXSBib290cGF0aCA9IGdldEJvb3RwYXRoKGNvbmZpZ3VyYXRpb24pOwotCQlpZiAoYm9vdHBhdGggIT0gbnVsbCAmJiBib290cGF0aC5sZW5ndGggPiAwKQotCQkJcnVuQ29uZmlnLnNldEJvb3RDbGFzc1BhdGgoYm9vdHBhdGgpOwotCQkKLQkJc2V0RGVmYXVsdFNvdXJjZUxvY2F0b3IobGF1bmNoLCBjb25maWd1cmF0aW9uKTsKLQkJCi0JCS8vIExhdW5jaCB0aGUgY29uZmlndXJhdGlvbgotCQlydW5uZXIucnVuKHJ1bkNvbmZpZywgbGF1bmNoLCBtb25pdG9yKTsKLQkJdG9tY2F0U2VydmVyLnNldFByb2Nlc3MobGF1bmNoLmdldFByb2Nlc3NlcygpWzBdKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9Ub21jYXRMYXVuY2hhYmxlQWRhcHRlckRlbGVnYXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1RvbWNhdExhdW5jaGFibGVBZGFwdGVyRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJjYjM4NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1RvbWNhdExhdW5jaGFibGVBZGFwdGVyRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5JV2ViTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5TZXJ2bGV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnV0aWwuSHR0cExhdW5jaGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnV0aWwuV2ViUmVzb3VyY2U7Ci0vKioKLSAqIExhdW5jaGFibGUgYWRhcHRlciBkZWxlZ2F0ZSBmb3IgV2ViIHJlc291cmNlcyBpbiBUb21jYXQuCi0gKi8KLXB1YmxpYyBjbGFzcyBUb21jYXRMYXVuY2hhYmxlQWRhcHRlckRlbGVnYXRlIGV4dGVuZHMgTGF1bmNoYWJsZUFkYXB0ZXJEZWxlZ2F0ZSB7Ci0JLyoKLQkgKiBAc2VlIExhdW5jaGFibGVBZGFwdGVyRGVsZWdhdGUjZ2V0TGF1bmNoYWJsZShJU2VydmVyLCBJTW9kdWxlQXJ0aWZhY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRMYXVuY2hhYmxlKElTZXJ2ZXIgc2VydmVyLCBJTW9kdWxlQXJ0aWZhY3QgbW9kdWxlT2JqZWN0KSB7Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVSLCAiVG9tY2F0TGF1bmNoYWJsZUFkYXB0ZXIgIiArIHNlcnZlciArICItIiArIG1vZHVsZU9iamVjdCk7Ci0JCWlmIChzZXJ2ZXIuZ2V0QWRhcHRlcihUb21jYXRTZXJ2ZXIuY2xhc3MpID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKCEobW9kdWxlT2JqZWN0IGluc3RhbmNlb2YgU2VydmxldCkgJiYKLQkJCSEobW9kdWxlT2JqZWN0IGluc3RhbmNlb2YgV2ViUmVzb3VyY2UpKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChtb2R1bGVPYmplY3QuZ2V0TW9kdWxlKCkubG9hZEFkYXB0ZXIoSVdlYk1vZHVsZS5jbGFzcywgbnVsbCkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCXRyeSB7Ci0JCQlVUkwgdXJsID0gKChJVVJMUHJvdmlkZXIpIHNlcnZlci5nZXRBZGFwdGVyKElVUkxQcm92aWRlci5jbGFzcykpLmdldE1vZHVsZVJvb3RVUkwobW9kdWxlT2JqZWN0LmdldE1vZHVsZSgpKTsKLQkJCQotCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVIsICJyb290OiAiICsgdXJsKTsKLQotCQkJaWYgKG1vZHVsZU9iamVjdCBpbnN0YW5jZW9mIFNlcnZsZXQpIHsKLQkJCQlTZXJ2bGV0IHNlcnZsZXQgPSAoU2VydmxldCkgbW9kdWxlT2JqZWN0OwotCQkJCWlmIChzZXJ2bGV0LmdldEFsaWFzKCkgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgcGF0aCA9IHNlcnZsZXQuZ2V0QWxpYXMoKTsKLQkJCQkJaWYgKHBhdGguc3RhcnRzV2l0aCgiLyIpKQotCQkJCQkJcGF0aCA9IHBhdGguc3Vic3RyaW5nKDEpOwotCQkJCQl1cmwgPSBuZXcgVVJMKHVybCwgcGF0aCk7Ci0JCQkJfSBlbHNlCi0JCQkJCXVybCA9IG5ldyBVUkwodXJsLCAic2VydmxldC8iICsgc2VydmxldC5nZXRTZXJ2bGV0Q2xhc3NOYW1lKCkpOwotCQkJfSBlbHNlIGlmIChtb2R1bGVPYmplY3QgaW5zdGFuY2VvZiBXZWJSZXNvdXJjZSkgewotCQkJCVdlYlJlc291cmNlIHJlc291cmNlID0gKFdlYlJlc291cmNlKSBtb2R1bGVPYmplY3Q7Ci0JCQkJU3RyaW5nIHBhdGggPSByZXNvdXJjZS5nZXRQYXRoKCkudG9TdHJpbmcoKTsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FUiwgInBhdGg6ICIgKyBwYXRoKTsKLQkJCQlpZiAocGF0aCAhPSBudWxsICYmIHBhdGguc3RhcnRzV2l0aCgiLyIpICYmIHBhdGgubGVuZ3RoKCkgPiAwKQotCQkJCQlwYXRoID0gcGF0aC5zdWJzdHJpbmcoMSk7Ci0JCQkJaWYgKHBhdGggIT0gbnVsbCAmJiBwYXRoLmxlbmd0aCgpID4gMCkKLQkJCQkJdXJsID0gbmV3IFVSTCh1cmwsIHBhdGgpOwotCQkJfQotCQkJcmV0dXJuIG5ldyBIdHRwTGF1bmNoYWJsZSh1cmwpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgZ2V0dGluZyBVUkwgZm9yICIgKyBtb2R1bGVPYmplY3QsIGUpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9Ub21jYXRQbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvVG9tY2F0UGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyZmI4ZmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9Ub21jYXRQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci0vKioKLSAqIFRoZSBUb21jYXQgcGx1Z2luLgotICovCi1wdWJsaWMgY2xhc3MgVG9tY2F0UGx1Z2luIGV4dGVuZHMgUGx1Z2luIHsKLQlwcm90ZWN0ZWQgc3RhdGljIFRvbWNhdFBsdWdpbiBzaW5nbGV0b247Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZSI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT01DQVRfMzIgPSAib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuMzIiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPTUNBVF80MCA9ICJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC40MCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9NQ0FUXzQxID0gIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LjQxIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT01DQVRfNTAgPSAib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuNTAiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPTUNBVF81NSA9ICJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC41NSI7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJJRllfSU5TVEFMTF9GSUxFID0gInZlcmlmeUluc3RhbGwucHJvcGVydGllcyI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmdbXSB2ZXJpZnkzMjsKLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZ1tdIHZlcmlmeTQwOwotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nW10gdmVyaWZ5NDE7Ci0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmdbXSB2ZXJpZnk1MDsKLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZ1tdIHZlcmlmeTU1OwotCi0JLyoqCi0JICogVG9tY2F0UGx1Z2luIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFRvbWNhdFBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJc2luZ2xldG9uID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhpcyBwbHVnaW4uCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5pbnRlcm5hbC5Ub21jYXRQbHVnaW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRvbWNhdFBsdWdpbiBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIHNpbmdsZXRvbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluc3RhbGwgbG9jYXRpb24gcHJlZmVyZW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gaWQgYSBydW50aW1lIHR5cGUgaWQKLQkgKiBAcmV0dXJuIHRoZSBpbnN0YWxsIGxvY2F0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UHJlZmVyZW5jZShTdHJpbmcgaWQpIHsKLQkJcmV0dXJuIGdldEluc3RhbmNlKCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoaWQpOwotCX0KLQkKLQkvKioKLQkgKiBTZXQgdGhlIGluc3RhbGwgbG9jYXRpb24gcHJlZmVyZW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gaWQgdGhlIHJ1bnRpbXQgdHlwZSBpZAotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbG9jYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0UHJlZmVyZW5jZShTdHJpbmcgaWQsIFN0cmluZyB2YWx1ZSkgewotCQlnZXRJbnN0YW5jZSgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuc2V0VmFsdWUoaWQsIHZhbHVlKTsKLQkJZ2V0SW5zdGFuY2UoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGxvZ2dpbmcuCi0JICoKLQkgKiBAcGFyYW0gc3RhdHVzIGEgc3RhdHVzIG9iamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coSVN0YXR1cyBzdGF0dXMpIHsKLQkJZ2V0SW5zdGFuY2UoKS5nZXRMb2coKS5sb2coc3RhdHVzKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBUb21jYXQgaG9tZSBkaXJlY3RvcnkuCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZ2V0VG9tY2F0U3RhdGVMb2NhdGlvbigpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBnZXRJbnN0YW5jZSgpLmdldFN0YXRlTG9jYXRpb24oKS50b09TU3RyaW5nKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgVG9tY2F0IHZlcnNpb24gaGFuZGxlci4KLQkgKiAKLQkgKiBAcGFyYW0gaWQKLQkgKiBAcmV0dXJuIGEgdmVyc2lvbiBoYW5kbGVyCi0JICovCi0JcHVibGljIHN0YXRpYyBJVG9tY2F0VmVyc2lvbkhhbmRsZXIgZ2V0VG9tY2F0VmVyc2lvbkhhbmRsZXIoU3RyaW5nIGlkKSB7Ci0JCWlmIChpZC5pbmRleE9mKCJydW50aW1lIikgPiAwKQotCQkJaWQgPSBpZC5zdWJzdHJpbmcoMCwgMzApICsgaWQuc3Vic3RyaW5nKDM4KTsKLQkJLy9pZCA9IGlkLnN1YnN0cmluZygwLCBpZC5sZW5ndGgoKSAtIDgpOwotCQlpZiAoVE9NQ0FUXzMyLmVxdWFscyhpZCkpCi0JCQlyZXR1cm4gbmV3IFRvbWNhdDMySGFuZGxlcigpOwotCQllbHNlIGlmIChUT01DQVRfNDAuZXF1YWxzKGlkKSkKLQkJCXJldHVybiBuZXcgVG9tY2F0NDBIYW5kbGVyKCk7Ci0JCWVsc2UgaWYgKFRPTUNBVF80MS5lcXVhbHMoaWQpKQotCQkJcmV0dXJuIG5ldyBUb21jYXQ0MUhhbmRsZXIoKTsKLQkJZWxzZSBpZiAoVE9NQ0FUXzUwLmVxdWFscyhpZCkpCi0JCQlyZXR1cm4gbmV3IFRvbWNhdDUwSGFuZGxlcigpOwotCQllbHNlIGlmIChUT01DQVRfNTUuZXF1YWxzKGlkKSkKLQkJCXJldHVybiBuZXcgVG9tY2F0NTVIYW5kbGVyKCk7Ci0JCWVsc2UKLQkJCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIExvYWRzIHRoZSBmaWxlcyB0byB2ZXJpZnkgdGhlIFRvbWNhdCBpbnN0YWxsYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvYWRWZXJpZnlGaWxlcygpIHsKLQkJaWYgKHZlcmlmeTMyICE9IG51bGwpCi0JCQlyZXR1cm47Ci0JCi0JCS8vIGJhY2t1cCAoZW1wdHkpIHZhbHVlcwotCQl2ZXJpZnkzMiA9IG5ldyBTdHJpbmdbMF07Ci0JCXZlcmlmeTQwID0gbmV3IFN0cmluZ1swXTsKLQkJdmVyaWZ5NDEgPSBuZXcgU3RyaW5nWzBdOwotCQl2ZXJpZnk1MCA9IG5ldyBTdHJpbmdbMF07Ci0JCXZlcmlmeTU1ID0gbmV3IFN0cmluZ1swXTsKLQkJCi0JCXRyeSB7Ci0JCQlVUkwgdXJsID0gZ2V0SW5zdGFuY2UoKS5nZXRCdW5kbGUoKS5nZXRFbnRyeShWRVJJRllfSU5TVEFMTF9GSUxFKTsKLQkJCXVybCA9IFBsYXRmb3JtLnJlc29sdmUodXJsKTsKLQkJCVByb3BlcnRpZXMgcCA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCQlwLmxvYWQodXJsLm9wZW5TdHJlYW0oKSk7Ci0KLQkJCVN0cmluZyB2ZXJpZnkgPSBwLmdldFByb3BlcnR5KCJ2ZXJpZnkzMmluc3RhbGwiKTsKLQkJCXZlcmlmeS5yZXBsYWNlKCcvJywgRmlsZS5zZXBhcmF0b3JDaGFyKTsKLQotCQkJU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcih2ZXJpZnksICIsIik7Ci0JCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQl3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKQotCQkJCWxpc3QuYWRkKHN0Lm5leHRUb2tlbigpKTsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIlZlcmlmeTMyOiAiICsgbGlzdC50b1N0cmluZygpKTsKLQkJCXZlcmlmeTMyID0gbmV3IFN0cmluZ1tsaXN0LnNpemUoKV07Ci0JCQlsaXN0LnRvQXJyYXkodmVyaWZ5MzIpOwotCi0JCQkvLyB2NC4wCi0JCQl2ZXJpZnkgPSBwLmdldFByb3BlcnR5KCJ2ZXJpZnk0MGluc3RhbGwiKTsKLQkJCXZlcmlmeS5yZXBsYWNlKCcvJywgRmlsZS5zZXBhcmF0b3JDaGFyKTsKLQotCQkJc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHZlcmlmeSwgIiwiKTsKLQkJCWxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQl3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKQotCQkJCWxpc3QuYWRkKHN0Lm5leHRUb2tlbigpKTsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIlZlcmlmeTQwOiAiICsgbGlzdC50b1N0cmluZygpKTsKLQkJCXZlcmlmeTQwID0gbmV3IFN0cmluZ1tsaXN0LnNpemUoKV07Ci0JCQlsaXN0LnRvQXJyYXkodmVyaWZ5NDApOwotCQkJCi0JCQkvLyB2NC4xCi0JCQl2ZXJpZnkgPSBwLmdldFByb3BlcnR5KCJ2ZXJpZnk0MWluc3RhbGwiKTsKLQkJCXZlcmlmeS5yZXBsYWNlKCcvJywgRmlsZS5zZXBhcmF0b3JDaGFyKTsKLQotCQkJc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHZlcmlmeSwgIiwiKTsKLQkJCWxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQl3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKQotCQkJCWxpc3QuYWRkKHN0Lm5leHRUb2tlbigpKTsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIlZlcmlmeTQxOiAiICsgbGlzdC50b1N0cmluZygpKTsKLQkJCXZlcmlmeTQxID0gbmV3IFN0cmluZ1tsaXN0LnNpemUoKV07Ci0JCQlsaXN0LnRvQXJyYXkodmVyaWZ5NDEpOwotCQkJCi0JCQkvLyB2NS4wCi0JCQl2ZXJpZnkgPSBwLmdldFByb3BlcnR5KCJ2ZXJpZnk1MGluc3RhbGwiKTsKLQkJCXZlcmlmeS5yZXBsYWNlKCcvJywgRmlsZS5zZXBhcmF0b3JDaGFyKTsKLQotCQkJc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHZlcmlmeSwgIiwiKTsKLQkJCWxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQl3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKQotCQkJCWxpc3QuYWRkKHN0Lm5leHRUb2tlbigpKTsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIlZlcmlmeTUwOiAiICsgbGlzdC50b1N0cmluZygpKTsKLQkJCXZlcmlmeTUwID0gbmV3IFN0cmluZ1tsaXN0LnNpemUoKV07Ci0JCQlsaXN0LnRvQXJyYXkodmVyaWZ5NTApOwotCi0JCQkvLyB2NS41Ci0JCQl2ZXJpZnkgPSBwLmdldFByb3BlcnR5KCJ2ZXJpZnk1NWluc3RhbGwiKTsKLQkJCXZlcmlmeS5yZXBsYWNlKCcvJywgRmlsZS5zZXBhcmF0b3JDaGFyKTsKLQotCQkJc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHZlcmlmeSwgIiwiKTsKLQkJCWxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQl3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKQotCQkJCWxpc3QuYWRkKHN0Lm5leHRUb2tlbigpKTsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIlZlcmlmeTU1OiAiICsgbGlzdC50b1N0cmluZygpKTsKLQkJCXZlcmlmeTU1ID0gbmV3IFN0cmluZ1tsaXN0LnNpemUoKV07Ci0JCQlsaXN0LnRvQXJyYXkodmVyaWZ5NTUpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IGxvYWQgaW5zdGFsbGF0aW9uIHZlcmlmaWNhdGlvbiBwcm9wZXJ0aWVzIiwgZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBWZXJpZnkgdGhlIFRvbWNhdCBpbnN0YWxsYXRpb24gZGlyZWN0b3J5LgotCSAqIAotCSAqIEBwYXJhbSBpbnN0YWxsUGF0aAotCSAqIEBwYXJhbSBpZAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGRpcmVjdG9yeSBtYXkgYmUgYSBUb21jYXQgaW5zdGFsbGF0aW9uLAotCSAqICAgIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHZlcmlmeUluc3RhbGxQYXRoKElQYXRoIGluc3RhbGxQYXRoLCBTdHJpbmcgaWQpIHsKLQkJaWYgKGluc3RhbGxQYXRoID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQlTdHJpbmcgZGlyID0gaW5zdGFsbFBhdGgudG9PU1N0cmluZygpOwotCQlpZiAoIWRpci5lbmRzV2l0aChGaWxlLnNlcGFyYXRvcikpCi0JCQlkaXIgKz0gRmlsZS5zZXBhcmF0b3I7Ci0KLQkJLy8gbG9vayBmb3IgdGhlIGZvbGxvd2luZyBmaWxlcyBhbmQgZGlyZWN0b3JpZXMKLQkJVG9tY2F0UGx1Z2luLmxvYWRWZXJpZnlGaWxlcygpOwotCQkKLQkJU3RyaW5nW10gcGF0aHMgPSBudWxsOwotCQlpZiAoVE9NQ0FUXzMyLmVxdWFscyhpZCkpCi0JCQlwYXRocyA9IHZlcmlmeTMyOwotCQllbHNlIGlmIChUT01DQVRfNDAuZXF1YWxzKGlkKSkKLQkJCXBhdGhzID0gdmVyaWZ5NDA7Ci0JCWVsc2UgaWYgKFRPTUNBVF80MS5lcXVhbHMoaWQpKQotCQkJcGF0aHMgPSB2ZXJpZnk0MTsKLQkJZWxzZSBpZiAoVE9NQ0FUXzUwLmVxdWFscyhpZCkpCi0JCQlwYXRocyA9IHZlcmlmeTUwOwotCQllbHNlIGlmIChUT01DQVRfNTUuZXF1YWxzKGlkKSkKLQkJCXBhdGhzID0gdmVyaWZ5NTU7Ci0JCWVsc2UKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGF0aHMubGVuZ3RoOyBpKyspIHsKLQkJCUZpbGUgdGVtcCA9IG5ldyBGaWxlKGRpciArIHBhdGhzW2ldKTsKLQkJCWlmICghdGVtcC5leGlzdHMoKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHZlcmlmeVRvbWNhdFZlcnNpb25Gcm9tUGF0aChJUGF0aCBpbnN0YWxsUGF0aCwgU3RyaW5nIHZlcnNpb24pIHsKLQkJaWYgKGluc3RhbGxQYXRoID09IG51bGwgfHwgdmVyc2lvbiA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlTdHJpbmcgcyA9IGluc3RhbGxQYXRoLmxhc3RTZWdtZW50KCk7Ci0JCWlmIChzID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChzLmluZGV4T2YoIi0zLjIiKSA+IDAgfHwgcy5pbmRleE9mKCIgMy4yIikgPiAwKQotCQkJcmV0dXJuIFRPTUNBVF8zMi5lcXVhbHModmVyc2lvbik7Ci0JCWlmIChzLmluZGV4T2YoIi00LjAiKSA+IDAgfHwgcy5pbmRleE9mKCIgNC4wIikgPiAwKQotCQkJcmV0dXJuIFRPTUNBVF80MC5lcXVhbHModmVyc2lvbik7Ci0JCWlmIChzLmluZGV4T2YoIi00LjEiKSA+IDAgfHwgcy5pbmRleE9mKCIgNC4xIikgPiAwKQotCQkJcmV0dXJuIFRPTUNBVF80MS5lcXVhbHModmVyc2lvbik7Ci0JCWlmIChzLmluZGV4T2YoIi01LjAiKSA+IDAgfHwgcy5pbmRleE9mKCIgNS4wIikgPiAwKQotCQkJcmV0dXJuIFRPTUNBVF81MC5lcXVhbHModmVyc2lvbik7Ci0JCWlmIChzLmluZGV4T2YoIi01LjUiKSA+IDAgfHwgcy5pbmRleE9mKCIgNS41IikgPiAwKQotCQkJcmV0dXJuIFRPTUNBVF81NS5lcXVhbHModmVyc2lvbik7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIDxjb2RlPmphdmEuaW8uRmlsZTwvY29kZT4gb2JqZWN0IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIHNwZWNpZmllZAotCSAqIDxjb2RlPklQYXRoPC9jb2RlPiBpbiB0aGUgcGx1Z2luIGRpcmVjdG9yeS4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgZmlsZQotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgRmlsZSBnZXRQbHVnaW4oKSB7Ci0JCXRyeSB7Ci0JCQlVUkwgaW5zdGFsbFVSTCA9IGdldEluc3RhbmNlKCkuZ2V0QnVuZGxlKCkuZ2V0RW50cnkoIi8iKTsKLQkJCVVSTCBsb2NhbFVSTCA9IFBsYXRmb3JtLmFzTG9jYWxVUkwoaW5zdGFsbFVSTCk7Ci0JCQlyZXR1cm4gbmV3IEZpbGUobG9jYWxVUkwuZ2V0RmlsZSgpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coU3RyaW5nIG1lc3NhZ2UpIHsKLQkJbG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUExVR0lOX0lELCBJU3RhdHVzLkVSUk9SLCBtZXNzYWdlLCBudWxsKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhUaHJvd2FibGUgZSkgewotCQlsb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQTFVHSU5fSUQsIElTdGF0dXMuRVJST1IsIGUuZ2V0TWVzc2FnZSgpLCBlKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvVG9tY2F0UnVudGltZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9Ub21jYXRSdW50aW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxYTNiNWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9Ub21jYXRSdW50aW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkxhdW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklTdHJlYW1zUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuUnVudGltZURlbGVnYXRlOwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFRvbWNhdFJ1bnRpbWUgZXh0ZW5kcyBSdW50aW1lRGVsZWdhdGUgaW1wbGVtZW50cyBJVG9tY2F0UnVudGltZSwgSVRvbWNhdFJ1bnRpbWVXb3JraW5nQ29weSB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9WTV9JTlNUQUxMX1RZUEVfSUQgPSAidm0taW5zdGFsbC10eXBlLWlkIjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX1ZNX0lOU1RBTExfSUQgPSAidm0taW5zdGFsbC1pZCI7Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBNYXAgc2RrTWFwID0gbmV3IEhhc2hNYXAoMik7Ci0KLQlwdWJsaWMgVG9tY2F0UnVudGltZSgpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyBJVG9tY2F0VmVyc2lvbkhhbmRsZXIgZ2V0VmVyc2lvbkhhbmRsZXIoKSB7Ci0JCUlSdW50aW1lVHlwZSB0eXBlID0gZ2V0UnVudGltZSgpLmdldFJ1bnRpbWVUeXBlKCk7Ci0JCXJldHVybiBUb21jYXRQbHVnaW4uZ2V0VG9tY2F0VmVyc2lvbkhhbmRsZXIodHlwZS5nZXRJZCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFZNSW5zdGFsbFR5cGVJZCgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZShQUk9QX1ZNX0lOU1RBTExfVFlQRV9JRCwgKFN0cmluZyludWxsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFZNSW5zdGFsbElkKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKFBST1BfVk1fSU5TVEFMTF9JRCwgKFN0cmluZyludWxsKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNVc2luZ0RlZmF1bHRKUkUoKSB7Ci0JCXJldHVybiBnZXRWTUluc3RhbGxUeXBlSWQoKSA9PSBudWxsOwotCX0KLQotCXB1YmxpYyBJVk1JbnN0YWxsIGdldFZNSW5zdGFsbCgpIHsKLQkJaWYgKGdldFZNSW5zdGFsbFR5cGVJZCgpID09IG51bGwpCi0JCQlyZXR1cm4gSmF2YVJ1bnRpbWUuZ2V0RGVmYXVsdFZNSW5zdGFsbCgpOwotCQl0cnkgewotCQkJSVZNSW5zdGFsbFR5cGUgdm1JbnN0YWxsVHlwZSA9IEphdmFSdW50aW1lLmdldFZNSW5zdGFsbFR5cGUoZ2V0Vk1JbnN0YWxsVHlwZUlkKCkpOwotCQkJSVZNSW5zdGFsbFtdIHZtSW5zdGFsbHMgPSB2bUluc3RhbGxUeXBlLmdldFZNSW5zdGFsbHMoKTsKLQkJCWludCBzaXplID0gdm1JbnN0YWxscy5sZW5ndGg7Ci0JCQlTdHJpbmcgaWQgPSBnZXRWTUluc3RhbGxJZCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlpZiAoaWQuZXF1YWxzKHZtSW5zdGFsbHNbaV0uZ2V0SWQoKSkpCi0JCQkJCXJldHVybiB2bUluc3RhbGxzW2ldOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0UnVudGltZUNsYXNzcGF0aCgpIHsKLQkJcmV0dXJuIGdldFZlcnNpb25IYW5kbGVyKCkuZ2V0UnVudGltZUNsYXNzcGF0aChnZXRSdW50aW1lKCkuZ2V0TG9jYXRpb24oKSk7Ci0JfQotCi0JLyoqCi0JICogVmVyaWZpZXMgdGhlIFRvbWNhdCBpbnN0YWxsYXRpb24gZGlyZWN0b3J5LiBJZiBpdCBpcwotCSAqIGNvcnJlY3QsIHRydWUgaXMgcmV0dXJuZWQuIE90aGVyd2lzZSwgdGhlIHVzZXIgaXMgbm90aWZpZWQKLQkgKiBhbmQgZmFsc2UgaXMgcmV0dXJuZWQuCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmVyaWZ5TG9jYXRpb24oKSB7Ci0JCXJldHVybiBnZXRWZXJzaW9uSGFuZGxlcigpLnZlcmlmeUluc3RhbGxQYXRoKGdldFJ1bnRpbWUoKS5nZXRMb2NhdGlvbigpKTsKLQl9Ci0JCi0JLyoKLQkgKiBWYWxpZGF0ZSB0aGUgcnVudGltZQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKCkgewotCQlJU3RhdHVzIHN0YXR1cyA9IHN1cGVyLnZhbGlkYXRlKCk7Ci0JCWlmICghc3RhdHVzLmlzT0soKSkKLQkJCXJldHVybiBzdGF0dXM7Ci0JCi0JCWlmICghdmVyaWZ5TG9jYXRpb24oKSkKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsIDAsIE1lc3NhZ2VzLmVycm9ySW5zdGFsbERpciwgbnVsbCk7Ci0JCS8vIGRvbid0IGFjY2VwdCB0cmFpbGluZyBzcGFjZSBzaW5jZSB0aGF0IGNhbiBjYXVzZSBzdGFydHVwIHByb2JsZW1zCi0JCWlmIChnZXRSdW50aW1lKCkuZ2V0TG9jYXRpb24oKS5oYXNUcmFpbGluZ1NlcGFyYXRvcigpKQotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgVG9tY2F0UGx1Z2luLlBMVUdJTl9JRCwgMCwgTWVzc2FnZXMuZXJyb3JJbnN0YWxsRGlyVHJhaWxpbmdTbGFzaCwgbnVsbCk7Ci0JCWlmIChnZXRWTUluc3RhbGwoKSA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgVG9tY2F0UGx1Z2luLlBMVUdJTl9JRCwgMCwgTWVzc2FnZXMuZXJyb3JKUkUsIG51bGwpOwotCi0JCS8vIGNoZWNrIGZvciB0b29scy5qYXIgKGNvbnRhaW5zIHRoZSBqYXZhYyBjb21waWxlciBvbiBXaW5kb3dzICYgTGludXgpIHRvIHNlZSB3aGV0aGVyCi0JCS8vIFRvbWNhdCB3aWxsIGJlIGFibGUgdG8gY29tcGlsZSBKU1BzLgotCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCUZpbGUgZmlsZSA9IGdldFZNSW5zdGFsbCgpLmdldEluc3RhbGxMb2NhdGlvbigpOwotCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQlGaWxlIHRvb2xzSmFyID0gbmV3IEZpbGUoZmlsZSwgImxpYiIgKyBGaWxlLnNlcGFyYXRvciArICJ0b29scy5qYXIiKTsKLQkJCWlmICh0b29sc0phci5leGlzdHMoKSkKLQkJCQlmb3VuZCA9IHRydWU7Ci0JCX0KLQkJCi0JCS8vIG9uIE1hYywgdG9vbHMuamFyIGlzIG1lcmdlZCBpbnRvIGNsYXNzZXMuemlwLiBpZiB0b29scy5qYXIgd2Fzbid0IGZvdW5kLAotCQkvLyB0cnkgbG9hZGluZyB0aGUgamF2YWMgY2xhc3MgYnkgcnVubmluZyBhIGNoZWNrIGluc2lkZSB0aGUgVk0KLQkJaWYgKCFmb3VuZCkgewotCQkJU3RyaW5nIG9zID0gUGxhdGZvcm0uZ2V0T1MoKTsKLQkJCWlmIChvcyAhPSBudWxsICYmIG9zLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigibWFjIikgPj0gMCkKLQkJCQlmb3VuZCA9IGNoZWNrRm9yQ29tcGlsZXIoKTsKLQkJfQotCQkKLQkJaWYgKCFmb3VuZCkKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgVG9tY2F0UGx1Z2luLlBMVUdJTl9JRCwgMCwgTWVzc2FnZXMud2FybmluZ0pSRSwgbnVsbCk7Ci0JCQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFJ1bnRpbWVEZWxlZ2F0ZSNzZXREZWZhdWx0cyhJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlJVk1JbnN0YWxsIHZtSW5zdGFsbCA9IEphdmFSdW50aW1lLmdldERlZmF1bHRWTUluc3RhbGwoKTsKLQkJc2V0Vk1JbnN0YWxsKHZtSW5zdGFsbC5nZXRWTUluc3RhbGxUeXBlKCkuZ2V0SWQoKSwgdm1JbnN0YWxsLmdldElkKCkpOwotCQkKLQkJSVJ1bnRpbWVUeXBlIHR5cGUgPSBnZXRSdW50aW1lV29ya2luZ0NvcHkoKS5nZXRSdW50aW1lVHlwZSgpOwotCQlnZXRSdW50aW1lV29ya2luZ0NvcHkoKS5zZXRMb2NhdGlvbihuZXcgUGF0aChUb21jYXRQbHVnaW4uZ2V0UHJlZmVyZW5jZSgibG9jYXRpb24iICsgdHlwZS5nZXRJZCgpKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZNSW5zdGFsbChJVk1JbnN0YWxsIHZtSW5zdGFsbCkgewotCQlpZiAodm1JbnN0YWxsID09IG51bGwpIHsKLQkJCXNldFZNSW5zdGFsbChudWxsLCBudWxsKTsKLQkJfSBlbHNlCi0JCQlzZXRWTUluc3RhbGwodm1JbnN0YWxsLmdldFZNSW5zdGFsbFR5cGUoKS5nZXRJZCgpLCB2bUluc3RhbGwuZ2V0SWQoKSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldFZNSW5zdGFsbChTdHJpbmcgdHlwZUlkLCBTdHJpbmcgaWQpIHsKLQkJaWYgKHR5cGVJZCA9PSBudWxsKQotCQkJc2V0QXR0cmlidXRlKFBST1BfVk1fSU5TVEFMTF9UWVBFX0lELCAoU3RyaW5nKW51bGwpOwotCQllbHNlCi0JCQlzZXRBdHRyaWJ1dGUoUFJPUF9WTV9JTlNUQUxMX1RZUEVfSUQsIHR5cGVJZCk7Ci0JCQotCQlpZiAoaWQgPT0gbnVsbCkKLQkJCXNldEF0dHJpYnV0ZShQUk9QX1ZNX0lOU1RBTExfSUQsIChTdHJpbmcpbnVsbCk7Ci0JCWVsc2UKLQkJCXNldEF0dHJpYnV0ZShQUk9QX1ZNX0lOU1RBTExfSUQsIGlkKTsKLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2tzIGZvciB0aGUgZXhpc3RhbmNlIG9mIHRoZSBKYXZhIGNvbXBpbGVyIGluIHRoZSBnaXZlbiBqYXZhCi0JICogZXhlY3V0YWJsZS4gQSBtYWluIHByb2dyYW0gaXMgcnVuICg8Y29kZT5vcmcuZWNsaXBzZS5qc3QudG9tY2F0LmNvcmUuCi0JICogaW50ZXJuYWwuQ2xhc3NEZXRlY3RvcjwvY29kZT4pLCB0aGF0IGR1bXBzIGEgdHJ1ZSBvciBmYWxzZSB2YWx1ZQotCSAqIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSBjb21waWxlciBpcyBmb3VuZC4gVGhpcyBvdXRwdXQgaXMgdGhlbgotCSAqIHBhcnNlZCBhbmQgY2FjaGVkIGZvciBmdXR1cmUgcmVmZXJlbmNlLgotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY29tcGlsZXIgd2FzIGZvdW5kCi0JICovCQotCXByb3RlY3RlZCBib29sZWFuIGNoZWNrRm9yQ29tcGlsZXIoKSB7Ci0JCS8vIGZpcnN0IHRyeSB0aGUgY2FjaGUKLQkJRmlsZSBqYXZhSG9tZSA9IGdldFZNSW5zdGFsbCgpLmdldEluc3RhbGxMb2NhdGlvbigpOwotCQl0cnkgewotCQkJQm9vbGVhbiBiID0gKEJvb2xlYW4pIHNka01hcC5nZXQoamF2YUhvbWUpOwotCQkJcmV0dXJuIGIuYm9vbGVhblZhbHVlKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCi0JCS8vIGxvY2F0ZSB0b21jYXRjb3JlLmphciAtIGl0IGNvbnRhaW5zIHRoZSBjbGFzcyBkZXRlY3RvciBtYWluIHByb2dyYW0KLQkJRmlsZSBmaWxlID0gVG9tY2F0UGx1Z2luLmdldFBsdWdpbigpOwotCQlpZiAoZmlsZSAhPSBudWxsICYmIGZpbGUuZXhpc3RzKCkpIHsKLQkJCUlWTVJ1bm5lciB2bVJ1bm5lciA9IGdldFZNSW5zdGFsbCgpLmdldFZNUnVubmVyKElMYXVuY2hNYW5hZ2VyLlJVTl9NT0RFKTsKLQkJCVZNUnVubmVyQ29uZmlndXJhdGlvbiBjb25maWcgPSBuZXcgVk1SdW5uZXJDb25maWd1cmF0aW9uKCJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLkNsYXNzRGV0ZWN0b3IiLCBuZXcgU3RyaW5nW10geyBmaWxlLmdldEFic29sdXRlUGF0aCgpIH0pOwotCQkJY29uZmlnLnNldFByb2dyYW1Bcmd1bWVudHMobmV3IFN0cmluZ1tdIHsgImNvbS5zdW4udG9vbHMuamF2YWMuTWFpbiIgfSk7Ci0JCQlJTGF1bmNoIGxhdW5jaCA9IG5ldyBMYXVuY2gobnVsbCwgSUxhdW5jaE1hbmFnZXIuUlVOX01PREUsIG51bGwpOwotCQkJdHJ5IHsKLQkJCQl2bVJ1bm5lci5ydW4oY29uZmlnLCBsYXVuY2gsIG51bGwpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgMjAwOyBpKyspIHsKLQkJCQkJLy8gd2FpdCBubyBtb3JlIHRoYW4gMTAgc2Vjb25kcyAoMjAwICogNTAgbWlscykKLQkJCQkJaWYgKGxhdW5jaC5pc1Rlcm1pbmF0ZWQoKSkgewotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJdHJ5IHsKLQkJCQkJCVRocmVhZC5zbGVlcCg1MCk7Ci0JCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIGlnbm9yZQotCQkJCQl9Ci0JCQkJfQotCQkJCUlTdHJlYW1zUHJveHkgc3RyZWFtc1Byb3h5ID0gbGF1bmNoLmdldFByb2Nlc3NlcygpWzBdLmdldFN0cmVhbXNQcm94eSgpOwotCQkJCVN0cmluZyB0ZXh0ID0gbnVsbDsKLQkJCQlpZiAoc3RyZWFtc1Byb3h5ICE9IG51bGwpIHsKLQkJCQkJdGV4dCA9IHN0cmVhbXNQcm94eS5nZXRPdXRwdXRTdHJlYW1Nb25pdG9yKCkuZ2V0Q29udGVudHMoKTsKLQkJCQkKLQkJCQkJaWYgKHRleHQgIT0gbnVsbCAmJiB0ZXh0Lmxlbmd0aCgpID4gMCkgewotCQkJCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQkJCQkJaWYgKCJ0cnVlIi5lcXVhbHModGV4dCkpCi0JCQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCQkJCi0JCQkJCQlzZGtNYXAucHV0KGphdmFIb21lLCBuZXcgQm9vbGVhbihmb3VuZCkpOwotCQkJCQkJcmV0dXJuIGZvdW5kOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBjaGVja2luZyBmb3IgSkRLIiwgZSk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWlmICghbGF1bmNoLmlzVGVybWluYXRlZCgpKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlsYXVuY2gudGVybWluYXRlKCk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCQkJLy8gaWdub3JlCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIGxvZyBlcnJvciB0aGF0IHdlIHdlcmUgdW5hYmxlIHRvIGNoZWNrIGZvciB0aGUgY29tcGlsZXIKLQkJVG9tY2F0UGx1Z2luLmxvZyhNZXNzYWdlRm9ybWF0LmZvcm1hdCgiRmFpbGVkIGNvbXBpbGVyIGNoZWNrIGZvciB7MH0iLCBuZXcgU3RyaW5nW10geyBqYXZhSG9tZS5nZXRBYnNvbHV0ZVBhdGgoKSB9KSk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9Ub21jYXRSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvVG9tY2F0UnVudGltZUNsYXNzcGF0aFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4YThhOWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9Ub21jYXRSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSVZNSW5zdGFsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkphdmFSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5SdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJEZWxlZ2F0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZTsKLS8qKgotICogQ2xhc3NwYXRoIHByb3ZpZGVyIGZvciB0aGUgVG9tY2F0IHJ1bnRpbWUuCi0gKi8KLXB1YmxpYyBjbGFzcyBUb21jYXRSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXIgZXh0ZW5kcyBSdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJEZWxlZ2F0ZSB7Ci0JcHVibGljIElDbGFzc3BhdGhFbnRyeVtdIGdldERlbGVnYXRlQ2xhc3NwYXRoRW50cmllcyhJUnVudGltZSBydW50aW1lLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJSVRvbWNhdFJ1bnRpbWUgdG9tY2F0UnVudGltZSA9IChJVG9tY2F0UnVudGltZSkgcnVudGltZS5sb2FkQWRhcHRlcihJVG9tY2F0UnVudGltZS5jbGFzcywgbnVsbCk7Ci0JCUlWTUluc3RhbGwgdm1JbnN0YWxsID0gdG9tY2F0UnVudGltZS5nZXRWTUluc3RhbGwoKTsKLQkJaWYgKHZtSW5zdGFsbCAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgbmFtZSA9IHZtSW5zdGFsbC5nZXROYW1lKCk7Ci0JCQlTdHJpbmcgdHlwZUlkID0gdm1JbnN0YWxsLmdldFZNSW5zdGFsbFR5cGUoKS5nZXRJZCgpOwotCQkJcmV0dXJuIG5ldyBJQ2xhc3NwYXRoRW50cnlbXSB7IEphdmFDb3JlLm5ld0NvbnRhaW5lckVudHJ5KG5ldyBQYXRoKEphdmFSdW50aW1lLkpSRV9DT05UQUlORVIpLmFwcGVuZCh0eXBlSWQpLmFwcGVuZChuYW1lKSkgfTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlckRlbGVnYXRlI2dldENsYXNzcGF0aENvbnRhaW5lckxhYmVsKElSdW50aW1lKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NwYXRoQ29udGFpbmVyTGFiZWwoSVJ1bnRpbWUgcnVudGltZSkgewotCQlTdHJpbmcgaWQyID0gcnVudGltZS5nZXRSdW50aW1lVHlwZSgpLmdldElkKCk7Ci0JCWlmIChpZDIuaW5kZXhPZigiMzIiKSA+IDApCi0JCQlyZXR1cm4gTWVzc2FnZXMudGFyZ2V0MzJydW50aW1lOwotCQllbHNlIGlmIChpZDIuaW5kZXhPZigiNDAiKSA+IDApCi0JCQlyZXR1cm4gTWVzc2FnZXMudGFyZ2V0NDBydW50aW1lOwotCQllbHNlIGlmIChpZDIuaW5kZXhPZigiNDEiKSA+IDApCi0JCQlyZXR1cm4gTWVzc2FnZXMudGFyZ2V0NDFydW50aW1lOwotCQllbHNlIGlmIChpZDIuaW5kZXhPZigiNTAiKSA+IDApCi0JCQlyZXR1cm4gTWVzc2FnZXMudGFyZ2V0NTBydW50aW1lOwotCQkKLQkJcmV0dXJuIE1lc3NhZ2VzLnRhcmdldDU1cnVudGltZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlckRlbGVnYXRlI3Jlc29sdmVDbGFzc3BhdGhDb250YWluZXIoSVJ1bnRpbWUpCi0JICovCi0JcHVibGljIElDbGFzc3BhdGhFbnRyeVtdIHJlc29sdmVDbGFzc3BhdGhDb250YWluZXIoSVJ1bnRpbWUgcnVudGltZSkgewotCQlyZXR1cm4gcmVzb2x2ZUNsYXNzcGF0aENvbnRhaW5lcjIocnVudGltZSk7Ci0JfQotCi0JLyoqCi0JICogUmVzb2x2ZSB0aGUgY2xhc3NwYXRoIGNvbnRhaW5lci4KLQkgKi8KLQlwcm90ZWN0ZWQgSUNsYXNzcGF0aEVudHJ5W10gcmVzb2x2ZUNsYXNzcGF0aENvbnRhaW5lcjIoSVJ1bnRpbWUgcnVudGltZSkgewotCQlJUGF0aCBpbnN0YWxsUGF0aCA9IHJ1bnRpbWUuZ2V0TG9jYXRpb24oKTsKLQkJCi0JCWlmIChpbnN0YWxsUGF0aCA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBJQ2xhc3NwYXRoRW50cnlbMF07Ci0JCQotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmIChydW50aW1lLmdldFJ1bnRpbWVUeXBlKCkuZ2V0SWQoKS5pbmRleE9mKCIzMiIpID4gMCkgewotCQkJSVBhdGggcGF0aCA9IGluc3RhbGxQYXRoLmFwcGVuZCgibGliIik7Ci0JCQlhZGRMaWJyYXJ5RW50cmllcyhsaXN0LCBwYXRoLnRvRmlsZSgpLCB0cnVlKTsKLQkJfSBlbHNlIHsKLQkJCUlQYXRoIHBhdGggPSBpbnN0YWxsUGF0aC5hcHBlbmQoImNvbW1vbiIpOwotCQkJYWRkTGlicmFyeUVudHJpZXMobGlzdCwgcGF0aC5hcHBlbmQoImxpYiIpLnRvRmlsZSgpLCB0cnVlKTsKLQkJCWFkZExpYnJhcnlFbnRyaWVzKGxpc3QsIHBhdGguYXBwZW5kKCJlbmRvcnNlZCIpLnRvRmlsZSgpLCB0cnVlKTsKLQkJfQotCQlyZXR1cm4gKElDbGFzc3BhdGhFbnRyeVtdKWxpc3QudG9BcnJheShuZXcgSUNsYXNzcGF0aEVudHJ5W2xpc3Quc2l6ZSgpXSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvVG9tY2F0UnVudGltZUxvY2F0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvVG9tY2F0UnVudGltZUxvY2F0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJmNTY0YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1RvbWNhdFJ1bnRpbWVMb2NhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUZpbHRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSmF2YVJ1bnRpbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZVdvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5SdW50aW1lTG9jYXRvckRlbGVnYXRlOwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFRvbWNhdFJ1bnRpbWVMb2NhdG9yIGV4dGVuZHMgUnVudGltZUxvY2F0b3JEZWxlZ2F0ZSB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBydW50aW1lVHlwZXMgPSBuZXcgU3RyaW5nW10gewotCQkib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQucnVudGltZS4zMiIsCi0JCSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5ydW50aW1lLjQwIiwKLQkJIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnJ1bnRpbWUuNDEiLAotCQkib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQucnVudGltZS41MCIsCi0JCSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5ydW50aW1lLjU1In07Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSVJ1bnRpbWVGYWN0b3J5RGVsZWdhdGUjZ2V0S25vd25SdW50aW1lcygpCi0JICovCi0JcHVibGljIHZvaWQgc2VhcmNoRm9yUnVudGltZXMoSVBhdGggcGF0aCwgSVJ1bnRpbWVTZWFyY2hMaXN0ZW5lciBsaXN0ZW5lciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXNlYXJjaEZvclJ1bnRpbWVzMihwYXRoLCBsaXN0ZW5lciwgbW9uaXRvcik7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHNlYXJjaEZvclJ1bnRpbWVzMihJUGF0aCBwYXRoLCBJUnVudGltZVNlYXJjaExpc3RlbmVyIGxpc3RlbmVyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJRmlsZVtdIGZpbGVzID0gbnVsbDsKLQkJaWYgKHBhdGggIT0gbnVsbCkgewotCQkJRmlsZSBmID0gcGF0aC50b0ZpbGUoKTsKLQkJCWlmIChmLmV4aXN0cygpKQotCQkJCWZpbGVzID0gZi5saXN0RmlsZXMoKTsKLQkJCWVsc2UKLQkJCQlyZXR1cm47Ci0JCX0gZWxzZQotCQkJZmlsZXMgPSBGaWxlLmxpc3RSb290cygpOwotCi0JCWlmIChmaWxlcyAhPSBudWxsKSB7Ci0JCQlpbnQgc2l6ZSA9IGZpbGVzLmxlbmd0aDsKLQkJCWludCB3b3JrID0gMTAwIC8gc2l6ZTsKLQkJCWludCB3b3JrTGVmdCA9IDEwMCAtICh3b3JrICogc2l6ZSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCQkJcmV0dXJuOwotCQkJCWlmIChmaWxlc1tpXSAhPSBudWxsICYmIGZpbGVzW2ldLmlzRGlyZWN0b3J5KCkpCi0JCQkJCXNlYXJjaERpcihsaXN0ZW5lciwgZmlsZXNbaV0sIDQsIG1vbml0b3IpOwotCQkJCW1vbml0b3Iud29ya2VkKHdvcmspOwotCQkJfQotCQkJbW9uaXRvci53b3JrZWQod29ya0xlZnQpOwotCQl9IGVsc2UKLQkJCW1vbml0b3Iud29ya2VkKDEwMCk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHNlYXJjaERpcihJUnVudGltZVNlYXJjaExpc3RlbmVyIGxpc3RlbmVyLCBGaWxlIGRpciwgaW50IGRlcHRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKCJjb25mIi5lcXVhbHMoZGlyLmdldE5hbWUoKSkpIHsKLQkJCUlSdW50aW1lV29ya2luZ0NvcHkgcnVudGltZSA9IGdldFJ1bnRpbWVGcm9tRGlyKGRpci5nZXRQYXJlbnRGaWxlKCksIG1vbml0b3IpOwotCQkJaWYgKHJ1bnRpbWUgIT0gbnVsbCkgewotCQkJCWxpc3RlbmVyLnJ1bnRpbWVGb3VuZChydW50aW1lKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmIChkZXB0aCA9PSAwKQotCQkJcmV0dXJuOwotCQkKLQkJRmlsZVtdIGZpbGVzID0gZGlyLmxpc3RGaWxlcyhuZXcgRmlsZUZpbHRlcigpIHsKLQkJCXB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGZpbGUpIHsKLQkJCQlyZXR1cm4gZmlsZS5pc0RpcmVjdG9yeSgpOwotCQkJfQotCQl9KTsKLQkJaWYgKGZpbGVzICE9IG51bGwpIHsKLQkJCWludCBzaXplID0gZmlsZXMubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJCXJldHVybjsKLQkJCQlzZWFyY2hEaXIobGlzdGVuZXIsIGZpbGVzW2ldLCBkZXB0aCAtIDEsIG1vbml0b3IpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBJUnVudGltZVdvcmtpbmdDb3B5IGdldFJ1bnRpbWVGcm9tRGlyKEZpbGUgZGlyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBydW50aW1lVHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJSVJ1bnRpbWVUeXBlIHJ1bnRpbWVUeXBlID0gU2VydmVyQ29yZS5maW5kUnVudGltZVR5cGUocnVudGltZVR5cGVzW2ldKTsKLQkJCQlTdHJpbmcgYWJzb2x1dGVQYXRoID0gZGlyLmdldEFic29sdXRlUGF0aCgpOwotCQkJCVN0cmluZyBpZCA9IGFic29sdXRlUGF0aC5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwnXycpLnJlcGxhY2UoJzonLCctJyk7Ci0JCQkJSVJ1bnRpbWVXb3JraW5nQ29weSBydW50aW1lID0gcnVudGltZVR5cGUuY3JlYXRlUnVudGltZShpZCwgbW9uaXRvcik7Ci0JCQkJcnVudGltZS5zZXROYW1lKGRpci5nZXROYW1lKCkpOwotCQkJCXJ1bnRpbWUuc2V0TG9jYXRpb24obmV3IFBhdGgoYWJzb2x1dGVQYXRoKSk7Ci0JCQkJSVRvbWNhdFJ1bnRpbWVXb3JraW5nQ29weSB3YyA9IChJVG9tY2F0UnVudGltZVdvcmtpbmdDb3B5KSBydW50aW1lLmxvYWRBZGFwdGVyKElUb21jYXRSdW50aW1lV29ya2luZ0NvcHkuY2xhc3MsIG51bGwpOwotCQkJCXdjLnNldFZNSW5zdGFsbChKYXZhUnVudGltZS5nZXREZWZhdWx0Vk1JbnN0YWxsKCkpOwotCQkJCUlTdGF0dXMgc3RhdHVzID0gcnVudGltZS52YWxpZGF0ZShtb25pdG9yKTsKLQkJCQlpZiAoc3RhdHVzID09IG51bGwgfHwgc3RhdHVzLmdldFNldmVyaXR5KCkgIT0gSVN0YXR1cy5FUlJPUikKLQkJCQkJcmV0dXJuIHJ1bnRpbWU7Ci0JCQkJCi0JCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVIsICJGYWxzZSBydW50aW1lIGZvdW5kIGF0ICIgKyBkaXIuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiOiAiICsgc3RhdHVzLmdldE1lc3NhZ2UoKSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBmaW5kIHJ1bnRpbWUiLCBlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9Ub21jYXRTZXJ2ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvVG9tY2F0U2VydmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0ZTk1OTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9Ub21jYXRTZXJ2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLaAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuSVdlYk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuSjJFRVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC4qOwotLyoqCi0gKiBHZW5lcmljIFRvbWNhdCBzZXJ2ZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBUb21jYXRTZXJ2ZXIgZXh0ZW5kcyBTZXJ2ZXJEZWxlZ2F0ZSBpbXBsZW1lbnRzIElUb21jYXRTZXJ2ZXIsIElUb21jYXRTZXJ2ZXJXb3JraW5nQ29weSB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfU0VDVVJFID0gInNlY3VyZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfREVCVUcgPSAiZGVidWciOwotCi0JcHJvdGVjdGVkIHRyYW5zaWVudCBUb21jYXRDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb247Ci0KLQkvKioKLQkgKiBUb21jYXRTZXJ2ZXIuCi0JICovCi0JcHVibGljIFRvbWNhdFNlcnZlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgVG9tY2F0UnVudGltZSBnZXRUb21jYXRSdW50aW1lKCkgewotCQlpZiAoZ2V0U2VydmVyKCkuZ2V0UnVudGltZSgpID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCXJldHVybiAoVG9tY2F0UnVudGltZSkgZ2V0U2VydmVyKCkuZ2V0UnVudGltZSgpLmxvYWRBZGFwdGVyKFRvbWNhdFJ1bnRpbWUuY2xhc3MsIG51bGwpOwotCX0KLQotCXB1YmxpYyBJVG9tY2F0VmVyc2lvbkhhbmRsZXIgZ2V0VG9tY2F0VmVyc2lvbkhhbmRsZXIoKSB7Ci0JCWlmIChnZXRTZXJ2ZXIoKS5nZXRSdW50aW1lKCkgPT0gbnVsbCB8fCBnZXRUb21jYXRSdW50aW1lKCkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCXJldHVybiBnZXRUb21jYXRSdW50aW1lKCkuZ2V0VmVyc2lvbkhhbmRsZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSVRvbWNhdENvbmZpZ3VyYXRpb24gZ2V0U2VydmVyQ29uZmlndXJhdGlvbigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldFRvbWNhdENvbmZpZ3VyYXRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgVG9tY2F0Q29uZmlndXJhdGlvbiBnZXRUb21jYXRDb25maWd1cmF0aW9uKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoY29uZmlndXJhdGlvbiA9PSBudWxsKSB7Ci0JCQlJRm9sZGVyIGZvbGRlciA9IGdldFNlcnZlcigpLmdldFNlcnZlckNvbmZpZ3VyYXRpb24oKTsKLQkJCWlmIChmb2xkZXIgPT0gbnVsbCB8fCAhZm9sZGVyLmV4aXN0cygpKSB7Ci0JCQkJU3RyaW5nIHBhdGggPSBudWxsOwotCQkJCWlmIChmb2xkZXIgIT0gbnVsbCkKLQkJCQkJcGF0aCA9IGZvbGRlci5nZXRGdWxsUGF0aCgpLnRvT1NTdHJpbmcoKTsKLQkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yTm9Db25maWd1cmF0aW9uLCBwYXRoKSwgbnVsbCkpOwotCQkJfQotCQkJCi0JCQlTdHJpbmcgaWQgPSBnZXRTZXJ2ZXIoKS5nZXRTZXJ2ZXJUeXBlKCkuZ2V0SWQoKTsKLQkJCWlmIChpZC5pbmRleE9mKCIzMiIpID4gMCkKLQkJCQljb25maWd1cmF0aW9uID0gbmV3IFRvbWNhdDMyQ29uZmlndXJhdGlvbihmb2xkZXIpOwotCQkJZWxzZSBpZiAoaWQuaW5kZXhPZigiNDAiKSA+IDApCi0JCQkJY29uZmlndXJhdGlvbiA9IG5ldyBUb21jYXQ0MENvbmZpZ3VyYXRpb24oZm9sZGVyKTsKLQkJCWVsc2UgaWYgKGlkLmluZGV4T2YoIjQxIikgPiAwKQotCQkJCWNvbmZpZ3VyYXRpb24gPSBuZXcgVG9tY2F0NDFDb25maWd1cmF0aW9uKGZvbGRlcik7Ci0JCQllbHNlIGlmIChpZC5pbmRleE9mKCI1MCIpID4gMCkKLQkJCQljb25maWd1cmF0aW9uID0gbmV3IFRvbWNhdDUwQ29uZmlndXJhdGlvbihmb2xkZXIpOwotCQkJZWxzZSBpZiAoaWQuaW5kZXhPZigiNTUiKSA+IDApCi0JCQkJY29uZmlndXJhdGlvbiA9IG5ldyBUb21jYXQ1NUNvbmZpZ3VyYXRpb24oZm9sZGVyKTsKLQkJCXRyeSB7Ci0JCQkJY29uZmlndXJhdGlvbi5sb2FkKGZvbGRlciwgbnVsbCk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQkJY29uZmlndXJhdGlvbiA9IG51bGw7Ci0JCQkJdGhyb3cgY2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvbmZpZ3VyYXRpb247Ci0JfQotCi0JcHVibGljIHZvaWQgaW1wb3J0Q29uZmlndXJhdGlvbihJUnVudGltZSBydW50aW1lLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKHJ1bnRpbWUgPT0gbnVsbCkgewotCQkJY29uZmlndXJhdGlvbiA9IG51bGw7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSVBhdGggcGF0aCA9IHJ1bnRpbWUuZ2V0TG9jYXRpb24oKS5hcHBlbmQoImNvbmYiKTsKLQkJCi0JCVN0cmluZyBpZCA9IGdldFNlcnZlcigpLmdldFNlcnZlclR5cGUoKS5nZXRJZCgpOwotCQlJRm9sZGVyIGZvbGRlciA9IGdldFNlcnZlcigpLmdldFNlcnZlckNvbmZpZ3VyYXRpb24oKTsKLQkJaWYgKGlkLmluZGV4T2YoIjMyIikgPiAwKQotCQkJY29uZmlndXJhdGlvbiA9IG5ldyBUb21jYXQzMkNvbmZpZ3VyYXRpb24oZm9sZGVyKTsKLQkJZWxzZSBpZiAoaWQuaW5kZXhPZigiNDAiKSA+IDApCi0JCQljb25maWd1cmF0aW9uID0gbmV3IFRvbWNhdDQwQ29uZmlndXJhdGlvbihmb2xkZXIpOwotCQllbHNlIGlmIChpZC5pbmRleE9mKCI0MSIpID4gMCkKLQkJCWNvbmZpZ3VyYXRpb24gPSBuZXcgVG9tY2F0NDFDb25maWd1cmF0aW9uKGZvbGRlcik7Ci0JCWVsc2UgaWYgKGlkLmluZGV4T2YoIjUwIikgPiAwKQotCQkJY29uZmlndXJhdGlvbiA9IG5ldyBUb21jYXQ1MENvbmZpZ3VyYXRpb24oZm9sZGVyKTsKLQkJZWxzZSBpZiAoaWQuaW5kZXhPZigiNTUiKSA+IDApCi0JCQljb25maWd1cmF0aW9uID0gbmV3IFRvbWNhdDU1Q29uZmlndXJhdGlvbihmb2xkZXIpOwotCQl0cnkgewotCQkJY29uZmlndXJhdGlvbi5pbXBvcnRGcm9tUGF0aChwYXRoLCBpc1Rlc3RFbnZpcm9ubWVudCgpLCBtb25pdG9yKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJLy8gaWdub3JlCi0JCQljb25maWd1cmF0aW9uID0gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNhdmVDb25maWd1cmF0aW9uKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoY29uZmlndXJhdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCQljb25maWd1cmF0aW9uLnNhdmUoZ2V0U2VydmVyKCkuZ2V0U2VydmVyQ29uZmlndXJhdGlvbigpLCBtb25pdG9yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjb25maWd1cmF0aW9uQ2hhbmdlZCgpIHsKLQkJY29uZmlndXJhdGlvbiA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByb290IFVSTCBvZiB0aGlzIG1vZHVsZS4KLQkgKiBAcGFyYW0gbW9kdWxlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5JTW9kdWxlCi0JICogQHJldHVybiBqYXZhLm5ldC5VUkwKLQkgKi8KLQlwdWJsaWMgVVJMIGdldE1vZHVsZVJvb3RVUkwoSU1vZHVsZSBtb2R1bGUpIHsKLQkJdHJ5IHsKLQkJCWlmIChtb2R1bGUgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCQotCQkJVG9tY2F0Q29uZmlndXJhdGlvbiBjb25maWcgPSBnZXRUb21jYXRDb25maWd1cmF0aW9uKCk7Ci0JCQlpZiAoY29uZmlnID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQkKLQkJCVN0cmluZyB1cmwgPSAiaHR0cDovL2xvY2FsaG9zdCI7Ci0JCQlpbnQgcG9ydCA9IGNvbmZpZy5nZXRNYWluUG9ydCgpLmdldFBvcnQoKTsKLQkJCXBvcnQgPSBTZXJ2ZXJVdGlsLmdldE1vbml0b3JlZFBvcnQoZ2V0U2VydmVyKCksIHBvcnQsICJ3ZWIiKTsKLQkJCWlmIChwb3J0ICE9IDgwKQotCQkJCXVybCArPSAiOiIgKyBwb3J0OwotCQkJCi0JCQl1cmwgKz0gY29uZmlnLmdldFdlYk1vZHVsZVVSTChtb2R1bGUpOwotCQkJCi0JCQlpZiAoIXVybC5lbmRzV2l0aCgiLyIpKQotCQkJCXVybCArPSAiLyI7Ci0JCQkKLQkJCXJldHVybiBuZXcgVVJMKHVybCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3QgZ2V0IHJvb3QgVVJMIiwgZSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcHJvY2VzcyBpcyBzZXQgdG8gcnVuIGluIGRlYnVnIG1vZGUuCi0JICogVGhpcyBmZWF0dXJlIG9ubHkgd29ya3Mgd2l0aCBUb21jYXQgdjQuMC4KLQkgKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGVidWcoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoUFJPUEVSVFlfREVCVUcsIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBpcyBhIHRlc3QgKHJ1biBjb2RlIG91dCBvZiB0aGUgd29ya2JlbmNoKSBzZXJ2ZXIuCi0JICoKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Rlc3RFbnZpcm9ubWVudCgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZShQUk9QRVJUWV9URVNUX0VOVklST05NRU5ULCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBwcm9jZXNzIGlzIHNldCB0byBydW4gaW4gc2VjdXJlIG1vZGUuCi0JICoKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NlY3VyZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZShQUk9QRVJUWV9TRUNVUkUsIGZhbHNlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgcmVuZGVyQ29tbWFuZExpbmUoU3RyaW5nW10gY29tbWFuZExpbmUsIFN0cmluZyBzZXBhcmF0b3IpIHsKLQkJaWYgKGNvbW1hbmRMaW5lID09IG51bGwgfHwgY29tbWFuZExpbmUubGVuZ3RoIDwgMSkKLQkJCXJldHVybiAiIjsKLQkJU3RyaW5nQnVmZmVyIGJ1Zj0gbmV3IFN0cmluZ0J1ZmZlcihjb21tYW5kTGluZVswXSk7Ci0JCWZvciAoaW50IGkgPSAxOyBpIDwgY29tbWFuZExpbmUubGVuZ3RoOyBpKyspIHsKLQkJCWJ1Zi5hcHBlbmQoc2VwYXJhdG9yKTsKLQkJCWJ1Zi5hcHBlbmQoY29tbWFuZExpbmVbaV0pOwotCQl9CQotCQlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoKLQkgKiBSZXR1cm5zIHRoZSBjaGlsZCBtb2R1bGUocykgb2YgdGhpcyBtb2R1bGUuCi0JICovCi0JcHVibGljIElNb2R1bGVbXSBnZXRDaGlsZE1vZHVsZXMoSU1vZHVsZVtdIG1vZHVsZSkgewotCQlpZiAobW9kdWxlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCUlNb2R1bGVUeXBlIG1vZHVsZVR5cGUgPSBtb2R1bGVbMF0uZ2V0TW9kdWxlVHlwZSgpOwotCQkKLQkJaWYgKG1vZHVsZS5sZW5ndGggPT0gMSAmJiBtb2R1bGVUeXBlICE9IG51bGwgJiYgImpzdC53ZWIiLmVxdWFscyhtb2R1bGVUeXBlLmdldElkKCkpKSB7Ci0JCQlJV2ViTW9kdWxlIHdlYk1vZHVsZSA9IChJV2ViTW9kdWxlKSBtb2R1bGVbMF0ubG9hZEFkYXB0ZXIoSVdlYk1vZHVsZS5jbGFzcywgbnVsbCk7Ci0JCQlpZiAod2ViTW9kdWxlICE9IG51bGwpIHsKLQkJCQlJTW9kdWxlW10gbW9kdWxlcyA9IHdlYk1vZHVsZS5nZXRNb2R1bGVzKCk7Ci0JCQkJLy9pZiAobW9kdWxlcyAhPSBudWxsKQotCQkJCS8vCVN5c3RlbS5vdXQucHJpbnRsbihtb2R1bGVzLmxlbmd0aCk7Ci0JCQkJcmV0dXJuIG1vZHVsZXM7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5ldyBJTW9kdWxlWzBdOwotCX0KLQotCS8qCi0JICogUmV0dXJucyB0aGUgcm9vdCBtb2R1bGUocykgb2YgdGhpcyBtb2R1bGUuCi0JICovCi0JcHVibGljIElNb2R1bGVbXSBnZXRSb290TW9kdWxlcyhJTW9kdWxlIG1vZHVsZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoImpzdC53ZWIiLmVxdWFscyhtb2R1bGUuZ2V0TW9kdWxlVHlwZSgpLmdldElkKCkpKSB7Ci0JCQlJU3RhdHVzIHN0YXR1cyA9IGNhbk1vZGlmeU1vZHVsZXMobmV3IElNb2R1bGVbXSB7IG1vZHVsZSB9LCBudWxsKTsKLQkJCWlmIChzdGF0dXMgPT0gbnVsbCB8fCAhc3RhdHVzLmlzT0soKSkKLQkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihzdGF0dXMpOwotCQkJcmV0dXJuIG5ldyBJTW9kdWxlW10geyBtb2R1bGUgfTsKLQkJfQotCQkKLQkJcmV0dXJuIEoyRUVVdGlsLmdldFdlYk1vZHVsZXMobW9kdWxlLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIHByb2plY3QgaXMgc3VwcG9ydGVkIGJ5IHRoaXMKLQkgKiBzZXJ2ZXIsIGFuZCBmYWxzZSBvdGhlcndpc2UuCi0JICoKLQkgKiBAcGFyYW0gYWRkIG1vZHVsZXMKLQkgKiBAcGFyYW0gcmVtb3ZlIG1vZHVsZXMKLQkgKiBAcmV0dXJuIHRoZSBzdGF0dXMKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBjYW5Nb2RpZnlNb2R1bGVzKElNb2R1bGVbXSBhZGQsIElNb2R1bGVbXSByZW1vdmUpIHsKLQkJaWYgKGFkZCAhPSBudWxsKSB7Ci0JCQlpbnQgc2l6ZSA9IGFkZC5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCUlNb2R1bGUgbW9kdWxlID0gYWRkW2ldOwotCQkJCWlmICghImpzdC53ZWIiLmVxdWFscyhtb2R1bGUuZ2V0TW9kdWxlVHlwZSgpLmdldElkKCkpKQotCQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBUb21jYXRQbHVnaW4uUExVR0lOX0lELCAwLCBNZXNzYWdlcy5lcnJvcldlYk1vZHVsZXNPbmx5LCBudWxsKTsKLQkJCQkKLQkJCQlpZiAoZ2V0VG9tY2F0VmVyc2lvbkhhbmRsZXIoKSA9PSBudWxsKQotCQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBUb21jYXRQbHVnaW4uUExVR0lOX0lELCAwLCBNZXNzYWdlcy5lcnJvck5vUnVudGltZSwgbnVsbCk7Ci0JCQkJCi0JCQkJSVN0YXR1cyBzdGF0dXMgPSBnZXRUb21jYXRWZXJzaW9uSGFuZGxlcigpLmNhbkFkZE1vZHVsZShtb2R1bGUpOwotCQkJCWlmIChzdGF0dXMgIT0gbnVsbCAmJiAhc3RhdHVzLmlzT0soKSkKLQkJCQkJcmV0dXJuIHN0YXR1czsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JcHVibGljIFNlcnZlclBvcnRbXSBnZXRTZXJ2ZXJQb3J0cygpIHsKLQkJaWYgKGdldFNlcnZlcigpLmdldFNlcnZlckNvbmZpZ3VyYXRpb24oKSA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBTZXJ2ZXJQb3J0WzBdOwotCQkKLQkJdHJ5IHsKLQkJCUxpc3QgbGlzdCA9IGdldFRvbWNhdENvbmZpZ3VyYXRpb24oKS5nZXRTZXJ2ZXJQb3J0cygpOwotCQkJU2VydmVyUG9ydFtdIHNwID0gbmV3IFNlcnZlclBvcnRbbGlzdC5zaXplKCldOwotCQkJbGlzdC50b0FycmF5KHNwKTsKLQkJCXJldHVybiBzcDsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBuZXcgU2VydmVyUG9ydFswXTsgCi0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0cyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJc2V0VGVzdEVudmlyb25tZW50KHRydWUpOwotCQlzZXRBdHRyaWJ1dGUoImF1dG8tcHVibGlzaC1zZXR0aW5nIiwgMik7Ci0JCXNldEF0dHJpYnV0ZSgiYXV0by1wdWJsaXNoLXRpbWUiLCAxKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoaXMgcHJvY2VzcyB0byBkZWJ1ZyBtb2RlLiBUaGlzIGZlYXR1cmUgb25seSB3b3JrcwotCSAqIHdpdGggVG9tY2F0IHY0LjAuCi0JICoKLQkgKiBAcGFyYW0gYiBib29sZWFuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVidWcoYm9vbGVhbiBiKSB7Ci0JCXNldEF0dHJpYnV0ZShQUk9QRVJUWV9ERUJVRywgYik7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGlzIHByb2Nlc3MgdG8gc2VjdXJlIG1vZGUuCi0JICogQHBhcmFtIGIgYm9vbGVhbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlY3VyZShib29sZWFuIGIpIHsKLQkJc2V0QXR0cmlidXRlKFBST1BFUlRZX1NFQ1VSRSwgYik7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGlzIHNlcnZlciB0byB0ZXN0IGVudmlyb25tZW50IG1vZGUuCi0JICogCi0JICogQHBhcmFtIGIgYm9vbGVhbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRlc3RFbnZpcm9ubWVudChib29sZWFuIGIpIHsKLQkJc2V0QXR0cmlidXRlKFBST1BFUlRZX1RFU1RfRU5WSVJPTk1FTlQsIGIpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIFNlcnZlckRlbGVnYXRlI21vZGlmeU1vZHVsZXMoSU1vZHVsZVtdLCBJTW9kdWxlW10sIElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgbW9kaWZ5TW9kdWxlcyhJTW9kdWxlW10gYWRkLCBJTW9kdWxlW10gcmVtb3ZlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVN0YXR1cyBzdGF0dXMgPSBjYW5Nb2RpZnlNb2R1bGVzKGFkZCwgcmVtb3ZlKTsKLQkJaWYgKHN0YXR1cyA9PSBudWxsIHx8ICFzdGF0dXMuaXNPSygpKQotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oc3RhdHVzKTsKLQkJCi0JCVRvbWNhdENvbmZpZ3VyYXRpb24gY29uZmlnID0gZ2V0VG9tY2F0Q29uZmlndXJhdGlvbigpOwotCQkKLQkJaWYgKGFkZCAhPSBudWxsKSB7Ci0JCQlpbnQgc2l6ZSA9IGFkZC5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCUlNb2R1bGUgbW9kdWxlMyA9IGFkZFtpXTsKLQkJCQlJV2ViTW9kdWxlIG1vZHVsZSA9IChJV2ViTW9kdWxlKSBtb2R1bGUzLmxvYWRBZGFwdGVyKElXZWJNb2R1bGUuY2xhc3MsIG1vbml0b3IpOwotCQkJCVN0cmluZyBjb250ZXh0Um9vdCA9IG1vZHVsZS5nZXRDb250ZXh0Um9vdCgpOwotCQkJCWlmIChjb250ZXh0Um9vdCAhPSBudWxsICYmICFjb250ZXh0Um9vdC5zdGFydHNXaXRoKCIvIikgJiYgY29udGV4dFJvb3QubGVuZ3RoKCkgPiAwKQotCQkJCQljb250ZXh0Um9vdCA9ICIvIiArIGNvbnRleHRSb290OwotCQkJCVN0cmluZyBkb2NCYXNlID0gY29uZmlnLmdldERvY0Jhc2VQcmVmaXgoKSArIG1vZHVsZTMuZ2V0TmFtZSgpOwotCQkJCVdlYk1vZHVsZSBtb2R1bGUyID0gbmV3IFdlYk1vZHVsZShjb250ZXh0Um9vdCwgZG9jQmFzZSwgbW9kdWxlMy5nZXRJZCgpLCB0cnVlKTsKLQkJCQljb25maWcuYWRkV2ViTW9kdWxlKC0xLCBtb2R1bGUyKTsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKHJlbW92ZSAhPSBudWxsKSB7Ci0JCQlpbnQgc2l6ZTIgPSByZW1vdmUubGVuZ3RoOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBzaXplMjsgaisrKSB7Ci0JCQkJSU1vZHVsZSBtb2R1bGUzID0gcmVtb3ZlW2pdOwotCQkJCVN0cmluZyBtZW1lbnRvID0gbW9kdWxlMy5nZXRJZCgpOwotCQkJCUxpc3QgbW9kdWxlcyA9IGdldFRvbWNhdENvbmZpZ3VyYXRpb24oKS5nZXRXZWJNb2R1bGVzKCk7Ci0JCQkJaW50IHNpemUgPSBtb2R1bGVzLnNpemUoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCQlXZWJNb2R1bGUgbW9kdWxlID0gKFdlYk1vZHVsZSkgbW9kdWxlcy5nZXQoaSk7Ci0JCQkJCWlmIChtZW1lbnRvLmVxdWFscyhtb2R1bGUuZ2V0TWVtZW50bygpKSkKLQkJCQkJCWNvbmZpZy5yZW1vdmVXZWJNb2R1bGUoaSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vY29uZmlnLnNhdmUoY29uZmlnLmdldEZvbGRlcigpLCBtb25pdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJUb21jYXRTZXJ2ZXIiOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1RvbWNhdFNlcnZlckJlaGF2aW91ci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9Ub21jYXRTZXJ2ZXJCZWhhdmlvdXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzIzYzZmMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1RvbWNhdFNlcnZlckJlaGF2aW91ci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotoCoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JUnVudGltZUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSVZNSW5zdGFsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkphdmFSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5QdWJsaXNoVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLklNb2R1bGVQdWJsaXNoSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5TZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnV0aWwuU29ja2V0VXRpbDsKLS8qKgotICogR2VuZXJpYyBUb21jYXQgc2VydmVyLgotICovCi1wdWJsaWMgY2xhc3MgVG9tY2F0U2VydmVyQmVoYXZpb3VyIGV4dGVuZHMgU2VydmVyQmVoYXZpb3VyRGVsZWdhdGUgaW1wbGVtZW50cyBJVG9tY2F0U2VydmVyQmVoYXZpb3VyLCBJTW9kdWxlUHVibGlzaEhlbHBlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfU1RPUCA9ICJzdG9wLXNlcnZlciI7Ci0KLQkvLyB0aGUgdGhyZWFkIHVzZWQgdG8gcGluZyB0aGUgc2VydmVyIHRvIGNoZWNrIGZvciBzdGFydHVwCi0JcHJvdGVjdGVkIHRyYW5zaWVudCBQaW5nVGhyZWFkIHBpbmcgPSBudWxsOwotCXByb3RlY3RlZCB0cmFuc2llbnQgSVByb2Nlc3MgcHJvY2VzczsKLQlwcm90ZWN0ZWQgdHJhbnNpZW50IElEZWJ1Z0V2ZW50U2V0TGlzdGVuZXIgcHJvY2Vzc0xpc3RlbmVyOwotCi0JLyoqCi0JICogVG9tY2F0U2VydmVyQmVoYXZpb3VyLgotCSAqLwotCXB1YmxpYyBUb21jYXRTZXJ2ZXJCZWhhdmlvdXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyBUb21jYXRSdW50aW1lIGdldFRvbWNhdFJ1bnRpbWUoKSB7Ci0JCWlmIChnZXRTZXJ2ZXIoKS5nZXRSdW50aW1lKCkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkKLQkJcmV0dXJuIChUb21jYXRSdW50aW1lKSBnZXRTZXJ2ZXIoKS5nZXRSdW50aW1lKCkubG9hZEFkYXB0ZXIoVG9tY2F0UnVudGltZS5jbGFzcywgbnVsbCk7Ci0JfQotCi0JcHVibGljIElUb21jYXRWZXJzaW9uSGFuZGxlciBnZXRUb21jYXRWZXJzaW9uSGFuZGxlcigpIHsKLQkJaWYgKGdldFNlcnZlcigpLmdldFJ1bnRpbWUoKSA9PSBudWxsIHx8IGdldFRvbWNhdFJ1bnRpbWUoKSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJcmV0dXJuIGdldFRvbWNhdFJ1bnRpbWUoKS5nZXRWZXJzaW9uSGFuZGxlcigpOwotCX0KLQotCXB1YmxpYyBUb21jYXRDb25maWd1cmF0aW9uIGdldFRvbWNhdENvbmZpZ3VyYXRpb24oKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRUb21jYXRTZXJ2ZXIoKS5nZXRUb21jYXRDb25maWd1cmF0aW9uKCk7Ci0JfQotCi0JcHVibGljIFRvbWNhdFNlcnZlciBnZXRUb21jYXRTZXJ2ZXIoKSB7Ci0JCXJldHVybiAoVG9tY2F0U2VydmVyKSBnZXRTZXJ2ZXIoKS5sb2FkQWRhcHRlcihUb21jYXRTZXJ2ZXIuY2xhc3MsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcnVudGltZSBjbGFzcyBuYW1lLgotCSAqCi0JICogQHJldHVybiB0aGUgY2xhc3MgbmFtZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UnVudGltZUNsYXNzKCkgewotCQlyZXR1cm4gZ2V0VG9tY2F0VmVyc2lvbkhhbmRsZXIoKS5nZXRSdW50aW1lQ2xhc3MoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcnVudGltZSBiYXNlIHBhdGggZm9yIHJlbGF0aXZlIHBhdGhzIGluIHRoZSBzZXJ2ZXIKLQkgKiBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGJhc2UgcGF0aAotCSAqLwotCXB1YmxpYyBJUGF0aCBnZXRSdW50aW1lQmFzZURpcmVjdG9yeSgpIHsKLQkJcmV0dXJuIGdldFRvbWNhdFZlcnNpb25IYW5kbGVyKCkuZ2V0UnVudGltZUJhc2VEaXJlY3RvcnkodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwcm9ncmFtJ3MgcnVudGltZSBhcmd1bWVudHMgdG8gc3RhcnQgb3Igc3RvcC4KLQkgKgotCSAqIEBwYXJhbSBzdGFydGluZyB0cnVlIGlmIHN0YXJ0aW5nCi0JICogQHJldHVybiBhbiBhcnJheSBvZiBydW50aW1lIHByb2dyYW0gYXJndW1lbnRzCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldFJ1bnRpbWVQcm9ncmFtQXJndW1lbnRzKGJvb2xlYW4gc3RhcnRpbmcpIHsKLQkJSVBhdGggY29uZmlnUGF0aCA9IG51bGw7Ci0JCWlmIChnZXRUb21jYXRTZXJ2ZXIoKS5pc1Rlc3RFbnZpcm9ubWVudCgpKQotCQkJY29uZmlnUGF0aCA9IGdldFRlbXBEaXJlY3RvcnkoKTsKLQkJcmV0dXJuIGdldFRvbWNhdFZlcnNpb25IYW5kbGVyKCkuZ2V0UnVudGltZVByb2dyYW1Bcmd1bWVudHMoY29uZmlnUGF0aCwgZ2V0VG9tY2F0U2VydmVyKCkuaXNEZWJ1ZygpLCBzdGFydGluZyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBydW50aW1lIChWTSkgYXJndW1lbnRzLgotCSAqCi0JICogQHJldHVybiBhbiBhcnJheSBvZiBydW50aW1lIGFyZ3VtZW50cwotCSAqLwotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRSdW50aW1lVk1Bcmd1bWVudHMoKSB7Ci0JCUlQYXRoIGluc3RhbGxQYXRoID0gZ2V0U2VydmVyKCkuZ2V0UnVudGltZSgpLmdldExvY2F0aW9uKCk7Ci0JCUlQYXRoIGNvbmZpZ1BhdGggPSBudWxsOwotCQlpZiAoZ2V0VG9tY2F0U2VydmVyKCkuaXNUZXN0RW52aXJvbm1lbnQoKSkKLQkJCWNvbmZpZ1BhdGggPSBnZXRUZW1wRGlyZWN0b3J5KCk7Ci0JCWVsc2UKLQkJCWNvbmZpZ1BhdGggPSBpbnN0YWxsUGF0aDsKLQkJcmV0dXJuIGdldFRvbWNhdFZlcnNpb25IYW5kbGVyKCkuZ2V0UnVudGltZVZNQXJndW1lbnRzKGluc3RhbGxQYXRoLCBjb25maWdQYXRoLAotCQkJCWdldFRvbWNhdFNlcnZlcigpLmlzVGVzdEVudmlyb25tZW50KCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFJ1bnRpbWVQb2xpY3lGaWxlKCkgewotCQlJUGF0aCBjb25maWdQYXRoOwotCQlpZiAoZ2V0VG9tY2F0U2VydmVyKCkuaXNUZXN0RW52aXJvbm1lbnQoKSkKLQkJCWNvbmZpZ1BhdGggPSBnZXRUZW1wRGlyZWN0b3J5KCk7Ci0JCWVsc2UKLQkJCWNvbmZpZ1BhdGggPSBnZXRTZXJ2ZXIoKS5nZXRSdW50aW1lKCkuZ2V0TG9jYXRpb24oKTsKLQkJcmV0dXJuIGdldFRvbWNhdFZlcnNpb25IYW5kbGVyKCkuZ2V0UnVudGltZVBvbGljeUZpbGUoY29uZmlnUGF0aCk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIHJlbmRlckNvbW1hbmRMaW5lKFN0cmluZ1tdIGNvbW1hbmRMaW5lLCBTdHJpbmcgc2VwYXJhdG9yKSB7Ci0JCWlmIChjb21tYW5kTGluZSA9PSBudWxsIHx8IGNvbW1hbmRMaW5lLmxlbmd0aCA8IDEpCi0JCQlyZXR1cm4gIiI7Ci0JCVN0cmluZ0J1ZmZlciBidWY9IG5ldyBTdHJpbmdCdWZmZXIoY29tbWFuZExpbmVbMF0pOwotCQlmb3IgKGludCBpID0gMTsgaSA8IGNvbW1hbmRMaW5lLmxlbmd0aDsgaSsrKSB7Ci0JCQlidWYuYXBwZW5kKHNlcGFyYXRvcik7Ci0JCQlidWYuYXBwZW5kKGNvbW1hbmRMaW5lW2ldKTsKLQkJfQkKLQkJcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFByb2Nlc3MoZmluYWwgSVByb2Nlc3MgbmV3UHJvY2VzcykgewotCQlpZiAocHJvY2VzcyAhPSBudWxsKQotCQkJcmV0dXJuOwotCi0JCXByb2Nlc3MgPSBuZXdQcm9jZXNzOwotCQlpZiAocHJvY2Vzc0xpc3RlbmVyICE9IG51bGwpCi0JCQlEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCkucmVtb3ZlRGVidWdFdmVudExpc3RlbmVyKHByb2Nlc3NMaXN0ZW5lcik7Ci0JCWlmIChuZXdQcm9jZXNzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQlwcm9jZXNzTGlzdGVuZXIgPSBuZXcgSURlYnVnRXZlbnRTZXRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZURlYnVnRXZlbnRzKERlYnVnRXZlbnRbXSBldmVudHMpIHsKLQkJCQlpZiAoZXZlbnRzICE9IG51bGwpIHsKLQkJCQkJaW50IHNpemUgPSBldmVudHMubGVuZ3RoOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCQkJaWYgKHByb2Nlc3MgIT0gbnVsbCAmJiBwcm9jZXNzLmVxdWFscyhldmVudHNbaV0uZ2V0U291cmNlKCkpICYmIGV2ZW50c1tpXS5nZXRLaW5kKCkgPT0gRGVidWdFdmVudC5URVJNSU5BVEUpIHsKLQkJCQkJCQlEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCkucmVtb3ZlRGVidWdFdmVudExpc3RlbmVyKHRoaXMpOwotCQkJCQkJCXN0b3BJbXBsKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCURlYnVnUGx1Z2luLmdldERlZmF1bHQoKS5hZGREZWJ1Z0V2ZW50TGlzdGVuZXIocHJvY2Vzc0xpc3RlbmVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTZXJ2ZXJTdGFydGVkKCkgewotCQlzZXRTZXJ2ZXJTdGF0ZShJU2VydmVyLlNUQVRFX1NUQVJURUQpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN0b3BJbXBsKCkgewotCQlpZiAocGluZyAhPSBudWxsKSB7Ci0JCQlwaW5nLnN0b3AoKTsKLQkJCXBpbmcgPSBudWxsOwotCQl9Ci0JCWlmIChwcm9jZXNzICE9IG51bGwpIHsKLQkJCXByb2Nlc3MgPSBudWxsOwotCQkJRGVidWdQbHVnaW4uZ2V0RGVmYXVsdCgpLnJlbW92ZURlYnVnRXZlbnRMaXN0ZW5lcihwcm9jZXNzTGlzdGVuZXIpOwotCQkJcHJvY2Vzc0xpc3RlbmVyID0gbnVsbDsKLQkJfQotCQlzZXRTZXJ2ZXJTdGF0ZShJU2VydmVyLlNUQVRFX1NUT1BQRUQpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHB1Ymxpc2hTZXJ2ZXIoaW50IGtpbmQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoZ2V0U2VydmVyKCkuZ2V0UnVudGltZSgpID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJSVBhdGggaW5zdGFsbERpciA9IGdldFNlcnZlcigpLmdldFJ1bnRpbWUoKS5nZXRMb2NhdGlvbigpOwotCQlJUGF0aCBjb25mRGlyID0gbnVsbDsKLQkJaWYgKGdldFRvbWNhdFNlcnZlcigpLmlzVGVzdEVudmlyb25tZW50KCkpIHsKLQkJCWNvbmZEaXIgPSBnZXRUZW1wRGlyZWN0b3J5KCk7Ci0JCQlJU3RhdHVzIHN0YXR1cyA9IGdldFRvbWNhdENvbmZpZ3VyYXRpb24oKS5wcmVwYXJlUnVudGltZURpcmVjdG9yeShjb25mRGlyKTsKLQkJCWlmIChzdGF0dXMgIT0gbnVsbCAmJiAhc3RhdHVzLmlzT0soKSkKLQkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihzdGF0dXMpOwotLyoJCQlGaWxlIHRlbXAgPSBjb25mRGlyLmFwcGVuZCgiY29uZiIpLnRvRmlsZSgpOwotCQkJaWYgKCF0ZW1wLmV4aXN0cygpKQotCQkJCXRlbXAubWtkaXJzKCk7Ki8KLQkJfSBlbHNlCi0JCQljb25mRGlyID0gaW5zdGFsbERpcjsKLQotCQltb25pdG9yID0gUHJvZ3Jlc3NVdGlsLmdldE1vbml0b3JGb3IobW9uaXRvcik7Ci0JCW1vbml0b3IuYmVnaW5UYXNrKE1lc3NhZ2VzLnB1Ymxpc2hTZXJ2ZXJUYXNrLCA2MDApOwotCQkKLQkJSVN0YXR1cyBzdGF0dXMgPSBnZXRUb21jYXRDb25maWd1cmF0aW9uKCkuY2xlYW51cFNlcnZlcihjb25mRGlyLCBpbnN0YWxsRGlyLCBQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yLCAxMDApKTsKLQkJaWYgKHN0YXR1cyAhPSBudWxsICYmICFzdGF0dXMuaXNPSygpKQotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oc3RhdHVzKTsKLQkJCi0JCXN0YXR1cyA9IGdldFRvbWNhdENvbmZpZ3VyYXRpb24oKS5iYWNrdXBBbmRQdWJsaXNoKGNvbmZEaXIsICFnZXRUb21jYXRTZXJ2ZXIoKS5pc1Rlc3RFbnZpcm9ubWVudCgpLCBQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yLCA0MDApKTsKLQkJaWYgKHN0YXR1cyAhPSBudWxsICYmICFzdGF0dXMuaXNPSygpKQotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oc3RhdHVzKTsKLQkJCi0JCWdldFRvbWNhdENvbmZpZ3VyYXRpb24oKS5sb2NhbGl6ZUNvbmZpZ3VyYXRpb24oY29uZkRpci5hcHBlbmQoImNvbmYiKSwgZ2V0VG9tY2F0U2VydmVyKCksIFByb2dyZXNzVXRpbC5nZXRTdWJNb25pdG9yRm9yKG1vbml0b3IsIDEwMCkpOwotCQkKLQkJbW9uaXRvci5kb25lKCk7Ci0JCQotCQlzZXRTZXJ2ZXJQdWJsaXNoU3RhdGUoSVNlcnZlci5QVUJMSVNIX1NUQVRFX05PTkUpOwotCX0KLQotCS8qCi0JICogUHVibGlzaGVzIHRoZSBnaXZlbiBtb2R1bGUgdG8gdGhlIHNlcnZlci4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwdWJsaXNoTW9kdWxlKGludCBraW5kLCBpbnQgZGVsdGFLaW5kLCBJTW9kdWxlW10gbW9kdWxlVHJlZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChnZXRTZXJ2ZXIoKS5nZXRTZXJ2ZXJTdGF0ZSgpICE9IElTZXJ2ZXIuU1RBVEVfU1RPUFBFRCkgewotCQkJaWYgKGRlbHRhS2luZCA9PSBTZXJ2ZXJCZWhhdmlvdXJEZWxlZ2F0ZS5BRERFRCB8fCBkZWx0YUtpbmQgPT0gU2VydmVyQmVoYXZpb3VyRGVsZWdhdGUuUkVNT1ZFRCkKLQkJCQlzZXRTZXJ2ZXJSZXN0YXJ0U3RhdGUodHJ1ZSk7Ci0JCX0KLQkJaWYgKGdldFRvbWNhdFNlcnZlcigpLmlzVGVzdEVudmlyb25tZW50KCkpCi0JCQlyZXR1cm47Ci0KLQkJSVBhdGggcGF0aCA9IGdldFRlbXBEaXJlY3RvcnkoKS5hcHBlbmQoInB1Ymxpc2gudHh0Iik7Ci0JCVByb3BlcnRpZXMgcCA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCUZpbGVJbnB1dFN0cmVhbSBmaW4gPSBudWxsOwotCQl0cnkgewotCQkJZmluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShwYXRoLnRvRmlsZSgpKTsKLQkJCXAubG9hZChmaW4pOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCWZpbi5jbG9zZSgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCX0KLQkJCi0JCWlmIChtb2R1bGVUcmVlLmxlbmd0aCA9PSAxKSAvLyB3ZWIgbW9kdWxlCi0JCQlwdWJsaXNoRGlyKGRlbHRhS2luZCwgcCwgbW9kdWxlVHJlZSwgbW9uaXRvcik7Ci0JCWVsc2UgLy8gdXRpbGl0eSBqYXIKLQkJCXB1Ymxpc2hKYXIoa2luZCwgZGVsdGFLaW5kLCBwLCBtb2R1bGVUcmVlLCBtb25pdG9yKTsKLQkJCi0JCXNldE1vZHVsZVB1Ymxpc2hTdGF0ZShtb2R1bGVUcmVlLCBJU2VydmVyLlBVQkxJU0hfU1RBVEVfTk9ORSk7Ci0JCQotCQl0cnkgewotCQkJcC5zdG9yZShuZXcgRmlsZU91dHB1dFN0cmVhbShwYXRoLnRvRmlsZSgpKSwgIlRvbWNhdCBwdWJsaXNoIGRhdGEiKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JfQotCi0JLyoqCi0JICogUHVibGlzaCBhIHdlYiBtb2R1bGUuCi0JICogCi0JICogQHBhcmFtIGRlbHRhS2luZAotCSAqIEBwYXJhbSBwCi0JICogQHBhcmFtIG1vZHVsZQotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIHB1Ymxpc2hEaXIoaW50IGRlbHRhS2luZCwgUHJvcGVydGllcyBwLCBJTW9kdWxlIG1vZHVsZVtdLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGRlbHRhS2luZCA9PSBSRU1PVkVEKSB7Ci0JCQl0cnkgewotCQkJCVN0cmluZyBwdWJsaXNoUGF0aCA9IChTdHJpbmcpIHAuZ2V0KG1vZHVsZVswXS5nZXRJZCgpKTsKLQkJCQlQdWJsaXNoVXRpbC5kZWxldGVEaXJlY3RvcnkobmV3IEZpbGUocHVibGlzaFBhdGgpLCBtb25pdG9yKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsIDAsICJDb3VsZCBub3QgcmVtb3ZlIG1vZHVsZSIsIGUpKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCUlQYXRoIHRvID0gZ2V0U2VydmVyKCkuZ2V0UnVudGltZSgpLmdldExvY2F0aW9uKCkuYXBwZW5kKCJ3ZWJhcHBzIikuYXBwZW5kKG1vZHVsZVswXS5nZXROYW1lKCkpOwotCQkJSU1vZHVsZVJlc291cmNlW10gbXIgPSBnZXRSZXNvdXJjZXMobW9kdWxlKTsKLQkJCVB1Ymxpc2hVdGlsLnNtYXJ0Q29weShtciwgdG8sIG1vbml0b3IpOwotCQkJcC5wdXQobW9kdWxlWzBdLmdldElkKCksIHRvLnRvT1NTdHJpbmcoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQdWJsaXNoIGEgamFyIGZpbGUuCi0JICogCi0JICogQHBhcmFtIGRlbHRhS2luZAotCSAqIEBwYXJhbSBwCi0JICogQHBhcmFtIG1vZHVsZQotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIHB1Ymxpc2hKYXIoaW50IGtpbmQsIGludCBkZWx0YUtpbmQsIFByb3BlcnRpZXMgcCwgSU1vZHVsZVtdIG1vZHVsZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChkZWx0YUtpbmQgPT0gUkVNT1ZFRCkgewotCQkJdHJ5IHsKLQkJCQlTdHJpbmcgcHVibGlzaFBhdGggPSAoU3RyaW5nKSBwLmdldChtb2R1bGVbMV0uZ2V0SWQoKSk7Ci0JCQkJbmV3IEZpbGUocHVibGlzaFBhdGgpLmRlbGV0ZSgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgVG9tY2F0UGx1Z2luLlBMVUdJTl9JRCwgMCwgIkNvdWxkIG5vdCByZW1vdmUgbW9kdWxlIiwgZSkpOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKGtpbmQgIT0gSVNlcnZlci5QVUJMSVNIX0NMRUFOICYmIGtpbmQgIT0gSVNlcnZlci5QVUJMSVNIX0ZVTEwpIHsKLQkJCQkvLyBhdm9pZCBjaGFuZ2VzIGlmIG5vIGNoYW5nZXMgdG8gbW9kdWxlIHNpbmNlIGxhc3QgcHVibGlzaAotCQkJCUlNb2R1bGVSZXNvdXJjZURlbHRhW10gZGVsdGEgPSBnZXRQdWJsaXNoZWRSZXNvdXJjZURlbHRhKG1vZHVsZSk7Ci0JCQkJaWYgKGRlbHRhID09IG51bGwgfHwgZGVsdGEubGVuZ3RoID09IDApCi0JCQkJCXJldHVybjsKLQkJCX0KLQkJCQotCQkJSVBhdGggcGF0aCA9IGdldFNlcnZlcigpLmdldFJ1bnRpbWUoKS5nZXRMb2NhdGlvbigpLmFwcGVuZCgid2ViYXBwcyIpLmFwcGVuZChtb2R1bGVbMF0uZ2V0TmFtZSgpKTsKLQkJCXBhdGggPSBwYXRoLmFwcGVuZCgiV0VCLUlORiIpLmFwcGVuZCgibGliIik7Ci0JCQlpZiAoIXBhdGgudG9GaWxlKCkuZXhpc3RzKCkpCi0JCQkJcGF0aC50b0ZpbGUoKS5ta2RpcnMoKTsKLQkJCQotCQkJSU1vZHVsZVJlc291cmNlW10gbXIgPSBnZXRSZXNvdXJjZXMobW9kdWxlKTsKLQkJCVB1Ymxpc2hVdGlsLmNyZWF0ZVppcEZpbGUobXIsIHBhdGguYXBwZW5kKG1vZHVsZVsxXS5nZXROYW1lKCkgKyAiLmphciIpKTsKLQkJCXAucHV0KG1vZHVsZVsxXS5nZXRJZCgpLCBwYXRoLnRvT1NTdHJpbmcoKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwdWJsaXNoRmluaXNoKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJUGF0aCBiYXNlRGlyOwotCQlpZiAoZ2V0VG9tY2F0U2VydmVyKCkuaXNUZXN0RW52aXJvbm1lbnQoKSkKLQkJCWJhc2VEaXIgPSBnZXRUZW1wRGlyZWN0b3J5KCk7Ci0JCWVsc2UKLQkJCWJhc2VEaXIgPSBnZXRTZXJ2ZXIoKS5nZXRSdW50aW1lKCkuZ2V0TG9jYXRpb24oKTsKLQotCQkvLyBQdWJsaXNoIGNvbnRleHQgY29uZmlndXJhdGlvbiBmb3Igc2VydmVycyB0aGF0IHN1cHBvcnQgTUVUQS1JTkYvY29udGV4dC54bWwKLQkJSVN0YXR1cyBzdGF0dXMgPSBnZXRUb21jYXRDb25maWd1cmF0aW9uKCkucHVibGlzaENvbnRleHRDb25maWcoYmFzZURpciwgbW9uaXRvcik7Ci0JCWlmICghc3RhdHVzLmlzT0soKSkKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKHN0YXR1cyk7Ci0JfQotCi0JLyoqCi0JICogU2V0dXAgZm9yIHN0YXJ0aW5nIHRoZSBzZXJ2ZXIuCi0JICogCi0JICogQHBhcmFtIGxhdW5jaCBJTGF1bmNoCi0JICogQHBhcmFtIGxhdW5jaE1vZGUgU3RyaW5nCi0JICogQHBhcmFtIG1vbml0b3IgSVByb2dyZXNzTW9uaXRvcgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiBhbnl0aGluZyBnb2VzIHdyb25nCi0JICovCi0JcHVibGljIHZvaWQgc2V0dXBMYXVuY2goSUxhdW5jaCBsYXVuY2gsIFN0cmluZyBsYXVuY2hNb2RlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKCJ0cnVlIi5lcXVhbHMobGF1bmNoLmdldExhdW5jaENvbmZpZ3VyYXRpb24oKS5nZXRBdHRyaWJ1dGUoQVRUUl9TVE9QLCAiZmFsc2UiKSkpCi0JCQlyZXR1cm47Ci0JCS8vaWYgKGdldFRvbWNhdFJ1bnRpbWUoKSA9PSBudWxsKQotCQkvLwl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbigpOwotCQkKLQkJSVN0YXR1cyBzdGF0dXMgPSBnZXRUb21jYXRSdW50aW1lKCkudmFsaWRhdGUoKTsKLQkJaWYgKHN0YXR1cyAhPSBudWxsICYmIHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpCi0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihzdGF0dXMpOwotCi0JCS8vc2V0UmVzdGFydE5lZWRlZChmYWxzZSk7Ci0JCVRvbWNhdENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IGdldFRvbWNhdENvbmZpZ3VyYXRpb24oKTsKLQkKLQkJLy8gY2hlY2sgdGhhdCBwb3J0cyBhcmUgZnJlZQotCQlJdGVyYXRvciBpdGVyYXRvciA9IGNvbmZpZ3VyYXRpb24uZ2V0U2VydmVyUG9ydHMoKS5pdGVyYXRvcigpOwotCQlMaXN0IHVzZWRQb3J0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJU2VydmVyUG9ydCBzcCA9IChTZXJ2ZXJQb3J0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoc3AuZ2V0UG9ydCgpIDwgMCkKLQkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsIDAsIE1lc3NhZ2VzLmVycm9yUG9ydEludmFsaWQsIG51bGwpKTsKLQkJCWlmIChTb2NrZXRVdGlsLmlzUG9ydEluVXNlKHNwLmdldFBvcnQoKSwgNSkpIHsKLQkJCQl1c2VkUG9ydHMuYWRkKHNwKTsKLQkJCX0KLQkJfQotCQlpZiAodXNlZFBvcnRzLnNpemUoKSA9PSAxKSB7Ci0JCQlTZXJ2ZXJQb3J0IHBvcnQgPSAoU2VydmVyUG9ydCkgdXNlZFBvcnRzLmdldCgwKTsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgVG9tY2F0UGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JQb3J0SW5Vc2UsIG5ldyBTdHJpbmdbXSB7cG9ydC5nZXRQb3J0KCkgKyAiIiwgZ2V0U2VydmVyKCkuZ2V0TmFtZSgpfSksIG51bGwpKTsKLQkJfSBlbHNlIGlmICh1c2VkUG9ydHMuc2l6ZSgpID4gMSkgewotCQkJU3RyaW5nIHBvcnRTdHIgPSAiIjsKLQkJCWl0ZXJhdG9yID0gdXNlZFBvcnRzLml0ZXJhdG9yKCk7Ci0JCQlib29sZWFuIGZpcnN0ID0gdHJ1ZTsKLQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlpZiAoIWZpcnN0KQotCQkJCQlwb3J0U3RyICs9ICIsICI7Ci0JCQkJZmlyc3QgPSBmYWxzZTsKLQkJCQlTZXJ2ZXJQb3J0IHNwID0gKFNlcnZlclBvcnQpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlwb3J0U3RyICs9ICIiICsgc3AuZ2V0UG9ydCgpOwotCQkJfQotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBUb21jYXRQbHVnaW4uUExVR0lOX0lELCAwLCBOTFMuYmluZChNZXNzYWdlcy5lcnJvclBvcnRzSW5Vc2UsIG5ldyBTdHJpbmdbXSB7cG9ydFN0ciwgZ2V0U2VydmVyKCkuZ2V0TmFtZSgpfSksIG51bGwpKTsKLQkJfQotCQkKLQkJLy8gY2hlY2sgdGhhdCB0aGVyZSBpcyBvbmx5IG9uZSBhcHAgZm9yIGVhY2ggY29udGV4dCByb290Ci0JCWl0ZXJhdG9yID0gY29uZmlndXJhdGlvbi5nZXRXZWJNb2R1bGVzKCkuaXRlcmF0b3IoKTsKLQkJTGlzdCBjb250ZXh0Um9vdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVdlYk1vZHVsZSBtb2R1bGUgPSAoV2ViTW9kdWxlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlTdHJpbmcgY29udGV4dFJvb3QgPSBtb2R1bGUuZ2V0UGF0aCgpOwotCQkJaWYgKGNvbnRleHRSb290cy5jb250YWlucyhjb250ZXh0Um9vdCkpCi0JCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBUb21jYXRQbHVnaW4uUExVR0lOX0lELCAwLCBOTFMuYmluZChNZXNzYWdlcy5lcnJvckR1cGxpY2F0ZUNvbnRleHRSb290LCBuZXcgU3RyaW5nW10geyBjb250ZXh0Um9vdCB9KSwgbnVsbCkpOwotCQkJCi0JCQljb250ZXh0Um9vdHMuYWRkKGNvbnRleHRSb290KTsKLQkJfQotCQkKLQkJc2V0U2VydmVyUmVzdGFydFN0YXRlKGZhbHNlKTsKLQkJc2V0U2VydmVyU3RhdGUoSVNlcnZlci5TVEFURV9TVEFSVElORyk7Ci0JCXNldE1vZGUobGF1bmNoTW9kZSk7Ci0JCi0JCS8vIHBpbmcgc2VydmVyIHRvIGNoZWNrIGZvciBzdGFydHVwCi0JCXRyeSB7Ci0JCQlTdHJpbmcgdXJsID0gImh0dHA6Ly9sb2NhbGhvc3QiOwotCQkJaW50IHBvcnQgPSBjb25maWd1cmF0aW9uLmdldE1haW5Qb3J0KCkuZ2V0UG9ydCgpOwotCQkJaWYgKHBvcnQgIT0gODApCi0JCQkJdXJsICs9ICI6IiArIHBvcnQ7Ci0JCQlwaW5nID0gbmV3IFBpbmdUaHJlYWQoZ2V0U2VydmVyKCksIHVybCwgNTAsIHRoaXMpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ2FuJ3QgcGluZyBmb3IgVG9tY2F0IHN0YXJ0dXAuIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDbGVhbmx5IHNodXRzIGRvd24gYW5kIHRlcm1pbmF0ZXMgdGhlIHNlcnZlci4KLQkgKiAKLQkgKiBAcGFyYW0gZm9yY2UgPGNvZGU+dHJ1ZTwvY29kZT4gdG8ga2lsbCB0aGUgc2VydmVyCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChib29sZWFuIGZvcmNlKSB7Ci0JCWlmIChmb3JjZSkgewotCQkJdGVybWluYXRlKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaW50IHN0YXRlID0gZ2V0U2VydmVyKCkuZ2V0U2VydmVyU3RhdGUoKTsKLQkJaWYgKHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfU1RPUFBFRCkKLQkJCXJldHVybjsKLQkJZWxzZSBpZiAoc3RhdGUgPT0gSVNlcnZlci5TVEFURV9TVEFSVElORyB8fCBzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1NUT1BQSU5HKSB7Ci0JCQl0ZXJtaW5hdGUoKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCXRyeSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FUiwgIlN0b3BwaW5nIFRvbWNhdCIpOwotCQkJaWYgKHN0YXRlICE9IElTZXJ2ZXIuU1RBVEVfU1RPUFBFRCkKLQkJCQlzZXRTZXJ2ZXJTdGF0ZShJU2VydmVyLlNUQVRFX1NUT1BQSU5HKTsKLQkKLQkJCUlMYXVuY2hDb25maWd1cmF0aW9uIGxhdW5jaENvbmZpZyA9ICgoU2VydmVyKWdldFNlcnZlcigpKS5nZXRMYXVuY2hDb25maWd1cmF0aW9uKHRydWUsIG51bGwpOwotCQkJSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSB3YyA9IGxhdW5jaENvbmZpZy5nZXRXb3JraW5nQ29weSgpOwotCQkJCi0JCQlTdHJpbmcgYXJncyA9IHJlbmRlckNvbW1hbmRMaW5lKGdldFJ1bnRpbWVQcm9ncmFtQXJndW1lbnRzKGZhbHNlKSwgIiAiKTsKLQkJCXdjLnNldEF0dHJpYnV0ZShJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9QUk9HUkFNX0FSR1VNRU5UUywgYXJncyk7Ci0JCQl3Yy5zZXRBdHRyaWJ1dGUoQVRUUl9TVE9QLCAidHJ1ZSIpOwotCQkJd2MubGF1bmNoKElMYXVuY2hNYW5hZ2VyLlJVTl9NT0RFLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIHN0b3BwaW5nIFRvbWNhdCIsIGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGVybWluYXRlcyB0aGUgc2VydmVyLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRlcm1pbmF0ZSgpIHsKLQkJaWYgKGdldFNlcnZlcigpLmdldFNlcnZlclN0YXRlKCkgPT0gSVNlcnZlci5TVEFURV9TVE9QUEVEKQotCQkJcmV0dXJuOwotCi0JCXRyeSB7Ci0JCQlzZXRTZXJ2ZXJTdGF0ZShJU2VydmVyLlNUQVRFX1NUT1BQSU5HKTsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVSLCAiS2lsbGluZyB0aGUgVG9tY2F0IHByb2Nlc3MiKTsKLQkJCWlmIChwcm9jZXNzICE9IG51bGwgJiYgIXByb2Nlc3MuaXNUZXJtaW5hdGVkKCkpIHsKLQkJCQlwcm9jZXNzLnRlcm1pbmF0ZSgpOwotCQkJCXN0b3BJbXBsKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBraWxsaW5nIHRoZSBwcm9jZXNzIiwgZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSVBhdGggZ2V0VGVtcERpcmVjdG9yeSgpIHsKLQkJcmV0dXJuIHN1cGVyLmdldFRlbXBEaXJlY3RvcnkoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJUb21jYXRTZXJ2ZXIiOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIGludCBnZXROZXh0VG9rZW4oU3RyaW5nIHMsIGludCBzdGFydCkgewotCQlpbnQgaSA9IHN0YXJ0OwotCQlpbnQgbGVuZ3RoID0gcy5sZW5ndGgoKTsKLQkJY2hhciBsb29rRm9yID0gJyAnOwotCQkKLQkJd2hpbGUgKGkgPCBsZW5ndGgpIHsKLQkJCWNoYXIgYyA9IHMuY2hhckF0KGkpOwotCQkJaWYgKGxvb2tGb3IgPT0gYykgewotCQkJCWlmIChsb29rRm9yID09ICciJykKLQkJCQkJcmV0dXJuIGkrMTsKLQkJCQlyZXR1cm4gaTsKLQkJCX0KLQkJCWlmIChjID09ICciJykKLQkJCQlsb29rRm9yID0gJyInOwotCQkJaSsrOwotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0JCi0JLyoqCi0JICogTWVyZ2UgdGhlIGdpdmVuIGFyZ3VtZW50cyBpbnRvIHRoZSBvcmlnaW5hbCBhcmd1bWVudCBzdHJpbmcsIHJlcGxhY2luZwotCSAqIGludmFsaWQgdmFsdWVzIGlmIHRoZXkgaGF2ZSBiZWVuIGNoYW5nZWQuCi0JICogCi0JICogQHBhcmFtIG9yaWdpbmFsQXJnCi0JICogQHBhcmFtIHZtQXJncwotCSAqIEByZXR1cm4gbWVyZ2VkIGFyZ3VtZW50IHN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1lcmdlQXJndW1lbnRzKFN0cmluZyBvcmlnaW5hbEFyZywgU3RyaW5nW10gdm1BcmdzKSB7Ci0JCWlmICh2bUFyZ3MgPT0gbnVsbCkKLQkJCXJldHVybiBvcmlnaW5hbEFyZzsKLQkJCi0JCWlmIChvcmlnaW5hbEFyZyA9PSBudWxsKQotCQkJb3JpZ2luYWxBcmcgPSAiIjsKLQkJCi0JCS8vIHJlcGxhY2UgYW5kIG51bGwgb3V0IGFsbCB2bWFyZ3MgdGhhdCBhbHJlYWR5IGV4aXN0Ci0JCWludCBzaXplID0gdm1BcmdzLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCWludCBpbmQgPSB2bUFyZ3NbaV0uaW5kZXhPZigiICIpOwotCQkJaW50IGluZDIgPSB2bUFyZ3NbaV0uaW5kZXhPZigiPSIpOwotCQkJaWYgKGluZCA+PSAwICYmIChpbmQyID09IC0xIHx8IGluZCA8IGluZDIpKSB7IC8vIC1hIGJjIHN0eWxlCi0JCQkJaW50IGluZGV4ID0gb3JpZ2luYWxBcmcuaW5kZXhPZih2bUFyZ3NbaV0uc3Vic3RyaW5nKDAsIGluZCArIDEpKTsKLQkJCQlpZiAoaW5kZXggPT0gMCB8fCAoaW5kZXggPiAwICYmIG9yaWdpbmFsQXJnLmNoYXJBdChpbmRleCAtIDEpID09ICcgJykpIHsKLQkJCQkJLy8gcmVwbGFjZQotCQkJCQlTdHJpbmcgcyA9IG9yaWdpbmFsQXJnLnN1YnN0cmluZygwLCBpbmRleCk7Ci0JCQkJCWludCBpbmRleDIgPSBnZXROZXh0VG9rZW4ob3JpZ2luYWxBcmcsIGluZGV4ICsgaW5kICsgMSk7Ci0JCQkJCWlmIChpbmRleDIgPj0gMCkKLQkJCQkJCW9yaWdpbmFsQXJnID0gcyArIHZtQXJnc1tpXSArIG9yaWdpbmFsQXJnLnN1YnN0cmluZyhpbmRleDIpOwotCQkJCQllbHNlCi0JCQkJCQlvcmlnaW5hbEFyZyA9IHMgKyB2bUFyZ3NbaV07Ci0JCQkJCXZtQXJnc1tpXSA9IG51bGw7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChpbmQyID49IDApIHsgLy8gYT1iIHN0eWxlCi0JCQkJaW50IGluZGV4ID0gb3JpZ2luYWxBcmcuaW5kZXhPZih2bUFyZ3NbaV0uc3Vic3RyaW5nKDAsIGluZDIgKyAxKSk7Ci0JCQkJaWYgKGluZGV4ID09IDAgfHwgKGluZGV4ID4gMCAmJiBvcmlnaW5hbEFyZy5jaGFyQXQoaW5kZXggLSAxKSA9PSAnICcpKSB7Ci0JCQkJCS8vIHJlcGxhY2UKLQkJCQkJU3RyaW5nIHMgPSBvcmlnaW5hbEFyZy5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCQkJCQlpbnQgaW5kZXgyID0gZ2V0TmV4dFRva2VuKG9yaWdpbmFsQXJnLCBpbmRleCk7Ci0JCQkJCWlmIChpbmRleDIgPj0gMCkKLQkJCQkJCW9yaWdpbmFsQXJnID0gcyArIHZtQXJnc1tpXSArIG9yaWdpbmFsQXJnLnN1YnN0cmluZyhpbmRleDIpOwotCQkJCQllbHNlCi0JCQkJCQlvcmlnaW5hbEFyZyA9IHMgKyB2bUFyZ3NbaV07Ci0JCQkJCXZtQXJnc1tpXSA9IG51bGw7Ci0JCQkJfQotCQkJfSBlbHNlIHsgLy8gYWJjIHN0eWxlCi0JCQkJaW50IGluZGV4ID0gb3JpZ2luYWxBcmcuaW5kZXhPZih2bUFyZ3NbaV0pOwotCQkJCWlmIChpbmRleCA9PSAwIHx8IChpbmRleCA+IDAgJiYgb3JpZ2luYWxBcmcuY2hhckF0KGluZGV4LTEpID09ICcgJykpIHsKLQkJCQkJLy8gcmVwbGFjZQotCQkJCQlTdHJpbmcgcyA9IG9yaWdpbmFsQXJnLnN1YnN0cmluZygwLCBpbmRleCk7Ci0JCQkJCWludCBpbmRleDIgPSBnZXROZXh0VG9rZW4ob3JpZ2luYWxBcmcsIGluZGV4KTsKLQkJCQkJaWYgKGluZGV4MiA+PSAwKQotCQkJCQkJb3JpZ2luYWxBcmcgPSBzICsgdm1BcmdzW2ldICsgb3JpZ2luYWxBcmcuc3Vic3RyaW5nKGluZGV4Mik7Ci0JCQkJCWVsc2UKLQkJCQkJCW9yaWdpbmFsQXJnID0gcyArIHZtQXJnc1tpXTsKLQkJCQkJdm1BcmdzW2ldID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIGFkZCByZW1haW5pbmcgdm1hcmdzIHRvIHRoZSBlbmQKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCWlmICh2bUFyZ3NbaV0gIT0gbnVsbCkgewotCQkJCWlmIChvcmlnaW5hbEFyZy5sZW5ndGgoKSA+IDAgJiYgIW9yaWdpbmFsQXJnLmVuZHNXaXRoKCIgIikpCi0JCQkJCW9yaWdpbmFsQXJnICs9ICIgIjsKLQkJCQlvcmlnaW5hbEFyZyArPSB2bUFyZ3NbaV07Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBvcmlnaW5hbEFyZzsKLQl9Ci0KLQkvKioKLQkgKiBSZXBsYWNlIHRoZSBjdXJyZW50IEpSRSBjb250YWluZXIgY2xhc3NwYXRoIHdpdGggdGhlIGdpdmVuIGVudHJ5LgotCSAqIAotCSAqIEBwYXJhbSBjcAotCSAqIEBwYXJhbSBlbnRyeQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZXBsYWNlSlJFQ29udGFpbmVyKExpc3QgY3AsIElSdW50aW1lQ2xhc3NwYXRoRW50cnkgZW50cnkpIHsKLQkJaW50IHNpemUgPSBjcC5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlJUnVudGltZUNsYXNzcGF0aEVudHJ5IGVudHJ5MiA9IChJUnVudGltZUNsYXNzcGF0aEVudHJ5KSBjcC5nZXQoaSk7Ci0JCQlpZiAoZW50cnkyLmdldFBhdGgoKS51cHRvU2VnbWVudCgyKS5pc1ByZWZpeE9mKGVudHJ5LmdldFBhdGgoKSkpIHsKLQkJCQljcC5zZXQoaSwgZW50cnkpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQkKLQkJY3AuYWRkKDAsIGVudHJ5KTsKLQl9Ci0KLQkvKioKLQkgKiBNZXJnZSBhIHNpbmdsZSBjbGFzc3BhdGggZW50cnkgaW50byB0aGUgY2xhc3NwYXRoIGxpc3QuCi0JICogCi0JICogQHBhcmFtIGNwCi0JICogQHBhcmFtIGVudHJ5Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1lcmdlQ2xhc3NwYXRoKExpc3QgY3AsIElSdW50aW1lQ2xhc3NwYXRoRW50cnkgZW50cnkpIHsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBjcC5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlJUnVudGltZUNsYXNzcGF0aEVudHJ5IGVudHJ5MiA9IChJUnVudGltZUNsYXNzcGF0aEVudHJ5KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkKLQkJCWlmIChlbnRyeTIuZ2V0UGF0aCgpLmVxdWFscyhlbnRyeS5nZXRQYXRoKCkpKQotCQkJCXJldHVybjsKLQkJfQotCQkKLQkJY3AuYWRkKGVudHJ5KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXR1cExhdW5jaENvbmZpZ3VyYXRpb24oSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSB3b3JraW5nQ29weSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBleGlzdGluZ1Byb2dBcmdzID0gd29ya2luZ0NvcHkuZ2V0QXR0cmlidXRlKElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1BST0dSQU1fQVJHVU1FTlRTLCAoU3RyaW5nKW51bGwpOwotCQl3b3JraW5nQ29weS5zZXRBdHRyaWJ1dGUoSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfUFJPR1JBTV9BUkdVTUVOVFMsIG1lcmdlQXJndW1lbnRzKGV4aXN0aW5nUHJvZ0FyZ3MsIGdldFJ1bnRpbWVQcm9ncmFtQXJndW1lbnRzKHRydWUpKSk7Ci0KLQkJU3RyaW5nIGV4aXN0aW5nVk1BcmdzID0gd29ya2luZ0NvcHkuZ2V0QXR0cmlidXRlKElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1ZNX0FSR1VNRU5UUywgKFN0cmluZyludWxsKTsKLQkJU3RyaW5nW10gcGFyc2VkVk1BcmdzID0gbnVsbDsKLQkJaWYgKG51bGwgIT0gZXhpc3RpbmdWTUFyZ3MpIHsKLQkJCXBhcnNlZFZNQXJncyA9IERlYnVnUGx1Z2luLnBhcnNlQXJndW1lbnRzKGV4aXN0aW5nVk1BcmdzKTsKLQkJfQotCQlTdHJpbmcgW10gY29uZmlnVk1BcmdzID0gZ2V0UnVudGltZVZNQXJndW1lbnRzKCk7Ci0JCWlmIChnZXRUb21jYXRTZXJ2ZXIoKS5pc1NlY3VyZSgpKSB7Ci0JCQlib29sZWFuIGFkZFNlY3VyaXR5QXJncyA9IHRydWU7Ci0JCQlpZiAobnVsbCAhPSBwYXJzZWRWTUFyZ3MpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlZFZNQXJncy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAocGFyc2VkVk1BcmdzW2ldLnN0YXJ0c1dpdGgoInd0cC5jb25maWd1cmVkLnNlY3VyaXR5IikpIHsKLQkJCQkJCWFkZFNlY3VyaXR5QXJncyA9IGZhbHNlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoYWRkU2VjdXJpdHlBcmdzKSB7Ci0JCQkJU3RyaW5nIFtdIG5ld1ZNQXJncyA9IG5ldyBTdHJpbmcgW2NvbmZpZ1ZNQXJncy5sZW5ndGggKyAzXTsKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KGNvbmZpZ1ZNQXJncywgMCwgbmV3Vk1BcmdzLCAwLCBjb25maWdWTUFyZ3MubGVuZ3RoKTsKLQkJCQluZXdWTUFyZ3NbY29uZmlnVk1BcmdzLmxlbmd0aF0gPSAiLURqYXZhLnNlY3VyaXR5Lm1hbmFnZXIiOwotCQkJCW5ld1ZNQXJnc1tjb25maWdWTUFyZ3MubGVuZ3RoICsgMV0gPSAiLURqYXZhLnNlY3VyaXR5LnBvbGljeT1cIiIKLQkJCQkJCSsgZ2V0UnVudGltZVBvbGljeUZpbGUoKSArIlwiIjsKLQkJCQluZXdWTUFyZ3NbY29uZmlnVk1BcmdzLmxlbmd0aCArIDJdID0gIi1Ed3RwLmNvbmZpZ3VyZWQuc2VjdXJpdHk9dHJ1ZSI7Ci0JCQkJY29uZmlnVk1BcmdzID0gbmV3Vk1BcmdzOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKG51bGwgIT0gcGFyc2VkVk1BcmdzKXsKLQkJCWJvb2xlYW4gcmVtb3ZlU2VjdXJpdHlBcmdzID0gZmFsc2U7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlZFZNQXJncy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChwYXJzZWRWTUFyZ3NbaV0uc3RhcnRzV2l0aCgiLUR3dHAuY29uZmlndXJlZC5zZWN1cml0eSIpKSB7Ci0JCQkJCXJlbW92ZVNlY3VyaXR5QXJncyA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWlmIChyZW1vdmVTZWN1cml0eUFyZ3MpIHsKLQkJCQlTdHJpbmdCdWZmZXIgZmlsdGVyZWRWTUFyZ3MgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZWRWTUFyZ3MubGVuZ3RoOyBpKyspIHsKLQkJCQkJU3RyaW5nIGFyZyA9IHBhcnNlZFZNQXJnc1tpXTsKLQkJCQkJaWYgKCFhcmcuc3RhcnRzV2l0aCgiLURqYXZhLnNlY3VyaXR5Lm1hbmFnZXIiKQotCQkJCQkJCSYmICFhcmcuc3RhcnRzV2l0aCgiLURqYXZhLnNlY3VyaXR5LnBvbGljeT0iKQotCQkJCQkJCSYmICFhcmcuc3RhcnRzV2l0aCgiLUR3dHAuY29uZmlndXJlZC5zZWN1cml0eT0iKSkgewotCQkJCQkJaWYgKGZpbHRlcmVkVk1BcmdzLmxlbmd0aCgpID4gMCkgewotCQkJCQkJCWZpbHRlcmVkVk1BcmdzLmFwcGVuZCgnICcpOwotCQkJCQkJfQotCQkJCQkJZmlsdGVyZWRWTUFyZ3MuYXBwZW5kKGFyZyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZXhpc3RpbmdWTUFyZ3MgPSBmaWx0ZXJlZFZNQXJncy50b1N0cmluZygpOwotCQkJfQotCQl9Ci0JCXdvcmtpbmdDb3B5LnNldEF0dHJpYnV0ZShJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9WTV9BUkdVTUVOVFMsIG1lcmdlQXJndW1lbnRzKGV4aXN0aW5nVk1BcmdzLCBjb25maWdWTUFyZ3MpKTsKLQkJCi0JCUlUb21jYXRSdW50aW1lIHJ1bnRpbWUgPSBnZXRUb21jYXRSdW50aW1lKCk7Ci0JCUlWTUluc3RhbGwgdm1JbnN0YWxsID0gcnVudGltZS5nZXRWTUluc3RhbGwoKTsKLQkJaWYgKHZtSW5zdGFsbCAhPSBudWxsKSB7Ci0JCQl3b3JraW5nQ29weS5zZXRBdHRyaWJ1dGUoSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfVk1fSU5TVEFMTF9UWVBFLCB2bUluc3RhbGwuZ2V0Vk1JbnN0YWxsVHlwZSgpLmdldElkKCkpOwotCQkJd29ya2luZ0NvcHkuc2V0QXR0cmlidXRlKElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1ZNX0lOU1RBTExfTkFNRSwgdm1JbnN0YWxsLmdldE5hbWUoKSk7Ci0JCX0KLQkJCi0JCS8vIHVwZGF0ZSBjbGFzc3BhdGgKLQkJSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeVtdIG9yaWdpbmFsQ2xhc3NwYXRoID0gSmF2YVJ1bnRpbWUuY29tcHV0ZVVucmVzb2x2ZWRSdW50aW1lQ2xhc3NwYXRoKHdvcmtpbmdDb3B5KTsKLQkJaW50IHNpemUgPSBvcmlnaW5hbENsYXNzcGF0aC5sZW5ndGg7Ci0JCUxpc3Qgb2xkQ3AgPSBuZXcgQXJyYXlMaXN0KG9yaWdpbmFsQ2xhc3NwYXRoLmxlbmd0aCArIDIpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLQkJCW9sZENwLmFkZChvcmlnaW5hbENsYXNzcGF0aFtpXSk7Ci0JCQotCQlMaXN0IGNwMiA9IHJ1bnRpbWUuZ2V0UnVudGltZUNsYXNzcGF0aCgpOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IGNwMi5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlJUnVudGltZUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gKElSdW50aW1lQ2xhc3NwYXRoRW50cnkpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCW1lcmdlQ2xhc3NwYXRoKG9sZENwLCBlbnRyeSk7Ci0JCX0KLQkJCi0JCWlmICh2bUluc3RhbGwgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlTdHJpbmcgdHlwZUlkID0gdm1JbnN0YWxsLmdldFZNSW5zdGFsbFR5cGUoKS5nZXRJZCgpOwotCQkJCXJlcGxhY2VKUkVDb250YWluZXIob2xkQ3AsIEphdmFSdW50aW1lLm5ld1J1bnRpbWVDb250YWluZXJDbGFzc3BhdGhFbnRyeShuZXcgUGF0aChKYXZhUnVudGltZS5KUkVfQ09OVEFJTkVSKS5hcHBlbmQodHlwZUlkKS5hcHBlbmQodm1JbnN0YWxsLmdldE5hbWUoKSksIElSdW50aW1lQ2xhc3NwYXRoRW50cnkuQk9PVFNUUkFQX0NMQVNTRVMpKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCQkKLQkJCUlQYXRoIGpyZVBhdGggPSBuZXcgUGF0aCh2bUluc3RhbGwuZ2V0SW5zdGFsbExvY2F0aW9uKCkuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJaWYgKGpyZVBhdGggIT0gbnVsbCkgewotCQkJCUlQYXRoIHRvb2xzUGF0aCA9IGpyZVBhdGguYXBwZW5kKCJsaWIiKS5hcHBlbmQoInRvb2xzLmphciIpOwotCQkJCWlmICh0b29sc1BhdGgudG9GaWxlKCkuZXhpc3RzKCkpIHsKLQkJCQkJSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeSB0b29sc0phciA9IEphdmFSdW50aW1lLm5ld0FyY2hpdmVSdW50aW1lQ2xhc3NwYXRoRW50cnkodG9vbHNQYXRoKTsKLQkJCQkJLy8gU2VhcmNoIGZvciBpbmRleCB0byBhbnkgZXhpc3RpbmcgdG9vbHMuamFyIGVudHJ5Ci0JCQkJCWludCB0b29sc0luZGV4OwotCQkJCQlmb3IgKHRvb2xzSW5kZXggPSAwOyB0b29sc0luZGV4IDwgb2xkQ3Auc2l6ZSgpOyB0b29sc0luZGV4KysgKSB7Ci0JCQkJCQlJUnVudGltZUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gKElSdW50aW1lQ2xhc3NwYXRoRW50cnkpIG9sZENwLmdldCh0b29sc0luZGV4KTsKLQkJCQkJCWlmIChlbnRyeS5nZXRUeXBlKCkgPT0gSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeS5BUkNISVZFCi0JCQkJCQkJCSYmIGVudHJ5LmdldFBhdGgoKS5sYXN0U2VnbWVudCgpLmVxdWFscygidG9vbHMuamFyIikpIHsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkvLyBJZiBleGlzdGluZyB0b29scy5qYXIgZm91bmQsIHJlcGxhY2UgaW4gY2FzZSBpdCdzIGRpZmZlcmVudC4gIE90aGVyd2lzZSBhZGQuCi0JCQkJCWlmICh0b29sc0luZGV4IDwgb2xkQ3Auc2l6ZSgpKQotCQkJCQkJb2xkQ3Auc2V0KHRvb2xzSW5kZXgsIHRvb2xzSmFyKTsgCi0JCQkJCWVsc2UKLQkJCQkJCW1lcmdlQ2xhc3NwYXRoKG9sZENwLCB0b29sc0phcik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlpdGVyYXRvciA9IG9sZENwLml0ZXJhdG9yKCk7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IChJUnVudGltZUNsYXNzcGF0aEVudHJ5KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQl0cnkgewotCQkJCWxpc3QuYWRkKGVudHJ5LmdldE1lbWVudG8oKSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCByZXNvbHZlIGNsYXNzcGF0aCBlbnRyeTogIiArIGVudHJ5LCBlKTsKLQkJCX0KLQkJfQotCQkKLQkJd29ya2luZ0NvcHkuc2V0QXR0cmlidXRlKElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX0NMQVNTUEFUSCwgbGlzdCk7Ci0JCXdvcmtpbmdDb3B5LnNldEF0dHJpYnV0ZShJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9ERUZBVUxUX0NMQVNTUEFUSCwgZmFsc2UpOwotCX0KLQotCXByb3RlY3RlZCBJTW9kdWxlUmVzb3VyY2VbXSBnZXRSZXNvdXJjZXMoSU1vZHVsZVtdIG1vZHVsZSkgewotCQlyZXR1cm4gc3VwZXIuZ2V0UmVzb3VyY2VzKG1vZHVsZSk7Ci0JfQotCi0JcHJvdGVjdGVkIElNb2R1bGVSZXNvdXJjZURlbHRhW10gZ2V0UHVibGlzaGVkUmVzb3VyY2VEZWx0YShJTW9kdWxlW10gbW9kdWxlKSB7Ci0JCXJldHVybiBzdXBlci5nZXRQdWJsaXNoZWRSZXNvdXJjZURlbHRhKG1vZHVsZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBTZXJ2ZXJCZWhhdmlvdXJEZWxlZ2F0ZSNoYW5kbGVSZXNvdXJjZUNoYW5nZSgpCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlUmVzb3VyY2VDaGFuZ2UoKSB7Ci0JCWlmIChnZXRTZXJ2ZXIoKS5nZXRTZXJ2ZXJSZXN0YXJ0U3RhdGUoKSkKLQkJCXJldHVybjsKLQkJCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZ2V0QWxsTW9kdWxlcygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCUlNb2R1bGVbXSBtb2R1bGUgPSAoSU1vZHVsZVtdKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlJTW9kdWxlUmVzb3VyY2VEZWx0YVtdIGRlbHRhID0gZ2V0UHVibGlzaGVkUmVzb3VyY2VEZWx0YShtb2R1bGUpOwotCQkJaWYgKGRlbHRhID09IG51bGwgfHwgZGVsdGEubGVuZ3RoID09IDApCi0JCQkJY29udGludWU7Ci0JCQkKLQkJCWlmIChjb250YWluc05vblJlc291cmNlQ2hhbmdlKGRlbHRhKSkgewotCQkJCXNldFNlcnZlclJlc3RhcnRTdGF0ZSh0cnVlKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjb250YWluc05vblJlc291cmNlQ2hhbmdlKElNb2R1bGVSZXNvdXJjZURlbHRhW10gZGVsdGEpIHsKLQkJaW50IHNpemUgPSBkZWx0YS5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlJTW9kdWxlUmVzb3VyY2VEZWx0YSBkID0gZGVsdGFbaV07Ci0JCQlpZiAoZC5nZXRNb2R1bGVSZWxhdGl2ZVBhdGgoKS5zZWdtZW50Q291bnQoKSA9PSAwKSB7Ci0JCQkJaWYgKCJXRUItSU5GIi5lcXVhbHMoZC5nZXRNb2R1bGVSZXNvdXJjZSgpLmdldE5hbWUoKSkpIHsKLQkJCQkJcmV0dXJuIGNvbnRhaW5zTm9uUmVzb3VyY2VDaGFuZ2UoZC5nZXRBZmZlY3RlZENoaWxkcmVuKCkpOwotCQkJCX0KLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmIChkLmdldE1vZHVsZVJlc291cmNlKCkgaW5zdGFuY2VvZiBJTW9kdWxlRmlsZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQotCQkJYm9vbGVhbiBiID0gY29udGFpbnNOb25BZGRDaGFuZ2UoZC5nZXRBZmZlY3RlZENoaWxkcmVuKCkpOwotCQkJaWYgKGIpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGNvbnRhaW5zTm9uQWRkQ2hhbmdlKElNb2R1bGVSZXNvdXJjZURlbHRhW10gZGVsdGEpIHsKLQkJaWYgKGRlbHRhID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWludCBzaXplID0gZGVsdGEubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJSU1vZHVsZVJlc291cmNlRGVsdGEgZCA9IGRlbHRhW2ldOwotCQkJaWYgKGQuZ2V0TW9kdWxlUmVzb3VyY2UoKSBpbnN0YW5jZW9mIElNb2R1bGVGaWxlKSB7Ci0JCQkJaWYgKGQuZ2V0S2luZCgpICE9IElNb2R1bGVSZXNvdXJjZURlbHRhLkFEREVEKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCQotCQkJYm9vbGVhbiBiID0gY29udGFpbnNOb25BZGRDaGFuZ2UoZC5nZXRBZmZlY3RlZENoaWxkcmVuKCkpOwotCQkJaWYgKGIpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFRlbXBvcmFyeSBtZXRob2QgdG8gaGVscCB3ZWIgc2VydmljZXMgdGVhbS4gUmV0dXJucyB0aGUgcGF0aCB0aGF0IHRoZSBtb2R1bGUgaXMKLQkgKiBwdWJsaXNoZWQgdG8gd2hlbiBpbiB0ZXN0IGVudmlyb25tZW50IG1vZGUuCi0JICogCi0JICogQHBhcmFtIG1vZHVsZSBhIG1vZHVsZSBvbiB0aGUgc2VydmVyIAotCSAqIEByZXR1cm4gdGhlIHBhdGggdGhhdCB0aGUgbW9kdWxlIGlzIHB1Ymxpc2hlZCB0byB3aGVuIGluIHRlc3QgZW52aXJvbm1lbnQgbW9kZSwKLQkgKiAgICBvciBudWxsIGlmIG5vdCBydW5uaW5nIGFzIGEgdGVzdCBlbnZpcm9ubWVudCBvciB0aGUgbW9kdWxlIGlzIG5vdCBhIHdlYiBtb2R1bGUKLQkgKi8KLQlwdWJsaWMgSVBhdGggZ2V0UHVibGlzaERpcmVjdG9yeShJTW9kdWxlW10gbW9kdWxlKSB7Ci0JCWlmICghZ2V0VG9tY2F0U2VydmVyKCkuaXNUZXN0RW52aXJvbm1lbnQoKSB8fCBtb2R1bGUgPT0gbnVsbCB8fCBtb2R1bGUubGVuZ3RoICE9IDEpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCXJldHVybiBnZXRUZW1wRGlyZWN0b3J5KCkuYXBwZW5kKCJ3ZWJhcHBzIikuYXBwZW5kKG1vZHVsZVswXS5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1vZHVsZVB1Ymxpc2hTdGF0ZTIoSU1vZHVsZVtdIG1vZHVsZSwgaW50IHN0YXRlKSB7Ci0JCXNldE1vZHVsZVB1Ymxpc2hTdGF0ZShtb2R1bGUsIHN0YXRlKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9Ub21jYXRTZXJ2ZXJMb2NhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1RvbWNhdFNlcnZlckxvY2F0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjA4NzYxOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1RvbWNhdFNlcnZlckxvY2F0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLlNlcnZlckxvY2F0b3JEZWxlZ2F0ZTsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBUb21jYXRTZXJ2ZXJMb2NhdG9yIGV4dGVuZHMgU2VydmVyTG9jYXRvckRlbGVnYXRlIHsKLQlwdWJsaWMgdm9pZCBzZWFyY2hGb3JTZXJ2ZXJzKFN0cmluZyBob3N0LCBmaW5hbCBJU2VydmVyU2VhcmNoTGlzdGVuZXIgbGlzdGVuZXIsIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlUb21jYXRSdW50aW1lTG9jYXRvci5JUnVudGltZVNlYXJjaExpc3RlbmVyIGxpc3RlbmVyMiA9IG5ldyBUb21jYXRSdW50aW1lTG9jYXRvci5JUnVudGltZVNlYXJjaExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcnVudGltZUZvdW5kKElSdW50aW1lV29ya2luZ0NvcHkgcnVudGltZSkgewotCQkJCVN0cmluZyBydW50aW1lVHlwZUlkID0gcnVudGltZS5nZXRSdW50aW1lVHlwZSgpLmdldElkKCk7Ci0JCQkJU3RyaW5nIHNlcnZlclR5cGVJZCA9IHJ1bnRpbWVUeXBlSWQuc3Vic3RyaW5nKDAsIHJ1bnRpbWVUeXBlSWQubGVuZ3RoKCkgLSA4KTsKLQkJCQlJU2VydmVyVHlwZSBzZXJ2ZXJUeXBlID0gU2VydmVyQ29yZS5maW5kU2VydmVyVHlwZShzZXJ2ZXJUeXBlSWQpOwotCQkJCXRyeSB7Ci0JCQkJCUlTZXJ2ZXJXb3JraW5nQ29weSBzZXJ2ZXIgPSBzZXJ2ZXJUeXBlLmNyZWF0ZVNlcnZlcihzZXJ2ZXJUeXBlSWQsIG51bGwsIHJ1bnRpbWUsIG1vbml0b3IpOwotCQkJCQlsaXN0ZW5lci5zZXJ2ZXJGb3VuZChzZXJ2ZXIpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJDb3VsZCBub3QgY3JlYXRlIFRvbWNhdCBzZXJ2ZXIiLCBlKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCVRvbWNhdFJ1bnRpbWVMb2NhdG9yLnNlYXJjaEZvclJ1bnRpbWVzMihudWxsLCBsaXN0ZW5lcjIsIG1vbml0b3IpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1RvbWNhdFNlcnZlclV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvVG9tY2F0U2VydmVyVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjcyMGU4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvVG9tY2F0U2VydmVyVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLS8qKgotICogSGVscGVyIGNsYXNzIHRvIGxvYWQgYW5kIHNhdmUgVG9tY2F0IHNlcnZlciBhbmQgaWRlbnRpZnkgY29uZmlndXJhdGlvbnMuCi0gKi8KLXB1YmxpYyBjbGFzcyBUb21jYXRTZXJ2ZXJVdGlsIHsKLQkvKioKLQkgKiBUb21jYXRTZXJ2ZXJTZXJpYWxpemVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHJvdGVjdGVkIFRvbWNhdFNlcnZlclV0aWwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGtpbmQgb2YgYSA8Y29kZT5QYWNrYWdlRnJhZ21lbnRSb290PC9jb2RlPiBmcm9tIGl0cyA8Y29kZT5TdHJpbmc8L2NvZGU+IGZvcm0uCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBpbnQgZ2V0Q2xhc3NwYXRoS2luZEZyb21TdHJpbmcoU3RyaW5nIGtpbmRTdHIpIHsKLQkJLy9pZiAoa2luZFN0ci5lcXVhbHNJZ25vcmVDYXNlKCJwcmoiKSkKLQkJLy8JcmV0dXJuIElDbGFzc3BhdGhFbnRyeS5DUEVfUFJPSkVDVDsKLQkJaWYgKGtpbmRTdHIuZXF1YWxzSWdub3JlQ2FzZSgidmFyIikpCi0JCQlyZXR1cm4gSUNsYXNzcGF0aEVudHJ5LkNQRV9WQVJJQUJMRTsKLQkJLy9pZiAoa2luZFN0ci5lcXVhbHNJZ25vcmVDYXNlKCJzcmMiKSkKLQkJLy8JcmV0dXJuIElDbGFzc3BhdGhFbnRyeS5DUEVfU09VUkNFOwotCQlpZiAoa2luZFN0ci5lcXVhbHNJZ25vcmVDYXNlKCJsaWIiKSkKLQkJCXJldHVybiBJQ2xhc3NwYXRoRW50cnkuQ1BFX0xJQlJBUlk7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiBmb3IgdGhlIGtpbmQgb2YgYSBjbGFzcyBwYXRoIGVudHJ5LgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGdldENsYXNzcGF0aEtpbmRUb1N0cmluZyhpbnQga2luZCkgewotCQlzd2l0Y2ggKGtpbmQpIHsKLQkJCS8vY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1BST0pFQ1QgOgotCQkJLy8JcmV0dXJuICJwcmoiOwotCQkJLy9jYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfU09VUkNFIDoKLQkJCS8vCXJldHVybiAic3JjIjsKLQkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9MSUJSQVJZIDoKLQkJCQlyZXR1cm4gImxpYiI7Ci0JCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfVkFSSUFCTEUgOgotCQkJCXJldHVybiAidmFyIjsKLQkJCWRlZmF1bHQgOgotCQkJCXJldHVybiAidW5rbm93biI7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlJ3MgYSBjbGFzc3BhdGggZW50cnkgb2YgdGhlIHNwZWNpZmllZCBraW5kLgotCSAqCi0JICogUmV0dXJucyBudWxsIGlmIHVuYWJsZSB0byBjcmVhdGUgYSB2YWxpZCBlbnRyeS4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIElDbGFzc3BhdGhFbnRyeSBjcmVhdGVDbGFzc3BhdGhFbnRyeShJUGF0aCBwYXRoLCBpbnQga2luZCwgSVBhdGggc291cmNlQXR0YWNobWVudFBhdGgsIElQYXRoIHNvdXJjZUF0dGFjaG1lbnRSb290UGF0aCkgewotCQlzd2l0Y2ggKGtpbmQpIHsKLQkJCS8qY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1BST0pFQ1Q6Ci0JCQkJaWYgKCFwYXRoLmlzQWJzb2x1dGUoKSkKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJZWxzZQotCQkJCQlyZXR1cm4gSmF2YUNvcmUubmV3UHJvamVjdEVudHJ5KHBhdGgpOyovCi0JCi0JCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfTElCUkFSWToKLQkJCQlpZiAoIXBhdGguaXNBYnNvbHV0ZSgpKQotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkKLQkJCQlyZXR1cm4gSmF2YUNvcmUubmV3TGlicmFyeUVudHJ5KHBhdGgsIHNvdXJjZUF0dGFjaG1lbnRQYXRoLCBzb3VyY2VBdHRhY2htZW50Um9vdFBhdGgpOwotCQotCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1ZBUklBQkxFOgotCQkJCXJldHVybiBKYXZhQ29yZS5uZXdWYXJpYWJsZUVudHJ5KHBhdGgsIHNvdXJjZUF0dGFjaG1lbnRQYXRoLCBzb3VyY2VBdHRhY2htZW50Um9vdFBhdGgpOwotCQotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1RvbWNhdFNvdXJjZVBhdGhDb21wdXRlckRlbGVnYXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1RvbWNhdFNvdXJjZVBhdGhDb21wdXRlckRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3M2NmZGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9Ub21jYXRTb3VyY2VQYXRoQ29tcHV0ZXJEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotoCoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuc291cmNlbG9va3VwLklTb3VyY2VDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5zb3VyY2Vsb29rdXAuSVNvdXJjZVBhdGhDb21wdXRlckRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuc291cmNlbG9va3VwLmNvbnRhaW5lcnMuRm9sZGVyU291cmNlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLklSdW50aW1lQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KYXZhUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyVXRpbDsKLS8qKgotICoKLSAqLwotcHVibGljIGNsYXNzIFRvbWNhdFNvdXJjZVBhdGhDb21wdXRlckRlbGVnYXRlIGltcGxlbWVudHMgSVNvdXJjZVBhdGhDb21wdXRlckRlbGVnYXRlIHsKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLnNvdXJjZWxvb2t1cC5JU291cmNlUGF0aENvbXB1dGVyRGVsZWdhdGUjY29tcHV0ZVNvdXJjZUNvbnRhaW5lcnMob3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbiwgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIElTb3VyY2VDb250YWluZXJbXSBjb21wdXRlU291cmNlQ29udGFpbmVycyhJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMgPSBKYXZhUnVudGltZS5jb21wdXRlVW5yZXNvbHZlZFNvdXJjZUxvb2t1cFBhdGgoY29uZmlndXJhdGlvbik7Ci0JCUxpc3Qgc291cmNlZm9sZGVyTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlJU2VydmVyIHNlcnZlciA9IFNlcnZlclV0aWwuZ2V0U2VydmVyKGNvbmZpZ3VyYXRpb24pOwotCQlpZiAoc2VydmVyICE9IG51bGwpIHsKLQkJCS8vSVBhdGggYmFzZVBhdGggPSAoKFRvbWNhdFNlcnZlckJlaGF2aW91cilzZXJ2ZXIuZ2V0QWRhcHRlcihUb21jYXRTZXJ2ZXJCZWhhdmlvdXIuY2xhc3MpKS5nZXRSdW50aW1lQmFzZURpcmVjdG9yeSgpOwotCQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJLy9MaXN0IHBhdGhMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJSU1vZHVsZVtdIG1vZHVsZXMgPSBzZXJ2ZXIuZ2V0TW9kdWxlcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtb2R1bGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSVByb2plY3QgcHJvamVjdCA9IG1vZHVsZXNbaV0uZ2V0UHJvamVjdCgpOwotCQkJCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKLQkJCQkJCi0JCQkJCUlGb2xkZXIgbW9kdWxlRm9sZGVyID0gcHJvamVjdC5nZXRGb2xkZXIobW9kdWxlc1tpXS5nZXROYW1lKCkpOwotCQkJCQlpZiAobW9kdWxlRm9sZGVyLmV4aXN0cygpKSB7Ci0JCQkJCQlzb3VyY2Vmb2xkZXJMaXN0LmFkZChuZXcgRm9sZGVyU291cmNlQ29udGFpbmVyKG1vZHVsZUZvbGRlciwgdHJ1ZSkpOwotCQkJCQl9Ci0JCQkJCQotCQkJCQl0cnkgewotCQkJCQkJaWYgKHByb2plY3QuaGFzTmF0dXJlKEphdmFDb3JlLk5BVFVSRV9JRCkpIHsKLQkJCQkJCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSAoSUphdmFQcm9qZWN0KSBwcm9qZWN0LmdldE5hdHVyZShKYXZhQ29yZS5OQVRVUkVfSUQpOwotCQkJCQkJCWlmICghbGlzdC5jb250YWlucyhqYXZhUHJvamVjdCkpCi0JCQkJCQkJCWxpc3QuYWRkKGphdmFQcm9qZWN0KTsKLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIGlnbm9yZQotCQkJCQl9Ci0JCQkJCQotCQkJCQkvL0lQYXRoIHBhdGggPSBiYXNlUGF0aC5hcHBlbmQoIndvcmsiKS5hcHBlbmQoIkNhdGFsaW5hIikuYXBwZW5kKCJsb2NhbGhvc3QiKS5hcHBlbmQobW9kdWxlc1tpXS5nZXROYW1lKCkpOwotCQkJCQkvL3BhdGhMaXN0LmFkZChwYXRoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpbnQgc2l6ZSA9IGxpc3Quc2l6ZSgpOwotCQkJSUphdmFQcm9qZWN0W10gcHJvamVjdHMgPSBuZXcgSUphdmFQcm9qZWN0W3NpemVdOwotCQkJbGlzdC50b0FycmF5KHByb2plY3RzKTsKLQkJCQotCQkJaW50IHNpemUyID0gZW50cmllcy5sZW5ndGg7Ci0JCQkvL2ludCBzaXplMyA9IHBhdGhMaXN0LnNpemUoKTsKLQkJCUlSdW50aW1lQ2xhc3NwYXRoRW50cnlbXSBlbnRyaWVzMiA9IG5ldyBJUnVudGltZUNsYXNzcGF0aEVudHJ5W3NpemUgKyBzaXplMl07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGVudHJpZXMsIDAsIGVudHJpZXMyLCAwLCBzaXplMik7Ci0JCQkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotCQkJCWVudHJpZXMyW3NpemUyICsgaV0gPSBKYXZhUnVudGltZS5uZXdQcm9qZWN0UnVudGltZUNsYXNzcGF0aEVudHJ5KHByb2plY3RzW2ldKTsKLQkJCQotCQkJLy9mb3IgKGludCBpID0gMDsgaSA8IHNpemUzOyBpKyspCi0JCQkvLwllbnRyaWVzMltzaXplICsgc2l6ZTIgKyBpXSA9IEphdmFSdW50aW1lLm5ld0FyY2hpdmVSdW50aW1lQ2xhc3NwYXRoRW50cnkoKElQYXRoKSBwYXRoTGlzdC5nZXQoaSkpOwotCQkJCi0JCQllbnRyaWVzID0gZW50cmllczI7Ci0JCX0KLQkJCi0JCUlSdW50aW1lQ2xhc3NwYXRoRW50cnlbXSByZXNvbHZlZCA9IEphdmFSdW50aW1lLnJlc29sdmVTb3VyY2VMb29rdXBQYXRoKGVudHJpZXMsIGNvbmZpZ3VyYXRpb24pOwotCQlJU291cmNlQ29udGFpbmVyW10gc291cmNlQ29udGFpbmVycyA9IEphdmFSdW50aW1lLmdldFNvdXJjZUNvbnRhaW5lcnMocmVzb2x2ZWQpOwotCQkKLQkJaWYgKCFzb3VyY2Vmb2xkZXJMaXN0LmlzRW1wdHkoKSkgewotCQkJSVNvdXJjZUNvbnRhaW5lcltdIGNvbWJpbmVkU291cmNlQ29udGFpbmVycyA9IG5ldyBJU291cmNlQ29udGFpbmVyW3NvdXJjZUNvbnRhaW5lcnMubGVuZ3RoICsgc291cmNlZm9sZGVyTGlzdC5zaXplKCldOwotCQkJc291cmNlZm9sZGVyTGlzdC50b0FycmF5KGNvbWJpbmVkU291cmNlQ29udGFpbmVycyk7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KHNvdXJjZUNvbnRhaW5lcnMsIDAsIGNvbWJpbmVkU291cmNlQ29udGFpbmVycywgc291cmNlZm9sZGVyTGlzdC5zaXplKCksIHNvdXJjZUNvbnRhaW5lcnMubGVuZ3RoKTsKLQkJCXNvdXJjZUNvbnRhaW5lcnMgPSBjb21iaW5lZFNvdXJjZUNvbnRhaW5lcnM7Ci0JCX0KLQotCQlyZXR1cm4gc291cmNlQ29udGFpbmVyczsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9UcmFjZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9UcmFjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWUzZmJjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvVHJhY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotoCoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLS8qKgotICogSGVscGVyIGNsYXNzIHRvIHJvdXRlIHRyYWNlIG91dHB1dC4KLSAqLwotcHVibGljIGNsYXNzIFRyYWNlIHsKLQlwdWJsaWMgc3RhdGljIGJ5dGUgQ09ORklHID0gMDsKLQlwdWJsaWMgc3RhdGljIGJ5dGUgV0FSTklORyA9IDE7Ci0JcHVibGljIHN0YXRpYyBieXRlIFNFVkVSRSA9IDI7Ci0JcHVibGljIHN0YXRpYyBieXRlIEZJTkVTVCA9IDM7Ci0JcHVibGljIHN0YXRpYyBieXRlIEZJTkVSID0gNDsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBsZXZlbE5hbWVzID0gbmV3IFN0cmluZ1tdIHsKLQkJIkNPTkZJRyAgICIsICJXQVJOSU5HICAiLCAiU0VWRVJFICAgIiwgIkZJTkVSICAgICIsICJGSU5FU1QgICAifTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgc3BhY2VyID0gIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTaW1wbGVEYXRlRm9ybWF0IHNkZiA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJkZC9NTS95eSBISDptbS5zcy5TU1MiKTsKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIGludCBwbHVnaW5MZW5ndGggPSAtMTsKLQotCS8qKgotCSAqIFRyYWNlIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHJpdmF0ZSBUcmFjZSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBUcmFjZSB0aGUgZ2l2ZW4gdGV4dC4KLQkgKgotCSAqIEBwYXJhbSBsZXZlbCB0aGUgdHJhY2UgbGV2ZWwKLQkgKiBAcGFyYW0gcyBhIG1lc3NhZ2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2UoYnl0ZSBsZXZlbCwgU3RyaW5nIHMpIHsKLQkJVHJhY2UudHJhY2UobGV2ZWwsIHMsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIFRyYWNlIHRoZSBnaXZlbiBtZXNzYWdlIGFuZCBleGNlcHRpb24uCi0JICoKLQkgKiBAcGFyYW0gbGV2ZWwgdGhlIHRyYWNlIGxldmVsCi0JICogQHBhcmFtIHMgYSBtZXNzYWdlCi0JICogQHBhcmFtIHQgYSB0aHJvd2FibGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2UoYnl0ZSBsZXZlbCwgU3RyaW5nIHMsIFRocm93YWJsZSB0KSB7Ci0JCWlmICghVG9tY2F0UGx1Z2luLmdldEluc3RhbmNlKCkuaXNEZWJ1Z2dpbmcoKSkKLQkJCXJldHVybjsKLQotCQkvKlN5c3RlbS5vdXQucHJpbnRsbihUb21jYXRQbHVnaW4uUExVR0lOX0lEICsgIiAiICsgcyk7Ci0JCWlmICh0ICE9IG51bGwpCi0JCQl0LnByaW50U3RhY2tUcmFjZSgpOyovCi0JCXRyYWNlKFRvbWNhdFBsdWdpbi5QTFVHSU5fSUQsIGxldmVsLCBzLCB0KTsKLQl9Ci0KLQkvKioKLQkgKiBUcmFjZSB0aGUgZ2l2ZW4gbWVzc2FnZSBhbmQgZXhjZXB0aW9uLgotCSAqCi0JICogQHBhcmFtIGxldmVsIGEgdHJhY2UgbGV2ZWwKLQkgKiBAcGFyYW0gcyBhIG1lc3NhZ2UKLQkgKiBAcGFyYW0gdCBhIHRocm93YWJsZQotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgdHJhY2UoU3RyaW5nIHBsdWdpbklkLCBpbnQgbGV2ZWwsIFN0cmluZyBzLCBUaHJvd2FibGUgdCkgewotCQlpZiAocGx1Z2luSWQgPT0gbnVsbCB8fCBzID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKCFUb21jYXRQbHVnaW4uZ2V0SW5zdGFuY2UoKS5pc0RlYnVnZ2luZygpKQotCQkJcmV0dXJuOwotCQkKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcihwbHVnaW5JZCk7Ci0JCWlmIChwbHVnaW5JZC5sZW5ndGgoKSA+IHBsdWdpbkxlbmd0aCkKLQkJCXBsdWdpbkxlbmd0aCA9IHBsdWdpbklkLmxlbmd0aCgpOwotCQllbHNlIGlmIChwbHVnaW5JZC5sZW5ndGgoKSA8IHBsdWdpbkxlbmd0aCkKLQkJCXNiLmFwcGVuZChzcGFjZXIuc3Vic3RyaW5nKDAsIHBsdWdpbkxlbmd0aCAtIHBsdWdpbklkLmxlbmd0aCgpKSk7Ci0JCXNiLmFwcGVuZCgiICIpOwotCQlzYi5hcHBlbmQobGV2ZWxOYW1lc1tsZXZlbF0pOwotCQlzYi5hcHBlbmQoIiAiKTsKLQkJc2IuYXBwZW5kKHNkZi5mb3JtYXQobmV3IERhdGUoKSkpOwotCQlzYi5hcHBlbmQoIiAiKTsKLQkJc2IuYXBwZW5kKHMpOwotCQkvL1BsYXRmb3JtLmdldERlYnVnT3B0aW9uKFNlcnZlckNvcmUuUExVR0lOX0lEICsgIi8iICsgInJlc291cmNlcyIpOwotCi0JCVN5c3RlbS5vdXQucHJpbnRsbihzYi50b1N0cmluZygpKTsKLQkJaWYgKHQgIT0gbnVsbCkKLQkJCXQucHJpbnRTdGFja1RyYWNlKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvV2ViQXBwRG9jdW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvV2ViQXBwRG9jdW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjljMDc1MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1dlYkFwcERvY3VtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC54bWwuWE1MVXRpbDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci0vKioKLSAqIEhlbHBlciBjbGFzcyB0byBhY2Nlc3MgYSB3ZWIueG1sIGZpbGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJBcHBEb2N1bWVudCB7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaXNXZWJBcHBEaXJ0eTsKLQlwcm90ZWN0ZWQgRG9jdW1lbnQgd2ViQXBwRG9jdW1lbnQ7Ci0KLQkvKioKLQkgKiBMb2FkcyBhIHdlYi54bWwgZnJvbSB0aGUgZ2l2ZW4gVVJMLgotCSAqCi0JICogQHBhcmFtIHBhdGggYSBwYXRoCi0JICogQHRocm93cyBFeGNlcHRpb24gaWYgYW55dGhpbmcgZ29lcyB3cm9uZwotCSAqLwotCXB1YmxpYyBXZWJBcHBEb2N1bWVudChJUGF0aCBwYXRoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJd2ViQXBwRG9jdW1lbnQgPSBYTUxVdGlsLmdldERvY3VtZW50QnVpbGRlcigpLnBhcnNlKG5ldyBJbnB1dFNvdXJjZShuZXcgRmlsZUlucHV0U3RyZWFtKHBhdGgudG9GaWxlKCkpKSk7Ci0JfQotCi0JLyoqCi0JICogTG9hZHMgYSB3ZWIueG1sIGZyb20gdGhlIGdpdmVuIHJlc291cmNlLgotCSAqCi0JICogQHBhcmFtIGZpbGUgYSBmaWxlCi0JICogQHRocm93cyBFeGNlcHRpb24gaWYgYW55dGhpbmcgZ29lcyB3cm9uZwotCSAqLwotCXB1YmxpYyBXZWJBcHBEb2N1bWVudChJRmlsZSBmaWxlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJd2ViQXBwRG9jdW1lbnQgPSBYTUxVdGlsLmdldERvY3VtZW50QnVpbGRlcigpLnBhcnNlKG5ldyBJbnB1dFNvdXJjZShmaWxlLmdldENvbnRlbnRzKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgTWltZU1hcHBpbmcuCi0JICoKLQkgKiBAcGFyYW0gaW5kZXggaW50Ci0JICogQHBhcmFtIG1hcCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5JTWltZU1hcHBpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRNaW1lTWFwcGluZyhpbnQgaW5kZXgsIElNaW1lTWFwcGluZyBtYXApIHsKLQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVIsICJBZGRpbmcgbWltZSBtYXBwaW5nICIgKyBpbmRleCArICIgIiArIG1hcC5nZXRNaW1lVHlwZSgpICsgIiAiICsgbWFwLmdldEV4dGVuc2lvbigpKTsKLQkJRWxlbWVudCBlbGVtZW50ID0gd2ViQXBwRG9jdW1lbnQuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0JCUVsZW1lbnQgbWFwcGluZyA9IFhNTFV0aWwuY3JlYXRlQ2hpbGRFbGVtZW50KHdlYkFwcERvY3VtZW50LCBlbGVtZW50LCBpbmRleCwgIm1pbWUtbWFwcGluZyIpOwotCQlYTUxVdGlsLmluc2VydFRleHQod2ViQXBwRG9jdW1lbnQsIG1hcHBpbmcsICJcblx0Iik7Ci0JCVhNTFV0aWwuY3JlYXRlVGV4dENoaWxkRWxlbWVudCh3ZWJBcHBEb2N1bWVudCwgbWFwcGluZywgImV4dGVuc2lvbiIsIG1hcC5nZXRFeHRlbnNpb24oKSk7Ci0JCVhNTFV0aWwuaW5zZXJ0VGV4dCh3ZWJBcHBEb2N1bWVudCwgbWFwcGluZywgIlxuXHQiKTsKLQkJWE1MVXRpbC5jcmVhdGVUZXh0Q2hpbGRFbGVtZW50KHdlYkFwcERvY3VtZW50LCBtYXBwaW5nLCAibWltZS10eXBlIiwgbWFwLmdldE1pbWVUeXBlKCkpOwotCQlYTUxVdGlsLmluc2VydFRleHQod2ViQXBwRG9jdW1lbnQsIG1hcHBpbmcsICJcbiIpOwotCQotCQlpc1dlYkFwcERpcnR5ID0gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBNaW1lTWFwcGluZ3MuCi0JICoKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHVibGljIExpc3QgZ2V0TWltZU1hcHBpbmdzKCkgewotCQlMaXN0IG1hcCA9IG5ldyBBcnJheUxpc3QoKTsKLQkKLQkJRWxlbWVudCByb290ID0gd2ViQXBwRG9jdW1lbnQuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gWE1MVXRpbC5nZXROb2RlSXRlcmF0b3Iocm9vdCwgIm1pbWUtbWFwcGluZyIpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlFbGVtZW50IGVsZW1lbnQgPSAoRWxlbWVudCkgaXRlcmF0b3IubmV4dCgpOwotCQkJU3RyaW5nIG1pbWVUeXBlID0gWE1MVXRpbC5nZXRTdWJOb2RlVmFsdWUoZWxlbWVudCwgIm1pbWUtdHlwZSIpOwotCQkJU3RyaW5nIGV4dGVuc2lvbiA9IFhNTFV0aWwuZ2V0U3ViTm9kZVZhbHVlKGVsZW1lbnQsICJleHRlbnNpb24iKTsKLQkJCU1pbWVNYXBwaW5nIG1tID0gbmV3IE1pbWVNYXBwaW5nKGV4dGVuc2lvbiwgbWltZVR5cGUpOwotCQkJbWFwLmFkZChtbSk7Ci0JCX0KLQkKLQkJcmV0dXJuIG1hcDsKLQl9Ci0KLQkvKioKLQkgKiBNb2RpZmllcyBhIG1pbWUgbWFwcGluZy4KLQkgKgotCSAqIEBwYXJhbSBpbmRleAotCSAqIEBwYXJhbSBtYXAKLQkgKi8KLQlwdWJsaWMgdm9pZCBtb2RpZnlNaW1lTWFwcGluZyhpbnQgaW5kZXgsIElNaW1lTWFwcGluZyBtYXApIHsKLQkJRWxlbWVudCBlbGVtZW50ID0gd2ViQXBwRG9jdW1lbnQuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0JCU5vZGVMaXN0IGxpc3QgPSBlbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJtaW1lLW1hcHBpbmciKTsKLQkJRWxlbWVudCBlbGVtZW50MiA9IChFbGVtZW50KSBsaXN0Lml0ZW0oaW5kZXgpOwotCQlYTUxVdGlsLnNldE5vZGVWYWx1ZShlbGVtZW50Mi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZXh0ZW5zaW9uIikuaXRlbSgwKSwgImV4dGVuc2lvbiIsIG1hcC5nZXRFeHRlbnNpb24oKSk7Ci0JCVhNTFV0aWwuc2V0Tm9kZVZhbHVlKGVsZW1lbnQyLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJtaW1lLXR5cGUiKS5pdGVtKDApLCAibWltZS10eXBlIiwgbWFwLmdldE1pbWVUeXBlKCkpOwotCQkJCi0JCWlzV2ViQXBwRGlydHkgPSB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIG1pbWUgbWFwcGluZyBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgotCSAqCi0JICogQHBhcmFtIGluZGV4IGludAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZU1pbWVNYXBwaW5nKGludCBpbmRleCkgewotCQlFbGVtZW50IGVsZW1lbnQgPSB3ZWJBcHBEb2N1bWVudC5nZXREb2N1bWVudEVsZW1lbnQoKTsKLQkJTm9kZUxpc3QgbGlzdCA9IGVsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm1pbWUtbWFwcGluZyIpOwotCQlOb2RlIG5vZGUgPSBsaXN0Lml0ZW0oaW5kZXgpOwotCQllbGVtZW50LnJlbW92ZUNoaWxkKG5vZGUpOwotCQlpc1dlYkFwcERpcnR5ID0gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogU2F2ZXMgdGhlIFdlYiBhcHAgZG9jdW1lbnQuCi0JICoKLQkgKiBAcGFyYW0gcGF0aCBhIHBhdGgKLQkgKiBAcGFyYW0gZm9yY2VEaXJ0eSB0cnVlIHRvIGZvcmNlIGEgc2F2ZQotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYW55dGhpbmcgZ29lcyB3cm9uZwotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmUoU3RyaW5nIHBhdGgsIGJvb2xlYW4gZm9yY2VEaXJ0eSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKGZvcmNlRGlydHkgfHwgaXNXZWJBcHBEaXJ0eSkKLQkJCVhNTFV0aWwuc2F2ZShwYXRoLCB3ZWJBcHBEb2N1bWVudCk7Ci0JfQotCQotCS8qKgotCSAqIFNhdmVzIHRoZSBXZWIgYXBwIGRvY3VtZW50LgotCSAqCi0JICogQHBhcmFtIGZpbGUgYSBmaWxlCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yCi0JICogQHRocm93cyBFeGNlcHRpb24gaWYgYW55dGhpbmcgZ29lcyB3cm9uZyAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlKElGaWxlIGZpbGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWJ5dGVbXSBkYXRhID0gWE1MVXRpbC5nZXRDb250ZW50cyh3ZWJBcHBEb2N1bWVudCk7Ci0JCUlucHV0U3RyZWFtIGluID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWluID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGRhdGEpOwotCQkJaWYgKGZpbGUuZXhpc3RzKCkpCi0JCQkJZmlsZS5zZXRDb250ZW50cyhpbiwgdHJ1ZSwgdHJ1ZSwgUHJvZ3Jlc3NVdGlsLmdldFN1Yk1vbml0b3JGb3IobW9uaXRvciwgMjAwKSk7Ci0JCQllbHNlCi0JCQkJZmlsZS5jcmVhdGUoaW4sIHRydWUsIFByb2dyZXNzVXRpbC5nZXRTdWJNb25pdG9yRm9yKG1vbml0b3IsIDIwMCkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCWluLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCS8vIGlnbm9yZQotCQkJfQotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvV2ViTW9kdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL1dlYk1vZHVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTE3MTY5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvV2ViTW9kdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWw7Ci0vKioKLSAqIEEgV2ViIG1vZHVsZS4KLSAqLwotcHVibGljIGNsYXNzIFdlYk1vZHVsZSBpbXBsZW1lbnRzIElUb21jYXRXZWJNb2R1bGUgewotCXByaXZhdGUgU3RyaW5nIGRvY0Jhc2U7Ci0JcHJpdmF0ZSBTdHJpbmcgcGF0aDsKLQlwcml2YXRlIFN0cmluZyBtZW1lbnRvOwotCXByaXZhdGUgYm9vbGVhbiByZWxvYWRhYmxlOwotCi0JLyoqCi0JICogV2ViTW9kdWxlIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHBhdGggYSBwYXRoCi0JICogQHBhcmFtIGRvY0Jhc2UgYSBkb2N1bWVudCBiYXNlCi0JICogQHBhcmFtIG1lbWVudG8gYSBtZW1lbnRvCi0JICogQHBhcmFtIHJlbG9hZGFibGUgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgcmVsb2FkYWJsZQotCSAqLwotCXB1YmxpYyBXZWJNb2R1bGUoU3RyaW5nIHBhdGgsIFN0cmluZyBkb2NCYXNlLCBTdHJpbmcgbWVtZW50bywgYm9vbGVhbiByZWxvYWRhYmxlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMucGF0aCA9IHBhdGg7Ci0JCXRoaXMuZG9jQmFzZSA9IGRvY0Jhc2U7Ci0JCXRoaXMubWVtZW50byA9IG1lbWVudG87Ci0JCXRoaXMucmVsb2FkYWJsZSA9IHJlbG9hZGFibGU7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBkb2N1bWVudCBiYXNlLgotCSAqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREb2N1bWVudEJhc2UoKSB7Ci0JCXJldHVybiBkb2NCYXNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcGF0aC4gKGNvbnRleHQgcm9vdCkKLQkgKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGF0aCgpIHsKLQkJcmV0dXJuIHBhdGg7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBtZW1lbnRvLgotCSAqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNZW1lbnRvKCkgewotCQlyZXR1cm4gbWVtZW50bzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgd2ViIG1vZHVsZSBpcyBhdXRvLXJlbG9hZGFibGUuCi0JICoKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1JlbG9hZGFibGUoKSB7Ci0JCXJldHVybiByZWxvYWRhYmxlOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIE9iamVjdCNlcXVhbHMoT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCWlmICghKG9iaiBpbnN0YW5jZW9mIFdlYk1vZHVsZSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQlXZWJNb2R1bGUgd20gPSAoV2ViTW9kdWxlKSBvYmo7Ci0JCWlmICghZ2V0RG9jdW1lbnRCYXNlKCkuZXF1YWxzKHdtLmdldERvY3VtZW50QmFzZSgpKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKCFnZXRQYXRoKCkuZXF1YWxzKHdtLmdldFBhdGgoKSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmICghZ2V0TWVtZW50bygpLmVxdWFscyh3bS5nZXRNZW1lbnRvKCkpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9jb21tYW5kL0FkZE1pbWVNYXBwaW5nQ29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9jb21tYW5kL0FkZE1pbWVNYXBwaW5nQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODg0MDRmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvY29tbWFuZC9BZGRNaW1lTWFwcGluZ0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotoCoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuY29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuSVRvbWNhdENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuTWltZU1hcHBpbmc7Ci0vKioKLSAqIENvbW1hbmQgdG8gYWRkIGEgbWltZSBtYXBwaW5nLgotICovCi1wdWJsaWMgY2xhc3MgQWRkTWltZU1hcHBpbmdDb21tYW5kIGV4dGVuZHMgQ29uZmlndXJhdGlvbkNvbW1hbmQgewotCXByb3RlY3RlZCBNaW1lTWFwcGluZyBtYXA7Ci0KLQkvKioKLQkgKiBBZGRNaW1lTWFwcGluZ0NvbW1hbmQgY29uc3RydWN0b3IuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ3VyYXRpb24gYSB0b21jYXQgY29uZmlndXJhdGlvbgotCSAqIEBwYXJhbSBtYXAgYSBtaW1lIG1hcHBpbmcKLQkgKi8KLQlwdWJsaWMgQWRkTWltZU1hcHBpbmdDb21tYW5kKElUb21jYXRDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29uZmlndXJhdGlvbiwgTWltZU1hcHBpbmcgbWFwKSB7Ci0JCXN1cGVyKGNvbmZpZ3VyYXRpb24sIE1lc3NhZ2VzLmNvbmZpZ3VyYXRpb25FZGl0b3JBY3Rpb25BZGRNaW1lTWFwcGluZyk7Ci0JCXRoaXMubWFwID0gbWFwOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGUgdGhlIGNvbW1hbmQuCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJY29uZmlndXJhdGlvbi5hZGRNaW1lTWFwcGluZygwLCBtYXApOwotCX0KLQotCS8qKgotCSAqIFVuZG8gdGhlIGNvbW1hbmQuCi0JICovCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJY29uZmlndXJhdGlvbi5yZW1vdmVNaW1lTWFwcGluZygwKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9jb21tYW5kL0FkZE1vZHVsZUNvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvY29tbWFuZC9BZGRNb2R1bGVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhZmVhZTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9jb21tYW5kL0FkZE1vZHVsZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotoCoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuY29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5BYnN0cmFjdE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyV29ya2luZ0NvcHk7Ci0vKioKLSAqIENvbW1hbmQgdG8gYWRkIGEgd2ViIG1vZHVsZSB0byBhIHNlcnZlci4KLSAqLwotcHVibGljIGNsYXNzIEFkZE1vZHVsZUNvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdE9wZXJhdGlvbiB7Ci0JcHJvdGVjdGVkIElTZXJ2ZXJXb3JraW5nQ29weSBzZXJ2ZXI7Ci0JcHJvdGVjdGVkIElNb2R1bGUgbW9kdWxlOwotCXByb3RlY3RlZCBpbnQgbW9kdWxlcyA9IC0xOwotCi0JLyoqCi0JICogQWRkTW9kdWxlQ29tbWFuZCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBzZXJ2ZXIgYSBzZXJ2ZXIKLQkgKiBAcGFyYW0gbW9kdWxlIGEgd2ViIG1vZHVsZQotCSAqLwotCXB1YmxpYyBBZGRNb2R1bGVDb21tYW5kKElTZXJ2ZXJXb3JraW5nQ29weSBzZXJ2ZXIsIElNb2R1bGUgbW9kdWxlKSB7Ci0JCXN1cGVyKE1lc3NhZ2VzLmNvbmZpZ3VyYXRpb25FZGl0b3JBY3Rpb25BZGRXZWJNb2R1bGUpOwotCQl0aGlzLnNlcnZlciA9IHNlcnZlcjsKLQkJdGhpcy5tb2R1bGUgPSBtb2R1bGU7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlzZXJ2ZXIubW9kaWZ5TW9kdWxlcyhuZXcgSU1vZHVsZVtdIHsgbW9kdWxlIH0sIG51bGwsIG1vbml0b3IpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgcmVkbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCXJldHVybiBleGVjdXRlKG1vbml0b3IsIGluZm8pOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHVuZG8oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQl0cnkgewotCQkJc2VydmVyLm1vZGlmeU1vZHVsZXMobnVsbCwgbmV3IElNb2R1bGVbXSB7IG1vZHVsZSB9LCBtb25pdG9yKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL2NvbW1hbmQvQWRkV2ViTW9kdWxlQ29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9jb21tYW5kL0FkZFdlYk1vZHVsZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTAxZDNiNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL2NvbW1hbmQvQWRkV2ViTW9kdWxlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi2gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5jb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5JVG9tY2F0Q29uZmlndXJhdGlvbldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5XZWJNb2R1bGU7Ci0vKioKLSAqIENvbW1hbmQgdG8gYWRkIGEgd2ViIG1vZHVsZS4KLSAqLwotcHVibGljIGNsYXNzIEFkZFdlYk1vZHVsZUNvbW1hbmQgZXh0ZW5kcyBDb25maWd1cmF0aW9uQ29tbWFuZCB7Ci0JcHJvdGVjdGVkIFdlYk1vZHVsZSBtb2R1bGU7Ci0JcHJvdGVjdGVkIGludCBtb2R1bGVzID0gLTE7Ci0KLQkvKioKLQkgKiBBZGRXZWJNb2R1bGVDb21tYW5kIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ3VyYXRpb24gYSB0b21jYXQgY29uZmlndXJhdGlvbgotCSAqIEBwYXJhbSBtb2R1bGUgYSB3ZWIgbW9kdWxlCi0JICovCi0JcHVibGljIEFkZFdlYk1vZHVsZUNvbW1hbmQoSVRvbWNhdENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBjb25maWd1cmF0aW9uLCBXZWJNb2R1bGUgbW9kdWxlKSB7Ci0JCXN1cGVyKGNvbmZpZ3VyYXRpb24sIE1lc3NhZ2VzLmNvbmZpZ3VyYXRpb25FZGl0b3JBY3Rpb25BZGRXZWJNb2R1bGUpOwotCQl0aGlzLm1vZHVsZSA9IG1vZHVsZTsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlIHRoZSBjb21tYW5kLgotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCW1vZHVsZXMgPSBjb25maWd1cmF0aW9uLmdldFdlYk1vZHVsZXMoKS5zaXplKCk7Ci0JCWNvbmZpZ3VyYXRpb24uYWRkV2ViTW9kdWxlKC0xLCBtb2R1bGUpOwotCX0KLQotCS8qKgotCSAqIFVuZG8gdGhlIGNvbW1hbmQuCi0JICovCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJY29uZmlndXJhdGlvbi5yZW1vdmVXZWJNb2R1bGUobW9kdWxlcyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvY29tbWFuZC9Db25maWd1cmF0aW9uQ29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9jb21tYW5kL0NvbmZpZ3VyYXRpb25Db21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkY2MxNDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9jb21tYW5kL0NvbmZpZ3VyYXRpb25Db21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuY29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5BYnN0cmFjdE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLklUb21jYXRDb25maWd1cmF0aW9uV29ya2luZ0NvcHk7Ci0vKioKLSAqIENvbmZpZ3VyYXRpb24gY29tbWFuZC4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIENvbmZpZ3VyYXRpb25Db21tYW5kIGV4dGVuZHMgQWJzdHJhY3RPcGVyYXRpb24gewotCXByb3RlY3RlZCBJVG9tY2F0Q29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNvbmZpZ3VyYXRpb247Ci0KLQkvKioKLQkgKiBDb25maWd1cmF0aW9uQ29tbWFuZCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBjb25maWd1cmF0aW9uIGEgVG9tY2F0IGNvbmZpZ3VyYXRpb24KLQkgKiBAcGFyYW0gbGFiZWwgYSBsYWJlbAotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uQ29tbWFuZChJVG9tY2F0Q29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNvbmZpZ3VyYXRpb24sIFN0cmluZyBsYWJlbCkgewotCQlzdXBlcihsYWJlbCk7Ci0JCXRoaXMuY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb247Ci0JfQotCi0JcHVibGljIElTdGF0dXMgcmVkbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCXJldHVybiBleGVjdXRlKG1vbml0b3IsIGluZm8pOwotCX0KLQotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIGV4ZWN1dGUoKTsKLQotCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlleGVjdXRlKCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHVuZG8oKTsKLQotCXB1YmxpYyBJU3RhdHVzIHVuZG8oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQl1bmRvKCk7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL2NvbW1hbmQvRml4TW9kdWxlQ29udGV4dFJvb3RUYXNrLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL2NvbW1hbmQvRml4TW9kdWxlQ29udGV4dFJvb3RUYXNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxMjNjZmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9jb21tYW5kL0ZpeE1vZHVsZUNvbnRleHRSb290VGFzay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLmNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlRhc2tNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuUHVibGlzaE9wZXJhdGlvbjsKLS8qKgotICogVGFzayB0byBmaXggYSBjb250ZXh0IHJvb3Qgb24gYSB3ZWIgbW9kdWxlLgotICovCi1wdWJsaWMgY2xhc3MgRml4TW9kdWxlQ29udGV4dFJvb3RUYXNrIGV4dGVuZHMgUHVibGlzaE9wZXJhdGlvbiB7Ci0JcHJvdGVjdGVkIGludCBpbmRleDsKLQlwcm90ZWN0ZWQgV2ViTW9kdWxlIG1vZHVsZTsKLQlwcm90ZWN0ZWQgSU1vZHVsZSB3ZWJNb2R1bGU7Ci0JcHJvdGVjdGVkIFN0cmluZyBjb250ZXh0Um9vdDsKLQlwcm90ZWN0ZWQgaW50IGtpbmQ7Ci0KLQkvKioKLQkgKiBGaXhNb2R1bGVDb250ZXh0Um9vdFRhc2sgY29uc3RydWN0b3IuCi0JICogCi0JICogQHBhcmFtIHdlYk1vZHVsZQotCSAqIEBwYXJhbSBpbmRleAotCSAqIEBwYXJhbSBjb250ZXh0Um9vdAotCSAqIEBwYXJhbSBraW5kCi0JICovCi0JcHVibGljIEZpeE1vZHVsZUNvbnRleHRSb290VGFzayhJTW9kdWxlIHdlYk1vZHVsZSwgaW50IGluZGV4LCBTdHJpbmcgY29udGV4dFJvb3QsIGludCBraW5kKSB7Ci0JCXN1cGVyKE5MUy5iaW5kKE1lc3NhZ2VzLmZpeE1vZHVsZUNvbnRleHRSb290LCB3ZWJNb2R1bGUuZ2V0TmFtZSgpKSwgTWVzc2FnZXMuZml4TW9kdWxlQ29udGV4dFJvb3REZXNjcmlwdGlvbik7Ci0JCXRoaXMud2ViTW9kdWxlID0gd2ViTW9kdWxlOwotCQl0aGlzLmluZGV4ID0gaW5kZXg7Ci0JCXRoaXMuY29udGV4dFJvb3QgPSBjb250ZXh0Um9vdDsKLQkJdGhpcy5raW5kID0ga2luZDsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlIHRoZSBjb21tYW5kLgotCSAqIAotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvcgotCSAqIEBwYXJhbSBpbmZvCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJU2VydmVyV29ya2luZ0NvcHkgd2MgPSBudWxsOwotCQlJU2VydmVyIHNlcnZlcjIgPSAoSVNlcnZlcikgZ2V0VGFza01vZGVsKCkuZ2V0T2JqZWN0KFRhc2tNb2RlbC5UQVNLX1NFUlZFUik7Ci0JCWlmIChzZXJ2ZXIyIGluc3RhbmNlb2YgSVNlcnZlcldvcmtpbmdDb3B5KQotCQkJd2MgPSAoSVNlcnZlcldvcmtpbmdDb3B5KSBzZXJ2ZXIyOwotCQllbHNlCi0JCQl3YyA9IHNlcnZlcjIuY3JlYXRlV29ya2luZ0NvcHkoKTsKLQkJCi0JCVRvbWNhdFNlcnZlciBzZXJ2ZXIgPSAoVG9tY2F0U2VydmVyKSB3Yy5sb2FkQWRhcHRlcihUb21jYXRTZXJ2ZXIuY2xhc3MsIG1vbml0b3IpOwotCQlUb21jYXRDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSBzZXJ2ZXIuZ2V0VG9tY2F0Q29uZmlndXJhdGlvbigpOwotCQlpZiAoY29uZmlndXJhdGlvbi5nZXRXZWJNb2R1bGVzKCkuc2l6ZSgpIDw9IGluZGV4KQotCQkJcmV0dXJuOwotCQltb2R1bGUgPSAoV2ViTW9kdWxlKSBjb25maWd1cmF0aW9uLmdldFdlYk1vZHVsZXMoKS5nZXQoaW5kZXgpOwotCQlpZiAoY29udGV4dFJvb3QgIT0gbnVsbCAmJiAhY29udGV4dFJvb3Quc3RhcnRzV2l0aCgiLyIpICYmIGNvbnRleHRSb290Lmxlbmd0aCgpID4gMCkKLQkJCWNvbnRleHRSb290ID0gIi8iICsgY29udGV4dFJvb3Q7Ci0JCWlmICghY29udGV4dFJvb3QuZXF1YWxzKG1vZHVsZS5nZXRQYXRoKCkpKSB7Ci0JCQljb25maWd1cmF0aW9uLm1vZGlmeVdlYk1vZHVsZShpbmRleCwgbW9kdWxlLmdldERvY3VtZW50QmFzZSgpLCBjb250ZXh0Um9vdCwgbW9kdWxlLmlzUmVsb2FkYWJsZSgpKTsKLQkJCXdjLnNhdmUodHJ1ZSwgbW9uaXRvcik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgaW50IGdldEtpbmQoKSB7Ci0JCXJldHVybiBraW5kOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0T3JkZXIoKSB7Ci0JCXJldHVybiAwOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL2NvbW1hbmQvTW9kaWZ5TWltZU1hcHBpbmdDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL2NvbW1hbmQvTW9kaWZ5TWltZU1hcHBpbmdDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0YWExNWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9jb21tYW5kL01vZGlmeU1pbWVNYXBwaW5nQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLmNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLklUb21jYXRDb25maWd1cmF0aW9uV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLk1pbWVNYXBwaW5nOwotLyoqCi0gKiBDb21tYW5kIHRvIGNoYW5nZSBhIG1pbWUgdHlwZSBleHRlbnNpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2RpZnlNaW1lTWFwcGluZ0NvbW1hbmQgZXh0ZW5kcyBDb25maWd1cmF0aW9uQ29tbWFuZCB7Ci0JcHJvdGVjdGVkIGludCBpbmRleDsKLQlwcm90ZWN0ZWQgTWltZU1hcHBpbmcgb2xkTWFwOwotCXByb3RlY3RlZCBNaW1lTWFwcGluZyBuZXdNYXA7Ci0KLQkvKioKLQkgKiBBIGNvbW1hbmQgdG8gbW9kaWZ5IGEgbWltZSBtYXBwaW5nLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWd1cmF0aW9uIGEgdG9tY2F0IGNvbmZpZ3VyYXRpb24KLQkgKiBAcGFyYW0gaW5kZXggYW4gaW5kZXgKLQkgKiBAcGFyYW0gbWFwIGEgbWltZSBtYXBwaW5nCi0JICovCi0JcHVibGljIE1vZGlmeU1pbWVNYXBwaW5nQ29tbWFuZChJVG9tY2F0Q29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNvbmZpZ3VyYXRpb24sIGludCBpbmRleCwgTWltZU1hcHBpbmcgbWFwKSB7Ci0JCXN1cGVyKGNvbmZpZ3VyYXRpb24sIE1lc3NhZ2VzLmNvbmZpZ3VyYXRpb25FZGl0b3JBY3Rpb25Nb2RpZnlNaW1lTWFwcGluZyk7Ci0JCXRoaXMuaW5kZXggPSBpbmRleDsKLQkJbmV3TWFwID0gbWFwOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGUgdGhlIGNvbW1hbmQuCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJb2xkTWFwID0gKE1pbWVNYXBwaW5nKSBjb25maWd1cmF0aW9uLmdldE1pbWVNYXBwaW5ncygpLmdldChpbmRleCk7Ci0JCWNvbmZpZ3VyYXRpb24ubW9kaWZ5TWltZU1hcHBpbmcoaW5kZXgsIG5ld01hcCk7Ci0JfQotCi0JLyoqCi0JICogVW5kbyB0aGUgY29tbWFuZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQljb25maWd1cmF0aW9uLm1vZGlmeU1pbWVNYXBwaW5nKGluZGV4LCBvbGRNYXApOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL2NvbW1hbmQvTW9kaWZ5UG9ydENvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvY29tbWFuZC9Nb2RpZnlQb3J0Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGVkMTNhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvY29tbWFuZC9Nb2RpZnlQb3J0Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLklUb21jYXRDb25maWd1cmF0aW9uV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyUG9ydDsKLS8qKgotICogQ29tbWFuZCB0byBjaGFuZ2UgdGhlIGNvbmZpZ3VyYXRpb24gcG9ydC4KLSAqLwotcHVibGljIGNsYXNzIE1vZGlmeVBvcnRDb21tYW5kIGV4dGVuZHMgQ29uZmlndXJhdGlvbkNvbW1hbmQgewotCXByb3RlY3RlZCBTdHJpbmcgaWQ7Ci0JcHJvdGVjdGVkIGludCBwb3J0OwotCXByb3RlY3RlZCBpbnQgb2xkUG9ydDsKLQotCS8qKgotCSAqIE1vZGlmeVBvcnRDb21tYW5kIGNvbnN0cnVjdG9yLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWd1cmF0aW9uIGEgVG9tY2F0IGNvbmZpZ3VyYXRpb24KLQkgKiBAcGFyYW0gaWQgYSBwb3J0IGlkCi0JICogQHBhcmFtIHBvcnQgbmV3IHBvcnQgbnVtYmVyCi0JICovCi0JcHVibGljIE1vZGlmeVBvcnRDb21tYW5kKElUb21jYXRDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29uZmlndXJhdGlvbiwgU3RyaW5nIGlkLCBpbnQgcG9ydCkgewotCQlzdXBlcihjb25maWd1cmF0aW9uLCBNZXNzYWdlcy5jb25maWd1cmF0aW9uRWRpdG9yQWN0aW9uTW9kaWZ5UG9ydCk7Ci0JCXRoaXMuaWQgPSBpZDsKLQkJdGhpcy5wb3J0ID0gcG9ydDsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlIHRoZSBjb21tYW5kLgotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCS8vIGZpbmQgb2xkIHBvcnQgbnVtYmVyCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gY29uZmlndXJhdGlvbi5nZXRTZXJ2ZXJQb3J0cygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVNlcnZlclBvcnQgdGVtcCA9IChTZXJ2ZXJQb3J0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoaWQuZXF1YWxzKHRlbXAuZ2V0SWQoKSkpCi0JCQkJb2xkUG9ydCA9IHRlbXAuZ2V0UG9ydCgpOwotCQl9Ci0JCi0JCS8vIG1ha2UgdGhlIGNoYW5nZQotCQljb25maWd1cmF0aW9uLm1vZGlmeVNlcnZlclBvcnQoaWQsIHBvcnQpOwotCX0KLQotCS8qKgotCSAqIFVuZG8gdGhlIGNvbW1hbmQuCi0JICovCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJY29uZmlndXJhdGlvbi5tb2RpZnlTZXJ2ZXJQb3J0KGlkLCBvbGRQb3J0KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9jb21tYW5kL01vZGlmeVdlYk1vZHVsZUNvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvY29tbWFuZC9Nb2RpZnlXZWJNb2R1bGVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5YzNmZmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9jb21tYW5kL01vZGlmeVdlYk1vZHVsZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5jb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5JVG9tY2F0Q29uZmlndXJhdGlvbldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5XZWJNb2R1bGU7Ci0vKioKLSAqIENvbW1hbmQgdG8gY2hhbmdlIGEgd2ViIG1vZHVsZS4KLSAqLwotcHVibGljIGNsYXNzIE1vZGlmeVdlYk1vZHVsZUNvbW1hbmQgZXh0ZW5kcyBDb25maWd1cmF0aW9uQ29tbWFuZCB7Ci0JcHJvdGVjdGVkIGludCBpbmRleDsKLQlwcm90ZWN0ZWQgV2ViTW9kdWxlIG9sZE1vZHVsZTsKLQlwcm90ZWN0ZWQgV2ViTW9kdWxlIG5ld01vZHVsZTsKLQotCXB1YmxpYyBNb2RpZnlXZWJNb2R1bGVDb21tYW5kKElUb21jYXRDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29uZmlndXJhdGlvbiwgaW50IGluZGV4LCBXZWJNb2R1bGUgbW9kdWxlKSB7Ci0JCXN1cGVyKGNvbmZpZ3VyYXRpb24sIE1lc3NhZ2VzLmNvbmZpZ3VyYXRpb25FZGl0b3JBY3Rpb25Nb2RpZnlXZWJNb2R1bGUpOwotCQl0aGlzLmluZGV4ID0gaW5kZXg7Ci0JCW5ld01vZHVsZSA9IG1vZHVsZTsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlIHRoZSBjb21tYW5kLgotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCW9sZE1vZHVsZSA9IChXZWJNb2R1bGUpIGNvbmZpZ3VyYXRpb24uZ2V0V2ViTW9kdWxlcygpLmdldChpbmRleCk7Ci0JCWNvbmZpZ3VyYXRpb24ubW9kaWZ5V2ViTW9kdWxlKGluZGV4LCBuZXdNb2R1bGUuZ2V0RG9jdW1lbnRCYXNlKCksIG5ld01vZHVsZS5nZXRQYXRoKCksIG5ld01vZHVsZS5pc1JlbG9hZGFibGUoKSk7Ci0JfQotCi0JLyoqCi0JICogVW5kbyB0aGUgY29tbWFuZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQljb25maWd1cmF0aW9uLm1vZGlmeVdlYk1vZHVsZShpbmRleCwgb2xkTW9kdWxlLmdldERvY3VtZW50QmFzZSgpLCBvbGRNb2R1bGUuZ2V0UGF0aCgpLCBvbGRNb2R1bGUuaXNSZWxvYWRhYmxlKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL2NvbW1hbmQvUmVtb3ZlTWltZU1hcHBpbmdDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL2NvbW1hbmQvUmVtb3ZlTWltZU1hcHBpbmdDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4YzI3NTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9jb21tYW5kL1JlbW92ZU1pbWVNYXBwaW5nQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLmNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLklUb21jYXRDb25maWd1cmF0aW9uV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLk1pbWVNYXBwaW5nOwotLyoqCi0gKiBDb21tYW5kIHRvIHJlbW92ZSBhIG1pbWUgbWFwcGluZy4KLSAqLwotcHVibGljIGNsYXNzIFJlbW92ZU1pbWVNYXBwaW5nQ29tbWFuZCBleHRlbmRzIENvbmZpZ3VyYXRpb25Db21tYW5kIHsKLQlwcm90ZWN0ZWQgaW50IGluZGV4OwotCXByb3RlY3RlZCBNaW1lTWFwcGluZyBtYXBwaW5nOwotCi0JLyoqCi0JICogUmVtb3ZlTWltZU1hcHBpbmdDb21tYW5kIGNvbnN0cnVjdG9yLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWd1cmF0aW9uIGEgdG9tY2F0IGNvbmZpZ3VyYXRpb24KLQkgKiBAcGFyYW0gaW5kZXggYW4gaW5kZXgKLQkgKi8KLQlwdWJsaWMgUmVtb3ZlTWltZU1hcHBpbmdDb21tYW5kKElUb21jYXRDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29uZmlndXJhdGlvbiwgaW50IGluZGV4KSB7Ci0JCXN1cGVyKGNvbmZpZ3VyYXRpb24sIE1lc3NhZ2VzLmNvbmZpZ3VyYXRpb25FZGl0b3JBY3Rpb25SZW1vdmVNaW1lTWFwcGluZyk7Ci0JCXRoaXMuaW5kZXggPSBpbmRleDsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlIHRoZSBjb21tYW5kLgotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCW1hcHBpbmcgPSAoTWltZU1hcHBpbmcpIGNvbmZpZ3VyYXRpb24uZ2V0TWltZU1hcHBpbmdzKCkuZ2V0KGluZGV4KTsKLQkJY29uZmlndXJhdGlvbi5yZW1vdmVNaW1lTWFwcGluZyhpbmRleCk7Ci0JfQotCi0JLyoqCi0JICogVW5kbyB0aGUgY29tbWFuZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQljb25maWd1cmF0aW9uLmFkZE1pbWVNYXBwaW5nKGluZGV4LCBtYXBwaW5nKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9jb21tYW5kL1JlbW92ZU1vZHVsZUNvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvY29tbWFuZC9SZW1vdmVNb2R1bGVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmNTFmMjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9jb21tYW5kL1JlbW92ZU1vZHVsZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotoCoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuY29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5BYnN0cmFjdE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyV29ya2luZ0NvcHk7Ci0vKioKLSAqIENvbW1hbmQgdG8gcmVtb3ZlIGEgd2ViIG1vZHVsZSBmcm9tIGEgc2VydmVyLgotICovCi1wdWJsaWMgY2xhc3MgUmVtb3ZlTW9kdWxlQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0T3BlcmF0aW9uIHsKLQlwcm90ZWN0ZWQgSVNlcnZlcldvcmtpbmdDb3B5IHNlcnZlcjsKLQlwcm90ZWN0ZWQgSU1vZHVsZSBtb2R1bGU7Ci0KLQkvKioKLQkgKiBBZGRNb2R1bGVDb21tYW5kIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHNlcnZlciBhIHNlcnZlcgotCSAqIEBwYXJhbSBtb2R1bGUgYSB3ZWIgbW9kdWxlCi0JICovCi0JcHVibGljIFJlbW92ZU1vZHVsZUNvbW1hbmQoSVNlcnZlcldvcmtpbmdDb3B5IHNlcnZlciwgSU1vZHVsZSBtb2R1bGUpIHsKLQkJc3VwZXIoTWVzc2FnZXMuY29uZmlndXJhdGlvbkVkaXRvckFjdGlvblJlbW92ZVdlYk1vZHVsZSk7Ci0JCXRoaXMuc2VydmVyID0gc2VydmVyOwotCQl0aGlzLm1vZHVsZSA9IG1vZHVsZTsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCXNlcnZlci5tb2RpZnlNb2R1bGVzKG51bGwsIG5ldyBJTW9kdWxlW10geyBtb2R1bGUgfSwgbW9uaXRvcik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyByZWRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGV4ZWN1dGUobW9uaXRvciwgaW5mbyk7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgdW5kbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlzZXJ2ZXIubW9kaWZ5TW9kdWxlcyhuZXcgSU1vZHVsZVtdIHsgbW9kdWxlIH0sIG51bGwsIG1vbml0b3IpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvY29tbWFuZC9SZW1vdmVXZWJNb2R1bGVDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL2NvbW1hbmQvUmVtb3ZlV2ViTW9kdWxlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODQ5ZDFjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvY29tbWFuZC9SZW1vdmVXZWJNb2R1bGVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuY29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuSVRvbWNhdENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuV2ViTW9kdWxlOwotLyoqCi0gKiBDb21tYW5kIHRvIHJlbW92ZSBhIHdlYiBtb2R1bGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBSZW1vdmVXZWJNb2R1bGVDb21tYW5kIGV4dGVuZHMgQ29uZmlndXJhdGlvbkNvbW1hbmQgewotCXByb3RlY3RlZCBpbnQgaW5kZXg7Ci0JcHJvdGVjdGVkIFdlYk1vZHVsZSBtb2R1bGU7Ci0KLQkvKioKLQkgKiBSZW1vdmVXZWJNb2R1bGVDb21tYW5kIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ3VyYXRpb24gYSB0b21jYXQgY29uZmlndXJhdGlvbgotCSAqIEBwYXJhbSBpbmRleCBhbiBpbmRleAotCSAqLwotCXB1YmxpYyBSZW1vdmVXZWJNb2R1bGVDb21tYW5kKElUb21jYXRDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29uZmlndXJhdGlvbiwgaW50IGluZGV4KSB7Ci0JCXN1cGVyKGNvbmZpZ3VyYXRpb24sIE1lc3NhZ2VzLmNvbmZpZ3VyYXRpb25FZGl0b3JBY3Rpb25SZW1vdmVXZWJNb2R1bGUpOwotCQl0aGlzLmluZGV4ID0gaW5kZXg7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZSB0aGUgY29tbWFuZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQltb2R1bGUgPSAoV2ViTW9kdWxlKSBjb25maWd1cmF0aW9uLmdldFdlYk1vZHVsZXMoKS5nZXQoaW5kZXgpOwotCQljb25maWd1cmF0aW9uLnJlbW92ZVdlYk1vZHVsZShpbmRleCk7Ci0JfQotCi0JLyoqCi0JICogVW5kbyB0aGUgY29tbWFuZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQljb25maWd1cmF0aW9uLmFkZFdlYk1vZHVsZShpbmRleCwgbW9kdWxlKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9jb21tYW5kL1NlcnZlckNvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvY29tbWFuZC9TZXJ2ZXJDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2ZThhZDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9jb21tYW5kL1NlcnZlckNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5jb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLkFic3RyYWN0T3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuSVRvbWNhdFNlcnZlcldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuVG9tY2F0U2VydmVyOwotLyoqCi0gKiBBIGNvbW1hbmQgb24gYSBUb21jYXQgc2VydmVyLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2VydmVyQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0T3BlcmF0aW9uIHsKLQlwcm90ZWN0ZWQgVG9tY2F0U2VydmVyIHNlcnZlcjsKLQotCS8qKgotCSAqIFNlcnZlckNvbW1hbmQgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gc2VydmVyIGEgVG9tY2F0IHNlcnZlcgotCSAqIEBwYXJhbSBsYWJlbCBhIGxhYmVsCi0JICovCi0JcHVibGljIFNlcnZlckNvbW1hbmQoSVRvbWNhdFNlcnZlcldvcmtpbmdDb3B5IHNlcnZlciwgU3RyaW5nIGxhYmVsKSB7Ci0JCXN1cGVyKGxhYmVsKTsKLQkJdGhpcy5zZXJ2ZXIgPSAoVG9tY2F0U2VydmVyKSBzZXJ2ZXI7Ci0JfQotCQotCXB1YmxpYyBJU3RhdHVzIHJlZG8oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlyZXR1cm4gZXhlY3V0ZShtb25pdG9yLCBpbmZvKTsKLQl9Ci0KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBleGVjdXRlKCk7Ci0KLQlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJZXhlY3V0ZSgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCB1bmRvKCk7Ci0KLQlwdWJsaWMgSVN0YXR1cyB1bmRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJdW5kbygpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9jb21tYW5kL1NldERlYnVnTW9kZUNvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvY29tbWFuZC9TZXREZWJ1Z01vZGVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyYjU2YzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9jb21tYW5kL1NldERlYnVnTW9kZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5jb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5JVG9tY2F0U2VydmVyV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5NZXNzYWdlczsKLS8qKgotICogQ29tbWFuZCB0byBjaGFuZ2UgdGhlIHNlcnZlciBkZWJ1ZyBtb2RlLgotICovCi1wdWJsaWMgY2xhc3MgU2V0RGVidWdNb2RlQ29tbWFuZCBleHRlbmRzIFNlcnZlckNvbW1hbmQgewotCXByb3RlY3RlZCBib29sZWFuIGRlYnVnOwotCXByb3RlY3RlZCBib29sZWFuIG9sZERlYnVnOwotCi0JLyoqCi0JICogU2V0RGVidWdNb2RlQ29tbWFuZCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBzZXJ2ZXIgYSBUb21jYXQgc2VydmVyCi0JICogQHBhcmFtIGRlYnVnIDxjb2RlPnRydWU8L2NvZGU+IGZvciBkZWJ1ZyBtb2RlCi0JICovCi0JcHVibGljIFNldERlYnVnTW9kZUNvbW1hbmQoSVRvbWNhdFNlcnZlcldvcmtpbmdDb3B5IHNlcnZlciwgYm9vbGVhbiBkZWJ1ZykgewotCQlzdXBlcihzZXJ2ZXIsIE1lc3NhZ2VzLnNlcnZlckVkaXRvckFjdGlvblNldERlYnVnTW9kZSk7Ci0JCXRoaXMuZGVidWcgPSBkZWJ1ZzsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlIHRoZSBjb21tYW5kLgotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCW9sZERlYnVnID0gc2VydmVyLmlzRGVidWcoKTsKLQkJc2VydmVyLnNldERlYnVnKGRlYnVnKTsKLQl9Ci0KLQkvKioKLQkgKiBVbmRvIHRoZSBjb21tYW5kLgotCSAqLwotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCXNlcnZlci5zZXREZWJ1ZyhvbGREZWJ1Zyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvY29tbWFuZC9TZXRTZWN1cmVDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL2NvbW1hbmQvU2V0U2VjdXJlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTU0MjlmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwvY29tbWFuZC9TZXRTZWN1cmVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuY29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuSVRvbWNhdFNlcnZlcldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuTWVzc2FnZXM7Ci0vKioKLSAqIENvbW1hbmQgdG8gY2hhbmdlIHRoZSBzZXJ2ZXIgc2VjdXJpdHkgb3B0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgU2V0U2VjdXJlQ29tbWFuZCBleHRlbmRzIFNlcnZlckNvbW1hbmQgewotCXByb3RlY3RlZCBib29sZWFuIHNlY3VyZTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBvbGRTZWN1cmU7Ci0KLQkvKioKLQkgKiBTZXRTZWN1cmVDb21tYW5kIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHNlcnZlciBhIFRvbWNhdCBzZXJ2ZXIKLQkgKiBAcGFyYW0gc2VjdXJlIDxjb2RlPnRydWU8L2NvZGU+IGZvciBzZWN1cml0eSBvbgotCSAqLwotCXB1YmxpYyBTZXRTZWN1cmVDb21tYW5kKElUb21jYXRTZXJ2ZXJXb3JraW5nQ29weSBzZXJ2ZXIsIGJvb2xlYW4gc2VjdXJlKSB7Ci0JCXN1cGVyKHNlcnZlciwgTWVzc2FnZXMuc2VydmVyRWRpdG9yQWN0aW9uU2V0U2VjdXJlKTsKLQkJdGhpcy5zZWN1cmUgPSBzZWN1cmU7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZSB0aGUgY29tbWFuZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlvbGRTZWN1cmUgPSBzZXJ2ZXIuaXNTZWN1cmUoKTsKLQkJc2VydmVyLnNldFNlY3VyZShzZWN1cmUpOwotCX0KLQotCS8qKgotCSAqIFVuZG8gdGhlIGNvbW1hbmQuCi0JICovCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJc2VydmVyLnNldFNlY3VyZShvbGRTZWN1cmUpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL2NvbW1hbmQvU2V0VGVzdEVudmlyb25tZW50Q29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9jb21tYW5kL1NldFRlc3RFbnZpcm9ubWVudENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJiNDhhZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL2NvbW1hbmQvU2V0VGVzdEVudmlyb25tZW50Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLmNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLklUb21jYXRTZXJ2ZXJXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLk1lc3NhZ2VzOwotLyoqCi0gKiBDb21tYW5kIHRvIGNoYW5nZSB0aGUgc2VydmVyIGRlYnVnIG1vZGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXRUZXN0RW52aXJvbm1lbnRDb21tYW5kIGV4dGVuZHMgU2VydmVyQ29tbWFuZCB7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gdGU7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gb2xkVGU7Ci0KLQkvKioKLQkgKiBTZXRUZXN0RW52aXJvbm1lbnRDb21tYW5kIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHNlcnZlciBhIFRvbWNhdCBzZXJ2ZXIKLQkgKiBAcGFyYW0gdGUgPGNvZGU+dHJ1ZTwvY29kZT4gZm9yIGEgdGVzdCBlbnZpcm9ubWVudC4KLQkgKi8KLQlwdWJsaWMgU2V0VGVzdEVudmlyb25tZW50Q29tbWFuZChJVG9tY2F0U2VydmVyV29ya2luZ0NvcHkgc2VydmVyLCBib29sZWFuIHRlKSB7Ci0JCXN1cGVyKHNlcnZlciwgTWVzc2FnZXMuc2VydmVyRWRpdG9yQWN0aW9uU2V0VGVzdEVudmlyb25tZW50KTsKLQkJdGhpcy50ZSA9IHRlOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGUgdGhlIGNvbW1hbmQuCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJb2xkVGUgPSBzZXJ2ZXIuaXNUZXN0RW52aXJvbm1lbnQoKTsKLQkJc2VydmVyLnNldFRlc3RFbnZpcm9ubWVudCh0ZSk7Ci0JfQotCi0JLyoqCi0JICogVW5kbyB0aGUgY29tbWFuZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlzZXJ2ZXIuc2V0VGVzdEVudmlyb25tZW50KG9sZFRlKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC9jb21tYW5kL1NldFdlYk1vZHVsZVBhdGhDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL2NvbW1hbmQvU2V0V2ViTW9kdWxlUGF0aENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQwZjFkYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL2NvbW1hbmQvU2V0V2ViTW9kdWxlUGF0aENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5jb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5JVG9tY2F0Q29uZmlndXJhdGlvbldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5XZWJNb2R1bGU7Ci0vKioKLSAqIENvbW1hbmQgdG8gbW9kaWZ5IHRoZSBwYXRoIG9mIGEgV2ViIG1vZHVsZS4KLSAqLwotcHVibGljIGNsYXNzIFNldFdlYk1vZHVsZVBhdGhDb21tYW5kIGV4dGVuZHMgQ29uZmlndXJhdGlvbkNvbW1hbmQgewotCXByb3RlY3RlZCBpbnQgaW5kZXg7Ci0JcHJvdGVjdGVkIFdlYk1vZHVsZSBvbGRNb2R1bGU7Ci0JcHJvdGVjdGVkIFN0cmluZyBwYXRoOwotCi0JLyoqCi0JICogU2V0V2ViTW9kdWxlUGF0aENvbW1hbmQgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlndXJhdGlvbiBhIHRvbWNhdCBjb25maWd1cmF0aW9uCi0JICogQHBhcmFtIGluZGV4IGFuIGluZGV4Ci0JICogQHBhcmFtIGNvbnRleHRSb290IHRoZSBjb250ZXh0IHJvb3QKLQkgKi8KLQlwdWJsaWMgU2V0V2ViTW9kdWxlUGF0aENvbW1hbmQoSVRvbWNhdENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBjb25maWd1cmF0aW9uLCBpbnQgaW5kZXgsIFN0cmluZyBjb250ZXh0Um9vdCkgewotCQlzdXBlcihjb25maWd1cmF0aW9uLCBNZXNzYWdlcy5jb25maWd1cmF0aW9uRWRpdG9yQWN0aW9uRWRpdFdlYk1vZHVsZVBhdGgpOwotCQl0aGlzLmluZGV4ID0gaW5kZXg7Ci0JCXRoaXMucGF0aCA9IGNvbnRleHRSb290OwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGUgdGhlIGNvbW1hbmQuCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJb2xkTW9kdWxlID0gKFdlYk1vZHVsZSkgY29uZmlndXJhdGlvbi5nZXRXZWJNb2R1bGVzKCkuZ2V0KGluZGV4KTsKLQkJY29uZmlndXJhdGlvbi5yZW1vdmVXZWJNb2R1bGUoaW5kZXgpOwotCQkKLQkJV2ViTW9kdWxlIG1vZHVsZSA9IG5ldyBXZWJNb2R1bGUocGF0aCwgb2xkTW9kdWxlLmdldERvY3VtZW50QmFzZSgpLCBvbGRNb2R1bGUuZ2V0TWVtZW50bygpLCBvbGRNb2R1bGUuaXNSZWxvYWRhYmxlKCkpOwotCQljb25maWd1cmF0aW9uLmFkZFdlYk1vZHVsZShpbmRleCwgbW9kdWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBVbmRvIHRoZSBjb21tYW5kLgotCSAqLwotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCWNvbmZpZ3VyYXRpb24ucmVtb3ZlV2ViTW9kdWxlKGluZGV4KTsKLQkJY29uZmlndXJhdGlvbi5hZGRXZWJNb2R1bGUoaW5kZXgsIG9sZE1vZHVsZSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwveG1sL0ZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwveG1sL0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZiZGJhYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL3htbC9GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbDsKLQotaW1wb3J0IGphdmEuaW8uKjsKLQotaW1wb3J0IG9yZy53M2MuZG9tLio7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5UcmFjZTsKLS8qKgotICogRmFjdG9yeSBmb3IgcmVhZGluZyBhbmQgd3JpdGluZyBmcm9tIFhNTCBmaWxlcy4KLSAqLwotcHVibGljIGNsYXNzIEZhY3RvcnkgewotCXByb3RlY3RlZCBTdHJpbmcgcGFja2FnZU5hbWU7Ci0JcHJvdGVjdGVkIERvY3VtZW50IGRvY3VtZW50OwotCi0JcHVibGljIEZhY3RvcnkoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0JCi0JcHJvdGVjdGVkIEF0dHIgY3JlYXRlQXR0cmlidXRlKFN0cmluZyBzLCBFbGVtZW50IGVsZW1lbnQpIHsKLQkJQXR0ciBhdHRyID0gZG9jdW1lbnQuY3JlYXRlQXR0cmlidXRlKHMpOwotCQllbGVtZW50LnNldEF0dHJpYnV0ZU5vZGUoYXR0cik7Ci0JCXJldHVybiBhdHRyOwotCX0KLQkKLQlwcm90ZWN0ZWQgWE1MRWxlbWVudCBjcmVhdGVFbGVtZW50KGludCBpbmRleCwgU3RyaW5nIHMsIE5vZGUgbm9kZSkgewotCQlpZiAoaW5kZXggPCAwKQotCQkJcmV0dXJuIGNyZWF0ZUVsZW1lbnQocywgbm9kZSk7Ci0JCi0JCUVsZW1lbnQgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQocyk7Ci0JCXRyeSB7Ci0JCQlOb2RlIGNoaWxkID0gbm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGluZGV4OyBpKyspCi0JCQkJY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCQotCQkJbm9kZS5pbnNlcnRCZWZvcmUoZWxlbWVudCwgY2hpbGQpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJbm9kZS5hcHBlbmRDaGlsZChlbGVtZW50KTsKLQkJfQotCQlyZXR1cm4gbmV3SW5zdGFuY2UoZWxlbWVudCk7Ci0JfQotCQotCXByb3RlY3RlZCBYTUxFbGVtZW50IGNyZWF0ZUVsZW1lbnQoU3RyaW5nIHMsIE5vZGUgbm9kZSkgewotCQlFbGVtZW50IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHMpOwotCQlub2RlLmFwcGVuZENoaWxkKGVsZW1lbnQpOwotCQlyZXR1cm4gbmV3SW5zdGFuY2UoZWxlbWVudCk7Ci0JfQotCQotCXB1YmxpYyBieXRlW10gZ2V0Q29udGVudHMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gWE1MVXRpbC5nZXRDb250ZW50cyhkb2N1bWVudCk7Ci0JfQotCQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uRG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKSB7Ci0JCXJldHVybiBkb2N1bWVudDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgewotCQlyZXR1cm4gcGFja2FnZU5hbWU7Ci0JfQotCi0JcHVibGljIFhNTEVsZW1lbnQgbG9hZERvY3VtZW50KElucHV0U3RyZWFtIGluKSB0aHJvd3MgSU9FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlkb2N1bWVudCA9IFhNTFV0aWwuZ2V0RG9jdW1lbnRCdWlsZGVyKCkucGFyc2UobmV3IElucHV0U291cmNlKGluKSk7Ci0JCQlFbGVtZW50IGVsZW1lbnQgPSBkb2N1bWVudC5nZXREb2N1bWVudEVsZW1lbnQoKTsKLQkJCXJldHVybiBuZXdJbnN0YW5jZShlbGVtZW50KTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIkVycm9yIGxvYWRpbmcgZG9jdW1lbnQiLCBleGNlcHRpb24pOwotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJDb3VsZCBub3QgbG9hZCBkb2N1bWVudCIpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFhNTEVsZW1lbnQgbmV3SW5zdGFuY2UoRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN0cmluZyBzID0gZWxlbWVudC5nZXROb2RlTmFtZSgpOwotCQl0cnkgewotCQkJLy8gY2hhbmdlICJ3ZWItYXBwOnRlc3QiIHRvICJXZWJBcHBUZXN0IgotCQkJcyA9IHMuc3Vic3RyaW5nKDAsIDEpLnRvVXBwZXJDYXNlKCkgKyBzLnN1YnN0cmluZygxKTsKLQkJCWludCBpID0gcy5pbmRleE9mKCItIik7Ci0JCQl3aGlsZSAoaSA+PSAwKSB7Ci0JCQkJcyA9IHMuc3Vic3RyaW5nKDAsIGkpICsgcy5zdWJzdHJpbmcoaSsxLCBpKzIpLnRvVXBwZXJDYXNlKCkgKyBzLnN1YnN0cmluZyhpKzIpOwotCQkJCWkgPSBzLmluZGV4T2YoIi0iKTsKLQkJCX0KLQkJCWkgPSBzLmluZGV4T2YoIjoiKTsKLQkJCXdoaWxlIChpID49IDApIHsKLQkJCQlzID0gcy5zdWJzdHJpbmcoMCwgaSkgKyBzLnN1YnN0cmluZyhpKzEsIGkrMikudG9VcHBlckNhc2UoKSArIHMuc3Vic3RyaW5nKGkrMik7Ci0JCQkJaSA9IHMuaW5kZXhPZigiOiIpOwotCQkJfQotCQotCQkJLy8gYWRkIHBhY2thZ2UgbmFtZQotCQkJaWYgKHBhY2thZ2VOYW1lICE9IG51bGwpCi0JCQkJcyA9IHBhY2thZ2VOYW1lICsgIi4iICsgczsKLQkJCUNsYXNzIGNsYXNzMSA9IENsYXNzLmZvck5hbWUocyk7Ci0JCi0JCQlYTUxFbGVtZW50IHhtbEVsZW1lbnQgPSAoWE1MRWxlbWVudCkgY2xhc3MxLm5ld0luc3RhbmNlKCk7Ci0JCQl4bWxFbGVtZW50LnNldEVsZW1lbnQoZWxlbWVudCk7Ci0JCQl4bWxFbGVtZW50LnNldEZhY3RvcnkodGhpcyk7Ci0JCQlyZXR1cm4geG1sRWxlbWVudDsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJLy8gaWdub3JlCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNhdmUoU3RyaW5nIGZpbGVuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlYTUxVdGlsLnNhdmUoZmlsZW5hbWUsIGRvY3VtZW50KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0RG9jdW1lbnQoRG9jdW1lbnQgZCkgewotCQlkb2N1bWVudCA9IGQ7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFBhY2thZ2VOYW1lKFN0cmluZyBzKSB7Ci0JCXBhY2thZ2VOYW1lID0gczsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC94bWwvWE1MRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC94bWwvWE1MRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTRjMTVmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwveG1sL1hNTEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sOwotCi1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLio7Ci0vKioKLSAqIEFuIFhNTCBlbGVtZW50LgotICovCi1wdWJsaWMgY2xhc3MgWE1MRWxlbWVudCB7Ci0JcHJpdmF0ZSBFbGVtZW50IHhtbEVsZW1lbnQ7Ci0JcHJvdGVjdGVkIEZhY3RvcnkgZmFjdG9yeTsKLQotCXB1YmxpYyBYTUxFbGVtZW50KCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIEF0dHIgYWRkQXR0cmlidXRlKFN0cmluZyBzLCBTdHJpbmcgczEpIHsKLQkJQXR0ciBhdHRyID0gZmFjdG9yeS5jcmVhdGVBdHRyaWJ1dGUocywgeG1sRWxlbWVudCk7Ci0JCWF0dHIuc2V0VmFsdWUoczEpOwotCQlyZXR1cm4gYXR0cjsKLQl9Ci0KLQlwdWJsaWMgWE1MRWxlbWVudCBjcmVhdGVFbGVtZW50KGludCBpbmRleCwgU3RyaW5nIHMpIHsKLQkJcmV0dXJuIGZhY3RvcnkuY3JlYXRlRWxlbWVudChpbmRleCwgcywgeG1sRWxlbWVudCk7Ci0JfQotCi0JcHVibGljIFhNTEVsZW1lbnQgY3JlYXRlRWxlbWVudChTdHJpbmcgcykgewotCQlyZXR1cm4gZmFjdG9yeS5jcmVhdGVFbGVtZW50KHMsIHhtbEVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBYTUxFbGVtZW50IGZpbmRFbGVtZW50KFN0cmluZyBzKSB7Ci0JCU5vZGVMaXN0IG5vZGVsaXN0ID0geG1sRWxlbWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShzKTsKLQkJaW50IGkgPSBub2RlbGlzdCA9PSBudWxsID8gMCA6IG5vZGVsaXN0LmdldExlbmd0aCgpOwotCQlmb3IgKGludCBqID0gMDsgaiA8IGk7IGorKykgewotCQkJTm9kZSBub2RlID0gbm9kZWxpc3QuaXRlbShqKTsKLQkJCVN0cmluZyBzMSA9IG5vZGUuZ2V0Tm9kZU5hbWUoKS50cmltKCk7Ci0JCQlpZiAoczEuZXF1YWxzKHMpKQotCQkJCXJldHVybiBmYWN0b3J5Lm5ld0luc3RhbmNlKChFbGVtZW50KSBub2RlKTsKLQkJfQotCQotCQlyZXR1cm4gY3JlYXRlRWxlbWVudChzKTsKLQl9Ci0KLQlwdWJsaWMgWE1MRWxlbWVudCBmaW5kRWxlbWVudChTdHJpbmcgcywgaW50IGkpIHsKLQkJTm9kZUxpc3Qgbm9kZWxpc3QgPSB4bWxFbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKHMpOwotCQlpbnQgaiA9IG5vZGVsaXN0ID09IG51bGwgPyAwIDogbm9kZWxpc3QuZ2V0TGVuZ3RoKCk7Ci0JCWZvciAoaW50IGsgPSAwOyBrIDwgajsgaysrKSB7Ci0JCQlOb2RlIG5vZGUgPSBub2RlbGlzdC5pdGVtKGspOwotCQkJU3RyaW5nIHMxID0gbm9kZS5nZXROb2RlTmFtZSgpLnRyaW0oKTsKLQkJCWlmIChzMS5lcXVhbHMocykgJiYgayA9PSBpKQotCQkJCXJldHVybiBmYWN0b3J5Lm5ld0luc3RhbmNlKChFbGVtZW50KSBub2RlKTsKLQkJfQotCQotCQlyZXR1cm4gY3JlYXRlRWxlbWVudChzKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZVZhbHVlKFN0cmluZyBzKSB7Ci0JCUF0dHIgYXR0ciA9IHhtbEVsZW1lbnQuZ2V0QXR0cmlidXRlTm9kZShzKTsKLQkJaWYgKGF0dHIgIT0gbnVsbCkKLQkJCXJldHVybiBhdHRyLmdldFZhbHVlKCk7Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIE1hcCBnZXRBdHRyaWJ1dGVzKCkgewotCQlNYXAgYXR0cmlidXRlcyA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7Ci0JCU5hbWVkTm9kZU1hcCBhdHRycyA9IHhtbEVsZW1lbnQuZ2V0QXR0cmlidXRlcygpOwotCQlpZiAobnVsbCAhPSBhdHRycykgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRycy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJTm9kZSBhdHRyID0gYXR0cnMuaXRlbShpKTsKLQkJCQlTdHJpbmcgbmFtZSA9IGF0dHIuZ2V0Tm9kZU5hbWUoKTsKLQkJCQlTdHJpbmcgdmFsdWUgPSBhdHRyLmdldE5vZGVWYWx1ZSgpOwotCQkJCWF0dHJpYnV0ZXMucHV0KG5hbWUsIHZhbHVlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gYXR0cmlidXRlczsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIHhtbEVsZW1lbnQuZ2V0Tm9kZU5hbWUoKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRFbGVtZW50VmFsdWUoKSB7Ci0JCXJldHVybiBnZXRFbGVtZW50VmFsdWUoeG1sRWxlbWVudCk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGdldEVsZW1lbnRWYWx1ZShFbGVtZW50IGVsZW1lbnQpIHsKLQkJU3RyaW5nIHMgPSBlbGVtZW50LmdldE5vZGVWYWx1ZSgpOwotCQlpZiAocyAhPSBudWxsKQotCQkJcmV0dXJuIHM7Ci0JCU5vZGVMaXN0IG5vZGVsaXN0ID0gZWxlbWVudC5nZXRDaGlsZE5vZGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZWxpc3QuZ2V0TGVuZ3RoKCk7IGkrKykKLQkJCWlmIChub2RlbGlzdC5pdGVtKGkpIGluc3RhbmNlb2YgVGV4dCkKLQkJCQlyZXR1cm4gKChUZXh0KSBub2RlbGlzdC5pdGVtKGkpKS5nZXREYXRhKCk7Ci0JCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgRWxlbWVudCBnZXRTdWJFbGVtZW50KFN0cmluZyBzKSB7Ci0JCU5vZGVMaXN0IG5vZGVsaXN0ID0geG1sRWxlbWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShzKTsKLQkJaW50IGkgPSBub2RlbGlzdCA9PSBudWxsID8gMCA6IG5vZGVsaXN0LmdldExlbmd0aCgpOwotCQlmb3IgKGludCBqID0gMDsgaiA8IGk7IGorKykgewotCQkJTm9kZSBub2RlID0gbm9kZWxpc3QuaXRlbShqKTsKLQkJCVN0cmluZyBzMSA9IG5vZGUuZ2V0Tm9kZU5hbWUoKS50cmltKCk7Ci0JCQlpZiAoczEuZXF1YWxzKHMpKQotCQkJCXJldHVybiAoRWxlbWVudCkgbm9kZTsKLQkJfQotCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFN1YkVsZW1lbnRWYWx1ZShTdHJpbmcgcykgewotCQlFbGVtZW50IGVsZW1lbnQgPSBnZXRTdWJFbGVtZW50KHMpOwotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCi0JCVN0cmluZyB2YWx1ZSA9IGdldEVsZW1lbnRWYWx1ZShlbGVtZW50KTsKLQkJaWYgKHZhbHVlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCXJldHVybiB2YWx1ZS50cmltKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlQXR0cmlidXRlKFN0cmluZyBzKSB7Ci0JCXRyeSB7Ci0JCQl4bWxFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShzKTsKLQkJCXJldHVybiB0cnVlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlbW92ZUVsZW1lbnQoU3RyaW5nIHMsIGludCBpKSB7Ci0JCU5vZGVMaXN0IG5vZGVsaXN0ID0geG1sRWxlbWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShzKTsKLQkJaW50IGogPSBub2RlbGlzdCA9PSBudWxsID8gMCA6IG5vZGVsaXN0LmdldExlbmd0aCgpOwotCQlmb3IgKGludCBrID0gMDsgayA8IGo7IGsrKykgewotCQkJTm9kZSBub2RlID0gbm9kZWxpc3QuaXRlbShrKTsKLQkJCVN0cmluZyBzMSA9IG5vZGUuZ2V0Tm9kZU5hbWUoKS50cmltKCk7Ci0JCQlpZiAoczEuZXF1YWxzKHMpICYmIGsgPT0gaSkgewotCQkJCXhtbEVsZW1lbnQucmVtb3ZlQ2hpbGQobm9kZSk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZVZhbHVlKFN0cmluZyBzLCBTdHJpbmcgczEpIHsKLQkJQXR0ciBhdHRyID0geG1sRWxlbWVudC5nZXRBdHRyaWJ1dGVOb2RlKHMpOwotCQlpZiAoYXR0ciA9PSBudWxsKQotCQkJYXR0ciA9IGFkZEF0dHJpYnV0ZShzLCBzMSk7Ci0JCWVsc2UKLQkJCWF0dHIuc2V0VmFsdWUoczEpOwotCX0KLQotCXZvaWQgc2V0RWxlbWVudChFbGVtZW50IGVsZW1lbnQpIHsKLQkJeG1sRWxlbWVudCA9IGVsZW1lbnQ7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHNldEVsZW1lbnRWYWx1ZShFbGVtZW50IGVsZW1lbnQsIFN0cmluZyB2YWx1ZSkgewotCQlTdHJpbmcgcyA9IGVsZW1lbnQuZ2V0Tm9kZVZhbHVlKCk7Ci0JCWlmIChzICE9IG51bGwpIHsKLQkJCWVsZW1lbnQuc2V0Tm9kZVZhbHVlKHZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlOb2RlTGlzdCBub2RlbGlzdCA9IGVsZW1lbnQuZ2V0Q2hpbGROb2RlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVsaXN0LmdldExlbmd0aCgpOyBpKyspCi0JCQlpZiAobm9kZWxpc3QuaXRlbShpKSBpbnN0YW5jZW9mIFRleHQpIHsKLQkJCQlUZXh0IHRleHQgPSAoVGV4dCkgbm9kZWxpc3QuaXRlbShpKTsKLQkJCQl0ZXh0LnNldERhdGEodmFsdWUpOwotCQkJCXJldHVybjsKLQkJCX0KLQkKLQkJcmV0dXJuOwotCX0KLQotCXZvaWQgc2V0RmFjdG9yeShGYWN0b3J5IGZhY3RvcnkxKSB7Ci0JCWZhY3RvcnkgPSBmYWN0b3J5MTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTdWJFbGVtZW50VmFsdWUoU3RyaW5nIHMsIFN0cmluZyB2YWx1ZSkgewotCQlFbGVtZW50IGVsZW1lbnQgPSBnZXRTdWJFbGVtZW50KHMpOwotCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQllbGVtZW50ID0gZmFjdG9yeS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KHMpOwotCQkJZWxlbWVudC5hcHBlbmRDaGlsZChmYWN0b3J5LmRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCJ0ZW1wIikpOwotCQkJeG1sRWxlbWVudC5hcHBlbmRDaGlsZChlbGVtZW50KTsKLQkJfQotCQlzZXRFbGVtZW50VmFsdWUoZWxlbWVudCwgdmFsdWUpOwotCX0KLQotCXB1YmxpYyBpbnQgc2l6ZU9mRWxlbWVudChTdHJpbmcgcykgewotCQlOb2RlTGlzdCBub2RlbGlzdCA9IHhtbEVsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUocyk7Ci0JCWludCBpID0gbm9kZWxpc3QgPT0gbnVsbCA/IDAgOiBub2RlbGlzdC5nZXRMZW5ndGgoKTsKLQkJcmV0dXJuIGk7Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlRWxlbWVudFZhbHVlKFN0cmluZyBzKSB7Ci0JCXRyeSB7Ci0JCQl4bWxFbGVtZW50LnNldE5vZGVWYWx1ZShzKTsKLQkJfSBjYXRjaCAoRE9NRXhjZXB0aW9uIGV4KSB7Ci0JCQlOb2RlTGlzdCBub2RlbGlzdCA9IHhtbEVsZW1lbnQuZ2V0Q2hpbGROb2RlcygpOwotCQkJaW50IGkgPSBub2RlbGlzdCA9PSBudWxsID8gMCA6IG5vZGVsaXN0LmdldExlbmd0aCgpOwotCQkJaWYgKGkgPiAwKSB7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBpOyBqKyspCi0JCQkJCWlmIChub2RlbGlzdC5pdGVtKGopIGluc3RhbmNlb2YgVGV4dCkgewotCQkJCQkJKChUZXh0KSBub2RlbGlzdC5pdGVtKGopKS5zZXREYXRhKHMpOwotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXhtbEVsZW1lbnQuYXBwZW5kQ2hpbGQoZmFjdG9yeS5kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShzKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGROb2RlcygpIHsKLQkJcmV0dXJuIHhtbEVsZW1lbnQuaGFzQ2hpbGROb2RlcygpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVDaGlsZHJlbigpCi0JewotCQl3aGlsZSAoeG1sRWxlbWVudC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCXhtbEVsZW1lbnQucmVtb3ZlQ2hpbGQoeG1sRWxlbWVudC5nZXRGaXJzdENoaWxkKCkpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIGNvcHlDaGlsZHJlblRvKFhNTEVsZW1lbnQgZGVzdGluYXRpb24pIHsKLQkJTm9kZUxpc3Qgbm9kZWxpc3QgPSB4bWxFbGVtZW50LmdldENoaWxkTm9kZXMoKTsKLQkJaW50IGxlbiA9IG5vZGVsaXN0ID09IG51bGwgPyAwIDogbm9kZWxpc3QuZ2V0TGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCU5vZGUgbm9kZSA9IG5vZGVsaXN0Lml0ZW0oaSk7Ci0JCQlkZXN0aW5hdGlvbi5pbXBvcnROb2RlKG5vZGUsIHRydWUpOwotCQl9Ci0JfQotCQotCXZvaWQgaW1wb3J0Tm9kZShOb2RlIG5vZGUsIGJvb2xlYW4gZGVlcCkgewotCQl4bWxFbGVtZW50LmFwcGVuZENoaWxkKHhtbEVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpLmltcG9ydE5vZGUobm9kZSwgZGVlcCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL3htbC9YTUxVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL3htbC9YTUxVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2ZDk2ZjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC94bWwvWE1MVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC54bWw7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuVHJhY2U7Ci1pbXBvcnQgb3JnLnczYy5kb20uKjsKLWltcG9ydCBvcmcueG1sLnNheC5FbnRpdHlSZXNvbHZlcjsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci0vKioKLSAqIFV0aWxpdHkgY2xhc3MgdG8gY3JlYXRlIGFuZCByZWFkIFhNTCBkb2N1bWVudHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxVdGlsIHsKLQlwcml2YXRlIHN0YXRpYyBEb2N1bWVudEJ1aWxkZXIgZG9jdW1lbnRCdWlsZGVyOwotCi0JLyoqCi0JICogWE1MVXRpbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBYTUxVdGlsKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIERvY3VtZW50QnVpbGRlciBnZXREb2N1bWVudEJ1aWxkZXIoKSB7Ci0JCWlmIChkb2N1bWVudEJ1aWxkZXIgPT0gbnVsbCkKLQkJCXRyeSB7Ci0JCQkJRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBmYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCQkJCWZhY3Rvcnkuc2V0VmFsaWRhdGluZyhmYWxzZSk7Ci0JCQkJZmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZShmYWxzZSk7Ci0JCQkJZmFjdG9yeS5zZXRFeHBhbmRFbnRpdHlSZWZlcmVuY2VzKGZhbHNlKTsKLQkJCQkvL2ZhY3Rvcnkuc2V0QXR0cmlidXRlKCJodHRwOi8vYXBhY2hlLm9yZy94bWwvZmVhdHVyZXMvbm9udmFsaWRhdGluZy9sb2FkLWV4dGVybmFsLWR0ZCIsIG5ldyBCb29sZWFuKGZhbHNlKSk7Ci0JCQkJZG9jdW1lbnRCdWlsZGVyID0gZmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKLQkJCQlkb2N1bWVudEJ1aWxkZXIuc2V0RW50aXR5UmVzb2x2ZXIobmV3IEVudGl0eVJlc29sdmVyKCkgewotCQkJCQlwdWJsaWMgSW5wdXRTb3VyY2UgcmVzb2x2ZUVudGl0eShTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQkJCQkJcmV0dXJuIG5ldyBJbnB1dFNvdXJjZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0obmV3IGJ5dGVbMF0pKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJScnJvciBjcmVhdGluZyBkb2N1bWVudCBidWlsZGVyIik7Ci0JCQl9Ci0KLQkJcmV0dXJuIGRvY3VtZW50QnVpbGRlcjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBjaGlsZCBvZiB0aGUgZ2l2ZW4gbm9kZSBhdCB0aGUgZ2l2ZW4gaW5kZXguCi0JICoKLQkgKiBAcGFyYW0gZG9jIGEgZG9jdW1lbnQKLQkgKiBAcGFyYW0gZWxlbWVudCBhbiBlbGVtZW50Ci0JICogQHBhcmFtIGluZGV4IGFuIGluZGV4Ci0JICogQHBhcmFtIG5vZGVOYW1lIGEgbm9kZSBuYW1lCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5FbGVtZW50Ci0JICovCi0JcHVibGljIHN0YXRpYyBFbGVtZW50IGNyZWF0ZUNoaWxkRWxlbWVudChEb2N1bWVudCBkb2MsIEVsZW1lbnQgZWxlbWVudCwgaW50IGluZGV4LCBTdHJpbmcgbm9kZU5hbWUpIHsKLQkJRWxlbWVudCBlbGVtZW50MiA9IGRvYy5jcmVhdGVFbGVtZW50KG5vZGVOYW1lKTsKLQkJdHJ5IHsKLQkJCU5vZGVMaXN0IGNoaWxkTGlzdCA9IGVsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUobm9kZU5hbWUpOwotCQkJTm9kZSBjaGlsZCA9IGNoaWxkTGlzdC5pdGVtKGluZGV4KTsKLQkJCWVsZW1lbnQuaW5zZXJ0QmVmb3JlKGVsZW1lbnQyLCBjaGlsZCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllbGVtZW50LmFwcGVuZENoaWxkKGVsZW1lbnQyKTsKLQkJfQotCQlyZXR1cm4gZWxlbWVudDI7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgY2hpbGQgb2YgdGhlIGdpdmVuIG5vZGUuCi0JICoKLQkgKiBAcGFyYW0gZG9jIGEgZG9jdW1lbnQKLQkgKiBAcGFyYW0gbm9kZSBhIG5vZGUKLQkgKiBAcGFyYW0gbm9kZU5hbWUgYSBub2RlIG5hbWUKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLkVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVsZW1lbnQgY3JlYXRlQ2hpbGRFbGVtZW50KERvY3VtZW50IGRvYywgTm9kZSBub2RlLCBTdHJpbmcgbm9kZU5hbWUpIHsKLQkJRWxlbWVudCBlbGVtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnQobm9kZU5hbWUpOwotCQlub2RlLmFwcGVuZENoaWxkKGVsZW1lbnQpOwotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0KLQkvKgotCSAqIFNldCB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIG5vZGUgdG8gdGhlIGdpdmVuIHRleHQuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZVRleHRDaGlsZEVsZW1lbnQoRG9jdW1lbnQgZG9jLCBOb2RlIG5vZGUsIFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKLQkJRWxlbWVudCBlbGVtZW50ID0gY3JlYXRlQ2hpbGRFbGVtZW50KGRvYywgbm9kZSwgbmFtZSk7Ci0JCWVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZVRleHROb2RlKHZhbHVlKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhdHRyaWJ1dGUgdmFsdWUuCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGVsZW1lbnQgb3JnLnczYy5kb20uRWxlbWVudAotCSAqIEBwYXJhbSBhdHRyIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBdHRyaWJ1dGVWYWx1ZShFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBhdHRyKSB7Ci0JCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZU5vZGUoYXR0cikuZ2V0VmFsdWUoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJ5dGVbXSBnZXRDb250ZW50cyhEb2N1bWVudCBkb2N1bWVudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJdHJ5IHsKLQkJCXByaW50KG5ldyBQcmludFN0cmVhbShvdXQsIHRydWUsICJVVEYtOCIpLCBkb2N1bWVudCk7Ci0JCQlyZXR1cm4gb3V0LnRvQnl0ZUFycmF5KCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKGV4LmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAob3V0ICE9IG51bGwpCi0JCQkJdHJ5IHsKLQkJCQkJb3V0LmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gaWdub3JlCi0JCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZ2V0RG9jdW1lbnRUeXBlRGF0YShEb2N1bWVudFR5cGUgZG9jdHlwZSkgewotCQlTdHJpbmcgZGF0YSA9IGRvY3R5cGUuZ2V0TmFtZSgpOwotCQlpZiAoZG9jdHlwZS5nZXRQdWJsaWNJZCgpICE9IG51bGwpIHsKLQkJCWRhdGEgKz0gIiBQVUJMSUMgXCIiICsgZG9jdHlwZS5nZXRQdWJsaWNJZCgpICsgIlwiIjsKLQkJCVN0cmluZyBzeXN0ZW1JZCA9IGRvY3R5cGUuZ2V0U3lzdGVtSWQoKTsKLQkJCWlmIChzeXN0ZW1JZCA9PSBudWxsKQotCQkJCXN5c3RlbUlkID0gIiI7Ci0JCQlkYXRhICs9ICIgXCIiICsgc3lzdGVtSWQgKyAiXCIiOwotCQl9IGVsc2UKLQkJCWRhdGEgKz0gIiBTWVNURU0gXCIiICsgZG9jdHlwZS5nZXRTeXN0ZW1JZCgpICsgIlwiIjsKLQkKLQkJcmV0dXJuIGRhdGE7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGl0ZXJhdG9yIGZvciB0aGUgc3ViZWxlbWVudHMuCi0JICogQHJldHVybiBqYXZhLnV0aWwuSXRlcmF0b3IKLQkgKiBAcGFyYW0gZWxlbWVudCBvcmcudzNjLmRvbS5FbGVtZW50Ci0JICogQHBhcmFtIG5hbWUgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgSXRlcmF0b3IgZ2V0Tm9kZUl0ZXJhdG9yKEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIG5hbWUpIHsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlOb2RlTGlzdCBub2RlTGlzdCA9IGVsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUobmFtZSk7Ci0JCi0JCWludCBsZW5ndGggPSBub2RlTGlzdC5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKLQkJCWxpc3QuYWRkKG5vZGVMaXN0Lml0ZW0oaSkpOwotCQotCQlyZXR1cm4gbGlzdC5pdGVyYXRvcigpOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgdmFsdWUgb2YgdGhpcyBub2RlLiBXaWxsIHJldHVybiAiIiBpbnN0ZWFkIG9mIG51bGwuCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIG5vZGUgb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE5vZGVWYWx1ZShOb2RlIG5vZGUpIHsKLQkJTm9kZUxpc3Qgbm9kZUxpc3QgPSBub2RlLmdldENoaWxkTm9kZXMoKTsKLQkKLQkJaW50IGxlbmd0aCA9IG5vZGVMaXN0LmdldExlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQlOb2RlIG4gPSBub2RlTGlzdC5pdGVtKGkpOwotCQkJaWYgKG4gaW5zdGFuY2VvZiBUZXh0KSB7Ci0JCQkJVGV4dCB0ID0gKFRleHQpIG47Ci0JCQkJcmV0dXJuIHQuZ2V0Tm9kZVZhbHVlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuICIiOwotCX0KLQotCS8qCi0JICogR2V0IHRoZSB2YWx1ZSBvZiBhIHN1Ym5vZGUuCi0KLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdWJOb2RlVmFsdWUoRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgbmFtZSkgewotCQlOb2RlTGlzdCBub2RlTGlzdCA9IGVsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUobmFtZSk7Ci0JCXJldHVybiBnZXROb2RlVmFsdWUobm9kZUxpc3QuaXRlbSgwKSkudHJpbSgpOwotCX0KLQotCS8qCi0JICogSW5zZXJ0IHRoZSBnaXZlbiB0ZXh0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBpbnNlcnRUZXh0KERvY3VtZW50IGRvYywgTm9kZSBub2RlLCBTdHJpbmcgdGV4dCkgewotCQlub2RlLmFwcGVuZENoaWxkKGRvYy5jcmVhdGVDREFUQVNlY3Rpb24odGV4dCkpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIG5vcm1hbGl6ZShTdHJpbmcgcykgewotCQlTdHJpbmdCdWZmZXIgc3RyaW5nYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpbnQgaSA9IHMgPT0gbnVsbCA/IDAgOiBzLmxlbmd0aCgpOwotCQlmb3IgKGludCBqID0gMDsgaiA8IGk7IGorKykgewotCQkJY2hhciBjID0gcy5jaGFyQXQoaik7Ci0JCQlzd2l0Y2ggKGMpIHsKLQkJCQljYXNlIDYwIDogLyogJzwnICovCi0JCQkJCXN0cmluZ2J1ZmZlci5hcHBlbmQoIiZsdDsiKTsKLQkJCQkJYnJlYWs7Ci0JCi0JCQkJY2FzZSA2MiA6IC8qICc+JyAqLwotCQkJCQlzdHJpbmdidWZmZXIuYXBwZW5kKCImZ3Q7Iik7Ci0JCQkJCWJyZWFrOwotCQotCQkJCWNhc2UgMzggOiAvKiAnJicgKi8KLQkJCQkJc3RyaW5nYnVmZmVyLmFwcGVuZCgiJmFtcDsiKTsKLQkJCQkJYnJlYWs7Ci0JCi0JCQkJY2FzZSAzNCA6IC8qICciJyAqLwotCQkJCQlzdHJpbmdidWZmZXIuYXBwZW5kKCImcXVvdDsiKTsKLQkJCQkJYnJlYWs7Ci0JCi0JCQkJY2FzZSAxMCA6IC8qICdcbicgKi8KLQkJCQljYXNlIDEzIDogLyogJ1xyJyAqLwotCQkJCWRlZmF1bHQgOgotCQkJCQlzdHJpbmdidWZmZXIuYXBwZW5kKGMpOwotCQkJCQlicmVhazsKLQkKLQkJCX0KLQkJfQotCQotCQlyZXR1cm4gc3RyaW5nYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHByaW50KFByaW50U3RyZWFtIG91dCwgTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCXNob3J0IHR5cGUgPSBub2RlLmdldE5vZGVUeXBlKCk7Ci0JCXN3aXRjaCAodHlwZSkgewotCQkJY2FzZSBOb2RlLkRPQ1VNRU5UX05PREU6IHsKLQkJCQlvdXQucHJpbnRsbigiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+Iik7Ci0JCQkJLy9vdXQucHJpbnRsbigiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiSVNPLTg4NTktMVwiPz5cbiIpOwotCQkJCU5vZGVMaXN0IG5vZGVsaXN0ID0gbm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0JCQkJaW50IHNpemUgPSBub2RlbGlzdC5nZXRMZW5ndGgoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLQkJCQkJcHJpbnQob3V0LCBub2RlbGlzdC5pdGVtKGkpKTsKLQkJCQlicmVhazsKLQkJCX0KLQkKLQkJCWNhc2UgTm9kZS5ET0NVTUVOVF9UWVBFX05PREU6IHsKLQkJCQlEb2N1bWVudFR5cGUgZG9jVHlwZSA9IChEb2N1bWVudFR5cGUpIG5vZGU7Ci0JCQkJb3V0LnByaW50KCI8IURPQ1RZUEUgIiArIGdldERvY3VtZW50VHlwZURhdGEoZG9jVHlwZSkgKyAiPlxuIik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCi0JCQljYXNlIE5vZGUuRUxFTUVOVF9OT0RFOiB7Ci0JCQkJb3V0LnByaW50KCc8Jyk7Ci0JCQkJb3V0LnByaW50KG5vZGUuZ2V0Tm9kZU5hbWUoKSk7Ci0JCQkJTmFtZWROb2RlTWFwIG1hcCA9IG5vZGUuZ2V0QXR0cmlidXRlcygpOwotCQkJCWlmIChtYXAgIT0gbnVsbCkgewotCQkJCQlpbnQgc2l6ZSA9IG1hcC5nZXRMZW5ndGgoKTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQkJCUF0dHIgYXR0ciA9IChBdHRyKSBtYXAuaXRlbShpKTsKLQkJCQkJCW91dC5wcmludCgnICcpOwotCQkJCQkJb3V0LnByaW50KGF0dHIuZ2V0Tm9kZU5hbWUoKSk7Ci0JCQkJCQlvdXQucHJpbnQoIj1cIiIpOwotCQkJCQkJb3V0LnByaW50KG5vcm1hbGl6ZShhdHRyLmdldE5vZGVWYWx1ZSgpKSk7Ci0JCQkJCQlvdXQucHJpbnQoJyInKTsKLQkJCQkJfQotCQkJCX0KLQkKLQkJCQlpZiAoIW5vZGUuaGFzQ2hpbGROb2RlcygpKQotCQkJCQlvdXQucHJpbnQoIi8+Iik7Ci0JCQkJZWxzZSB7Ci0JCQkJCW91dC5wcmludCgnPicpOwotCQkJCQlOb2RlTGlzdCBub2RlbGlzdCA9IG5vZGUuZ2V0Q2hpbGROb2RlcygpOwotCQkJCQlpbnQgbnVtQ2hpbGRyZW4gPSBub2RlbGlzdC5nZXRMZW5ndGgoKTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW1DaGlsZHJlbjsgaSsrKQotCQkJCQkJcHJpbnQob3V0LCBub2RlbGlzdC5pdGVtKGkpKTsKLQkKLQkJCQkJb3V0LnByaW50KCI8LyIpOwotCQkJCQlvdXQucHJpbnQobm9kZS5nZXROb2RlTmFtZSgpKTsKLQkJCQkJb3V0LnByaW50KCc+Jyk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCQotCQkJY2FzZSBOb2RlLkVOVElUWV9SRUZFUkVOQ0VfTk9ERTogewotCQkJCU5vZGVMaXN0IG5vZGVsaXN0ID0gbm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0JCQkJaWYgKG5vZGVsaXN0ICE9IG51bGwpIHsKLQkJCQkJaW50IHNpemUgPSBub2RlbGlzdC5nZXRMZW5ndGgoKTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCi0JCQkJCQlwcmludChvdXQsIG5vZGVsaXN0Lml0ZW0oaSkpOwotCQotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkKLQkJCWNhc2UgTm9kZS5DREFUQV9TRUNUSU9OX05PREU6IHsKLQkJCQlvdXQucHJpbnQobm9ybWFsaXplKG5vZGUuZ2V0Tm9kZVZhbHVlKCkpKTsKLQkJCQlicmVhazsKLQkJCX0KLQkKLQkJCWNhc2UgTm9kZS5URVhUX05PREU6IHsKLQkJCQlvdXQucHJpbnQobm9ybWFsaXplKG5vZGUuZ2V0Tm9kZVZhbHVlKCkpKTsKLQkJCQlicmVhazsKLQkJCX0KLQkKLQkJCWNhc2UgTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREU6IHsKLQkJCQlvdXQucHJpbnQoIjw/Iik7Ci0JCQkJb3V0LnByaW50KG5vZGUuZ2V0Tm9kZU5hbWUoKSk7Ci0JCQkJU3RyaW5nIHMgPSBub2RlLmdldE5vZGVWYWx1ZSgpOwotCQkJCWlmIChzICE9IG51bGwgJiYgcy5sZW5ndGgoKSA+IDApIHsKLQkJCQkJb3V0LnByaW50KCcgJyk7Ci0JCQkJCW91dC5wcmludChzKTsKLQkJCQl9Ci0JCQkJb3V0LnByaW50KCI/PiIpOwotCQkJCWJyZWFrOwotCQkJfQotCQotCQkJY2FzZSBOb2RlLkNPTU1FTlRfTk9ERTogewotCQkJCW91dC5wcmludCgiPCEtLSIpOwotCQkJCW91dC5wcmludChub2RlLmdldE5vZGVWYWx1ZSgpKTsKLQkJCQlvdXQucHJpbnQoIi0tPiIpOwotCQkJCWJyZWFrOwotCQkJfQotCQotCQkJZGVmYXVsdDogewotCQkJCW91dC5wcmludChub3JtYWxpemUobm9kZS5nZXROb2RlVmFsdWUoKSkpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCW91dC5mbHVzaCgpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzYXZlKFN0cmluZyBmaWxlbmFtZSwgRG9jdW1lbnQgZG9jdW1lbnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVByaW50U3RyZWFtIG91dCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlvdXQgPSBuZXcgUHJpbnRTdHJlYW0obmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGVuYW1lKSksIHRydWUsICJVVEYtOCIpOwotCQkJLy90cmFjZU5vZGUoZG9jdW1lbnQsICIiKTsKLQkJCXByaW50KG91dCwgZG9jdW1lbnQpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihleC5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKG91dCAhPSBudWxsKQotCQkJCXRyeSB7Ci0JCQkJCW91dC5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIGlnbm9yZQotCQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogU2V0IHRoZSB2YWx1ZSBvZiB0aGUgc3Vibm9kZQotCSAqCi0JICogQHBhcmFtIG5hbWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSB2YWx1ZSBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldE5vZGVWYWx1ZShOb2RlIG5vZGUsIFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKLQkJU3RyaW5nIHMgPSBub2RlLmdldE5vZGVWYWx1ZSgpOwotCQlpZiAocyAhPSBudWxsKSB7Ci0JCQlub2RlLnNldE5vZGVWYWx1ZSh2YWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJTm9kZUxpc3Qgbm9kZWxpc3QgPSBub2RlLmdldENoaWxkTm9kZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub2RlbGlzdC5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlpZiAobm9kZWxpc3QuaXRlbShpKSBpbnN0YW5jZW9mIFRleHQpIHsKLQkJCQlUZXh0IHRleHQgPSAoVGV4dCkgbm9kZWxpc3QuaXRlbShpKTsKLQkJCQl0ZXh0LnNldERhdGEodmFsdWUpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlyZXR1cm47Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9TdHJpbmcoRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJUHJpbnRTdHJlYW0gb3V0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgyMDQ4KTsKLQkJCW91dCA9IG5ldyBQcmludFN0cmVhbShiYW9zKTsKLQkJCXByaW50KG91dCwgZG9jdW1lbnQpOwotCQkJcmV0dXJuIG5ldyBTdHJpbmcoYmFvcy50b0J5dGVBcnJheSgpLCAiVVRGLTgiKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkvLyBpZ25vcmUKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChvdXQgIT0gbnVsbCkKLQkJCQl0cnkgewotCQkJCQlvdXQuY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkvLyBpZ25vcmUKLQkJCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwveG1sL3NlcnZlcjMyL0Nvbm5lY3Rvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC94bWwvc2VydmVyMzIvQ29ubmVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwMzI0ZjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC94bWwvc2VydmVyMzIvQ29ubmVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sLnNlcnZlcjMyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC54bWwuKjsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25uZWN0b3IgZXh0ZW5kcyBYTUxFbGVtZW50IHsKLQlwdWJsaWMgQ29ubmVjdG9yKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlVmFsdWUoImNsYXNzTmFtZSIpOwotCX0KLQkKLQlwdWJsaWMgUGFyYW1ldGVyIGdldFBhcmFtZXRlcihpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIChQYXJhbWV0ZXIpIGZpbmRFbGVtZW50KCJQYXJhbWV0ZXIiLCBpbmRleCk7Ci0JfQotCQotCXB1YmxpYyBpbnQgZ2V0UGFyYW1ldGVyQ291bnQoKSB7Ci0JCXJldHVybiBzaXplT2ZFbGVtZW50KCJQYXJhbWV0ZXIiKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0Q2xhc3NOYW1lKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJc2V0QXR0cmlidXRlVmFsdWUoImNsYXNzTmFtZSIsIGNsYXNzTmFtZSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwveG1sL3NlcnZlcjMyL0NvbnRleHQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwveG1sL3NlcnZlcjMyL0NvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU1NjhlOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL3htbC9zZXJ2ZXIzMi9Db250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sLnNlcnZlcjMyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC54bWwuKjsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZXh0IGV4dGVuZHMgWE1MRWxlbWVudCB7Ci0JcHVibGljIENvbnRleHQoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRDcm9zc0NvbnRleHQoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVWYWx1ZSgiY3Jvc3NDb250ZXh0Iik7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVidWcoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVWYWx1ZSgiZGVidWciKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXREb2NCYXNlKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlVmFsdWUoImRvY0Jhc2UiKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRQYXRoKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlVmFsdWUoInBhdGgiKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRSZWxvYWRhYmxlKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlVmFsdWUoInJlbG9hZGFibGUiKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRTb3VyY2UoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVWYWx1ZSgic291cmNlIik7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0VHJ1c3RlZCgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZVZhbHVlKCJ0cnVzdGVkIik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldENyb3NzQ29udGV4dChTdHJpbmcgY3Jvc3NDb250ZXh0KSB7Ci0JCXNldEF0dHJpYnV0ZVZhbHVlKCJjcm9zc0NvbnRleHQiLCBjcm9zc0NvbnRleHQpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXREZWJ1ZyhTdHJpbmcgZGVidWcpIHsKLQkJc2V0QXR0cmlidXRlVmFsdWUoImRlYnVnIiwgZGVidWcpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXREb2NCYXNlKFN0cmluZyBkb2NCYXNlKSB7Ci0JCXNldEF0dHJpYnV0ZVZhbHVlKCJkb2NCYXNlIiwgZG9jQmFzZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFBhdGgoU3RyaW5nIHBhdGgpIHsKLQkJc2V0QXR0cmlidXRlVmFsdWUoInBhdGgiLCBwYXRoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0UmVsb2FkYWJsZShTdHJpbmcgcmVsb2FkYWJsZSkgewotCQlzZXRBdHRyaWJ1dGVWYWx1ZSgicmVsb2FkYWJsZSIsIHJlbG9hZGFibGUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTb3VyY2UoU3RyaW5nIHNvdXJjZSkgewotCQlzZXRBdHRyaWJ1dGVWYWx1ZSgic291cmNlIiwgc291cmNlKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0VHJ1c3RlZChTdHJpbmcgdHJ1c3RlZCkgewotCQlzZXRBdHRyaWJ1dGVWYWx1ZSgidHJ1c3RlZCIsIHRydXN0ZWQpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL3htbC9zZXJ2ZXIzMi9Db250ZXh0TWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC94bWwvc2VydmVyMzIvQ29udGV4dE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc4MjlkMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL3htbC9zZXJ2ZXIzMi9Db250ZXh0TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbC5zZXJ2ZXIzMjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sLio7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQ29udGV4dE1hbmFnZXIgZXh0ZW5kcyBYTUxFbGVtZW50IHsKLQlwdWJsaWMgQ29udGV4dE1hbmFnZXIoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0JCi0JcHVibGljIENvbm5lY3RvciBnZXRDb25uZWN0b3IoaW50IGluZGV4KSB7Ci0JCXJldHVybiAoQ29ubmVjdG9yKSBmaW5kRWxlbWVudCgiQ29ubmVjdG9yIiwgaW5kZXgpOwotCX0KLQkKLQlwdWJsaWMgaW50IGdldENvbm5lY3RvckNvdW50KCkgewotCQlyZXR1cm4gc2l6ZU9mRWxlbWVudCgiQ29ubmVjdG9yIik7Ci0JfQotCQotCXB1YmxpYyBDb250ZXh0IGdldENvbnRleHQoaW50IGluZGV4KSB7Ci0JCXJldHVybiAoQ29udGV4dCkgZmluZEVsZW1lbnQoIkNvbnRleHQiLCBpbmRleCk7Ci0JfQotCQotCXB1YmxpYyBpbnQgZ2V0Q29udGV4dENvdW50KCkgewotCQlyZXR1cm4gc2l6ZU9mRWxlbWVudCgiQ29udGV4dCIpOwotCX0KLQkKLQlwdWJsaWMgaW50IGdldENvbnRleHRJbnRlcmNlcHRvckNvdW50KCkgewotCQlyZXR1cm4gc2l6ZU9mRWxlbWVudCgiQ29udGV4dEludGVyY2VwdG9yIik7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVidWcoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVWYWx1ZSgiZGVidWciKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRIb21lKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlVmFsdWUoImhvbWUiKTsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRSZXF1ZXN0SW50ZXJjZXB0b3JDb3VudCgpIHsKLQkJcmV0dXJuIHNpemVPZkVsZW1lbnQoIlJlcXVlc3RJbnRlcmNlcHRvciIpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFNob3dEZWJ1Z0luZm8oKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVWYWx1ZSgic2hvd0RlYnVnSW5mbyIpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFdvcmtEaXIoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVWYWx1ZSgid29ya0RpciIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXREZWJ1ZyhTdHJpbmcgZGVidWcpIHsKLQkJc2V0QXR0cmlidXRlVmFsdWUoImRlYnVnIiwgZGVidWcpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRIb21lKFN0cmluZyBob21lKSB7Ci0JCXNldEF0dHJpYnV0ZVZhbHVlKCJob21lIiwgaG9tZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFNob3dEZWJ1Z0luZm8oU3RyaW5nIHNob3dEZWJ1Z0luZm8pIHsKLQkJc2V0QXR0cmlidXRlVmFsdWUoInNob3dEZWJ1Z0luZm8iLCBzaG93RGVidWdJbmZvKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0V29ya0RpcihTdHJpbmcgd29ya0RpcikgewotCQlzZXRBdHRyaWJ1dGVWYWx1ZSgid29ya0RpciIsIHdvcmtEaXIpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL3htbC9zZXJ2ZXIzMi9QYXJhbWV0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwveG1sL3NlcnZlcjMyL1BhcmFtZXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjA4Y2YxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwveG1sL3NlcnZlcjMyL1BhcmFtZXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbC5zZXJ2ZXIzMjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sLio7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUGFyYW1ldGVyIGV4dGVuZHMgWE1MRWxlbWVudCB7Ci0JcHVibGljIFBhcmFtZXRlcigpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVWYWx1ZSgibmFtZSIpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlVmFsdWUoInZhbHVlIik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJc2V0QXR0cmlidXRlVmFsdWUoIm5hbWUiLCBuYW1lKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JCXNldEF0dHJpYnV0ZVZhbHVlKCJ2YWx1ZSIsIHZhbHVlKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC94bWwvc2VydmVyMzIvU2VydmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL3htbC9zZXJ2ZXIzMi9TZXJ2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ4Y2RkMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL3htbC9zZXJ2ZXIzMi9TZXJ2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC54bWwuc2VydmVyMzI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbC4qOwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFNlcnZlciBleHRlbmRzIFhNTEVsZW1lbnQgewotCXB1YmxpYyBTZXJ2ZXIoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0JCi0JcHVibGljIENvbnRleHRNYW5hZ2VyIGdldENvbnRleHRNYW5hZ2VyKCkgewotCQlyZXR1cm4gKENvbnRleHRNYW5hZ2VyKSBmaW5kRWxlbWVudCgiQ29udGV4dE1hbmFnZXIiKTsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRMb2dnZXJDb3VudCgpIHsKLQkJcmV0dXJuIHNpemVPZkVsZW1lbnQoIkxvZ2dlciIpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZVZhbHVlKCJuYW1lIik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJc2V0QXR0cmlidXRlVmFsdWUoIm5hbWUiLCBuYW1lKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC94bWwvc2VydmVyNDAvQ29ubmVjdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL3htbC9zZXJ2ZXI0MC9Db25uZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzliZjZjOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL3htbC9zZXJ2ZXI0MC9Db25uZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC54bWwuc2VydmVyNDA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbC4qOwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIENvbm5lY3RvciBleHRlbmRzIFhNTEVsZW1lbnQgewotCXB1YmxpYyBDb25uZWN0b3IoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFjY2VwdENvdW50KCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlVmFsdWUoImFjY2VwdENvdW50Iik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVWYWx1ZSgiY2xhc3NOYW1lIik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWJ1ZygpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZVZhbHVlKCJkZWJ1ZyIpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TWF4UHJvY2Vzc29ycygpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZVZhbHVlKCJtYXhQcm9jZXNzb3JzIik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRNaW5Qcm9jZXNzb3JzKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlVmFsdWUoIm1pblByb2Nlc3NvcnMiKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBvcnQoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVWYWx1ZSgicG9ydCIpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFNlY3VyZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZVZhbHVlKCJzZWN1cmUiKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRQcm90b2NvbCgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZVZhbHVlKCJwcm90b2NvbCIpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvdG9jb2xIYW5kbGVyQ2xhc3NOYW1lKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlVmFsdWUoInByb3RvY29sSGFuZGxlckNsYXNzTmFtZSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFjY2VwdENvdW50KFN0cmluZyBhY2NlcHRDb3VudCkgewotCQlzZXRBdHRyaWJ1dGVWYWx1ZSgiYWNjZXB0Q291bnQiLCBhY2NlcHRDb3VudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q2xhc3NOYW1lKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJc2V0QXR0cmlidXRlVmFsdWUoImNsYXNzTmFtZSIsIGNsYXNzTmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVidWcoU3RyaW5nIGRlYnVnKSB7Ci0JCXNldEF0dHJpYnV0ZVZhbHVlKCJkZWJ1ZyIsIGRlYnVnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNYXhQcm9jZXNzb3JzKFN0cmluZyBtYXhQcm9jZXNzb3JzKSB7Ci0JCXNldEF0dHJpYnV0ZVZhbHVlKCJtYXhQcm9jZXNzb3JzIiwgbWF4UHJvY2Vzc29ycyk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TWluUHJvY2Vzc29ycyhTdHJpbmcgbWluUHJvY2Vzc29ycykgewotCQlzZXRBdHRyaWJ1dGVWYWx1ZSgibWluUHJvY2Vzc29ycyIsIG1pblByb2Nlc3NvcnMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBvcnQoU3RyaW5nIHBvcnQpIHsKLQkJc2V0QXR0cmlidXRlVmFsdWUoInBvcnQiLCBwb3J0KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0UHJvdG9jb2xIYW5kbGVyQ2xhc3NOYW1lKFN0cmluZyBwcm90b2NvbEhhbmRsZXJDbGFzc05hbWUpIHsKLQkJc2V0QXR0cmlidXRlVmFsdWUoInByb3RvY29sSGFuZGxlckNsYXNzTmFtZSIsIHByb3RvY29sSGFuZGxlckNsYXNzTmFtZSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwveG1sL3NlcnZlcjQwL0NvbnRleHQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwveG1sL3NlcnZlcjQwL0NvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU5N2M4OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL3htbC9zZXJ2ZXI0MC9Db250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sLnNlcnZlcjQwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC54bWwuKjsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZXh0IGV4dGVuZHMgWE1MRWxlbWVudCB7Ci0JcHVibGljIENvbnRleHQoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlYnVnKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlVmFsdWUoImRlYnVnIik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREb2NCYXNlKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlVmFsdWUoImRvY0Jhc2UiKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBhdGgoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVWYWx1ZSgicGF0aCIpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UmVsb2FkYWJsZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZVZhbHVlKCJyZWxvYWRhYmxlIik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTb3VyY2UoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVWYWx1ZSgic291cmNlIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVidWcoU3RyaW5nIGRlYnVnKSB7Ci0JCXNldEF0dHJpYnV0ZVZhbHVlKCJkZWJ1ZyIsIGRlYnVnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREb2NCYXNlKFN0cmluZyBkb2NCYXNlKSB7Ci0JCXNldEF0dHJpYnV0ZVZhbHVlKCJkb2NCYXNlIiwgZG9jQmFzZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UGF0aChTdHJpbmcgcGF0aCkgewotCQlzZXRBdHRyaWJ1dGVWYWx1ZSgicGF0aCIsIHBhdGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlbG9hZGFibGUoU3RyaW5nIHJlbG9hZGFibGUpIHsKLQkJc2V0QXR0cmlidXRlVmFsdWUoInJlbG9hZGFibGUiLCByZWxvYWRhYmxlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTb3VyY2UoU3RyaW5nIHNvdXJjZSkgewotCQlzZXRBdHRyaWJ1dGVWYWx1ZSgic291cmNlIiwgc291cmNlKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC94bWwvc2VydmVyNDAvRW5naW5lLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL3htbC9zZXJ2ZXI0MC9FbmdpbmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTY2Y2UwYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL3htbC9zZXJ2ZXI0MC9FbmdpbmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC54bWwuc2VydmVyNDA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbC4qOwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEVuZ2luZSBleHRlbmRzIFhNTEVsZW1lbnQgewotCXB1YmxpYyBFbmdpbmUoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRBcHBCYXNlKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlVmFsdWUoImFwcEJhc2UiKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVWYWx1ZSgiY2xhc3NOYW1lIik7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVidWcoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVWYWx1ZSgiZGVidWciKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0SG9zdCgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZVZhbHVlKCJkZWZhdWx0SG9zdCIpOwotCX0KLQkKLQlwdWJsaWMgSG9zdCBnZXRIb3N0KCkgewotCQlyZXR1cm4gKEhvc3QpIGZpbmRFbGVtZW50KCJIb3N0Iik7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZVZhbHVlKCJuYW1lIik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEFwcEJhc2UoU3RyaW5nIGFwcEJhc2UpIHsKLQkJc2V0QXR0cmlidXRlVmFsdWUoImFwcEJhc2UiLCBhcHBCYXNlKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0Q2xhc3NOYW1lKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJc2V0QXR0cmlidXRlVmFsdWUoImNsYXNzTmFtZSIsIGNsYXNzTmFtZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldERlYnVnKFN0cmluZyBkZWJ1ZykgewotCQlzZXRBdHRyaWJ1dGVWYWx1ZSgiZGVidWciLCBkZWJ1Zyk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRIb3N0KFN0cmluZyBkZWZhdWx0SG9zdCkgewotCQlzZXRBdHRyaWJ1dGVWYWx1ZSgiZGVmYXVsdEhvc3QiLCBkZWZhdWx0SG9zdCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJc2V0QXR0cmlidXRlVmFsdWUoIm5hbWUiLCBuYW1lKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC94bWwvc2VydmVyNDAvSG9zdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC94bWwvc2VydmVyNDAvSG9zdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzkxMDk4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwveG1sL3NlcnZlcjQwL0hvc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC54bWwuc2VydmVyNDA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbC4qOwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEhvc3QgZXh0ZW5kcyBYTUxFbGVtZW50IHsKLQlwdWJsaWMgSG9zdCgpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFwcEJhc2UoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVWYWx1ZSgiYXBwQmFzZSIpOwotCX0KLQkKLQlwdWJsaWMgQ29udGV4dCBnZXRDb250ZXh0KGludCBpbmRleCkgewotCQlyZXR1cm4gKENvbnRleHQpIGZpbmRFbGVtZW50KCJDb250ZXh0IiwgaW5kZXgpOwotCX0KLQkKLQlwdWJsaWMgaW50IGdldENvbnRleHRDb3VudCgpIHsKLQkJcmV0dXJuIHNpemVPZkVsZW1lbnQoIkNvbnRleHQiKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXREZWJ1ZygpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZVZhbHVlKCJkZWJ1ZyIpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVWYWx1ZSgibmFtZSIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRBcHBCYXNlKFN0cmluZyBhcHBCYXNlKSB7Ci0JCXNldEF0dHJpYnV0ZVZhbHVlKCJhcHBCYXNlIiwgYXBwQmFzZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldERlYnVnKFN0cmluZyBkZWJ1ZykgewotCQlzZXRBdHRyaWJ1dGVWYWx1ZSgiZGVidWciLCBkZWJ1Zyk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJc2V0QXR0cmlidXRlVmFsdWUoIm5hbWUiLCBuYW1lKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC94bWwvc2VydmVyNDAvTGlzdGVuZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwveG1sL3NlcnZlcjQwL0xpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3Mzc4YmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC94bWwvc2VydmVyNDAvTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC54bWwuc2VydmVyNDA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbC4qOwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIExpc3RlbmVyIGV4dGVuZHMgWE1MRWxlbWVudCB7Ci0JcHVibGljIExpc3RlbmVyKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVWYWx1ZSgiY2xhc3NOYW1lIik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWJ1ZygpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZVZhbHVlKCJkZWJ1ZyIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENsYXNzTmFtZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXNldEF0dHJpYnV0ZVZhbHVlKCJjbGFzc05hbWUiLCBjbGFzc05hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlYnVnKFN0cmluZyBkZWJ1ZykgewotCQlzZXRBdHRyaWJ1dGVWYWx1ZSgiZGVidWciLCBkZWJ1Zyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS90b21jYXRjb3JlL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L2NvcmUvaW50ZXJuYWwveG1sL3NlcnZlcjQwL1NlcnZlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC94bWwvc2VydmVyNDAvU2VydmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5NzExMWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC94bWwvc2VydmVyNDAvU2VydmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sLnNlcnZlcjQwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC54bWwuKjsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2ZXIgZXh0ZW5kcyBYTUxFbGVtZW50IHsKLQlwdWJsaWMgU2VydmVyKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWJ1ZygpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZVZhbHVlKCJkZWJ1ZyIpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZVZhbHVlKCJuYW1lIik7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0UG9ydCgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZVZhbHVlKCJwb3J0Iik7Ci0JfQotCQotCXB1YmxpYyBTZXJ2aWNlIGdldFNlcnZpY2UoaW50IGluZGV4KSB7Ci0JCXJldHVybiAoU2VydmljZSkgZmluZEVsZW1lbnQoIlNlcnZpY2UiLCBpbmRleCk7Ci0JfQotCQotCXB1YmxpYyBpbnQgZ2V0U2VydmljZUNvdW50KCkgewotCQlyZXR1cm4gc2l6ZU9mRWxlbWVudCgiU2VydmljZSIpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFNodXRkb3duKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlVmFsdWUoInNodXRkb3duIik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldERlYnVnKFN0cmluZyBkZWJ1ZykgewotCQlzZXRBdHRyaWJ1dGVWYWx1ZSgiZGVidWciLCBkZWJ1Zyk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJc2V0QXR0cmlidXRlVmFsdWUoIm5hbWUiLCBuYW1lKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0UG9ydChTdHJpbmcgcG9ydCkgewotCQlzZXRBdHRyaWJ1dGVWYWx1ZSgicG9ydCIsIHBvcnQpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTaHV0ZG93bihTdHJpbmcgc2h1dGRvd24pIHsKLQkJc2V0QXR0cmlidXRlVmFsdWUoInNodXRkb3duIiwgc2h1dGRvd24pOwotCX0KLQotCXB1YmxpYyBMaXN0ZW5lciBnZXRMaXN0ZW5lcihpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIChMaXN0ZW5lcikgZmluZEVsZW1lbnQoIkxpc3RlbmVyIiwgaW5kZXgpOwotCX0KLQkKLQlwdWJsaWMgaW50IGdldExpc3RlbmVyQ291bnQoKSB7Ci0JCXJldHVybiBzaXplT2ZFbGVtZW50KCJMaXN0ZW5lciIpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL3htbC9zZXJ2ZXI0MC9TZXJ2aWNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUvdG9tY2F0Y29yZS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC9jb3JlL2ludGVybmFsL3htbC9zZXJ2ZXI0MC9TZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjMjRhNGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3RvbWNhdGNvcmUvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvY29yZS9pbnRlcm5hbC94bWwvc2VydmVyNDAvU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLnhtbC5zZXJ2ZXI0MDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwueG1sLio7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgU2VydmljZSBleHRlbmRzIFhNTEVsZW1lbnQgewotCXB1YmxpYyBTZXJ2aWNlKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIENvbm5lY3RvciBnZXRDb25uZWN0b3IoaW50IGluZGV4KSB7Ci0JCXJldHVybiAoQ29ubmVjdG9yKSBmaW5kRWxlbWVudCgiQ29ubmVjdG9yIiwgaW5kZXgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0Q29ubmVjdG9yQ291bnQoKSB7Ci0JCXJldHVybiBzaXplT2ZFbGVtZW50KCJDb25uZWN0b3IiKTsKLQl9Ci0KLQlwdWJsaWMgRW5naW5lIGdldEVuZ2luZSgpIHsKLQkJcmV0dXJuIChFbmdpbmUpIGZpbmRFbGVtZW50KCJFbmdpbmUiKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVWYWx1ZSgibmFtZSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJc2V0QXR0cmlidXRlVmFsdWUoIm5hbWUiLCBuYW1lKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3ZlcmlmeUluc3RhbGwucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS92ZXJpZnlJbnN0YWxsLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3MDEwNmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlL3ZlcmlmeUluc3RhbGwucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgdGhpcyBmaWxlIG11c3Qgbm90IGJlIHRyYW5zbGF0ZWQKLQotdmVyaWZ5MzJpbnN0YWxsPWxpYi9qYXNwZXIuamFyLGxpYi9zZXJ2bGV0LmphcixiaW4sY29uZix3ZWJhcHBzCi12ZXJpZnk0MGluc3RhbGw9bGliL25hbWluZy1mYWN0b3J5LmphcixiaW4vYm9vdHN0cmFwLmphcixjb25mLHdlYmFwcHMKLXZlcmlmeTQxaW5zdGFsbD1jb21tb24vbGliL25hbWluZy1mYWN0b3J5Lmphcixjb21tb24vbGliL3NlcnZsZXQuamFyLGJpbi9ib290c3RyYXAuamFyLGNvbmYsd2ViYXBwcwotdmVyaWZ5NTBpbnN0YWxsPWNvbW1vbi9saWIvc2VydmxldC1hcGkuamFyLGNvbW1vbi9saWIvbmFtaW5nLWNvbW1vbi5qYXIsYmluL2Jvb3RzdHJhcC5qYXIsY29uZix3ZWJhcHBzCi12ZXJpZnk1NWluc3RhbGw9Y29tbW9uL2kxOG4sYmluL2Jvb3RzdHJhcC5qYXIsY29uZix3ZWJhcHBzCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLy5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkZmVkMzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJ0b21jYXR1aS8iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWZlYWVhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotYmluCi1idWlsZC54bWwKLW9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpXzMuMC4wLmphcgotdG9tY2F0dWkuamFyCi10ZW1wLmZvbGRlcgotQGRvdAotc3JjLnppcApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS8ub3B0aW9ucyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4OGIwM2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotIyBEZWJ1Z2dpbmcgb3B0aW9ucyBmb3IgdGhlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpIHBsdWdpbgotCi0jIFR1cm4gb24gZ2VuZXJhbCBkZWJ1Z2dpbmcKLW9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpL2RlYnVnPXRydWUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzFmNzU2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2IzYjMxNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLmludGVybmFsLlRvbWNhdFVJUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS5pbnRlcm5hbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLmludGVybmFsLmVkaXRvcjt4LWludGVybmFsOj10cnVlCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotIG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMsCi0gb3JnLmVjbGlwc2UudWksCi0gb3JnLmVjbGlwc2UudWkuaWRlLAotIG9yZy5lY2xpcHNlLnVpLmZvcm1zLAotIG9yZy5lY2xpcHNlLmRlYnVnLnVpLAotIG9yZy5lY2xpcHNlLmpkdC5kZWJ1Zy51aSwKLSBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLAotIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZSwKLSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLAotIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZSwKLSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlCi1FY2xpcHNlLUF1dG9TdGFydDogdHJ1ZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS9hYm91dC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjZiOTZjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5GZWJydWFyeSAyNCwgMjAwNTwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODMyMTM0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCi1iaW4uZXhjbHVkZXMgPSBiaW4vKiosXAotICAgICAgICAgICAgICAgQGRvdC8qKixcCi0gICAgICAgICAgICAgICB0ZW1wLmZvbGRlci8qKgotc291cmNlLi4gPSB0b21jYXR1aS8KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvaWNvbnMvb2JqMTYvbWltZV9leHRlbnNpb24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS9pY29ucy9vYmoxNi9taW1lX2V4dGVuc2lvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1ODUwMTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS9pY29ucy9vYmoxNi9taW1lX2V4dGVuc2lvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpL2ljb25zL29iajE2L21pbWVfbWFwcGluZy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpL2ljb25zL29iajE2L21pbWVfbWFwcGluZy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhOGU0YmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS9pY29ucy9vYmoxNi9taW1lX21hcHBpbmcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS9pY29ucy9vYmoxNi9wb3J0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvaWNvbnMvb2JqMTYvcG9ydC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhMzU0YjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS9pY29ucy9vYmoxNi9wb3J0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvaWNvbnMvb2JqMTYvcHJvamVjdF9taXNzaW5nLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvaWNvbnMvb2JqMTYvcHJvamVjdF9taXNzaW5nLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNiNGMxNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpL2ljb25zL29iajE2L3Byb2plY3RfbWlzc2luZy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpL2ljb25zL29iajE2L3RvbWNhdC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpL2ljb25zL29iajE2L3RvbWNhdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4NTdjMGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS9pY29ucy9vYmoxNi90b21jYXQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS9pY29ucy9vYmoxNi93ZWJfbW9kdWxlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvaWNvbnMvb2JqMTYvd2ViX21vZHVsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmMjBmNzAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS9pY29ucy9vYmoxNi93ZWJfbW9kdWxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvaWNvbnMvd2l6YmFuL3RvbWNhdF93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS9pY29ucy93aXpiYW4vdG9tY2F0X3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzYTk1OTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS9pY29ucy93aXpiYW4vdG9tY2F0X3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzcxODQ3Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBsdWdpbk5hbWU9QXBhY2hlIFRvbWNhdCBVSSBTdXBwb3J0Ci1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotY29uZmlndXJhdGlvbkVkaXRvcldlYk1vZHVsZXNQYWdlPU1vZHVsZXMKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvcGx1Z2luLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRiNDBhNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLQotPHBsdWdpbj4KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuc2VydmVySW1hZ2VzIj4KLSAgICAgIDxpbWFnZQotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LjMyIgotICAgICAgICAgaWNvbj0iaWNvbnMvb2JqMTYvdG9tY2F0LmdpZiIKLSAgICAgICAgIHR5cGVJZHM9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnJ1bnRpbWUuMzIiLz4KLSAgICAgIDxpbWFnZQotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LjQwIgotICAgICAgICAgaWNvbj0iaWNvbnMvb2JqMTYvdG9tY2F0LmdpZiIKLSAgICAgICAgIHR5cGVJZHM9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnJ1bnRpbWUuNDAiLz4KLSAgICAgIDxpbWFnZQotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LjQxIgotICAgICAgICAgaWNvbj0iaWNvbnMvb2JqMTYvdG9tY2F0LmdpZiIKLSAgICAgICAgIHR5cGVJZHM9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnJ1bnRpbWUuNDEiLz4KLSAgICAgIDxpbWFnZQotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LjUwIgotICAgICAgICAgaWNvbj0iaWNvbnMvb2JqMTYvdG9tY2F0LmdpZiIKLSAgICAgICAgIHR5cGVJZHM9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnJ1bnRpbWUuNTAiLz4KLSAgICAgIDxpbWFnZQotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LjU1IgotICAgICAgICAgaWNvbj0iaWNvbnMvb2JqMTYvdG9tY2F0LmdpZiIKLSAgICAgICAgIHR5cGVJZHM9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnJ1bnRpbWUuNTUiLz4KLQotICAgICAgPGltYWdlCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuMzIiCi0gICAgICAgICBpY29uPSJpY29ucy9vYmoxNi90b21jYXQuZ2lmIgotICAgICAgICAgdHlwZUlkcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuMzIiLz4KLSAgICAgIDxpbWFnZQotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LjQwIgotICAgICAgICAgaWNvbj0iaWNvbnMvb2JqMTYvdG9tY2F0LmdpZiIKLSAgICAgICAgIHR5cGVJZHM9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LjQwIi8+Ci0gICAgICA8aW1hZ2UKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC40MSIKLSAgICAgICAgIGljb249Imljb25zL29iajE2L3RvbWNhdC5naWYiCi0gICAgICAgICB0eXBlSWRzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC40MSIvPgotICAgICAgPGltYWdlCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuNTAiCi0gICAgICAgICBpY29uPSJpY29ucy9vYmoxNi90b21jYXQuZ2lmIgotICAgICAgICAgdHlwZUlkcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuNTAiLz4KLSAgICAgIDxpbWFnZQotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LjU1IgotICAgICAgICAgaWNvbj0iaWNvbnMvb2JqMTYvdG9tY2F0LmdpZiIKLSAgICAgICAgIHR5cGVJZHM9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LjU1Ii8+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5wcm9wZXJ0eVRlc3RlcnMiPgotICAgICAgPHByb3BlcnR5VGVzdGVyCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkucHJvcGVydHlUZXN0ZXIiCi0gICAgICAgICBuYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpIgotICAgICAgICAgcHJvcGVydGllcz0iaGFzQ29uZmlndXJhdGlvbiIKLSAgICAgICAgIHR5cGU9ImphdmEubGFuZy5PYmplY3QiCi0gICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkuaW50ZXJuYWwuQ29uZmlndXJhdGlvblByb3BlcnR5VGVzdGVyIj4KLSAgICAgIDwvcHJvcGVydHlUZXN0ZXI+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5lZGl0b3JQYWdlcyI+Ci0gICAgICA8cGFnZQotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvbmZpZ3VyYXRpb24uZWRpdG9yLndlYm1vZHVsZSIKLSAgICAgICAgIG9yZGVyPSIyMCIKLSAgICAgICAgIG5hbWU9IiVjb25maWd1cmF0aW9uRWRpdG9yV2ViTW9kdWxlc1BhZ2UiCi0gICAgICAgICB0eXBlSWRzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC4qIgotICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLmludGVybmFsLmVkaXRvci5Db25maWd1cmF0aW9uV2ViTW9kdWxlRWRpdG9yUGFydCI+Ci0gICAgICAgICA8ZW5hYmxlbWVudD4KLSAgICAgICAgICAgPHRlc3QgcHJvcGVydHk9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLmhhc0NvbmZpZ3VyYXRpb24iIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgICA8L3BhZ2U+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5lZGl0b3JQYWdlU2VjdGlvbnMiPgotICAgICAgPHNlY3Rpb24KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5zZXJ2ZXIuZWRpdG9yLmdlbmVyYWwiCi0gICAgICAgICBvcmRlcj0iMCIKLSAgICAgICAgIGluc2VydGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmVkaXRvci5vdmVydmlldy5sZWZ0IgotICAgICAgICAgdHlwZUlkcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuKiIKLSAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS5pbnRlcm5hbC5lZGl0b3IuU2VydmVyR2VuZXJhbEVkaXRvclNlY3Rpb24iLz4KLSAgICAgIDxzZWN0aW9uCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29uZmlndXJhdGlvbi5lZGl0b3IucG9ydCIKLSAgICAgICAgIG9yZGVyPSIxMCIKLSAgICAgICAgIGluc2VydGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmVkaXRvci5vdmVydmlldy5yaWdodCIKLSAgICAgICAgIHR5cGVJZHM9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LioiCi0gICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkuaW50ZXJuYWwuZWRpdG9yLkNvbmZpZ3VyYXRpb25Qb3J0RWRpdG9yU2VjdGlvbiI+Ci0gICAgICAgICA8ZW5hYmxlbWVudD4KLSAgICAgICAgICAgPHRlc3QgcHJvcGVydHk9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLmhhc0NvbmZpZ3VyYXRpb24iIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgICA8L3NlY3Rpb24+Ci0gICAgICA8c2VjdGlvbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvbmZpZ3VyYXRpb24uZWRpdG9yLm1pbWUiCi0gICAgICAgICBvcmRlcj0iMjAiCi0gICAgICAgICBpbnNlcnRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5lZGl0b3Iub3ZlcnZpZXcucmlnaHQiCi0gICAgICAgICB0eXBlSWRzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC4qIgotICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLmludGVybmFsLmVkaXRvci5Db25maWd1cmF0aW9uTWltZUVkaXRvclNlY3Rpb24iPgotICAgICAgICAgPGVuYWJsZW1lbnQ+Ci0gICAgICAgICAgIDx0ZXN0IHByb3BlcnR5PSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS5oYXNDb25maWd1cmF0aW9uIiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgICAgPC9lbmFibGVtZW50PgotICAgICAgPC9zZWN0aW9uPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkud2l6YXJkRnJhZ21lbnRzIj4KLSAgICAgIDxmcmFnbWVudAotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnJ1bnRpbWUuMzIiCi0gICAgICAgICB0eXBlSWRzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5ydW50aW1lLjMyIgotICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLmludGVybmFsLlRvbWNhdFJ1bnRpbWVXaXphcmRGcmFnbWVudCIvPgotICAgICAgPGZyYWdtZW50Ci0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQucnVudGltZS40MCIKLSAgICAgICAgIHR5cGVJZHM9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnJ1bnRpbWUuNDAiCi0gICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkuaW50ZXJuYWwuVG9tY2F0UnVudGltZVdpemFyZEZyYWdtZW50Ii8+Ci0gICAgICA8ZnJhZ21lbnQKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5ydW50aW1lLjQxIgotICAgICAgICAgdHlwZUlkcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQucnVudGltZS40MSIKLSAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS5pbnRlcm5hbC5Ub21jYXRSdW50aW1lV2l6YXJkRnJhZ21lbnQiLz4KLSAgICAgIDxmcmFnbWVudAotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnJ1bnRpbWUuNTAiCi0gICAgICAgICB0eXBlSWRzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5ydW50aW1lLjUwIgotICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLmludGVybmFsLlRvbWNhdFJ1bnRpbWVXaXphcmRGcmFnbWVudCIvPgotICAgICAgPGZyYWdtZW50Ci0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQucnVudGltZS41NSIKLSAgICAgICAgIHR5cGVJZHM9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnJ1bnRpbWUuNTUiCi0gICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkuaW50ZXJuYWwuVG9tY2F0UnVudGltZVdpemFyZEZyYWdtZW50Ii8+Ci0gICA8L2V4dGVuc2lvbj4KLQotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5sYXVuY2hDb25maWd1cmF0aW9uVHlwZUltYWdlcyI+Ci0gICAgPGxhdW5jaENvbmZpZ3VyYXRpb25UeXBlSW1hZ2UKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS5sYXVuY2hDb25maWd1cmF0aW9uVHlwZUltYWdlIgotICAgICAgY29uZmlnVHlwZUlEPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmxhdW5jaENvbmZpZ3VyYXRpb25UeXBlIgotICAgICAgaWNvbj0iaWNvbnMvb2JqMTYvdG9tY2F0LmdpZiI+Ci0gICAgPC9sYXVuY2hDb25maWd1cmF0aW9uVHlwZUltYWdlPgotICA8L2V4dGVuc2lvbj4KLQotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5sYXVuY2hDb25maWd1cmF0aW9uVGFiR3JvdXBzIj4KLSAgICA8bGF1bmNoQ29uZmlndXJhdGlvblRhYkdyb3VwCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkubGF1bmNoQ29uZmlndXJhdGlvblRhYkdyb3VwIgotICAgICAgdHlwZT0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5sYXVuY2hDb25maWd1cmF0aW9uVHlwZSIKLSAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS5pbnRlcm5hbC5Ub21jYXRMYXVuY2hDb25maWd1cmF0aW9uVGFiR3JvdXAiPgotICAgIDwvbGF1bmNoQ29uZmlndXJhdGlvblRhYkdyb3VwPgotICA8L2V4dGVuc2lvbj4KLQotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkuaW1hZ2VzIj4KLSAgICA8aW1hZ2UgcnVudGltZS1jb21wb25lbnQtdHlwZT0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQiCi0gICAgICBwYXRoPSJpY29ucy9vYmoxNi90b21jYXQuZ2lmIi8+Ci0gIDwvZXh0ZW5zaW9uPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWVzIj4KLSAgICA8YWRhcHRlcj4KLSAgICAgIDxydW50aW1lLWNvbXBvbmVudCBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQiLz4KLSAgICAgIDxmYWN0b3J5IGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpLmludGVybmFsLlJ1bnRpbWVMYWJlbFByb3ZpZGVyJEZhY3RvcnkiLz4KLSAgICAgIDx0eXBlIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkuSVJ1bnRpbWVDb21wb25lbnRMYWJlbFByb3ZpZGVyIi8+Ci0gICAgPC9hZGFwdGVyPgotICA8L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvdG9tY2F0dWkvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvdWkvaW50ZXJuYWwvQ29uZmlndXJhdGlvblByb3BlcnR5VGVzdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpL3RvbWNhdHVpL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L3VpL2ludGVybmFsL0NvbmZpZ3VyYXRpb25Qcm9wZXJ0eVRlc3Rlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTJiMmQwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvdG9tY2F0dWkvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvdWkvaW50ZXJuYWwvQ29uZmlndXJhdGlvblByb3BlcnR5VGVzdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5Qcm9wZXJ0eVRlc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLklUb21jYXRTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5Ub21jYXRTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJBdHRyaWJ1dGVzOwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25Qcm9wZXJ0eVRlc3RlciBleHRlbmRzIFByb3BlcnR5VGVzdGVyIHsKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLklQcm9wZXJ0eVRlc3RlciN0ZXN0KGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3RbXSwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB0ZXN0KE9iamVjdCByZWNlaXZlciwgU3RyaW5nIHByb3BlcnR5LCBPYmplY3RbXSBhcmdzLCBPYmplY3QgZXhwZWN0ZWRWYWx1ZSkgewotCQl0cnkgewotCQkJSVNlcnZlckF0dHJpYnV0ZXMgc2VydmVyID0gKElTZXJ2ZXJBdHRyaWJ1dGVzKSByZWNlaXZlcjsKLQkJCVRvbWNhdFNlcnZlciB0b21jYXRTZXJ2ZXIgPSAoVG9tY2F0U2VydmVyKSBzZXJ2ZXIubG9hZEFkYXB0ZXIoSVRvbWNhdFNlcnZlci5jbGFzcywgbnVsbCk7Ci0JCQlpZiAodG9tY2F0U2VydmVyICE9IG51bGwpCi0JCQkJcmV0dXJuIHRvbWNhdFNlcnZlci5nZXRTZXJ2ZXJDb25maWd1cmF0aW9uKCkgIT0gbnVsbDsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS90b21jYXR1aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC91aS9pbnRlcm5hbC9Db250ZXh0SWRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpL3RvbWNhdHVpL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L3VpL2ludGVybmFsL0NvbnRleHRJZHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk1N2NjMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpL3RvbWNhdHVpL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L3VpL2ludGVybmFsL0NvbnRleHRJZHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkuaW50ZXJuYWw7Ci0vKioKLSAqIENvbnN0YW50IGlkcyBmb3IgY29udGV4dCBoZWxwLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbnRleHRJZHMgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZFUl9FRElUT1IgPSBUb21jYXRVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLnRlaWcwMDAwIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWRVJfRURJVE9SX1RFU1RfRU5WSVJPTk1FTlQgPSBUb21jYXRVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLnRlaWcwMDAyIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWRVJfRURJVE9SX1NFQ1VSRSA9IFRvbWNhdFVJUGx1Z2luLlBMVUdJTl9JRCArICIudGVpZzAwMDQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZFUl9FRElUT1JfREVCVUdfTU9ERSA9IFRvbWNhdFVJUGx1Z2luLlBMVUdJTl9JRCArICIudGVpZzAwMDYiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHVVJBVElPTl9FRElUT1JfV0VCTU9EVUxFUyA9IFRvbWNhdFVJUGx1Z2luLlBMVUdJTl9JRCArICIudGVjdzAwMDAiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR1VSQVRJT05fRURJVE9SX1dFQk1PRFVMRVNfTElTVCA9IFRvbWNhdFVJUGx1Z2luLlBMVUdJTl9JRCArICIudGVjdzAwMDIiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR1VSQVRJT05fRURJVE9SX1dFQk1PRFVMRVNfQUREX1BST0pFQ1QgPSBUb21jYXRVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLnRlY3cwMDA0IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdVUkFUSU9OX0VESVRPUl9XRUJNT0RVTEVTX0FERF9FWFRFUk5BTCA9IFRvbWNhdFVJUGx1Z2luLlBMVUdJTl9JRCArICIudGVjdzAwMDYiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR1VSQVRJT05fRURJVE9SX1dFQk1PRFVMRVNfRURJVCA9IFRvbWNhdFVJUGx1Z2luLlBMVUdJTl9JRCArICIudGVjdzAwMDgiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR1VSQVRJT05fRURJVE9SX1dFQk1PRFVMRVNfUkVNT1ZFID0gVG9tY2F0VUlQbHVnaW4uUExVR0lOX0lEICsgIi50ZWN3MDAxMCI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdVUkFUSU9OX0VESVRPUl9XRUJNT0RVTEVfRElBTE9HID0gVG9tY2F0VUlQbHVnaW4uUExVR0lOX0lEICsgIi50ZHdtMDAwMCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHVVJBVElPTl9FRElUT1JfV0VCTU9EVUxFX0RJQUxPR19QUk9KRUNUID0gVG9tY2F0VUlQbHVnaW4uUExVR0lOX0lEICsgIi50ZHByMDAwMiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHVVJBVElPTl9FRElUT1JfV0VCTU9EVUxFX0RJQUxPR19QQVRIID0gVG9tY2F0VUlQbHVnaW4uUExVR0lOX0lEICsgIi50ZHByMDAwNCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHVVJBVElPTl9FRElUT1JfV0VCTU9EVUxFX0RJQUxPR19ET0NCQVNFID0gVG9tY2F0VUlQbHVnaW4uUExVR0lOX0lEICsgIi50ZHByMDAwNiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHVVJBVElPTl9FRElUT1JfV0VCTU9EVUxFX0RJQUxPR19SRUxPQUQgPSBUb21jYXRVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLnRkcHIwMDA4IjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR1VSQVRJT05fRURJVE9SX01BUFBJTkdTID0gVG9tY2F0VUlQbHVnaW4uUExVR0lOX0lEICsgIi50ZWNtMDAwMCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHVVJBVElPTl9FRElUT1JfTUFQUElOR1NfTElTVCA9IFRvbWNhdFVJUGx1Z2luLlBMVUdJTl9JRCArICIudGVjbTAwMDIiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR1VSQVRJT05fRURJVE9SX01BUFBJTkdTX0FERCA9IFRvbWNhdFVJUGx1Z2luLlBMVUdJTl9JRCArICIudGVjbTAwMDQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR1VSQVRJT05fRURJVE9SX01BUFBJTkdTX0VESVQgPSBUb21jYXRVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLnRlY20wMDA2IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdVUkFUSU9OX0VESVRPUl9NQVBQSU5HU19SRU1PVkUgPSBUb21jYXRVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLnRlY20wMDA4IjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR1VSQVRJT05fRURJVE9SX01BUFBJTkdfRElBTE9HID0gVG9tY2F0VUlQbHVnaW4uUExVR0lOX0lEICsgIi50ZG1tMDAwMCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHVVJBVElPTl9FRElUT1JfTUFQUElOR19ESUFMT0dfVFlQRSA9IFRvbWNhdFVJUGx1Z2luLlBMVUdJTl9JRCArICIudGRtbTAwMDIiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR1VSQVRJT05fRURJVE9SX01BUFBJTkdfRElBTE9HX0VYVEVOU0lPTiA9IFRvbWNhdFVJUGx1Z2luLlBMVUdJTl9JRCArICIudGRtbTAwMDQiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHVVJBVElPTl9FRElUT1JfUE9SVFMgPSBUb21jYXRVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLnRlY3AwMDAwIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdVUkFUSU9OX0VESVRPUl9QT1JUU19MSVNUID0gVG9tY2F0VUlQbHVnaW4uUExVR0lOX0lEICsgIi50ZWNwMDAwMiI7Ci0JCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJVTlRJTUVfQ09NUE9TSVRFID0gVG9tY2F0VUlQbHVnaW4uUExVR0lOX0lEICsgIi50d25yMDAwMCI7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS90b21jYXR1aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC91aS9pbnRlcm5hbC9NZXNzYWdlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS90b21jYXR1aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC91aS9pbnRlcm5hbC9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2JiMWM4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvdG9tY2F0dWkvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvdWkvaW50ZXJuYWwvTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotoCoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLS8qKgotICogVHJhbnNsYXRlZCBtZXNzYWdlcy4KLSAqLwotcHVibGljIGNsYXNzIE1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3aXphcmRUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3aXphcmREZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBydW50aW1lTmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbnN0YWxsRGlyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJyb3dzZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbnN0YWxsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdEluc3RhbGxEaXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW5zdGFsbGVkSlJFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGluc3RhbGxlZEpSRXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcnVudGltZURlZmF1bHRKUkU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWRpdG9yQWRkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVkaXRvckVkaXQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWRpdG9yUmVtb3ZlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yTWlzc2luZ1dlYk1vZHVsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maWd1cmF0aW9uRWRpdG9yTWltZU1hcHBpbmdzU2VjdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maWd1cmF0aW9uRWRpdG9yTWltZU1hcHBpbmdzRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlndXJhdGlvbkVkaXRvclBvcnRzU2VjdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maWd1cmF0aW9uRWRpdG9yUG9ydHNEZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maWd1cmF0aW9uRWRpdG9yUG9ydE5hbWVDb2x1bW47Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlndXJhdGlvbkVkaXRvclBvcnRWYWx1ZUNvbHVtbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maWd1cmF0aW9uRWRpdG9yV2ViTW9kdWxlc1BhZ2VUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maWd1cmF0aW9uRWRpdG9yV2ViTW9kdWxlc1NlY3Rpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlndXJhdGlvbkVkaXRvcldlYk1vZHVsZXNEZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maWd1cmF0aW9uRWRpdG9yUGF0aENvbHVtbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maWd1cmF0aW9uRWRpdG9yRG9jQmFzZUNvbHVtbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maWd1cmF0aW9uRWRpdG9yUHJvamVjdENvbHVtbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maWd1cmF0aW9uRWRpdG9yUmVsb2FkQ29sdW1uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmZpZ3VyYXRpb25FZGl0b3JBZGRQcm9qZWN0TW9kdWxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmZpZ3VyYXRpb25FZGl0b3JBZGRFeHRlcm5hbE1vZHVsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maWd1cmF0aW9uRWRpdG9yUHJvamVjdE1pc3Npbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlndXJhdGlvbkVkaXRvclJlbG9hZEVuYWJsZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlndXJhdGlvbkVkaXRvclJlbG9hZERpc2FibGVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmZpZ3VyYXRpb25FZGl0b3JNaW1lTWFwcHBpbmdEaWFsb2dUaXRsZUVkaXQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlndXJhdGlvbkVkaXRvck1pbWVNYXBwcGluZ0RpYWxvZ1RpdGxlQWRkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmZpZ3VyYXRpb25FZGl0b3JNaW1lTWFwcHBpbmdEaWFsb2dNaW1lVHlwZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maWd1cmF0aW9uRWRpdG9yTWltZU1hcHBwaW5nRGlhbG9nTWltZUV4dGVuc2lvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZXJ2ZXJFZGl0b3JHZW5lcmFsU2VjdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZXJ2ZXJFZGl0b3JHZW5lcmFsRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VydmVyRWRpdG9yVGVzdEVudmlyb25tZW50OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlcnZlckVkaXRvclNlY3VyZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZXJ2ZXJFZGl0b3JEZWJ1Z01vZGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlndXJhdGlvbkVkaXRvcldlYk1vZHVsZURpYWxvZ1RpdGxlRWRpdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maWd1cmF0aW9uRWRpdG9yV2ViTW9kdWxlRGlhbG9nVGl0bGVBZGQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlndXJhdGlvbkVkaXRvcldlYk1vZHVsZURpYWxvZ1Byb2plY3RzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmZpZ3VyYXRpb25FZGl0b3JXZWJNb2R1bGVEaWFsb2dEb2N1bWVudEJhc2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlndXJhdGlvbkVkaXRvcldlYk1vZHVsZURpYWxvZ1NlbGVjdERpcmVjdG9yeTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maWd1cmF0aW9uRWRpdG9yV2ViTW9kdWxlRGlhbG9nUGF0aDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maWd1cmF0aW9uRWRpdG9yV2ViTW9kdWxlRGlhbG9nUmVsb2FkRW5hYmxlZDsKLQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoVG9tY2F0VUlQbHVnaW4uUExVR0lOX0lEICsgIi5pbnRlcm5hbC5NZXNzYWdlcyIsIE1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS90b21jYXR1aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC91aS9pbnRlcm5hbC9NZXNzYWdlcy5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS90b21jYXR1aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC91aS9pbnRlcm5hbC9NZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTQxYjc5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvdG9tY2F0dWkvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvdWkvaW50ZXJuYWwvTWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgLS0tLS0tLS0tLS0tLS0tIEdlbmVyYWwgVUkgLS0tLS0tLS0tLS0tLS0tCi0KLXJ1bnRpbWVOYW1lPU5hJm1lOgotYnJvd3NlPUImcm93c2UuLi4KLWluc3RhbGw9RG93bmxvYWQgYW5kIElucyZ0YWxsLi4uCi1pbnN0YWxsRGlyPVRvbWNhdCBpbnN0YWxsYXRpb24gJmRpcmVjdG9yeToKLWluc3RhbGxlZEpSRT0mSlJFOgotaW5zdGFsbGVkSlJFcz0mSW5zdGFsbGVkIEpSRXMuLi4KLXNlbGVjdEluc3RhbGxEaXI9U2VsZWN0IFRvbWNhdCBpbnN0YWxsYXRpb24gZGlyZWN0b3J5LgotcnVudGltZURlZmF1bHRKUkU9V29ya2JlbmNoIGRlZmF1bHQgSlJFCi0KLSMgTmV3IFRvbWNhdCBzZXJ2ZXIgd2l6YXJkCi13aXphcmRUaXRsZT1Ub21jYXQgU2VydmVyCi13aXphcmREZXNjcmlwdGlvbj1TcGVjaWZ5IHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0b3J5Ci0KLSMgLS0tLS0tLS0tLS0tLS0tIEVkaXRvcnMgLS0tLS0tLS0tLS0tLS0tCi0KLSMgR2VuZXJhbCB0ZXh0IHVzZWQgaW4gYm90aCBlZGl0b3JzCi1lZGl0b3JSZW1vdmU9UmVtb3ZlCi1lZGl0b3JBZGQ9QWRkLi4uCi1lZGl0b3JFZGl0PUVkaXQuLi4KLQotIyAtLS0gQ29uZmlndXJhdGlvbiBFZGl0b3IgLS0tCi1jb25maWd1cmF0aW9uRWRpdG9yV2ViTW9kdWxlc1BhZ2VUaXRsZT1XZWIgTW9kdWxlcwotY29uZmlndXJhdGlvbkVkaXRvcldlYk1vZHVsZXNTZWN0aW9uPVdlYiBNb2R1bGVzCi1jb25maWd1cmF0aW9uRWRpdG9yV2ViTW9kdWxlc0Rlc2NyaXB0aW9uPUNvbmZpZ3VyZSB0aGUgV2ViIE1vZHVsZXMgb24gdGhpcyBzZXJ2ZXIuCi1jb25maWd1cmF0aW9uRWRpdG9yTWltZU1hcHBpbmdzU2VjdGlvbj1NSU1FIE1hcHBpbmdzCi1jb25maWd1cmF0aW9uRWRpdG9yTWltZU1hcHBpbmdzRGVzY3JpcHRpb249Q29uZmlndXJlIE1JTUUgdHlwZSBtYXBwaW5ncy4KLWNvbmZpZ3VyYXRpb25FZGl0b3JQb3J0c1NlY3Rpb249UG9ydHMKLWNvbmZpZ3VyYXRpb25FZGl0b3JQb3J0c0Rlc2NyaXB0aW9uPU1vZGlmeSB0aGUgc2VydmVyIHBvcnRzLgotCi0jIEZpZWxkcwotY29uZmlndXJhdGlvbkVkaXRvclBvcnROYW1lQ29sdW1uPVBvcnQgTmFtZQotY29uZmlndXJhdGlvbkVkaXRvclBvcnRWYWx1ZUNvbHVtbj1Qb3J0IE51bWJlcgotY29uZmlndXJhdGlvbkVkaXRvclBhdGhDb2x1bW49UGF0aAotY29uZmlndXJhdGlvbkVkaXRvckRvY0Jhc2VDb2x1bW49RG9jdW1lbnQgQmFzZQotY29uZmlndXJhdGlvbkVkaXRvclByb2plY3RDb2x1bW49TW9kdWxlCi1jb25maWd1cmF0aW9uRWRpdG9yUmVsb2FkQ29sdW1uPUF1dG8gUmVsb2FkCi1jb25maWd1cmF0aW9uRWRpdG9yUHJvamVjdE1pc3Npbmc9ezB9IG1pc3NpbmcKLWNvbmZpZ3VyYXRpb25FZGl0b3JSZWxvYWRFbmFibGVkPUVuYWJsZWQKLWNvbmZpZ3VyYXRpb25FZGl0b3JSZWxvYWREaXNhYmxlZD1EaXNhYmxlZAotY29uZmlndXJhdGlvbkVkaXRvckFkZFByb2plY3RNb2R1bGU9QWRkIFdlYiBNb2R1bGUuLi4KLWNvbmZpZ3VyYXRpb25FZGl0b3JBZGRFeHRlcm5hbE1vZHVsZT1BZGQgRXh0ZXJuYWwgV2ViIE1vZHVsZS4uLgotCi0jIEFkZC9FZGl0IE1pbWUgTWFwcGluZyBkaWFsb2cKLWNvbmZpZ3VyYXRpb25FZGl0b3JNaW1lTWFwcHBpbmdEaWFsb2dUaXRsZUVkaXQ9RWRpdCBNSU1FIE1hcHBpbmcKLWNvbmZpZ3VyYXRpb25FZGl0b3JNaW1lTWFwcHBpbmdEaWFsb2dUaXRsZUFkZD1BZGQgTUlNRSBNYXBwaW5nCi1jb25maWd1cmF0aW9uRWRpdG9yTWltZU1hcHBwaW5nRGlhbG9nTWltZVR5cGU9TUlNRSAmdHlwZToKLWNvbmZpZ3VyYXRpb25FZGl0b3JNaW1lTWFwcHBpbmdEaWFsb2dNaW1lRXh0ZW5zaW9uPU1JTUUgJmV4dGVuc2lvbjoKLQotIyBBZGQvRWRpdCBXZWIgTW9kdWxlIGRpYWxvZwotY29uZmlndXJhdGlvbkVkaXRvcldlYk1vZHVsZURpYWxvZ1RpdGxlRWRpdD1FZGl0IFdlYiBNb2R1bGUKLWNvbmZpZ3VyYXRpb25FZGl0b3JXZWJNb2R1bGVEaWFsb2dUaXRsZUFkZD1BZGQgV2ViIE1vZHVsZQotY29uZmlndXJhdGlvbkVkaXRvcldlYk1vZHVsZURpYWxvZ1Byb2plY3RzPSZNb2R1bGVzOgotY29uZmlndXJhdGlvbkVkaXRvcldlYk1vZHVsZURpYWxvZ1BhdGg9UCZhdGg6Ci1jb25maWd1cmF0aW9uRWRpdG9yV2ViTW9kdWxlRGlhbG9nRG9jdW1lbnRCYXNlPSZEb2N1bWVudCBiYXNlOgotY29uZmlndXJhdGlvbkVkaXRvcldlYk1vZHVsZURpYWxvZ1JlbG9hZEVuYWJsZWQ9QXV0byByJmVsb2FkaW5nIGVuYWJsZWQKLWNvbmZpZ3VyYXRpb25FZGl0b3JXZWJNb2R1bGVEaWFsb2dTZWxlY3REaXJlY3Rvcnk9U2VsZWN0IHRoZSBXZWIgbW9kdWxlIGRpcmVjdG9yeS4KLWVycm9yTWlzc2luZ1dlYk1vZHVsZT1UaGUgV2ViIG1vZHVsZSBhdCB0aGUgZm9sbG93aW5nIGxvY2F0aW9uIGNhbm5vdCBiZSBmb3VuZDogezB9LgotCi0jIC0tLSBTZXJ2ZXIgRWRpdG9yIC0tLQotc2VydmVyRWRpdG9yR2VuZXJhbFNlY3Rpb249U2VydmVyCi1zZXJ2ZXJFZGl0b3JHZW5lcmFsRGVzY3JpcHRpb249RW50ZXIgc2V0dGluZ3MgZm9yIHRoZSBzZXJ2ZXIuCi0KLSMgRmllbGRzCi1zZXJ2ZXJFZGl0b3JTZWN1cmU9RW5hYmxlIHNlY3VyaXR5Ci1zZXJ2ZXJFZGl0b3JEZWJ1Z01vZGU9RW5hYmxlIFRvbWNhdCBkZWJ1ZyBtb2RlICh2NC54IGFuZCBhYm92ZSBvbmx5KQotc2VydmVyRWRpdG9yVGVzdEVudmlyb25tZW50PVJ1biBtb2R1bGVzIGRpcmVjdGx5IGZyb20gdGhlIHdvcmtzcGFjZSAoZG8gbm90IG1vZGlmeSB0aGUgVG9tY2F0IGluc3RhbGxhdGlvbikKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvdG9tY2F0dWkvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvdWkvaW50ZXJuYWwvU1dUVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS90b21jYXR1aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC91aS9pbnRlcm5hbC9TV1RVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiZTAzYzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS90b21jYXR1aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC91aS9pbnRlcm5hbC9TV1RVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnRNZXRyaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLS8qKgotICogU1dUIFV0aWxpdHkgY2xhc3MuCi0gKi8KLXB1YmxpYyBjbGFzcyBTV1RVdGlsIHsKLQlwcml2YXRlIHN0YXRpYyBGb250TWV0cmljcyBmb250TWV0cmljczsKLQotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBpbml0aWFsaXplRGlhbG9nVW5pdHMoQ29udHJvbCB0ZXN0Q29udHJvbCkgewotCQkvLyBDb21wdXRlIGFuZCBzdG9yZSBhIGZvbnQgbWV0cmljCi0JCUdDIGdjID0gbmV3IEdDKHRlc3RDb250cm9sKTsKLQkJZ2Muc2V0Rm9udChKRmFjZVJlc291cmNlcy5nZXREaWFsb2dGb250KCkpOwotCQlmb250TWV0cmljcyA9IGdjLmdldEZvbnRNZXRyaWNzKCk7Ci0JCWdjLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgd2lkdGggaGludCBmb3IgYSBidXR0b24gY29udHJvbC4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGludCBnZXRCdXR0b25XaWR0aEhpbnQoQnV0dG9uIGJ1dHRvbikgewotCQlpbnQgd2lkdGhIaW50ID0gRGlhbG9nLmNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKGZvbnRNZXRyaWNzLCBJRGlhbG9nQ29uc3RhbnRzLkJVVFRPTl9XSURUSCk7Ci0JCXJldHVybiBNYXRoLm1heCh3aWR0aEhpbnQsIGJ1dHRvbi5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIHRydWUpLngpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBidXR0b24gd2l0aCB0aGUgc3RhbmRhcmQgc2l6ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29tcCB0aGUgY29tcG9uZW50IHRvIGFkZCB0aGUgYnV0dG9uIHRvCi0JICogQHBhcmFtIGxhYmVsIHRoZSBidXR0b24gbGFiZWwKLQkgKiBAcmV0dXJuIGEgYnV0dG9uCi0JICovCi0JcHVibGljIHN0YXRpYyBCdXR0b24gY3JlYXRlQnV0dG9uKENvbXBvc2l0ZSBjb21wLCBTdHJpbmcgbGFiZWwpIHsKLQkJQnV0dG9uIGIgPSBuZXcgQnV0dG9uKGNvbXAsIFNXVC5QVVNIKTsKLQkJYi5zZXRUZXh0KGxhYmVsKTsKLQkJaWYgKGZvbnRNZXRyaWNzID09IG51bGwpCi0JCQlpbml0aWFsaXplRGlhbG9nVW5pdHMoY29tcCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLQkJZGF0YS53aWR0aEhpbnQgPSBnZXRCdXR0b25XaWR0aEhpbnQoYik7Ci0JCWIuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJcmV0dXJuIGI7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvdG9tY2F0dWkvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvdWkvaW50ZXJuYWwvVG9tY2F0TGF1bmNoQ29uZmlndXJhdGlvblRhYkdyb3VwLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpL3RvbWNhdHVpL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L3VpL2ludGVybmFsL1RvbWNhdExhdW5jaENvbmZpZ3VyYXRpb25UYWJHcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzZmNzI1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvdG9tY2F0dWkvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvdWkvaW50ZXJuYWwvVG9tY2F0TGF1bmNoQ29uZmlndXJhdGlvblRhYkdyb3VwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5zb3VyY2Vsb29rdXAuU291cmNlTG9va3VwVGFiOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5kZWJ1Zy51aS5sYXVuY2hDb25maWd1cmF0aW9ucy5KYXZhQXJndW1lbnRzVGFiOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5kZWJ1Zy51aS5sYXVuY2hDb25maWd1cmF0aW9ucy5KYXZhQ2xhc3NwYXRoVGFiOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5TZXJ2ZXJMYXVuY2hDb25maWd1cmF0aW9uVGFiOwotLyoqCi0gKiBBIGRlYnVnIHRhYiBncm91cCBmb3IgbGF1bmNoaW5nIFRvbWNhdC4gCi0gKi8KLXB1YmxpYyBjbGFzcyBUb21jYXRMYXVuY2hDb25maWd1cmF0aW9uVGFiR3JvdXAgZXh0ZW5kcyBBYnN0cmFjdExhdW5jaENvbmZpZ3VyYXRpb25UYWJHcm91cCB7Ci0JLyoKLQkgKiBAc2VlIElMYXVuY2hDb25maWd1cmF0aW9uVGFiR3JvdXAjY3JlYXRlVGFicyhJTGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZywgU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVRhYnMoSUxhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2cgZGlhbG9nLCBTdHJpbmcgbW9kZSkgewotCQlJTGF1bmNoQ29uZmlndXJhdGlvblRhYltdIHRhYnMgPSBuZXcgSUxhdW5jaENvbmZpZ3VyYXRpb25UYWJbNl07Ci0JCXRhYnNbMF0gPSBuZXcgU2VydmVyTGF1bmNoQ29uZmlndXJhdGlvblRhYihuZXcgU3RyaW5nW10geyAib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQiIH0pOwotCQl0YWJzWzBdLnNldExhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2coZGlhbG9nKTsKLQkJdGFic1sxXSA9IG5ldyBKYXZhQXJndW1lbnRzVGFiKCk7Ci0JCXRhYnNbMV0uc2V0TGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZyhkaWFsb2cpOwotCQl0YWJzWzJdID0gbmV3IEphdmFDbGFzc3BhdGhUYWIoKTsKLQkJdGFic1syXS5zZXRMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nKGRpYWxvZyk7Ci0JCXRhYnNbM10gPSBuZXcgU291cmNlTG9va3VwVGFiKCk7Ci0JCXRhYnNbM10uc2V0TGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZyhkaWFsb2cpOwotCQl0YWJzWzRdID0gbmV3IEVudmlyb25tZW50VGFiKCk7Ci0JCXRhYnNbNF0uc2V0TGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZyhkaWFsb2cpOwotCQl0YWJzWzVdID0gbmV3IENvbW1vblRhYigpOwotCQl0YWJzWzVdLnNldExhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2coZGlhbG9nKTsKLQkJc2V0VGFicyh0YWJzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS90b21jYXR1aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC91aS9pbnRlcm5hbC9Ub21jYXRSdW50aW1lQ29tcG9zaXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpL3RvbWNhdHVpL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L3VpL2ludGVybmFsL1RvbWNhdFJ1bnRpbWVDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIwYTc1YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpL3RvbWNhdHVpL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L3VpL2ludGVybmFsL1RvbWNhdFJ1bnRpbWVDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSVZNSW5zdGFsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLklWTUluc3RhbGxUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSmF2YVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JTWVzc2FnZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5JVG9tY2F0UnVudGltZVdvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CdXN5SW5kaWNhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlyZWN0b3J5RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZVdvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5JSW5zdGFsbGFibGVSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5TZXJ2ZXJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuSVdpemFyZEhhbmRsZTsKLS8qKgotICogV2l6YXJkIHBhZ2UgdG8gc2V0IHRoZSBzZXJ2ZXIgaW5zdGFsbCBkaXJlY3RvcnkuCi0gKi8KLXB1YmxpYyBjbGFzcyBUb21jYXRSdW50aW1lQ29tcG9zaXRlIGV4dGVuZHMgQ29tcG9zaXRlIHsKLQlwcm90ZWN0ZWQgSVJ1bnRpbWVXb3JraW5nQ29weSBydW50aW1lV0M7Ci0JcHJvdGVjdGVkIElUb21jYXRSdW50aW1lV29ya2luZ0NvcHkgcnVudGltZTsKLQkKLQlwcm90ZWN0ZWQgSVdpemFyZEhhbmRsZSB3aXphcmQ7Ci0JCi0JcHJvdGVjdGVkIFRleHQgaW5zdGFsbERpcjsKLQlwcm90ZWN0ZWQgVGV4dCBuYW1lOwotCXByb3RlY3RlZCBDb21ibyBjb21ibzsKLQlwcm90ZWN0ZWQgTGlzdCBpbnN0YWxsZWRKUkVzOwotCXByb3RlY3RlZCBTdHJpbmdbXSBqcmVOYW1lczsKLQotCS8qKgotCSAqIFRvbWNhdFJ1bnRpbWVXaXphcmRQYWdlIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSB3aXphcmQgdGhlIHdpemFyZCBoYW5kbGUKLQkgKi8KLQlwcm90ZWN0ZWQgVG9tY2F0UnVudGltZUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBJV2l6YXJkSGFuZGxlIHdpemFyZCkgewotCQlzdXBlcihwYXJlbnQsIFNXVC5OT05FKTsKLQkJdGhpcy53aXphcmQgPSB3aXphcmQ7Ci0JCQotCQl3aXphcmQuc2V0VGl0bGUoTWVzc2FnZXMud2l6YXJkVGl0bGUpOwotCQl3aXphcmQuc2V0RGVzY3JpcHRpb24oTWVzc2FnZXMud2l6YXJkRGVzY3JpcHRpb24pOwotCQl3aXphcmQuc2V0SW1hZ2VEZXNjcmlwdG9yKFRvbWNhdFVJUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcihUb21jYXRVSVBsdWdpbi5JTUdfV0laX1RPTUNBVCkpOwotCQkKLQkJY3JlYXRlQ29udHJvbCgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRSdW50aW1lKElSdW50aW1lV29ya2luZ0NvcHkgbmV3UnVudGltZSkgewotCQlpZiAobmV3UnVudGltZSA9PSBudWxsKSB7Ci0JCQlydW50aW1lV0MgPSBudWxsOwotCQkJcnVudGltZSA9IG51bGw7Ci0JCX0gZWxzZSB7Ci0JCQlydW50aW1lV0MgPSBuZXdSdW50aW1lOwotCQkJcnVudGltZSA9IChJVG9tY2F0UnVudGltZVdvcmtpbmdDb3B5KSBuZXdSdW50aW1lLmxvYWRBZGFwdGVyKElUb21jYXRSdW50aW1lV29ya2luZ0NvcHkuY2xhc3MsIG51bGwpOwotCQl9Ci0JCQotCQlpbml0KCk7Ci0JCXZhbGlkYXRlKCk7Ci0JfQotCi0JLyoqCi0JICogUHJvdmlkZSBhIHdpemFyZCBwYWdlIHRvIGNoYW5nZSB0aGUgVG9tY2F0IGluc3RhbGxhdGlvbiBkaXJlY3RvcnkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udHJvbCgpIHsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCXNldExheW91dChsYXlvdXQpOwotCQlzZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0aGlzLCBDb250ZXh0SWRzLlJVTlRJTUVfQ09NUE9TSVRFKTsKLQkJCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHRoaXMsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChNZXNzYWdlcy5ydW50aW1lTmFtZSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQluYW1lID0gbmV3IFRleHQodGhpcywgU1dULkJPUkRFUik7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJbmFtZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQluYW1lLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCXJ1bnRpbWVXQy5zZXROYW1lKG5hbWUuZ2V0VGV4dCgpKTsKLQkJCQl2YWxpZGF0ZSgpOwotCQkJfQotCQl9KTsKLQkKLQkJbGFiZWwgPSBuZXcgTGFiZWwodGhpcywgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLmluc3RhbGxEaXIpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQotCQlpbnN0YWxsRGlyID0gbmV3IFRleHQodGhpcywgU1dULkJPUkRFUik7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJaW5zdGFsbERpci5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlpbnN0YWxsRGlyLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCXJ1bnRpbWVXQy5zZXRMb2NhdGlvbihuZXcgUGF0aChpbnN0YWxsRGlyLmdldFRleHQoKSkpOwotCQkJCXZhbGlkYXRlKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJQnV0dG9uIGJyb3dzZSA9IFNXVFV0aWwuY3JlYXRlQnV0dG9uKHRoaXMsIE1lc3NhZ2VzLmJyb3dzZSk7Ci0JCWJyb3dzZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IHNlKSB7Ci0JCQkJRGlyZWN0b3J5RGlhbG9nIGRpYWxvZyA9IG5ldyBEaXJlY3RvcnlEaWFsb2coVG9tY2F0UnVudGltZUNvbXBvc2l0ZS50aGlzLmdldFNoZWxsKCkpOwotCQkJCWRpYWxvZy5zZXRNZXNzYWdlKE1lc3NhZ2VzLnNlbGVjdEluc3RhbGxEaXIpOwotCQkJCWRpYWxvZy5zZXRGaWx0ZXJQYXRoKGluc3RhbGxEaXIuZ2V0VGV4dCgpKTsKLQkJCQlTdHJpbmcgc2VsZWN0ZWREaXJlY3RvcnkgPSBkaWFsb2cub3BlbigpOwotCQkJCWlmIChzZWxlY3RlZERpcmVjdG9yeSAhPSBudWxsKQotCQkJCQlpbnN0YWxsRGlyLnNldFRleHQoc2VsZWN0ZWREaXJlY3RvcnkpOwotCQkJfQotCQl9KTsKLQkJCi0JCWZpbmFsIElJbnN0YWxsYWJsZVJ1bnRpbWUgaXIgPSBTZXJ2ZXJQbHVnaW4uZmluZEluc3RhbGxhYmxlUnVudGltZSgib3JnLmVjbGlwc2UuanN0LnNlcnZlci50aW1jYXQucnVudGltZS4zMiIpOwotCQlpZiAoaXIgIT0gbnVsbCkgewotCQkJbGFiZWwgPSBuZXcgTGFiZWwodGhpcywgU1dULk5PTkUpOwotCQkJCi0JCQlCdXR0b24gaW5zdGFsbCA9IFNXVFV0aWwuY3JlYXRlQnV0dG9uKHRoaXMsIE1lc3NhZ2VzLmluc3RhbGwpOwotCQkJaW5zdGFsbC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBzZSkgewotCQkJCQlEaXJlY3RvcnlEaWFsb2cgZGlhbG9nID0gbmV3IERpcmVjdG9yeURpYWxvZyhUb21jYXRSdW50aW1lQ29tcG9zaXRlLnRoaXMuZ2V0U2hlbGwoKSk7Ci0JCQkJCWRpYWxvZy5zZXRNZXNzYWdlKE1lc3NhZ2VzLnNlbGVjdEluc3RhbGxEaXIpOwotCQkJCQlkaWFsb2cuc2V0RmlsdGVyUGF0aChpbnN0YWxsRGlyLmdldFRleHQoKSk7Ci0JCQkJCVN0cmluZyBzZWxlY3RlZERpcmVjdG9yeSA9IGRpYWxvZy5vcGVuKCk7Ci0JCQkJCWlmIChzZWxlY3RlZERpcmVjdG9yeSAhPSBudWxsKSB7Ci0JCQkJCQlpci5pbnN0YWxsKG5ldyBQYXRoKHNlbGVjdGVkRGlyZWN0b3J5KSk7Ci0JCQkJCQlpbnN0YWxsRGlyLnNldFRleHQoc2VsZWN0ZWREaXJlY3RvcnkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJCi0JCXVwZGF0ZUpSRXMoKTsKLQkJCi0JCS8vIEpESyBsb2NhdGlvbgotCQlsYWJlbCA9IG5ldyBMYWJlbCh0aGlzLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoTWVzc2FnZXMuaW5zdGFsbGVkSlJFKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCi0JCWNvbWJvID0gbmV3IENvbWJvKHRoaXMsIFNXVC5EUk9QX0RPV04gfCBTV1QuUkVBRF9PTkxZKTsKLQkJY29tYm8uc2V0SXRlbXMoanJlTmFtZXMpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCWNvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQljb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaW50IHNlbCA9IGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCQkJSVZNSW5zdGFsbCB2bUluc3RhbGwgPSBudWxsOwotCQkJCWlmIChzZWwgPiAwKQotCQkJCQl2bUluc3RhbGwgPSAoSVZNSW5zdGFsbCkgaW5zdGFsbGVkSlJFcy5nZXQoc2VsIC0gMSk7Ci0JCQkJCi0JCQkJcnVudGltZS5zZXRWTUluc3RhbGwodm1JbnN0YWxsKTsKLQkJCQl2YWxpZGF0ZSgpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXdpZGdldFNlbGVjdGVkKGUpOwotCQkJfQotCQl9KTsKLQkJCi0JCUJ1dHRvbiBidXR0b24gPSBTV1RVdGlsLmNyZWF0ZUJ1dHRvbih0aGlzLCBNZXNzYWdlcy5pbnN0YWxsZWRKUkVzKTsKLQkJYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCVN0cmluZyBjdXJyZW50Vk0gPSBjb21iby5nZXRUZXh0KCk7Ci0JCQkJaWYgKHNob3dQcmVmZXJlbmNlUGFnZSgpKSB7Ci0JCQkJCXVwZGF0ZUpSRXMoKTsKLQkJCQkJY29tYm8uc2V0SXRlbXMoanJlTmFtZXMpOwotCQkJCQljb21iby5zZXRUZXh0KGN1cnJlbnRWTSk7Ci0JCQkJCWlmIChjb21iby5nZXRTZWxlY3Rpb25JbmRleCgpID09IC0xKQotCQkJCQkJY29tYm8uc2VsZWN0KDApOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCQotCQlpbml0KCk7Ci0JCXZhbGlkYXRlKCk7Ci0KLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udCh0aGlzKTsKLQotCQluYW1lLmZvcmNlRm9jdXMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVKUkVzKCkgewotCQkvLyBnZXQgYWxsIGluc3RhbGxlZCBKVk1zCi0JCWluc3RhbGxlZEpSRXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlWTUluc3RhbGxUeXBlW10gdm1JbnN0YWxsVHlwZXMgPSBKYXZhUnVudGltZS5nZXRWTUluc3RhbGxUeXBlcygpOwotCQlpbnQgc2l6ZSA9IHZtSW5zdGFsbFR5cGVzLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCUlWTUluc3RhbGxbXSB2bUluc3RhbGxzID0gdm1JbnN0YWxsVHlwZXNbaV0uZ2V0Vk1JbnN0YWxscygpOwotCQkJaW50IHNpemUyID0gdm1JbnN0YWxscy5sZW5ndGg7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IHNpemUyOyBqKyspIHsKLQkJCQlpbnN0YWxsZWRKUkVzLmFkZCh2bUluc3RhbGxzW2pdKTsKLQkJCX0KLQkJfQotCQkKLQkJLy8gZ2V0IG5hbWVzCi0JCXNpemUgPSBpbnN0YWxsZWRKUkVzLnNpemUoKTsKLQkJanJlTmFtZXMgPSBuZXcgU3RyaW5nW3NpemUrMV07Ci0JCWpyZU5hbWVzWzBdID0gTWVzc2FnZXMucnVudGltZURlZmF1bHRKUkU7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlJVk1JbnN0YWxsIHZtSW5zdGFsbCA9IChJVk1JbnN0YWxsKSBpbnN0YWxsZWRKUkVzLmdldChpKTsKLQkJCWpyZU5hbWVzW2krMV0gPSB2bUluc3RhbGwuZ2V0TmFtZSgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvd1ByZWZlcmVuY2VQYWdlKCkgewotCQlQcmVmZXJlbmNlTWFuYWdlciBtYW5hZ2VyID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRQcmVmZXJlbmNlTWFuYWdlcigpOwotCQlJUHJlZmVyZW5jZU5vZGUgbm9kZSA9IG1hbmFnZXIuZmluZCgib3JnLmVjbGlwc2UuamR0LnVpLnByZWZlcmVuY2VzLkphdmFCYXNlUHJlZmVyZW5jZVBhZ2UiKS5maW5kU3ViTm9kZSgib3JnLmVjbGlwc2UuamR0LmRlYnVnLnVpLnByZWZlcmVuY2VzLlZNUHJlZmVyZW5jZVBhZ2UiKTsKLQkJUHJlZmVyZW5jZU1hbmFnZXIgbWFuYWdlcjIgPSBuZXcgUHJlZmVyZW5jZU1hbmFnZXIoKTsKLQkJbWFuYWdlcjIuYWRkVG9Sb290KG5vZGUpOwotCQlmaW5hbCBQcmVmZXJlbmNlRGlhbG9nIGRpYWxvZyA9IG5ldyBQcmVmZXJlbmNlRGlhbG9nKGdldFNoZWxsKCksIG1hbmFnZXIyKTsKLQkJZmluYWwgYm9vbGVhbltdIHJlc3VsdCA9IG5ldyBib29sZWFuW10geyBmYWxzZSB9OwotCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShnZXREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCQkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKQotCQkJCQlyZXN1bHRbMF0gPSB0cnVlOwotCQkJfQotCQl9KTsKLQkJcmV0dXJuIHJlc3VsdFswXTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdCgpIHsKLQkJaWYgKG5hbWUgPT0gbnVsbCB8fCBydW50aW1lID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQlpZiAocnVudGltZVdDLmdldE5hbWUoKSAhPSBudWxsKQotCQkJbmFtZS5zZXRUZXh0KHJ1bnRpbWVXQy5nZXROYW1lKCkpOwotCQllbHNlCi0JCQluYW1lLnNldFRleHQoIiIpOwotCQotCQlpZiAocnVudGltZVdDLmdldExvY2F0aW9uKCkgIT0gbnVsbCkKLQkJCWluc3RhbGxEaXIuc2V0VGV4dChydW50aW1lV0MuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCkpOwotCQllbHNlCi0JCQlpbnN0YWxsRGlyLnNldFRleHQoIiIpOwotCQkKLQkJLy8gc2V0IHNlbGVjdGlvbgotCQlpZiAocnVudGltZS5pc1VzaW5nRGVmYXVsdEpSRSgpKQotCQkJY29tYm8uc2VsZWN0KDApOwotCQllbHNlIHsKLQkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJCWludCBzaXplID0gaW5zdGFsbGVkSlJFcy5zaXplKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCUlWTUluc3RhbGwgdm1JbnN0YWxsID0gKElWTUluc3RhbGwpIGluc3RhbGxlZEpSRXMuZ2V0KGkpOwotCQkJCWlmICh2bUluc3RhbGwuZXF1YWxzKHJ1bnRpbWUuZ2V0Vk1JbnN0YWxsKCkpKSB7Ci0JCQkJCWNvbWJvLnNlbGVjdChpICsgMSk7Ci0JCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIWZvdW5kKQotCQkJCWNvbWJvLnNlbGVjdCgwKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlKCkgewotCQlpZiAocnVudGltZSA9PSBudWxsKSB7Ci0JCQl3aXphcmQuc2V0TWVzc2FnZSgiIiwgSU1lc3NhZ2VQcm92aWRlci5FUlJPUik7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlJU3RhdHVzIHN0YXR1cyA9IHJ1bnRpbWVXQy52YWxpZGF0ZShudWxsKTsKLQkJaWYgKHN0YXR1cyA9PSBudWxsIHx8IHN0YXR1cy5pc09LKCkpCi0JCQl3aXphcmQuc2V0TWVzc2FnZShudWxsLCBJTWVzc2FnZVByb3ZpZGVyLk5PTkUpOwotCQllbHNlIGlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLldBUk5JTkcpCi0JCQl3aXphcmQuc2V0TWVzc2FnZShzdGF0dXMuZ2V0TWVzc2FnZSgpLCBJTWVzc2FnZVByb3ZpZGVyLldBUk5JTkcpOwotCQllbHNlCi0JCQl3aXphcmQuc2V0TWVzc2FnZShzdGF0dXMuZ2V0TWVzc2FnZSgpLCBJTWVzc2FnZVByb3ZpZGVyLkVSUk9SKTsKLQkJd2l6YXJkLnVwZGF0ZSgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpL3RvbWNhdHVpL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L3VpL2ludGVybmFsL1RvbWNhdFJ1bnRpbWVXaXphcmRGcmFnbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS90b21jYXR1aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC91aS9pbnRlcm5hbC9Ub21jYXRSdW50aW1lV2l6YXJkRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdmZDM2MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpL3RvbWNhdHVpL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L3VpL2ludGVybmFsL1RvbWNhdFJ1bnRpbWVXaXphcmRGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLlRvbWNhdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWVXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuVGFza01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkud2l6YXJkLklXaXphcmRIYW5kbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuV2l6YXJkRnJhZ21lbnQ7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgVG9tY2F0UnVudGltZVdpemFyZEZyYWdtZW50IGV4dGVuZHMgV2l6YXJkRnJhZ21lbnQgewotCXByb3RlY3RlZCBUb21jYXRSdW50aW1lQ29tcG9zaXRlIGNvbXA7Ci0KLQlwdWJsaWMgVG9tY2F0UnVudGltZVdpemFyZEZyYWdtZW50KCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzQ29tcG9zaXRlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0NvbXBsZXRlKCkgewotCQlJUnVudGltZVdvcmtpbmdDb3B5IHJ1bnRpbWUgPSAoSVJ1bnRpbWVXb3JraW5nQ29weSkgZ2V0VGFza01vZGVsKCkuZ2V0T2JqZWN0KFRhc2tNb2RlbC5UQVNLX1JVTlRJTUUpOwotCQkKLQkJaWYgKHJ1bnRpbWUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJSVN0YXR1cyBzdGF0dXMgPSBydW50aW1lLnZhbGlkYXRlKG51bGwpOwotCQlyZXR1cm4gKHN0YXR1cyA9PSBudWxsIHx8IHN0YXR1cy5nZXRTZXZlcml0eSgpICE9IElTdGF0dXMuRVJST1IpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkudGFzay5XaXphcmRGcmFnbWVudCNjcmVhdGVDb21wb3NpdGUoKQotCSAqLwotCXB1YmxpYyBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIElXaXphcmRIYW5kbGUgd2l6YXJkKSB7Ci0JCWNvbXAgPSBuZXcgVG9tY2F0UnVudGltZUNvbXBvc2l0ZShwYXJlbnQsIHdpemFyZCk7Ci0JCXJldHVybiBjb21wOwotCX0KLQotCXB1YmxpYyB2b2lkIGVudGVyKCkgewotCQlpZiAoY29tcCAhPSBudWxsKSB7Ci0JCQlJUnVudGltZVdvcmtpbmdDb3B5IHJ1bnRpbWUgPSAoSVJ1bnRpbWVXb3JraW5nQ29weSkgZ2V0VGFza01vZGVsKCkuZ2V0T2JqZWN0KFRhc2tNb2RlbC5UQVNLX1JVTlRJTUUpOwotCQkJY29tcC5zZXRSdW50aW1lKHJ1bnRpbWUpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZXhpdCgpIHsKLQkJSVJ1bnRpbWVXb3JraW5nQ29weSBydW50aW1lID0gKElSdW50aW1lV29ya2luZ0NvcHkpIGdldFRhc2tNb2RlbCgpLmdldE9iamVjdChUYXNrTW9kZWwuVEFTS19SVU5USU1FKTsKLQkJSVBhdGggcGF0aCA9IHJ1bnRpbWUuZ2V0TG9jYXRpb24oKTsKLQkJaWYgKHJ1bnRpbWUudmFsaWRhdGUobnVsbCkuZ2V0U2V2ZXJpdHkoKSAhPSBJU3RhdHVzLkVSUk9SKQotCQkJVG9tY2F0UGx1Z2luLnNldFByZWZlcmVuY2UoImxvY2F0aW9uIiArIHJ1bnRpbWUuZ2V0UnVudGltZVR5cGUoKS5nZXRJZCgpLCBwYXRoLnRvU3RyaW5nKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpL3RvbWNhdHVpL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L3VpL2ludGVybmFsL1RvbWNhdFVJUGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpL3RvbWNhdHVpL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L3VpL2ludGVybmFsL1RvbWNhdFVJUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViOGI2YzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS90b21jYXR1aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC91aS9pbnRlcm5hbC9Ub21jYXRVSVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLS8qKgotICogVGhlIGFjdHVhbCBUb21jYXQgcGx1Z2luLiBJdCBhbGxvd3MgdGhlIHJlc3Qgb2YgdGhlIGNsYXNzZXMKLSAqIHRvIGxvYWQgaW1hZ2VzIGFuZCBnZXQgYSBoYW5kbGUgdG8gdGhlIGRlc2t0b3AuCi0gKi8KLXB1YmxpYyBjbGFzcyBUb21jYXRVSVBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCXByb3RlY3RlZCBzdGF0aWMgVG9tY2F0VUlQbHVnaW4gc2luZ2xldG9uOwotCi0JcHJvdGVjdGVkIE1hcCBpbWFnZURlc2NyaXB0b3JzID0gbmV3IEhhc2hNYXAoKTsKLQotCS8vIGJhc2UgdXJsIGZvciBpY29ucwotCXByaXZhdGUgc3RhdGljIFVSTCBJQ09OX0JBU0VfVVJMOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTF9PQkogPSAib2JqMTYvIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMX1dJWkJBTiA9ICJ3aXpiYW4vIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aSI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfV0laX1RPTUNBVCA9ICJ3aXpUb21jYXQiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1dFQl9NT0RVTEUgPSAid2ViTW9kdWxlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfTUlNRV9NQVBQSU5HID0gIm1pbWVNYXBwaW5nIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfTUlNRV9FWFRFTlNJT04gPSAibWltZUV4dGVuc2lvbiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1BPUlQgPSAicG9ydCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1BST0pFQ1RfTUlTU0lORyA9ICJwcm9qZWN0TWlzc2luZyI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX1RPTUNBVDMyX0lOU1RBTExfRElSID0gInRvbWNhdDMyaW5zdGFsbCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9UT01DQVQ0MF9JTlNUQUxMX0RJUiA9ICJ0b21jYXQ0MGluc3RhbGwiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfVE9NQ0FUNDFfSU5TVEFMTF9ESVIgPSAidG9tY2F0NDFpbnN0YWxsIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX1RPTUNBVDUwX0lOU1RBTExfRElSID0gInRvbWNhdDUwaW5zdGFsbCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9KREtfSU5TVEFMTF9ESVIgPSAiamRraW5zdGFsbCI7Ci0KLQkvKioKLQkgKiBUb21jYXRVSVBsdWdpbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBUb21jYXRVSVBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJc2luZ2xldG9uID0gdGhpczsKLQl9Ci0KLQlwcm90ZWN0ZWQgSW1hZ2VSZWdpc3RyeSBjcmVhdGVJbWFnZVJlZ2lzdHJ5KCkgewotCQlJbWFnZVJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gbmV3IEltYWdlUmVnaXN0cnkoKTsKLQkKLQkJcmVnaXN0ZXJJbWFnZShyZWdpc3RyeSwgSU1HX1dJWl9UT01DQVQsIFVSTF9XSVpCQU4gKyAidG9tY2F0X3dpei5naWYiKTsKLQkKLQkJcmVnaXN0ZXJJbWFnZShyZWdpc3RyeSwgSU1HX1dFQl9NT0RVTEUsIFVSTF9PQkogKyAid2ViX21vZHVsZS5naWYiKTsKLQkJcmVnaXN0ZXJJbWFnZShyZWdpc3RyeSwgSU1HX01JTUVfTUFQUElORywgVVJMX09CSiArICJtaW1lX21hcHBpbmcuZ2lmIik7Ci0JCXJlZ2lzdGVySW1hZ2UocmVnaXN0cnksIElNR19NSU1FX0VYVEVOU0lPTiwgVVJMX09CSiArICJtaW1lX2V4dGVuc2lvbi5naWYiKTsKLQkJcmVnaXN0ZXJJbWFnZShyZWdpc3RyeSwgSU1HX1BPUlQsIFVSTF9PQkogKyAicG9ydC5naWYiKTsKLQkJcmVnaXN0ZXJJbWFnZShyZWdpc3RyeSwgSU1HX1BST0pFQ1RfTUlTU0lORywgVVJMX09CSiArICJwcm9qZWN0X21pc3NpbmcuZ2lmIik7Ci0JCi0JCXJldHVybiByZWdpc3RyeTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGltYWdlIHdpdGggdGhlIGdpdmVuIGtleSBmcm9tIHRoZSBpbWFnZSByZWdpc3RyeS4KLQkgKiBAcGFyYW0ga2V5IGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLmpmYWNlLnBhcnRzLklJbWFnZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW1hZ2UgZ2V0SW1hZ2UoU3RyaW5nIGtleSkgewotCQlyZXR1cm4gZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZVJlZ2lzdHJ5KCkuZ2V0KGtleSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbWFnZSB3aXRoIHRoZSBnaXZlbiBrZXkgZnJvbSB0aGUgaW1hZ2UgcmVnaXN0cnkuCi0JICogQHBhcmFtIGtleSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5qZmFjZS5wYXJ0cy5JSW1hZ2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIGtleSkgewotCQl0cnkgewotCQkJZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZVJlZ2lzdHJ5KCk7Ci0JCQlyZXR1cm4gKEltYWdlRGVzY3JpcHRvcikgZ2V0SW5zdGFuY2UoKS5pbWFnZURlc2NyaXB0b3JzLmdldChrZXkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhpcyBwbHVnaW4uCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5pbnRlcm5hbC5Ub21jYXRVSVBsdWdpbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVG9tY2F0VUlQbHVnaW4gZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBzaW5nbGV0b247Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBsb2dnaW5nLgotCSAqCi0JICogQHBhcmFtIHN0YXR1cyBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coSVN0YXR1cyBzdGF0dXMpIHsKLQkJZ2V0SW5zdGFuY2UoKS5nZXRMb2coKS5sb2coc3RhdHVzKTsKLQl9Ci0KLQkvKioKLQkgKiBSZWdpc3RlciBhbiBpbWFnZSB3aXRoIHRoZSByZWdpc3RyeS4KLQkgKiBAcGFyYW0ga2V5IGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gcGFydGlhbFVSTCBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlZ2lzdGVySW1hZ2UoSW1hZ2VSZWdpc3RyeSByZWdpc3RyeSwgU3RyaW5nIGtleSwgU3RyaW5nIHBhcnRpYWxVUkwpIHsKLQkJaWYgKElDT05fQkFTRV9VUkwgPT0gbnVsbCkgewotCQkJU3RyaW5nIHBhdGhTdWZmaXggPSAiaWNvbnMvIjsKLQkJCUlDT05fQkFTRV9VUkwgPSBzaW5nbGV0b24uZ2V0QnVuZGxlKCkuZ2V0RW50cnkocGF0aFN1ZmZpeCk7Ci0JCX0KLQotCQl0cnkgewotCQkJSW1hZ2VEZXNjcmlwdG9yIGlkID0gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwobmV3IFVSTChJQ09OX0JBU0VfVVJMLCBwYXJ0aWFsVVJMKSk7Ci0JCQlyZWdpc3RyeS5wdXQoa2V5LCBpZCk7Ci0JCQlpbWFnZURlc2NyaXB0b3JzLnB1dChrZXksIGlkKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJFcnJvciByZWdpc3RlcmluZyBpbWFnZSIsIGUpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvdG9tY2F0dWkvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvdWkvaW50ZXJuYWwvVHJhY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvdG9tY2F0dWkvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvdWkvaW50ZXJuYWwvVHJhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzIxNjNiOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpL3RvbWNhdHVpL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L3VpL2ludGVybmFsL1RyYWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLaAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS5pbnRlcm5hbDsKLS8qKgotICogSGVscGVyIGNsYXNzIHRvIHJvdXRlIHRyYWNlIG91dHB1dC4KLSAqLwotcHVibGljIGNsYXNzIFRyYWNlIHsKLQlwdWJsaWMgc3RhdGljIGJ5dGUgQ09ORklHID0gMDsKLQlwdWJsaWMgc3RhdGljIGJ5dGUgV0FSTklORyA9IDE7Ci0JcHVibGljIHN0YXRpYyBieXRlIFNFVkVSRSA9IDI7Ci0JcHVibGljIHN0YXRpYyBieXRlIEZJTkVTVCA9IDM7Ci0JcHVibGljIHN0YXRpYyBieXRlIEZJTkVSID0gNDsKLQotCS8qKgotCSAqIFRyYWNlIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHJpdmF0ZSBUcmFjZSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBUcmFjZSB0aGUgZ2l2ZW4gdGV4dC4KLQkgKgotCSAqIEBwYXJhbSBsZXZlbCB0aGUgdHJhY2UgbGV2ZWwKLQkgKiBAcGFyYW0gcyBhIG1lc3NhZ2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2UoYnl0ZSBsZXZlbCwgU3RyaW5nIHMpIHsKLQkJVHJhY2UudHJhY2UobGV2ZWwsIHMsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIFRyYWNlIHRoZSBnaXZlbiBtZXNzYWdlIGFuZCBleGNlcHRpb24uCi0JICoKLQkgKiBAcGFyYW0gbGV2ZWwgdGhlIHRyYWNlIGxldmVsCi0JICogQHBhcmFtIHMgYSBtZXNzYWdlCi0JICogQHBhcmFtIHQgYSB0aHJvd2FibGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2UoYnl0ZSBsZXZlbCwgU3RyaW5nIHMsIFRocm93YWJsZSB0KSB7Ci0JCWlmICghVG9tY2F0VUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5pc0RlYnVnZ2luZygpKQotCQkJcmV0dXJuOwotCi0JCVN5c3RlbS5vdXQucHJpbnRsbihUb21jYXRVSVBsdWdpbi5QTFVHSU5fSUQgKyAiICIgKyBzKTsKLQkJaWYgKHQgIT0gbnVsbCkKLQkJCXQucHJpbnRTdGFja1RyYWNlKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvdG9tY2F0dWkvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvdWkvaW50ZXJuYWwvZWRpdG9yL0NvbmZpZ3VyYXRpb25NaW1lRWRpdG9yU2VjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS90b21jYXR1aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC91aS9pbnRlcm5hbC9lZGl0b3IvQ29uZmlndXJhdGlvbk1pbWVFZGl0b3JTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyNWUyOTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS90b21jYXR1aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC91aS9pbnRlcm5hbC9lZGl0b3IvQ29uZmlndXJhdGlvbk1pbWVFZGl0b3JTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi2gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkuaW50ZXJuYWwuZWRpdG9yOwotCi1pbXBvcnQgamF2YS5iZWFucy4qOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmVkaXRvci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuTWltZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5Ub21jYXRDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuVG9tY2F0U2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuY29tbWFuZC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLmludGVybmFsLkNvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkuaW50ZXJuYWwuVG9tY2F0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkV4cGFuZGFibGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGVscC5JV29ya2JlbmNoSGVscFN5c3RlbTsKLS8qKgotICogVG9tY2F0IGNvbmZpZ3VyYXRpb24gbWltZSBlZGl0b3Igc2VjdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25NaW1lRWRpdG9yU2VjdGlvbiBleHRlbmRzIFNlcnZlckVkaXRvclNlY3Rpb24gewotCXByb3RlY3RlZCBUb21jYXRDb25maWd1cmF0aW9uIHRvbWNhdENvbmZpZ3VyYXRpb247Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiB1cGRhdGluZzsKLQotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyOwotCQotCXByb3RlY3RlZCBUcmVlIG1pbWVUeXBlczsKLQlwcm90ZWN0ZWQgaW50IGluZGV4ID0gLTE7Ci0JcHJvdGVjdGVkIExpc3QgbWFwcGluZ3M7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBhZGQ7Ci0JcHJvdGVjdGVkIEJ1dHRvbiByZW1vdmU7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBlZGl0OwotCi0JLyoqCi0JICogQ29uZmlndXJhdGlvbk1pbWVFZGl0b3JTZWN0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIENvbmZpZ3VyYXRpb25NaW1lRWRpdG9yU2VjdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJbGlzdGVuZXIgPSBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoVG9tY2F0Q29uZmlndXJhdGlvbi5BRERfTUFQUElOR19QUk9QRVJUWS5lcXVhbHMoZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkpKSB7Ci0JCQkJCUludGVnZXIgaW4gPSAoSW50ZWdlcikgZXZlbnQuZ2V0T2xkVmFsdWUoKTsKLQkJCQkJTWltZU1hcHBpbmcgbWFwcGluZyA9IChNaW1lTWFwcGluZykgZXZlbnQuZ2V0TmV3VmFsdWUoKTsKLQkJCQkJYWRkTWltZU1hcHBpbmcoaW4uaW50VmFsdWUoKSwgbWFwcGluZyk7Ci0JCQkJfSBlbHNlIGlmIChUb21jYXRDb25maWd1cmF0aW9uLlJFTU9WRV9NQVBQSU5HX1BST1BFUlRZLmVxdWFscyhldmVudC5nZXRQcm9wZXJ0eU5hbWUoKSkpIHsKLQkJCQkJSW50ZWdlciBpbiA9IChJbnRlZ2VyKSBldmVudC5nZXROZXdWYWx1ZSgpOwotCQkJCQlyZW1vdmVNaW1lTWFwcGluZyhpbi5pbnRWYWx1ZSgpKTsKLQkJCQl9IGVsc2UgaWYgKFRvbWNhdENvbmZpZ3VyYXRpb24uTU9ESUZZX01BUFBJTkdfUFJPUEVSVFkuZXF1YWxzKGV2ZW50LmdldFByb3BlcnR5TmFtZSgpKSkgewotCQkJCQlJbnRlZ2VyIGluID0gKEludGVnZXIpIGV2ZW50LmdldE9sZFZhbHVlKCk7Ci0JCQkJCU1pbWVNYXBwaW5nIG1hcHBpbmcgPSAoTWltZU1hcHBpbmcpIGV2ZW50LmdldE5ld1ZhbHVlKCk7Ci0JCQkJCW1vZGlmeU1pbWVNYXBwaW5nKGluLmludFZhbHVlKCksIG1hcHBpbmcpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQkJdG9tY2F0Q29uZmlndXJhdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVTZWN0aW9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJc3VwZXIuY3JlYXRlU2VjdGlvbihwYXJlbnQpOwotCQkKLQkJRm9ybVRvb2xraXQgdG9vbGtpdCA9IGdldEZvcm1Ub29sa2l0KHBhcmVudC5nZXREaXNwbGF5KCkpOwotCQkKLQkJU2VjdGlvbiBzZWN0aW9uID0gdG9vbGtpdC5jcmVhdGVTZWN0aW9uKHBhcmVudCwgRXhwYW5kYWJsZUNvbXBvc2l0ZS5UV0lTVElFIHwgRXhwYW5kYWJsZUNvbXBvc2l0ZS5USVRMRV9CQVIKLQkJCXwgU2VjdGlvbi5ERVNDUklQVElPTiB8IEV4cGFuZGFibGVDb21wb3NpdGUuRk9DVVNfVElUTEUpOwotCQlzZWN0aW9uLnNldFRleHQoTWVzc2FnZXMuY29uZmlndXJhdGlvbkVkaXRvck1pbWVNYXBwaW5nc1NlY3Rpb24pOwotCQlzZWN0aW9uLnNldERlc2NyaXB0aW9uKE1lc3NhZ2VzLmNvbmZpZ3VyYXRpb25FZGl0b3JNaW1lTWFwcGluZ3NEZXNjcmlwdGlvbik7Ci0JCXNlY3Rpb24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCkpOwotCQkKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKHNlY3Rpb24pOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDU7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDEwOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gNTsKLQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gMTU7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJSVdvcmtiZW5jaEhlbHBTeXN0ZW0gd2hzID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCk7Ci0JCXdocy5zZXRIZWxwKGNvbXBvc2l0ZSwgQ29udGV4dElkcy5DT05GSUdVUkFUSU9OX0VESVRPUl9NQVBQSU5HUyk7Ci0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKGNvbXBvc2l0ZSk7Ci0JCXNlY3Rpb24uc2V0Q2xpZW50KGNvbXBvc2l0ZSk7Ci0JCQotCQltaW1lVHlwZXMgPSB0b29sa2l0LmNyZWF0ZVRyZWUoY29tcG9zaXRlLCBTV1QuVl9TQ1JPTEwgfCBTV1QuU0lOR0xFIHwgU1dULkhfU0NST0xMKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKTsKLQkJZGF0YS53aWR0aEhpbnQgPSAyMjA7Ci0JCWRhdGEuaGVpZ2h0SGludCA9IDIwMDsKLQkJbWltZVR5cGVzLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXdocy5zZXRIZWxwKG1pbWVUeXBlcywgQ29udGV4dElkcy5DT05GSUdVUkFUSU9OX0VESVRPUl9NQVBQSU5HU19MSVNUKTsKLQkJCi0JCS8vIGFkZCBsaXN0ZW5lciB0byB0aGUgdGFibGUKLQkJbWltZVR5cGVzLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXNlbGVjdE1pbWVNYXBwaW5nKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJQ29tcG9zaXRlIGJ1dHRvbkNvbXAgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShjb21wb3NpdGUpOwotCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJYnV0dG9uQ29tcC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJYnV0dG9uQ29tcC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcgfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORykpOwotCQkKLQkJYWRkID0gdG9vbGtpdC5jcmVhdGVCdXR0b24oYnV0dG9uQ29tcCwgTWVzc2FnZXMuZWRpdG9yQWRkLCBTV1QuUFVTSCk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLQkJZGF0YS53aWR0aEhpbnQgPSA3NTsKLQkJYWRkLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQlhZGQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJTWltZU1hcHBpbmdEaWFsb2cgZGlhbG9nID0gbmV3IE1pbWVNYXBwaW5nRGlhbG9nKGdldFNoZWxsKCkpOwotCQkJCWRpYWxvZy5vcGVuKCk7Ci0JCQkJaWYgKGRpYWxvZy5nZXRSZXR1cm5Db2RlKCkgPT0gSURpYWxvZ0NvbnN0YW50cy5PS19JRCkgewotCQkJCQlleGVjdXRlKG5ldyBBZGRNaW1lTWFwcGluZ0NvbW1hbmQodG9tY2F0Q29uZmlndXJhdGlvbiwgZGlhbG9nLmdldE1pbWVNYXBwaW5nKCkpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQl3aHMuc2V0SGVscChhZGQsIENvbnRleHRJZHMuQ09ORklHVVJBVElPTl9FRElUT1JfTUFQUElOR1NfQUREKTsKLQkJCi0JCWVkaXQgPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihidXR0b25Db21wLCBNZXNzYWdlcy5lZGl0b3JFZGl0LCBTV1QuUFVTSCk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLQkJZGF0YS53aWR0aEhpbnQgPSA3NTsKLQkJZWRpdC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQllZGl0LnNldEVuYWJsZWQoZmFsc2UpOwotCQkKLQkJZWRpdC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlpZiAoaW5kZXggPCAwKQotCQkJCQlyZXR1cm47Ci0JCQkJTWltZU1hcHBpbmdEaWFsb2cgZGlhbG9nID0gbmV3IE1pbWVNYXBwaW5nRGlhbG9nKGdldFNoZWxsKCksIChNaW1lTWFwcGluZykgdG9tY2F0Q29uZmlndXJhdGlvbi5nZXRNaW1lTWFwcGluZ3MoKS5nZXQoaW5kZXgpKTsKLQkJCQlkaWFsb2cub3BlbigpOwotCQkJCWlmIChkaWFsb2cuZ2V0UmV0dXJuQ29kZSgpID09IElEaWFsb2dDb25zdGFudHMuT0tfSUQpIHsKLQkJCQkJZXhlY3V0ZShuZXcgTW9kaWZ5TWltZU1hcHBpbmdDb21tYW5kKHRvbWNhdENvbmZpZ3VyYXRpb24sIGluZGV4LCBkaWFsb2cuZ2V0TWltZU1hcHBpbmcoKSkpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCXdocy5zZXRIZWxwKGVkaXQsIENvbnRleHRJZHMuQ09ORklHVVJBVElPTl9FRElUT1JfTUFQUElOR1NfRURJVCk7Ci0JCQotCQlyZW1vdmUgPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihidXR0b25Db21wLCBNZXNzYWdlcy5lZGl0b3JSZW1vdmUsIFNXVC5QVVNIKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQlkYXRhLndpZHRoSGludCA9IDc1OwotCQlyZW1vdmUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJcmVtb3ZlLnNldEVuYWJsZWQoZmFsc2UpOwotCQkKLQkJcmVtb3ZlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWlmIChpbmRleCA8IDApCi0JCQkJCXJldHVybjsKLQkJCQlleGVjdXRlKG5ldyBSZW1vdmVNaW1lTWFwcGluZ0NvbW1hbmQodG9tY2F0Q29uZmlndXJhdGlvbiwgaW5kZXgpKTsKLQkJCQlpbmRleCA9IC0xOwotCQkJCWVkaXQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJcmVtb3ZlLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJfQotCQl9KTsKLQkJd2hzLnNldEhlbHAocmVtb3ZlLCBDb250ZXh0SWRzLkNPTkZJR1VSQVRJT05fRURJVE9SX01BUFBJTkdTX1JFTU9WRSk7Ci0JCQotCQlpbml0aWFsaXplKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmICh0b21jYXRDb25maWd1cmF0aW9uICE9IG51bGwpCi0JCQl0b21jYXRDb25maWd1cmF0aW9uLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQkKLQkJVG9tY2F0U2VydmVyIHRzID0gKFRvbWNhdFNlcnZlcikgc2VydmVyLmdldEFkYXB0ZXIoVG9tY2F0U2VydmVyLmNsYXNzKTsKLQkJdHJ5IHsKLQkJCXRvbWNhdENvbmZpZ3VyYXRpb24gPSB0cy5nZXRUb21jYXRDb25maWd1cmF0aW9uKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQlhZGRDaGFuZ2VMaXN0ZW5lcigpOwotCQlpbml0aWFsaXplKCk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZSB0aGUgZmllbGRzIGluIHRoaXMgZWRpdG9yLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCWlmIChtaW1lVHlwZXMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQltaW1lVHlwZXMucmVtb3ZlQWxsKCk7Ci0JCQotCQltYXBwaW5ncyA9IHRvbWNhdENvbmZpZ3VyYXRpb24uZ2V0TWltZU1hcHBpbmdzKCk7Ci0JCQotCQkvLyBzb3J0IG1hcHBpbmdzCi0JCWludCBzaXplID0gbWFwcGluZ3Muc2l6ZSgpOwotCQlpbnRbXSBtYXAgPSBuZXcgaW50W3NpemVdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLQkJCW1hcFtpXSA9IGk7Ci0JCQotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemUgLSAxOyBpKyspIHsKLQkJCWZvciAoaW50IGogPSBpICsgMTsgaiA8IHNpemU7IGorKykgewotCQkJCU1pbWVNYXBwaW5nIG1hcHBpbmdBID0gKE1pbWVNYXBwaW5nKSBtYXBwaW5ncy5nZXQobWFwW2ldKTsKLQkJCQlNaW1lTWFwcGluZyBtYXBwaW5nQiA9IChNaW1lTWFwcGluZykgbWFwcGluZ3MuZ2V0KG1hcFtqXSk7Ci0JCQkJaWYgKG1hcHBpbmdBLmdldE1pbWVUeXBlKCkuY29tcGFyZVRvKG1hcHBpbmdCLmdldE1pbWVUeXBlKCkpID4gMCB8fAotCQkJCQkJKChtYXBwaW5nQS5nZXRNaW1lVHlwZSgpLmVxdWFscyhtYXBwaW5nQi5nZXRNaW1lVHlwZSgpKSkgJiYKLQkJCQkJCQkJbWFwcGluZ0EuZ2V0RXh0ZW5zaW9uKCkuY29tcGFyZVRvKG1hcHBpbmdCLmdldEV4dGVuc2lvbigpKSA+IDApKSB7Ci0JCQkJCWludCB0ZW1wID0gbWFwW2ldOwotCQkJCQltYXBbaV0gPSBtYXBbal07Ci0JCQkJCW1hcFtqXSA9IHRlbXA7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQkvLyBkaXNwbGF5IHRoZW0KLQkJTWFwIGhhc2ggPSBuZXcgSGFzaE1hcCgpOwotCQkKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCU1pbWVNYXBwaW5nIG1hcHBpbmcgPSAoTWltZU1hcHBpbmcpIG1hcHBpbmdzLmdldChtYXBbaV0pOwotCQkJLy8gZ2V0IHBhcmVudCBub2RlCi0JCQlUcmVlSXRlbSBwYXJlbnQgPSAoVHJlZUl0ZW0pIGhhc2guZ2V0KG1hcHBpbmcuZ2V0TWltZVR5cGUoKSk7Ci0JCQlpZiAocGFyZW50ID09IG51bGwpIHsKLQkJCQlwYXJlbnQgPSBuZXcgVHJlZUl0ZW0obWltZVR5cGVzLCBTV1QuTk9ORSk7Ci0JCQkJcGFyZW50LnNldFRleHQobWFwcGluZy5nZXRNaW1lVHlwZSgpKTsKLQkJCQlwYXJlbnQuc2V0SW1hZ2UoVG9tY2F0VUlQbHVnaW4uZ2V0SW1hZ2UoVG9tY2F0VUlQbHVnaW4uSU1HX01JTUVfTUFQUElORykpOwotCQkJCWhhc2gucHV0KG1hcHBpbmcuZ2V0TWltZVR5cGUoKSwgcGFyZW50KTsKLQkJCX0KLQkJCQotCQkJLy8gYWRkIG5vZGUKLQkJCVRyZWVJdGVtIGl0ZW0gPSBuZXcgVHJlZUl0ZW0ocGFyZW50LCBTV1QuTk9ORSk7Ci0JCQlpdGVtLnNldFRleHQobWFwcGluZy5nZXRFeHRlbnNpb24oKSk7Ci0JCQlpdGVtLnNldEltYWdlKFRvbWNhdFVJUGx1Z2luLmdldEltYWdlKFRvbWNhdFVJUGx1Z2luLklNR19NSU1FX0VYVEVOU0lPTikpOwotCQkJaXRlbS5zZXREYXRhKG5ldyBJbnRlZ2VyKG1hcFtpXSkpOwotCQl9Ci0JCQotCQlpZiAocmVhZE9ubHkpIHsKLQkJCWFkZC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWVkaXQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlyZW1vdmUuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCX0gZWxzZSB7Ci0JCQlhZGQuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCXNlbGVjdE1pbWVNYXBwaW5nKCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQWRkIGEgbWltZSBtYXBwaW5nLgotCSAqIAotCSAqIEBwYXJhbSBpbmRleDIKLQkgKiBAcGFyYW0gbWFwCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTWltZU1hcHBpbmcoaW50IGluZGV4MiwgTWltZU1hcHBpbmcgbWFwKSB7Ci0JCW1hcHBpbmdzLmFkZChpbmRleDIsIG1hcCk7Ci0JCQotCQkvLyBjb3JyZWN0IGFsbCBpbmRleCBudW1iZXJzCi0JCWludCBzaXplID0gbWltZVR5cGVzLmdldEl0ZW1Db3VudCgpOwotCQlUcmVlSXRlbVtdIHBhcmVudHMgPSBtaW1lVHlwZXMuZ2V0SXRlbXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCVRyZWVJdGVtIHBhcmVudCA9IHBhcmVudHNbaV07Ci0JCQkKLQkJCWludCBzaXplMiA9IHBhcmVudC5nZXRJdGVtQ291bnQoKTsKLQkJCVRyZWVJdGVtW10gY2hpbGRyZW4gPSBwYXJlbnQuZ2V0SXRlbXMoKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgc2l6ZTI7IGorKykgewotCQkJCUludGVnZXIgaW4gPSAoSW50ZWdlcikgY2hpbGRyZW5bal0uZ2V0RGF0YSgpOwotCQkJCWlmIChpbi5pbnRWYWx1ZSgpID49IGluZGV4MikKLQkJCQkJY2hpbGRyZW5bal0uc2V0RGF0YShuZXcgSW50ZWdlcihpbi5pbnRWYWx1ZSgpICsgMSkpOwotCQkJfQotCQl9Ci0JCQotCQkvLyBjaGVjayBpZiB0aGVyZSBpcyBhIHBhcmVudC4gSWYgc28sIGp1c3QgYWRkIGEgbmV3IGNoaWxkCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlUcmVlSXRlbSBwYXJlbnQgPSBwYXJlbnRzW2ldOwotCQkJaWYgKHBhcmVudC5nZXRUZXh0KCkuZXF1YWxzKG1hcC5nZXRNaW1lVHlwZSgpKSkgewotCQkJCVRyZWVJdGVtIGl0ZW0gPSBuZXcgVHJlZUl0ZW0ocGFyZW50LCBTV1QuTk9ORSk7Ci0JCQkJaXRlbS5zZXRUZXh0KG1hcC5nZXRFeHRlbnNpb24oKSk7Ci0JCQkJaXRlbS5zZXRJbWFnZShUb21jYXRVSVBsdWdpbi5nZXRJbWFnZShUb21jYXRVSVBsdWdpbi5JTUdfTUlNRV9FWFRFTlNJT04pKTsKLQkJCQlpdGVtLnNldERhdGEobmV3IEludGVnZXIoaW5kZXgyKSk7Ci0JCQkJbWltZVR5cGVzLnNob3dJdGVtKGl0ZW0pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQkKLQkJLy8gaWYgbm90LCBhZGQgYSBuZXcgcGFyZW50IGFuZCBjaGlsZCB0byB0aGUgZW5kCi0JCVRyZWVJdGVtIHBhcmVudCA9IG5ldyBUcmVlSXRlbShtaW1lVHlwZXMsIFNXVC5OT05FKTsKLQkJcGFyZW50LnNldFRleHQobWFwLmdldE1pbWVUeXBlKCkpOwotCQlwYXJlbnQuc2V0SW1hZ2UoVG9tY2F0VUlQbHVnaW4uZ2V0SW1hZ2UoVG9tY2F0VUlQbHVnaW4uSU1HX01JTUVfTUFQUElORykpOwotCQkKLQkJVHJlZUl0ZW0gaXRlbSA9IG5ldyBUcmVlSXRlbShwYXJlbnQsIFNXVC5OT05FKTsKLQkJaXRlbS5zZXRUZXh0KG1hcC5nZXRFeHRlbnNpb24oKSk7Ci0JCWl0ZW0uc2V0SW1hZ2UoVG9tY2F0VUlQbHVnaW4uZ2V0SW1hZ2UoVG9tY2F0VUlQbHVnaW4uSU1HX01JTUVfRVhURU5TSU9OKSk7Ci0JCWl0ZW0uc2V0RGF0YShuZXcgSW50ZWdlcihpbmRleDIpKTsKLQkJbWltZVR5cGVzLnNob3dJdGVtKGl0ZW0pOwotCX0KLQkKLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gaW5kZXgyCi0JICogQHBhcmFtIG1hcAotCSAqLwotCXByb3RlY3RlZCB2b2lkIG1vZGlmeU1pbWVNYXBwaW5nKGludCBpbmRleDIsIE1pbWVNYXBwaW5nIG1hcCkgewotCQlNaW1lTWFwcGluZyBvbGRNYXAgPSAoTWltZU1hcHBpbmcpIG1hcHBpbmdzLmdldChpbmRleDIpOwotCQltYXBwaW5ncy5zZXQoaW5kZXgyLCBtYXApOwotCQkKLQkJaW50IHNpemUgPSBtaW1lVHlwZXMuZ2V0SXRlbUNvdW50KCk7Ci0JCVRyZWVJdGVtW10gcGFyZW50cyA9IG1pbWVUeXBlcy5nZXRJdGVtcygpOwotCQkKLQkJaWYgKG9sZE1hcC5nZXRNaW1lVHlwZSgpLmVxdWFscyhtYXAuZ2V0TWltZVR5cGUoKSkpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJVHJlZUl0ZW0gcGFyZW50ID0gcGFyZW50c1tpXTsKLQkJCQkKLQkJCQlpZiAocGFyZW50LmdldFRleHQoKS5lcXVhbHMobWFwLmdldE1pbWVUeXBlKCkpKSB7Ci0JCQkJCWludCBzaXplMiA9IHBhcmVudC5nZXRJdGVtQ291bnQoKTsKLQkJCQkJVHJlZUl0ZW1bXSBjaGlsZHJlbiA9IHBhcmVudC5nZXRJdGVtcygpOwotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHNpemUyOyBqKyspIHsKLQkJCQkJCUludGVnZXIgaW4gPSAoSW50ZWdlcikgY2hpbGRyZW5bal0uZ2V0RGF0YSgpOwotCQkJCQkJaWYgKGluLmludFZhbHVlKCkgPT0gaW5kZXgyKSB7Ci0JCQkJCQkJY2hpbGRyZW5bal0uc2V0VGV4dChtYXAuZ2V0RXh0ZW5zaW9uKCkpOwotCQkJCQkJCWNoaWxkcmVuW2pdLnNldERhdGEobmV3IEludGVnZXIoaW5kZXgyKSk7Ci0JCQkJCQkJbWltZVR5cGVzLnNob3dJdGVtKGNoaWxkcmVuW2pdKTsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCS8vIG90aGVyd2lzZSwgbGV0J3MgdHJ5IGEgcmVtb3ZlIGFuZCBhbiBhZGQKLQkJcmVtb3ZlTWltZU1hcHBpbmcoaW5kZXgyKTsKLQkJYWRkTWltZU1hcHBpbmcoaW5kZXgyLCBtYXApOwotCX0KLQkKLQkvKioKLQkgKiBSZW1vdmUgdGhlIG1pbWUgbWFwcGluZyBhdCB0aGUgZ2l2ZW4gaW5kZXguCi0JICogCi0JICogQHBhcmFtIGluZGV4MgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZU1pbWVNYXBwaW5nKGludCBpbmRleDIpIHsKLQkJbWFwcGluZ3MucmVtb3ZlKGluZGV4Mik7Ci0JCQotCQkvLyByZW1vdmUgaXRlbQotCQlpbnQgc2l6ZSA9IG1pbWVUeXBlcy5nZXRJdGVtQ291bnQoKTsKLQkJVHJlZUl0ZW1bXSBwYXJlbnRzID0gbWltZVR5cGVzLmdldEl0ZW1zKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlUcmVlSXRlbSBwYXJlbnQgPSBwYXJlbnRzW2ldOwotCQkJCi0JCQlpbnQgc2l6ZTIgPSBwYXJlbnQuZ2V0SXRlbUNvdW50KCk7Ci0JCQlUcmVlSXRlbVtdIGNoaWxkcmVuID0gcGFyZW50LmdldEl0ZW1zKCk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IHNpemUyOyBqKyspIHsKLQkJCQlJbnRlZ2VyIGluID0gKEludGVnZXIpIGNoaWxkcmVuW2pdLmdldERhdGEoKTsKLQkJCQlpZiAoaW4uaW50VmFsdWUoKSA9PSBpbmRleDIpIHsKLQkJCQkJY2hpbGRyZW5bal0uZGlzcG9zZSgpOwotCQkJCQlpZiAoc2l6ZTIgPT0gMSkKLQkJCQkJCXBhcmVudC5kaXNwb3NlKCk7Ci0JCQkJCWkgKz0gc2l6ZTsKLQkJCQkJaiArPSBzaXplMjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIGNvcnJlY3QgYWxsIGluZGV4IG51bWJlcnMKLQkJc2l6ZSA9IG1pbWVUeXBlcy5nZXRJdGVtQ291bnQoKTsKLQkJcGFyZW50cyA9IG1pbWVUeXBlcy5nZXRJdGVtcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJVHJlZUl0ZW0gcGFyZW50ID0gcGFyZW50c1tpXTsKLQkJCQotCQkJaW50IHNpemUyID0gcGFyZW50LmdldEl0ZW1Db3VudCgpOwotCQkJVHJlZUl0ZW1bXSBjaGlsZHJlbiA9IHBhcmVudC5nZXRJdGVtcygpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBzaXplMjsgaisrKSB7Ci0JCQkJSW50ZWdlciBpbiA9IChJbnRlZ2VyKSBjaGlsZHJlbltqXS5nZXREYXRhKCk7Ci0JCQkJaWYgKGluLmludFZhbHVlKCkgPiBpbmRleDIpCi0JCQkJCWNoaWxkcmVuW2pdLnNldERhdGEobmV3IEludGVnZXIoaW4uaW50VmFsdWUoKSAtIDEpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNlbGVjdE1pbWVNYXBwaW5nKCkgewotCQlpZiAocmVhZE9ubHkpCi0JCQlyZXR1cm47Ci0KLQkJdHJ5IHsKLQkJCVRyZWVJdGVtIGl0ZW0gPSBtaW1lVHlwZXMuZ2V0U2VsZWN0aW9uKClbMF07Ci0JCQlJbnRlZ2VyIGluID0gKEludGVnZXIpIGl0ZW0uZ2V0RGF0YSgpOwotCQkJaWYgKGluID09IG51bGwpIHsKLQkJCQlpbmRleCA9IC0xOwotCQkJCXJlbW92ZS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQllZGl0LnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCWluZGV4ID0gaW4uaW50VmFsdWUoKTsKLQkJCQotCQkJcmVtb3ZlLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQllZGl0LnNldEVuYWJsZWQodHJ1ZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlpbmRleCA9IC0xOwotCQkJcmVtb3ZlLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJZWRpdC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpL3RvbWNhdHVpL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L3VpL2ludGVybmFsL2VkaXRvci9Db25maWd1cmF0aW9uUG9ydEVkaXRvclNlY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvdG9tY2F0dWkvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvdWkvaW50ZXJuYWwvZWRpdG9yL0NvbmZpZ3VyYXRpb25Qb3J0RWRpdG9yU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2JmY2IxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvdG9tY2F0dWkvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvdWkvaW50ZXJuYWwvZWRpdG9yL0NvbmZpZ3VyYXRpb25Qb3J0RWRpdG9yU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotoCoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IGphdmEuYmVhbnMuKjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyUG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmVkaXRvci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuVG9tY2F0Q29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLlRvbWNhdFNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLmNvbW1hbmQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS5pbnRlcm5hbC5Db250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLmludGVybmFsLlRvbWNhdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5FeHBhbmRhYmxlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRvb2xraXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuSVdvcmtiZW5jaEhlbHBTeXN0ZW07Ci0vKioKLSAqIFRvbWNhdCBjb25maWd1cmF0aW9uIHBvcnQgZWRpdG9yIHBhZ2UuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uUG9ydEVkaXRvclNlY3Rpb24gZXh0ZW5kcyBTZXJ2ZXJFZGl0b3JTZWN0aW9uIHsKLQlwcm90ZWN0ZWQgVG9tY2F0Q29uZmlndXJhdGlvbiB0b21jYXRDb25maWd1cmF0aW9uOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gdXBkYXRpbmc7Ci0KLQlwcm90ZWN0ZWQgVGFibGUgcG9ydHM7Ci0JcHJvdGVjdGVkIFRhYmxlVmlld2VyIHZpZXdlcjsKLQotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyOwotCi0JLyoqCi0JICogQ29uZmlndXJhdGlvblBvcnRFZGl0b3JTZWN0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIENvbmZpZ3VyYXRpb25Qb3J0RWRpdG9yU2VjdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJbGlzdGVuZXIgPSBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoVG9tY2F0Q29uZmlndXJhdGlvbi5NT0RJRllfUE9SVF9QUk9QRVJUWS5lcXVhbHMoZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkpKSB7Ci0JCQkJCVN0cmluZyBpZCA9IChTdHJpbmcpIGV2ZW50LmdldE9sZFZhbHVlKCk7Ci0JCQkJCUludGVnZXIgaSA9IChJbnRlZ2VyKSBldmVudC5nZXROZXdWYWx1ZSgpOwotCQkJCQljaGFuZ2VQb3J0TnVtYmVyKGlkLCBpLmludFZhbHVlKCkpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQkJdG9tY2F0Q29uZmlndXJhdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0JCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGlkIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gcG9ydCBpbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjaGFuZ2VQb3J0TnVtYmVyKFN0cmluZyBpZCwgaW50IHBvcnQpIHsKLQkJVGFibGVJdGVtW10gaXRlbXMgPSBwb3J0cy5nZXRJdGVtcygpOwotCQlpbnQgc2l6ZSA9IGl0ZW1zLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCVNlcnZlclBvcnQgc3AgPSAoU2VydmVyUG9ydCkgaXRlbXNbaV0uZ2V0RGF0YSgpOwotCQkJaWYgKHNwLmdldElkKCkuZXF1YWxzKGlkKSkgewotCQkJCWl0ZW1zW2ldLnNldERhdGEobmV3IFNlcnZlclBvcnQoaWQsIHNwLmdldE5hbWUoKSwgcG9ydCwgc3AuZ2V0UHJvdG9jb2woKSkpOwotCQkJCWl0ZW1zW2ldLnNldFRleHQoMSwgcG9ydCArICIiKTsKLQkJCQkvKmlmIChpID09IHNlbGVjdGlvbikgewotCQkJCQlzZWxlY3RQb3J0KCk7Ci0JCQkJfSovCi0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFNXVCBjb250cm9scyBmb3IgdGhpcyB3b3JrYmVuY2ggcGFydC4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjb250cm9sCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlU2VjdGlvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXN1cGVyLmNyZWF0ZVNlY3Rpb24ocGFyZW50KTsKLQkJRm9ybVRvb2xraXQgdG9vbGtpdCA9IGdldEZvcm1Ub29sa2l0KHBhcmVudC5nZXREaXNwbGF5KCkpOwotCQkKLQkJU2VjdGlvbiBzZWN0aW9uID0gdG9vbGtpdC5jcmVhdGVTZWN0aW9uKHBhcmVudCwgRXhwYW5kYWJsZUNvbXBvc2l0ZS5UV0lTVElFIHwgRXhwYW5kYWJsZUNvbXBvc2l0ZS5FWFBBTkRFRAotCQkJfCBFeHBhbmRhYmxlQ29tcG9zaXRlLlRJVExFX0JBUiB8IFNlY3Rpb24uREVTQ1JJUFRJT04gfCBFeHBhbmRhYmxlQ29tcG9zaXRlLkZPQ1VTX1RJVExFKTsKLQkJc2VjdGlvbi5zZXRUZXh0KE1lc3NhZ2VzLmNvbmZpZ3VyYXRpb25FZGl0b3JQb3J0c1NlY3Rpb24pOwotCQlzZWN0aW9uLnNldERlc2NyaXB0aW9uKE1lc3NhZ2VzLmNvbmZpZ3VyYXRpb25FZGl0b3JQb3J0c0Rlc2NyaXB0aW9uKTsKLQkJc2VjdGlvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKSk7Ci0JCQotCQkvLyBwb3J0cwotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUoc2VjdGlvbik7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDg7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDg7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJSVdvcmtiZW5jaEhlbHBTeXN0ZW0gd2hzID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCk7Ci0JCXdocy5zZXRIZWxwKGNvbXBvc2l0ZSwgQ29udGV4dElkcy5DT05GSUdVUkFUSU9OX0VESVRPUl9QT1JUUyk7Ci0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKGNvbXBvc2l0ZSk7Ci0JCXNlY3Rpb24uc2V0Q2xpZW50KGNvbXBvc2l0ZSk7Ci0KLQkJcG9ydHMgPSB0b29sa2l0LmNyZWF0ZVRhYmxlKGNvbXBvc2l0ZSwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMIHwgU1dULkZVTExfU0VMRUNUSU9OKTsKLQkJcG9ydHMuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQkJcG9ydHMuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCQl3aHMuc2V0SGVscChwb3J0cywgQ29udGV4dElkcy5DT05GSUdVUkFUSU9OX0VESVRPUl9QT1JUU19MSVNUKTsKLQkJCi0JCVRhYmxlTGF5b3V0IHRhYmxlTGF5b3V0ID0gbmV3IFRhYmxlTGF5b3V0KCk7Ci0JCi0JCVRhYmxlQ29sdW1uIGNvbCA9IG5ldyBUYWJsZUNvbHVtbihwb3J0cywgU1dULk5PTkUpOwotCQljb2wuc2V0VGV4dChNZXNzYWdlcy5jb25maWd1cmF0aW9uRWRpdG9yUG9ydE5hbWVDb2x1bW4pOwotCQlDb2x1bW5XZWlnaHREYXRhIGNvbERhdGEgPSBuZXcgQ29sdW1uV2VpZ2h0RGF0YSgxNSwgMTUwLCB0cnVlKTsKLQkJdGFibGVMYXlvdXQuYWRkQ29sdW1uRGF0YShjb2xEYXRhKTsKLQotCQljb2wgPSBuZXcgVGFibGVDb2x1bW4ocG9ydHMsIFNXVC5OT05FKTsKLQkJY29sLnNldFRleHQoTWVzc2FnZXMuY29uZmlndXJhdGlvbkVkaXRvclBvcnRWYWx1ZUNvbHVtbik7Ci0JCWNvbERhdGEgPSBuZXcgQ29sdW1uV2VpZ2h0RGF0YSg4LCA4MCwgdHJ1ZSk7Ci0JCXRhYmxlTGF5b3V0LmFkZENvbHVtbkRhdGEoY29sRGF0YSk7Ci0KLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKTsKLQkJZGF0YS53aWR0aEhpbnQgPSAyMzA7Ci0JCWRhdGEuaGVpZ2h0SGludCA9IDEwMDsKLQkJcG9ydHMuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJcG9ydHMuc2V0TGF5b3V0KHRhYmxlTGF5b3V0KTsKLQkKLQkJdmlld2VyID0gbmV3IFRhYmxlVmlld2VyKHBvcnRzKTsKLQkJdmlld2VyLnNldENvbHVtblByb3BlcnRpZXMobmV3IFN0cmluZ1tdIHsibmFtZSIsICJwb3J0In0pOwotCi0JCWluaXRpYWxpemUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXR1cFBvcnRFZGl0b3JzKCkgewotCQl2aWV3ZXIuc2V0Q2VsbEVkaXRvcnMobmV3IENlbGxFZGl0b3JbXSB7bnVsbCwgbmV3IFRleHRDZWxsRWRpdG9yKHBvcnRzKX0pOwotCQotCQlJQ2VsbE1vZGlmaWVyIGNlbGxNb2RpZmllciA9IG5ldyBJQ2VsbE1vZGlmaWVyKCkgewotCQkJcHVibGljIE9iamVjdCBnZXRWYWx1ZShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCQkJU2VydmVyUG9ydCBzcCA9IChTZXJ2ZXJQb3J0KSBlbGVtZW50OwotCQkJCWlmIChzcC5nZXRQb3J0KCkgPCAwKQotCQkJCQlyZXR1cm4gIi0iOwotCQkJCXJldHVybiBzcC5nZXRQb3J0KCkgKyAiIjsKLQkJCX0KLQkKLQkJCXB1YmxpYyBib29sZWFuIGNhbk1vZGlmeShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCQkJaWYgKCJwb3J0Ii5lcXVhbHMocHJvcGVydHkpKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCi0JCQlwdWJsaWMgdm9pZCBtb2RpZnkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSwgT2JqZWN0IHZhbHVlKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJSXRlbSBpdGVtID0gKEl0ZW0pIGVsZW1lbnQ7Ci0JCQkJCVNlcnZlclBvcnQgc3AgPSAoU2VydmVyUG9ydCkgaXRlbS5nZXREYXRhKCk7Ci0JCQkJCWludCBwb3J0ID0gSW50ZWdlci5wYXJzZUludCgoU3RyaW5nKSB2YWx1ZSk7Ci0JCQkJCWV4ZWN1dGUobmV3IE1vZGlmeVBvcnRDb21tYW5kKHRvbWNhdENvbmZpZ3VyYXRpb24sIHNwLmdldElkKCksIHBvcnQpKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkJLy8gaWdub3JlCi0JCQkJfQotCQkJfQotCQl9OwotCQl2aWV3ZXIuc2V0Q2VsbE1vZGlmaWVyKGNlbGxNb2RpZmllcik7Ci0JCQotCQkvLyBwcmVzZWxlY3Qgc2Vjb25kIGNvbHVtbiAoV2luZG93cy1vbmx5KQotCQlTdHJpbmcgb3MgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLm5hbWUiKTsKLQkJaWYgKG9zICE9IG51bGwgJiYgb3MudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJ3aW4iKSA+PSAwKSB7Ci0JCQlwb3J0cy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCQl0cnkgewotCQkJCQkJaW50IG4gPSBwb3J0cy5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQkJCQkJdmlld2VyLmVkaXRFbGVtZW50KHBvcnRzLmdldEl0ZW0obikuZ2V0RGF0YSgpLCAxKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIGlnbm9yZQotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKHRvbWNhdENvbmZpZ3VyYXRpb24gIT0gbnVsbCkKLQkJCXRvbWNhdENvbmZpZ3VyYXRpb24ucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBJbml0aWFsaXplcyB0aGUgZWRpdG9yIHBhcnQgd2l0aCBhIHNpdGUgYW5kIGlucHV0LgotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQkKLQkJVG9tY2F0U2VydmVyIHRzID0gKFRvbWNhdFNlcnZlcikgc2VydmVyLmdldEFkYXB0ZXIoVG9tY2F0U2VydmVyLmNsYXNzKTsKLQkJdHJ5IHsKLQkJCXRvbWNhdENvbmZpZ3VyYXRpb24gPSB0cy5nZXRUb21jYXRDb25maWd1cmF0aW9uKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQlhZGRDaGFuZ2VMaXN0ZW5lcigpOwotCQlpbml0aWFsaXplKCk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZSB0aGUgZmllbGRzIGluIHRoaXMgZWRpdG9yLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCWlmIChwb3J0cyA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCXBvcnRzLnJlbW92ZUFsbCgpOwotCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gdG9tY2F0Q29uZmlndXJhdGlvbi5nZXRTZXJ2ZXJQb3J0cygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVNlcnZlclBvcnQgcG9ydCA9IChTZXJ2ZXJQb3J0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0ocG9ydHMsIFNXVC5OT05FKTsKLQkJCVN0cmluZyBwb3J0U3RyID0gIi0iOwotCQkJaWYgKHBvcnQuZ2V0UG9ydCgpID49IDApCi0JCQkJcG9ydFN0ciA9IHBvcnQuZ2V0UG9ydCgpICsgIiI7IAotCQkJU3RyaW5nW10gcyA9IG5ldyBTdHJpbmdbXSB7cG9ydC5nZXROYW1lKCksIHBvcnRTdHJ9OwotCQkJaXRlbS5zZXRUZXh0KHMpOwotCQkJaXRlbS5zZXRJbWFnZShUb21jYXRVSVBsdWdpbi5nZXRJbWFnZShUb21jYXRVSVBsdWdpbi5JTUdfUE9SVCkpOwotCQkJaXRlbS5zZXREYXRhKHBvcnQpOwotCQl9Ci0JCQotCQlpZiAocmVhZE9ubHkpIHsKLQkJCXZpZXdlci5zZXRDZWxsRWRpdG9ycyhuZXcgQ2VsbEVkaXRvcltdIHtudWxsLCBudWxsfSk7Ci0JCQl2aWV3ZXIuc2V0Q2VsbE1vZGlmaWVyKG51bGwpOwotCQl9IGVsc2UgewotCQkJc2V0dXBQb3J0RWRpdG9ycygpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvdG9tY2F0dWkvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvdWkvaW50ZXJuYWwvZWRpdG9yL0NvbmZpZ3VyYXRpb25XZWJNb2R1bGVFZGl0b3JQYXJ0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpL3RvbWNhdHVpL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdG9tY2F0L3VpL2ludGVybmFsL2VkaXRvci9Db25maWd1cmF0aW9uV2ViTW9kdWxlRWRpdG9yUGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODY3ZTliLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvdG9tY2F0dWkvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvdWkvaW50ZXJuYWwvZWRpdG9yL0NvbmZpZ3VyYXRpb25XZWJNb2R1bGVFZGl0b3JQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLWltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uV2VpZ2h0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5JV2ViTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuSVRvbWNhdFNlcnZlcldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuVG9tY2F0Q29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLlRvbWNhdFNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLldlYk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLmNvbW1hbmQuQWRkTW9kdWxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLmNvbW1hbmQuQWRkV2ViTW9kdWxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLmNvbW1hbmQuTW9kaWZ5V2ViTW9kdWxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLmNvbW1hbmQuUmVtb3ZlTW9kdWxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLmNvbW1hbmQuUmVtb3ZlV2ViTW9kdWxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS5pbnRlcm5hbC5Db250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLmludGVybmFsLlRvbWNhdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5FeHBhbmRhYmxlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRvb2xraXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TY3JvbGxlZEZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuSVdvcmtiZW5jaEhlbHBTeXN0ZW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLlNlcnZlclVJQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmVkaXRvci5TZXJ2ZXJFZGl0b3JQYXJ0OwotLyoqCi0gKiBUb21jYXQgY29uZmlndXJhdGlvbiB3ZWIgbW9kdWxlIGVkaXRvciBwYWdlLgotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvbldlYk1vZHVsZUVkaXRvclBhcnQgZXh0ZW5kcyBTZXJ2ZXJFZGl0b3JQYXJ0IHsKLQlwcm90ZWN0ZWQgSVRvbWNhdFNlcnZlcldvcmtpbmdDb3B5IHNlcnZlcjI7Ci0JcHJvdGVjdGVkIFRvbWNhdENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbjsKLQotCXByb3RlY3RlZCBUYWJsZSB3ZWJBcHBUYWJsZTsKLQlwcm90ZWN0ZWQgaW50IHNlbGVjdGlvbiA9IC0xOwotCXByb3RlY3RlZCBCdXR0b24gYWRkUHJvamVjdDsKLQlwcm90ZWN0ZWQgQnV0dG9uIGFkZEV4dFByb2plY3Q7Ci0JcHJvdGVjdGVkIEJ1dHRvbiByZW1vdmU7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBlZGl0OwotCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBDb25maWd1cmF0aW9uV2ViTW9kdWxlRWRpdG9yUGFydCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uV2ViTW9kdWxlRWRpdG9yUGFydCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJbGlzdGVuZXIgPSBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoVG9tY2F0Q29uZmlndXJhdGlvbi5NT0RJRllfV0VCX01PRFVMRV9QUk9QRVJUWS5lcXVhbHMoZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkpKSB7Ci0JCQkJCWluaXRpYWxpemUoKTsKLQkJCQl9IGVsc2UgaWYgKFRvbWNhdENvbmZpZ3VyYXRpb24uQUREX1dFQl9NT0RVTEVfUFJPUEVSVFkuZXF1YWxzKGV2ZW50LmdldFByb3BlcnR5TmFtZSgpKSkgewotCQkJCQlpbml0aWFsaXplKCk7Ci0JCQkJfSBlbHNlIGlmIChUb21jYXRDb25maWd1cmF0aW9uLlJFTU9WRV9XRUJfTU9EVUxFX1BST1BFUlRZLmVxdWFscyhldmVudC5nZXRQcm9wZXJ0eU5hbWUoKSkpIHsKLQkJCQkJaW5pdGlhbGl6ZSgpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQkJY29uZmlndXJhdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuV29ya2JlbmNoUGFydCNjcmVhdGVQYXJ0Q29udHJvbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlGb3JtVG9vbGtpdCB0b29sa2l0ID0gZ2V0Rm9ybVRvb2xraXQocGFyZW50LmdldERpc3BsYXkoKSk7Ci0KLQkJU2Nyb2xsZWRGb3JtIGZvcm0gPSB0b29sa2l0LmNyZWF0ZVNjcm9sbGVkRm9ybShwYXJlbnQpOwotCQlmb3JtLnNldFRleHQoTWVzc2FnZXMuY29uZmlndXJhdGlvbkVkaXRvcldlYk1vZHVsZXNQYWdlVGl0bGUpOwotCQlmb3JtLmdldEJvZHkoKS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCi0JCVNlY3Rpb24gc2VjdGlvbiA9IHRvb2xraXQuY3JlYXRlU2VjdGlvbihmb3JtLmdldEJvZHkoKSwgRXhwYW5kYWJsZUNvbXBvc2l0ZS5UV0lTVElFIHwgRXhwYW5kYWJsZUNvbXBvc2l0ZS5FWFBBTkRFRAotCQkJfCBFeHBhbmRhYmxlQ29tcG9zaXRlLlRJVExFX0JBUiB8IFNlY3Rpb24uREVTQ1JJUFRJT04gfCBFeHBhbmRhYmxlQ29tcG9zaXRlLkZPQ1VTX1RJVExFKTsKLQkJc2VjdGlvbi5zZXRUZXh0KE1lc3NhZ2VzLmNvbmZpZ3VyYXRpb25FZGl0b3JXZWJNb2R1bGVzU2VjdGlvbik7Ci0JCXNlY3Rpb24uc2V0RGVzY3JpcHRpb24oTWVzc2FnZXMuY29uZmlndXJhdGlvbkVkaXRvcldlYk1vZHVsZXNEZXNjcmlwdGlvbik7Ci0JCXNlY3Rpb24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKHNlY3Rpb24pOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDU7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDEwOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gNTsKLQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gMTU7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQlJV29ya2JlbmNoSGVscFN5c3RlbSB3aHMgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKTsKLQkJd2hzLnNldEhlbHAoY29tcG9zaXRlLCBDb250ZXh0SWRzLkNPTkZJR1VSQVRJT05fRURJVE9SX1dFQk1PRFVMRVMpOwotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0Zvcihjb21wb3NpdGUpOwotCQlzZWN0aW9uLnNldENsaWVudChjb21wb3NpdGUpOwotCQkKLQkJd2ViQXBwVGFibGUgPSB0b29sa2l0LmNyZWF0ZVRhYmxlKGNvbXBvc2l0ZSwgU1dULlZfU0NST0xMIHwgU1dULlNJTkdMRSB8IFNXVC5GVUxMX1NFTEVDVElPTik7Ci0JCXdlYkFwcFRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JCXdlYkFwcFRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQkJd2hzLnNldEhlbHAod2ViQXBwVGFibGUsIENvbnRleHRJZHMuQ09ORklHVVJBVElPTl9FRElUT1JfV0VCTU9EVUxFU19MSVNUKTsKLQkJLy90b29sa2l0LnBhaW50Qm9yZGVyc0Zvcih3ZWJBcHBUYWJsZSk7Ci0JCQotCQlUYWJsZUxheW91dCB0YWJsZUxheW91dCA9IG5ldyBUYWJsZUxheW91dCgpOwotCQotCQlUYWJsZUNvbHVtbiBjb2wgPSBuZXcgVGFibGVDb2x1bW4od2ViQXBwVGFibGUsIFNXVC5OT05FKTsKLQkJY29sLnNldFRleHQoTWVzc2FnZXMuY29uZmlndXJhdGlvbkVkaXRvclBhdGhDb2x1bW4pOwotCQlDb2x1bW5XZWlnaHREYXRhIGNvbERhdGEgPSBuZXcgQ29sdW1uV2VpZ2h0RGF0YSg4LCA4NSwgdHJ1ZSk7Ci0JCXRhYmxlTGF5b3V0LmFkZENvbHVtbkRhdGEoY29sRGF0YSk7Ci0JCi0JCVRhYmxlQ29sdW1uIGNvbDIgPSBuZXcgVGFibGVDb2x1bW4od2ViQXBwVGFibGUsIFNXVC5OT05FKTsKLQkJY29sMi5zZXRUZXh0KE1lc3NhZ2VzLmNvbmZpZ3VyYXRpb25FZGl0b3JEb2NCYXNlQ29sdW1uKTsKLQkJY29sRGF0YSA9IG5ldyBDb2x1bW5XZWlnaHREYXRhKDEzLCAxMzUsIHRydWUpOwotCQl0YWJsZUxheW91dC5hZGRDb2x1bW5EYXRhKGNvbERhdGEpOwotCQotCQlUYWJsZUNvbHVtbiBjb2wzID0gbmV3IFRhYmxlQ29sdW1uKHdlYkFwcFRhYmxlLCBTV1QuTk9ORSk7Ci0JCWNvbDMuc2V0VGV4dChNZXNzYWdlcy5jb25maWd1cmF0aW9uRWRpdG9yUHJvamVjdENvbHVtbik7Ci0JCWNvbERhdGEgPSBuZXcgQ29sdW1uV2VpZ2h0RGF0YSg4LCA4NSwgdHJ1ZSk7Ci0JCXRhYmxlTGF5b3V0LmFkZENvbHVtbkRhdGEoY29sRGF0YSk7Ci0JCi0JCVRhYmxlQ29sdW1uIGNvbDQgPSBuZXcgVGFibGVDb2x1bW4od2ViQXBwVGFibGUsIFNXVC5OT05FKTsKLQkJY29sNC5zZXRUZXh0KE1lc3NhZ2VzLmNvbmZpZ3VyYXRpb25FZGl0b3JSZWxvYWRDb2x1bW4pOwotCQljb2xEYXRhID0gbmV3IENvbHVtbldlaWdodERhdGEoNywgNzUsIHRydWUpOwotCQl0YWJsZUxheW91dC5hZGRDb2x1bW5EYXRhKGNvbERhdGEpOwotCQkKLQkJd2ViQXBwVGFibGUuc2V0TGF5b3V0KHRhYmxlTGF5b3V0KTsKLQkKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLndpZHRoSGludCA9IDQ1MDsKLQkJZGF0YS5oZWlnaHRIaW50ID0gMTIwOwotCQl3ZWJBcHBUYWJsZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQl3ZWJBcHBUYWJsZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzZWxlY3RXZWJBcHAoKTsKLQkJCX0KLQkJfSk7Ci0JCi0JCUNvbXBvc2l0ZSByaWdodFBhbmVsID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUoY29tcG9zaXRlKTsKLQkJbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCXJpZ2h0UGFuZWwuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJcmlnaHRQYW5lbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpKTsKLQkJLy90b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihyaWdodFBhbmVsKTsKLQkKLQkJLy8gYnV0dG9ucyBzdGlsbCB0byBhZGQ6Ci0JCS8vIGFkZCBwcm9qZWN0LCBhZGQgZXh0ZXJuYWwgbW9kdWxlLCByZW1vdmUgbW9kdWxlCi0JCWFkZFByb2plY3QgPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihyaWdodFBhbmVsLCBNZXNzYWdlcy5jb25maWd1cmF0aW9uRWRpdG9yQWRkUHJvamVjdE1vZHVsZSwgU1dULlBVU0gpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWFkZFByb2plY3Quc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJd2hzLnNldEhlbHAoYWRkUHJvamVjdCwgQ29udGV4dElkcy5DT05GSUdVUkFUSU9OX0VESVRPUl9XRUJNT0RVTEVTX0FERF9QUk9KRUNUKTsKLQkKLQkJLy8gZGlzYWJsZSB0aGUgYWRkIHByb2plY3QgbW9kdWxlIGJ1dHRvbiBpZiB0aGVyZSBhcmUgbm8KLQkJLy8gd2ViIHByb2plY3RzIGluIHRoZSB3b3JrYmVuY2gKLQkJaWYgKCFjYW5BZGRXZWJNb2R1bGUoKSkKLQkJCWFkZFByb2plY3Quc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWVsc2UgewotCQkJYWRkUHJvamVjdC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCVdlYk1vZHVsZURpYWxvZyBkaWFsb2cgPSBuZXcgV2ViTW9kdWxlRGlhbG9nKGdldEVkaXRvclNpdGUoKS5nZXRTaGVsbCgpLCBnZXRTZXJ2ZXIoKSwgc2VydmVyMiwgY29uZmlndXJhdGlvbiwgdHJ1ZSk7Ci0JCQkJCWRpYWxvZy5vcGVuKCk7Ci0JCQkJCWlmIChkaWFsb2cuZ2V0UmV0dXJuQ29kZSgpID09IElEaWFsb2dDb25zdGFudHMuT0tfSUQpIHsKLQkJCQkJCWV4ZWN1dGUobmV3IEFkZE1vZHVsZUNvbW1hbmQoZ2V0U2VydmVyKCksIGRpYWxvZy5tb2R1bGU0KSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQotCQlhZGRFeHRQcm9qZWN0ID0gdG9vbGtpdC5jcmVhdGVCdXR0b24ocmlnaHRQYW5lbCwgTWVzc2FnZXMuY29uZmlndXJhdGlvbkVkaXRvckFkZEV4dGVybmFsTW9kdWxlLCBTV1QuUFVTSCk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJYWRkRXh0UHJvamVjdC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlhZGRFeHRQcm9qZWN0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCVdlYk1vZHVsZURpYWxvZyBkaWFsb2cgPSBuZXcgV2ViTW9kdWxlRGlhbG9nKGdldEVkaXRvclNpdGUoKS5nZXRTaGVsbCgpLCBnZXRTZXJ2ZXIoKSwgc2VydmVyMiwgY29uZmlndXJhdGlvbiwgZmFsc2UpOwotCQkJCWRpYWxvZy5vcGVuKCk7Ci0JCQkJaWYgKGRpYWxvZy5nZXRSZXR1cm5Db2RlKCkgPT0gSURpYWxvZ0NvbnN0YW50cy5PS19JRCkgewotCQkJCQlleGVjdXRlKG5ldyBBZGRXZWJNb2R1bGVDb21tYW5kKGNvbmZpZ3VyYXRpb24sIGRpYWxvZy5nZXRXZWJNb2R1bGUoKSkpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCXdocy5zZXRIZWxwKGFkZEV4dFByb2plY3QsIENvbnRleHRJZHMuQ09ORklHVVJBVElPTl9FRElUT1JfV0VCTU9EVUxFU19BRERfRVhURVJOQUwpOwotCQkKLQkJZWRpdCA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKHJpZ2h0UGFuZWwsIE1lc3NhZ2VzLmVkaXRvckVkaXQsIFNXVC5QVVNIKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQllZGl0LnNldExheW91dERhdGEoZGF0YSk7Ci0JCWVkaXQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWVkaXQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaWYgKHNlbGVjdGlvbiA8IDApCi0JCQkJCXJldHVybjsKLQkJCQlXZWJNb2R1bGUgbW9kdWxlID0gKFdlYk1vZHVsZSkgY29uZmlndXJhdGlvbi5nZXRXZWJNb2R1bGVzKCkuZ2V0KHNlbGVjdGlvbik7Ci0JCQkJV2ViTW9kdWxlRGlhbG9nIGRpYWxvZyA9IG5ldyBXZWJNb2R1bGVEaWFsb2coZ2V0RWRpdG9yU2l0ZSgpLmdldFNoZWxsKCksIGdldFNlcnZlcigpLCBzZXJ2ZXIyLCBjb25maWd1cmF0aW9uLCBtb2R1bGUpOwotCQkJCWRpYWxvZy5vcGVuKCk7Ci0JCQkJaWYgKGRpYWxvZy5nZXRSZXR1cm5Db2RlKCkgPT0gSURpYWxvZ0NvbnN0YW50cy5PS19JRCkgewotCQkJCQlleGVjdXRlKG5ldyBNb2RpZnlXZWJNb2R1bGVDb21tYW5kKGNvbmZpZ3VyYXRpb24sIHNlbGVjdGlvbiwgZGlhbG9nLmdldFdlYk1vZHVsZSgpKSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJd2hzLnNldEhlbHAoZWRpdCwgQ29udGV4dElkcy5DT05GSUdVUkFUSU9OX0VESVRPUl9XRUJNT0RVTEVTX0VESVQpOwotCQotCQlyZW1vdmUgPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihyaWdodFBhbmVsLCBNZXNzYWdlcy5lZGl0b3JSZW1vdmUsIFNXVC5QVVNIKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlyZW1vdmUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJcmVtb3ZlLnNldEVuYWJsZWQoZmFsc2UpOwotCQlyZW1vdmUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaWYgKHNlbGVjdGlvbiA8IDApCi0JCQkJCXJldHVybjsKLQkJCQlUYWJsZUl0ZW0gaXRlbSA9IHdlYkFwcFRhYmxlLmdldEl0ZW0oc2VsZWN0aW9uKTsKLQkJCQlpZiAoaXRlbS5nZXREYXRhKCkgIT0gbnVsbCkgewotCQkJCQlJTW9kdWxlIG1vZHVsZSA9IChJTW9kdWxlKSBpdGVtLmdldERhdGEoKTsKLQkJCQkJZXhlY3V0ZShuZXcgUmVtb3ZlTW9kdWxlQ29tbWFuZChnZXRTZXJ2ZXIoKSwgbW9kdWxlKSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZXhlY3V0ZShuZXcgUmVtb3ZlV2ViTW9kdWxlQ29tbWFuZChjb25maWd1cmF0aW9uLCBzZWxlY3Rpb24pKTsKLQkJCQl9Ci0JCQkJcmVtb3ZlLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCWVkaXQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJc2VsZWN0aW9uID0gLTE7Ci0JCQl9Ci0JCX0pOwotCQl3aHMuc2V0SGVscChyZW1vdmUsIENvbnRleHRJZHMuQ09ORklHVVJBVElPTl9FRElUT1JfV0VCTU9EVUxFU19SRU1PVkUpOwotCQkKLQkJZm9ybS5zZXRDb250ZW50KHNlY3Rpb24pOwotCQlmb3JtLnJlZmxvdyh0cnVlKTsKLQotCQlpbml0aWFsaXplKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FuQWRkV2ViTW9kdWxlKCkgewotCQlJTW9kdWxlW10gbW9kdWxlcyA9IFNlcnZlclV0aWwuZ2V0TW9kdWxlcyhzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpLmdldFJ1bnRpbWVUeXBlKCkuZ2V0TW9kdWxlVHlwZXMoKSk7Ci0JCWlmIChtb2R1bGVzICE9IG51bGwpIHsKLQkJCWludCBzaXplID0gbW9kdWxlcy5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCUlXZWJNb2R1bGUgd2ViTW9kdWxlID0gKElXZWJNb2R1bGUpIG1vZHVsZXNbaV0ubG9hZEFkYXB0ZXIoSVdlYk1vZHVsZS5jbGFzcywgbnVsbCk7Ci0JCQkJaWYgKHdlYk1vZHVsZSAhPSBudWxsKSB7Ci0JCQkJCUlTdGF0dXMgc3RhdHVzID0gc2VydmVyLmNhbk1vZGlmeU1vZHVsZXMobmV3IElNb2R1bGVbXSB7IG1vZHVsZXNbaV0gfSwgbnVsbCwgbnVsbCk7Ci0JCQkJCWlmIChzdGF0dXMgIT0gbnVsbCAmJiBzdGF0dXMuaXNPSygpKQotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoY29uZmlndXJhdGlvbiAhPSBudWxsKQotCQkJY29uZmlndXJhdGlvbi5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0JCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBJbml0aWFsaXplcyB0aGUgZWRpdG9yIHBhcnQgd2l0aCBhIHNpdGUgYW5kIGlucHV0LgotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQkKLQkJVG9tY2F0U2VydmVyIHRzID0gKFRvbWNhdFNlcnZlcikgc2VydmVyLmxvYWRBZGFwdGVyKFRvbWNhdFNlcnZlci5jbGFzcywgbnVsbCk7Ci0JCXRyeSB7Ci0JCQljb25maWd1cmF0aW9uID0gdHMuZ2V0VG9tY2F0Q29uZmlndXJhdGlvbigpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQkJaWYgKGNvbmZpZ3VyYXRpb24gIT0gbnVsbCkKLQkJCWFkZENoYW5nZUxpc3RlbmVyKCk7Ci0JCQotCQlpZiAoc2VydmVyICE9IG51bGwpCi0JCQlzZXJ2ZXIyID0gKElUb21jYXRTZXJ2ZXJXb3JraW5nQ29weSkgc2VydmVyLmxvYWRBZGFwdGVyKElUb21jYXRTZXJ2ZXJXb3JraW5nQ29weS5jbGFzcywgbnVsbCk7Ci0JCQotCQlpbml0aWFsaXplKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJaWYgKHdlYkFwcFRhYmxlID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJd2ViQXBwVGFibGUucmVtb3ZlQWxsKCk7Ci0JCXNldEVycm9yTWVzc2FnZShudWxsKTsKLQkKLQkJTGlzdCBsaXN0ID0gY29uZmlndXJhdGlvbi5nZXRXZWJNb2R1bGVzKCk7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlXZWJNb2R1bGUgbW9kdWxlID0gKFdlYk1vZHVsZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKHdlYkFwcFRhYmxlLCBTV1QuTk9ORSk7Ci0JCi0JCQkvLyBGSVgtTUUKLQkJCVN0cmluZyBtZW1lbnRvID0gbW9kdWxlLmdldE1lbWVudG8oKTsKLQkJCVN0cmluZyBwcm9qZWN0TmFtZSA9ICIiOwotCQkJSW1hZ2UgcHJvamVjdEltYWdlID0gbnVsbDsKLQkJCWlmIChtZW1lbnRvICE9IG51bGwgJiYgbWVtZW50by5sZW5ndGgoKSA+IDApIHsKLQkJCQlwcm9qZWN0TmFtZSA9IE5MUy5iaW5kKE1lc3NhZ2VzLmNvbmZpZ3VyYXRpb25FZGl0b3JQcm9qZWN0TWlzc2luZywgbmV3IFN0cmluZ1tdIHttZW1lbnRvfSk7Ci0JCQkJcHJvamVjdEltYWdlID0gVG9tY2F0VUlQbHVnaW4uZ2V0SW1hZ2UoVG9tY2F0VUlQbHVnaW4uSU1HX1BST0pFQ1RfTUlTU0lORyk7Ci0JCQkJSU1vZHVsZSBtb2R1bGUyID0gU2VydmVyVXRpbC5nZXRNb2R1bGUobWVtZW50byk7Ci0JCQkJaWYgKG1vZHVsZTIgIT0gbnVsbCkgewotCQkJCQlwcm9qZWN0TmFtZSA9IFNlcnZlclVJQ29yZS5nZXRMYWJlbFByb3ZpZGVyKCkuZ2V0VGV4dChtb2R1bGUyKTsKLQkJCQkJcHJvamVjdEltYWdlID0gU2VydmVyVUlDb3JlLmdldExhYmVsUHJvdmlkZXIoKS5nZXRJbWFnZShtb2R1bGUyKTsKLQkJCQkJaXRlbS5zZXREYXRhKG1vZHVsZTIpOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJU3RyaW5nIHJlbG9hZCA9IG1vZHVsZS5pc1JlbG9hZGFibGUoKSA/IE1lc3NhZ2VzLmNvbmZpZ3VyYXRpb25FZGl0b3JSZWxvYWRFbmFibGVkIDogTWVzc2FnZXMuY29uZmlndXJhdGlvbkVkaXRvclJlbG9hZERpc2FibGVkOwotCQkJU3RyaW5nW10gcyA9IG5ldyBTdHJpbmdbXSB7bW9kdWxlLmdldFBhdGgoKSwgbW9kdWxlLmdldERvY3VtZW50QmFzZSgpLCBwcm9qZWN0TmFtZSwgcmVsb2FkfTsKLQkJCWl0ZW0uc2V0VGV4dChzKTsKLQkJCWl0ZW0uc2V0SW1hZ2UoMCwgVG9tY2F0VUlQbHVnaW4uZ2V0SW1hZ2UoVG9tY2F0VUlQbHVnaW4uSU1HX1dFQl9NT0RVTEUpKTsKLQkJCWlmIChwcm9qZWN0SW1hZ2UgIT0gbnVsbCkKLQkJCQlpdGVtLnNldEltYWdlKDIsIHByb2plY3RJbWFnZSk7Ci0JCQkKLQkJCWlmICghaXNEb2N1bWVudEJhc2VWYWxpZChtb2R1bGUuZ2V0RG9jdW1lbnRCYXNlKCkpKSB7Ci0JCQkJaXRlbS5zZXRJbWFnZSgxLCBUb21jYXRVSVBsdWdpbi5nZXRJbWFnZShUb21jYXRVSVBsdWdpbi5JTUdfUFJPSkVDVF9NSVNTSU5HKSk7Ci0JCQkJc2V0RXJyb3JNZXNzYWdlKE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yTWlzc2luZ1dlYk1vZHVsZSwgbW9kdWxlLmdldERvY3VtZW50QmFzZSgpKSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmIChyZWFkT25seSkgewotCQkJYWRkUHJvamVjdC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWFkZEV4dFByb2plY3Quc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQllZGl0LnNldEVuYWJsZWQoZmFsc2UpOwotCQkJcmVtb3ZlLnNldEVuYWJsZWQoZmFsc2UpOwotCQl9IGVsc2UgewotCQkJYWRkUHJvamVjdC5zZXRFbmFibGVkKGNhbkFkZFdlYk1vZHVsZSgpKTsKLQkJCWFkZEV4dFByb2plY3Quc2V0RW5hYmxlZCh0cnVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNlbGVjdFdlYkFwcCgpIHsKLQkJaWYgKHJlYWRPbmx5KQotCQkJcmV0dXJuOwotCi0JCXRyeSB7Ci0JCQlzZWxlY3Rpb24gPSB3ZWJBcHBUYWJsZS5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQkJcmVtb3ZlLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQllZGl0LnNldEVuYWJsZWQodHJ1ZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlzZWxlY3Rpb24gPSAtMTsKLQkJCXJlbW92ZS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWVkaXQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNEb2N1bWVudEJhc2VWYWxpZChTdHJpbmcgcykgewotCQlpZiAocyA9PSBudWxsIHx8IHMubGVuZ3RoKCkgPCAyKQotCQkJcmV0dXJuIHRydWU7Ci0JCQotCQkvLyBjaGVjayBhYnNvbHV0ZSBwYXRoCi0JCUZpbGUgZiA9IG5ldyBGaWxlKHMpOwotCQlpZiAoZi5leGlzdHMoKSkKLQkJCXJldHVybiB0cnVlOwotCQkKLQkJLy8gY2hlY2sgd29ya3NwYWNlCi0JCXRyeSB7Ci0JCQlpZiAoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KHMpLmV4aXN0cygpKQotCQkJCXJldHVybiB0cnVlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gYmFkIHBhdGgKLQkJfQotCQkKLQkJLy8gY2hlY2sgc2VydmVyIHJlbGF0aXZlIHBhdGgKLQkJdHJ5IHsKLQkJCWYgPSBzZXJ2ZXIuZ2V0UnVudGltZSgpLmdldExvY2F0aW9uKCkuYXBwZW5kKHMpLnRvRmlsZSgpOwotCQkJaWYgKGYuZXhpc3RzKCkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBiYWQgcGF0aAotCQl9Ci0JCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qCi0JICogQHNlZSBJV29ya2JlbmNoUGFydCNzZXRGb2N1cygpCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7Ci0JCWlmICh3ZWJBcHBUYWJsZSAhPSBudWxsKQotCQkJd2ViQXBwVGFibGUuc2V0Rm9jdXMoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS90b21jYXR1aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC91aS9pbnRlcm5hbC9lZGl0b3IvTWltZU1hcHBpbmdEaWFsb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvdG9tY2F0dWkvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvdWkvaW50ZXJuYWwvZWRpdG9yL01pbWVNYXBwaW5nRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmNjVmZjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS90b21jYXR1aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC91aS9pbnRlcm5hbC9lZGl0b3IvTWltZU1hcHBpbmdEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLk1pbWVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLmludGVybmFsLkNvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkuaW50ZXJuYWwuVG9tY2F0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuSVdvcmtiZW5jaEhlbHBTeXN0ZW07Ci0vKioKLSAqIERpYWxvZyB0byBhZGQgb3IgbW9kaWZ5IG1pbWUgbWFwcGluZ3MuCi0gKi8KLXB1YmxpYyBjbGFzcyBNaW1lTWFwcGluZ0RpYWxvZyBleHRlbmRzIERpYWxvZyB7Ci0JcHJvdGVjdGVkIE1pbWVNYXBwaW5nIG1hcDsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VkaXQ7Ci0KLQkvKioKLQkgKiBNaW1lTWFwcGluZ0RpYWxvZyBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIEBwYXJhbSBwYXJlbnRTaGVsbCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbAotCSAqLwotCXB1YmxpYyBNaW1lTWFwcGluZ0RpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCkgewotCQl0aGlzKHBhcmVudFNoZWxsLCBuZXcgTWltZU1hcHBpbmcoIiIsICIiKSk7Ci0JCWlzRWRpdCA9IGZhbHNlOwotCX0KLQotCS8qKgotCSAqIE1pbWVNYXBwaW5nRGlhbG9nIGNvbnN0cnVjdG9yLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnRTaGVsbCBhIHNoZWxsCi0JICogQHBhcmFtIG1hcCBhIG1pbWUgbWFwcGluZwotCSAqLwotCXB1YmxpYyBNaW1lTWFwcGluZ0RpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgTWltZU1hcHBpbmcgbWFwKSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsKTsKLQkJdGhpcy5tYXAgPSBtYXA7Ci0JCWlzRWRpdCA9IHRydWU7Ci0JfQotCi0JLyoqCi0JICoKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBuZXdTaGVsbCkgewotCQlzdXBlci5jb25maWd1cmVTaGVsbChuZXdTaGVsbCk7Ci0JCW5ld1NoZWxsLnNldEltYWdlKFRvbWNhdFVJUGx1Z2luLmdldEltYWdlKFRvbWNhdFVJUGx1Z2luLklNR19NSU1FX01BUFBJTkcpKTsKLQkJaWYgKGlzRWRpdCkKLQkJCW5ld1NoZWxsLnNldFRleHQoTWVzc2FnZXMuY29uZmlndXJhdGlvbkVkaXRvck1pbWVNYXBwcGluZ0RpYWxvZ1RpdGxlRWRpdCk7Ci0JCWVsc2UKLQkJCW5ld1NoZWxsLnNldFRleHQoTWVzc2FnZXMuY29uZmlndXJhdGlvbkVkaXRvck1pbWVNYXBwcGluZ0RpYWxvZ1RpdGxlQWRkKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIHRoZSBjb250ZW50cyBvZiB0aGUgdXBwZXIgcGFydCAKLQkgKiBvZiB0aGlzIGRpYWxvZyAoYWJvdmUgdGhlIGJ1dHRvbiBiYXIpLgotCSAqIDxwPgotCSAqIFRoZSA8Y29kZT5EaWFsb2c8L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZnJhbWV3b3JrIG1ldGhvZAotCSAqIGNyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPiB3aXRoCi0JICogc3RhbmRhcmQgbWFyZ2lucyBhbmQgc3BhY2luZy4gU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUuCi0JICogPC9wPgotCSAqCi0JICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IGNvbXBvc2l0ZSB0byBjb250YWluIHRoZSBkaWFsb2cgYXJlYQotCSAqIEByZXR1cm4gdGhlIGRpYWxvZyBhcmVhIGNvbnRyb2wKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gY3JlYXRlIGEgY29tcG9zaXRlIHdpdGggc3RhbmRhcmQgbWFyZ2lucyBhbmQgc3BhY2luZwotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSBjb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5WRVJUSUNBTF9NQVJHSU4pOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLkhPUklaT05UQUxfTUFSR0lOKTsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IGNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLlZFUlRJQ0FMX1NQQUNJTkcpOwotCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLkhPUklaT05UQUxfU1BBQ0lORyk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQljb21wb3NpdGUuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLQkJSVdvcmtiZW5jaEhlbHBTeXN0ZW0gd2hzID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCk7Ci0JCXdocy5zZXRIZWxwKGNvbXBvc2l0ZSwgQ29udGV4dElkcy5DT05GSUdVUkFUSU9OX0VESVRPUl9NQVBQSU5HX0RJQUxPRyk7Ci0JCi0JCW5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKS5zZXRUZXh0KE1lc3NhZ2VzLmNvbmZpZ3VyYXRpb25FZGl0b3JNaW1lTWFwcHBpbmdEaWFsb2dNaW1lVHlwZSk7Ci0JCWZpbmFsIFRleHQgdHlwZSA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS53aWR0aEhpbnQgPSAxNTA7Ci0JCXR5cGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJdHlwZS5zZXRUZXh0KG1hcC5nZXRNaW1lVHlwZSgpKTsKLQkJdHlwZS5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQltYXAgPSBuZXcgTWltZU1hcHBpbmcobWFwLmdldEV4dGVuc2lvbigpLCB0eXBlLmdldFRleHQoKSk7Ci0JCQkJdmFsaWRhdGUoKTsKLQkJCX0KLQkJfSk7Ci0JCXdocy5zZXRIZWxwKHR5cGUsIENvbnRleHRJZHMuQ09ORklHVVJBVElPTl9FRElUT1JfTUFQUElOR19ESUFMT0dfVFlQRSk7Ci0JCi0JCW5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKS5zZXRUZXh0KE1lc3NhZ2VzLmNvbmZpZ3VyYXRpb25FZGl0b3JNaW1lTWFwcHBpbmdEaWFsb2dNaW1lRXh0ZW5zaW9uKTsKLQkJZmluYWwgVGV4dCBleHRlbnNpb24gPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEud2lkdGhIaW50ID0gMTUwOwotCQlleHRlbnNpb24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJZXh0ZW5zaW9uLnNldFRleHQobWFwLmdldEV4dGVuc2lvbigpKTsKLQkJZXh0ZW5zaW9uLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCW1hcCA9IG5ldyBNaW1lTWFwcGluZyhleHRlbnNpb24uZ2V0VGV4dCgpLCBtYXAuZ2V0TWltZVR5cGUoKSk7Ci0JCQkJdmFsaWRhdGUoKTsKLQkJCX0KLQkJfSk7Ci0JCXdocy5zZXRIZWxwKGV4dGVuc2lvbiwgQ29udGV4dElkcy5DT05GSUdVUkFUSU9OX0VESVRPUl9NQVBQSU5HX0RJQUxPR19FWFRFTlNJT04pOwotCQkKLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChjb21wb3NpdGUpOwotCQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQkKLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb250cm9sIGNvbnRyb2wgPSBzdXBlci5jcmVhdGVCdXR0b25CYXIocGFyZW50KTsKLQkJdmFsaWRhdGUoKTsKLQotCQlyZXR1cm4gY29udHJvbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZSgpIHsKLQkJYm9vbGVhbiBvayA9IHRydWU7Ci0JCWlmIChtYXAuZ2V0RXh0ZW5zaW9uKCkgPT0gbnVsbCB8fCBtYXAuZ2V0RXh0ZW5zaW9uKCkubGVuZ3RoKCkgPCAxKQotCQkJb2sgPSBmYWxzZTsKLQkJaWYgKG1hcC5nZXRNaW1lVHlwZSgpID09IG51bGwgfHwgbWFwLmdldE1pbWVUeXBlKCkubGVuZ3RoKCkgPCAxKQotCQkJb2sgPSBmYWxzZTsKLQkJZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuT0tfSUQpLnNldEVuYWJsZWQob2spOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbWltZSBtYXBwaW5nLgotCSAqCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5NaW1lTWFwcGluZwotCSAqLwotCXB1YmxpYyBNaW1lTWFwcGluZyBnZXRNaW1lTWFwcGluZygpIHsKLQkJcmV0dXJuIG1hcDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS90b21jYXR1aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC91aS9pbnRlcm5hbC9lZGl0b3IvU2VydmVyR2VuZXJhbEVkaXRvclNlY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvdG9tY2F0dWkvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvdWkvaW50ZXJuYWwvZWRpdG9yL1NlcnZlckdlbmVyYWxFZGl0b3JTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2YzBhMjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS90b21jYXR1aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC91aS9pbnRlcm5hbC9lZGl0b3IvU2VydmVyR2VuZXJhbEVkaXRvclNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLaAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLWltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5JVG9tY2F0U2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuVG9tY2F0U2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuY29tbWFuZC5TZXREZWJ1Z01vZGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuY29tbWFuZC5TZXRTZWN1cmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuY29tbWFuZC5TZXRUZXN0RW52aXJvbm1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLmludGVybmFsLkNvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRXhwYW5kYWJsZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1Ub29sa2l0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLklXb3JrYmVuY2hIZWxwU3lzdGVtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5lZGl0b3IuKjsKLS8qKgotICogVG9tY2F0IHNlcnZlciBnZW5lcmFsIGVkaXRvciBwYWdlLgotICovCi1wdWJsaWMgY2xhc3MgU2VydmVyR2VuZXJhbEVkaXRvclNlY3Rpb24gZXh0ZW5kcyBTZXJ2ZXJFZGl0b3JTZWN0aW9uIHsKLQlwcm90ZWN0ZWQgVG9tY2F0U2VydmVyIHRvbWNhdFNlcnZlcjsKLQotCXByb3RlY3RlZCBCdXR0b24gc2VjdXJlOwotCXByb3RlY3RlZCBCdXR0b24gZGVidWc7Ci0JcHJvdGVjdGVkIEJ1dHRvbiB0ZXN0RW52aXJvbm1lbnQ7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gdXBkYXRpbmc7Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcjsKLQotCS8qKgotCSAqIFNlcnZlckdlbmVyYWxFZGl0b3JQYXJ0IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFNlcnZlckdlbmVyYWxFZGl0b3JTZWN0aW9uKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCWxpc3RlbmVyID0gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKHVwZGF0aW5nKQotCQkJCQlyZXR1cm47Ci0JCQkJdXBkYXRpbmcgPSB0cnVlOwotCQkJCWlmIChUb21jYXRTZXJ2ZXIuUFJPUEVSVFlfU0VDVVJFLmVxdWFscyhldmVudC5nZXRQcm9wZXJ0eU5hbWUoKSkpIHsKLQkJCQkJQm9vbGVhbiBiID0gKEJvb2xlYW4pIGV2ZW50LmdldE5ld1ZhbHVlKCk7Ci0JCQkJCVNlcnZlckdlbmVyYWxFZGl0b3JTZWN0aW9uLnRoaXMuc2VjdXJlLnNldFNlbGVjdGlvbihiLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQl9IGVsc2UgaWYgKFRvbWNhdFNlcnZlci5QUk9QRVJUWV9ERUJVRy5lcXVhbHMoZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkpKSB7Ci0JCQkJCUJvb2xlYW4gYiA9IChCb29sZWFuKSBldmVudC5nZXROZXdWYWx1ZSgpOwotCQkJCQlTZXJ2ZXJHZW5lcmFsRWRpdG9yU2VjdGlvbi50aGlzLmRlYnVnLnNldFNlbGVjdGlvbihiLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQl9IGVsc2UgaWYgKElUb21jYXRTZXJ2ZXIuUFJPUEVSVFlfVEVTVF9FTlZJUk9OTUVOVC5lcXVhbHMoZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkpKSB7Ci0JCQkJCUJvb2xlYW4gYiA9IChCb29sZWFuKSBldmVudC5nZXROZXdWYWx1ZSgpOwotCQkJCQlTZXJ2ZXJHZW5lcmFsRWRpdG9yU2VjdGlvbi50aGlzLnRlc3RFbnZpcm9ubWVudC5zZXRTZWxlY3Rpb24oYi5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJfQotCQkJCXVwZGF0aW5nID0gZmFsc2U7Ci0JCQl9Ci0JCX07Ci0JCXNlcnZlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgU1dUIGNvbnRyb2xzIGZvciB0aGlzIHdvcmtiZW5jaCBwYXJ0LgotCSAqCi0JICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVTZWN0aW9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJc3VwZXIuY3JlYXRlU2VjdGlvbihwYXJlbnQpOwotCQlGb3JtVG9vbGtpdCB0b29sa2l0ID0gZ2V0Rm9ybVRvb2xraXQocGFyZW50LmdldERpc3BsYXkoKSk7Ci0JCQotCQlTZWN0aW9uIHNlY3Rpb24gPSB0b29sa2l0LmNyZWF0ZVNlY3Rpb24ocGFyZW50LCBFeHBhbmRhYmxlQ29tcG9zaXRlLlRXSVNUSUUgfCBFeHBhbmRhYmxlQ29tcG9zaXRlLkVYUEFOREVECi0JCQl8IEV4cGFuZGFibGVDb21wb3NpdGUuVElUTEVfQkFSIHwgU2VjdGlvbi5ERVNDUklQVElPTiB8IEV4cGFuZGFibGVDb21wb3NpdGUuRk9DVVNfVElUTEUpOwotCQlzZWN0aW9uLnNldFRleHQoTWVzc2FnZXMuc2VydmVyRWRpdG9yR2VuZXJhbFNlY3Rpb24pOwotCQlzZWN0aW9uLnNldERlc2NyaXB0aW9uKE1lc3NhZ2VzLnNlcnZlckVkaXRvckdlbmVyYWxEZXNjcmlwdGlvbik7Ci0JCXNlY3Rpb24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCkpOwotCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShzZWN0aW9uKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSA1OwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAxMDsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDU7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IDE1OwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKSk7Ci0JCUlXb3JrYmVuY2hIZWxwU3lzdGVtIHdocyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpOwotCQl3aHMuc2V0SGVscChjb21wb3NpdGUsIENvbnRleHRJZHMuU0VSVkVSX0VESVRPUik7Ci0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKGNvbXBvc2l0ZSk7Ci0JCXNlY3Rpb24uc2V0Q2xpZW50KGNvbXBvc2l0ZSk7Ci0JCQotCQkvLyB0ZXN0IGVudmlyb25tZW50Ci0JCXRlc3RFbnZpcm9ubWVudCA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKGNvbXBvc2l0ZSwgTWVzc2FnZXMuc2VydmVyRWRpdG9yVGVzdEVudmlyb25tZW50LCBTV1QuQ0hFQ0spOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQl0ZXN0RW52aXJvbm1lbnQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJdGVzdEVudmlyb25tZW50LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgc2UpIHsKLQkJCQlpZiAodXBkYXRpbmcpCi0JCQkJCXJldHVybjsKLQkJCQl1cGRhdGluZyA9IHRydWU7Ci0JCQkJZXhlY3V0ZShuZXcgU2V0VGVzdEVudmlyb25tZW50Q29tbWFuZCh0b21jYXRTZXJ2ZXIsIHRlc3RFbnZpcm9ubWVudC5nZXRTZWxlY3Rpb24oKSkpOwotCQkJCXVwZGF0aW5nID0gZmFsc2U7Ci0JCQl9Ci0JCX0pOwotCQl3aHMuc2V0SGVscCh0ZXN0RW52aXJvbm1lbnQsIENvbnRleHRJZHMuU0VSVkVSX0VESVRPUl9URVNUX0VOVklST05NRU5UKTsKLQotCQkvLyBzZWN1cml0eQotCQlzZWN1cmUgPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihjb21wb3NpdGUsIE1lc3NhZ2VzLnNlcnZlckVkaXRvclNlY3VyZSwgU1dULkNIRUNLKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMzsKLQkJc2VjdXJlLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXNlY3VyZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IHNlKSB7Ci0JCQkJaWYgKHVwZGF0aW5nKQotCQkJCQlyZXR1cm47Ci0JCQkJdXBkYXRpbmcgPSB0cnVlOwotCQkJCWV4ZWN1dGUobmV3IFNldFNlY3VyZUNvbW1hbmQodG9tY2F0U2VydmVyLCBzZWN1cmUuZ2V0U2VsZWN0aW9uKCkpKTsKLQkJCQl1cGRhdGluZyA9IGZhbHNlOwotCQkJfQotCQl9KTsKLQkJd2hzLnNldEhlbHAoc2VjdXJlLCBDb250ZXh0SWRzLlNFUlZFUl9FRElUT1JfU0VDVVJFKTsKLQkKLQkJLy8gZGVidWcgbW9kZQotCQlkZWJ1ZyA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKGNvbXBvc2l0ZSwgTWVzc2FnZXMuc2VydmVyRWRpdG9yRGVidWdNb2RlLCBTV1QuQ0hFQ0spOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlkZWJ1Zy5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlkZWJ1Zy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IHNlKSB7Ci0JCQkJaWYgKHVwZGF0aW5nKQotCQkJCQlyZXR1cm47Ci0JCQkJdXBkYXRpbmcgPSB0cnVlOwotCQkJCWV4ZWN1dGUobmV3IFNldERlYnVnTW9kZUNvbW1hbmQodG9tY2F0U2VydmVyLCBkZWJ1Zy5nZXRTZWxlY3Rpb24oKSkpOwotCQkJCXVwZGF0aW5nID0gZmFsc2U7Ci0JCQl9Ci0JCX0pOwotCQl3aHMuc2V0SGVscChkZWJ1ZywgQ29udGV4dElkcy5TRVJWRVJfRURJVE9SX0RFQlVHX01PREUpOwotCQotCQlpbml0aWFsaXplKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKHNlcnZlciAhPSBudWxsKQotCQkJc2VydmVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQkKLQkJaWYgKHNlcnZlciAhPSBudWxsKSB7Ci0JCQl0b21jYXRTZXJ2ZXIgPSAoVG9tY2F0U2VydmVyKSBzZXJ2ZXIubG9hZEFkYXB0ZXIoVG9tY2F0U2VydmVyLmNsYXNzLCBudWxsKTsKLQkJCWFkZENoYW5nZUxpc3RlbmVyKCk7Ci0JCX0KLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemUgdGhlIGZpZWxkcyBpbiB0aGlzIGVkaXRvci4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgewotCQlpZiAoc2VjdXJlID09IG51bGwgfHwgdG9tY2F0U2VydmVyID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCXVwZGF0aW5nID0gdHJ1ZTsKLQotCQl0ZXN0RW52aXJvbm1lbnQuc2V0U2VsZWN0aW9uKHRvbWNhdFNlcnZlci5pc1Rlc3RFbnZpcm9ubWVudCgpKTsKLQkJc2VjdXJlLnNldFNlbGVjdGlvbih0b21jYXRTZXJ2ZXIuaXNTZWN1cmUoKSk7Ci0JCWlmIChzZXJ2ZXIuZ2V0UnVudGltZSgpICE9IG51bGwgJiYgc2VydmVyLmdldFJ1bnRpbWUoKS5nZXRSdW50aW1lVHlwZSgpLmdldElkKCkuaW5kZXhPZigiMzIiKSA+PSAwIHx8IHJlYWRPbmx5KQotCQkJZGVidWcuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWVsc2UgewotCQkJZGVidWcuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCWRlYnVnLnNldFNlbGVjdGlvbih0b21jYXRTZXJ2ZXIuaXNEZWJ1ZygpKTsKLQkJfQotCQkKLQkJaWYgKHJlYWRPbmx5KQotCQkJc2VjdXJlLnNldEVuYWJsZWQoZmFsc2UpOwotCQllbHNlCi0JCQlzZWN1cmUuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCi0JCXVwZGF0aW5nID0gZmFsc2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkvdG9tY2F0dWkvb3JnL2VjbGlwc2UvanN0L3NlcnZlci90b21jYXQvdWkvaW50ZXJuYWwvZWRpdG9yL1dlYk1vZHVsZURpYWxvZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS90b21jYXR1aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC91aS9pbnRlcm5hbC9lZGl0b3IvV2ViTW9kdWxlRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiOGRhYjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS90b21jYXR1aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3RvbWNhdC91aS9pbnRlcm5hbC9lZGl0b3IvV2ViTW9kdWxlRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLklXZWJNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5JVG9tY2F0Q29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLklUb21jYXRTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5XZWJNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkuaW50ZXJuYWwuQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS5pbnRlcm5hbC5UcmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlyZWN0b3J5RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGVscC5JV29ya2JlbmNoSGVscFN5c3RlbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyQXR0cmlidXRlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLlNlcnZlclVJQ29yZTsKLS8qKgotICogRGlhbG9nIHRvIGFkZCBvciBtb2RpZnkgd2ViIG1vZHVsZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJNb2R1bGVEaWFsb2cgZXh0ZW5kcyBEaWFsb2cgewotCXByb3RlY3RlZCBJTW9kdWxlIG1vZHVsZTQ7Ci0JcHJvdGVjdGVkIFdlYk1vZHVsZSBtb2R1bGU7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFZGl0OwotCXByb3RlY3RlZCBib29sZWFuIGlzUHJvamVjdDsKLQlwcm90ZWN0ZWQgVGV4dCBkb2NCYXNlOwotCXByb3RlY3RlZCBJU2VydmVyQXR0cmlidXRlcyBzZXJ2ZXIyOwotCXByb3RlY3RlZCBJVG9tY2F0U2VydmVyIHNlcnZlcjsKLQlwcm90ZWN0ZWQgSVRvbWNhdENvbmZpZ3VyYXRpb24gY29uZmlnOwotCi0JcHJvdGVjdGVkIFRhYmxlIHByb2pUYWJsZTsKLQotCS8qKgotCSAqIFdlYk1vZHVsZURpYWxvZyBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnRTaGVsbCBhIHNoZWxsCi0JICogQHBhcmFtIHNlcnZlcjIgYSBzZXJ2ZXIKLQkgKiBAcGFyYW0gc2VydmVyIGEgVG9tY2F0IHNlcnZlcgotCSAqIEBwYXJhbSBjb25maWcgYSBUb21jYXQgc2VydmVyIGNvbmZpZ3VyYXRpb24KLQkgKiBAcGFyYW0gbW9kdWxlIGEgbW9kdWxlCi0JICovCi0JcHVibGljIFdlYk1vZHVsZURpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgSVNlcnZlckF0dHJpYnV0ZXMgc2VydmVyMiwgSVRvbWNhdFNlcnZlciBzZXJ2ZXIsIElUb21jYXRDb25maWd1cmF0aW9uIGNvbmZpZywgV2ViTW9kdWxlIG1vZHVsZSkgewotCQlzdXBlcihwYXJlbnRTaGVsbCk7Ci0JCXRoaXMubW9kdWxlID0gbW9kdWxlOwotCQl0aGlzLnNlcnZlcjIgPSBzZXJ2ZXIyOwotCQl0aGlzLnNlcnZlciA9IHNlcnZlcjsKLQkJdGhpcy5jb25maWcgPSBjb25maWc7Ci0JCWlzRWRpdCA9IHRydWU7Ci0JfQotCi0JLyoqCi0JICogV2ViTW9kdWxlRGlhbG9nIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHBhcmVudFNoZWxsIGEgc2hlbGwKLQkgKiBAcGFyYW0gc2VydmVyMiBhIHNlcnZlcgotCSAqIEBwYXJhbSBzZXJ2ZXIgYSBUb21jYXQgc2VydmVyCi0JICogQHBhcmFtIGNvbmZpZyBhIFRvbWNhdCBzZXJ2ZXIgY29uZmlndXJhdGlvbgotCSAqIEBwYXJhbSBpc1Byb2plY3QgdHJ1ZSBpZiBpdCBpcyBhIHByb2plY3QKLQkgKi8KLQlwdWJsaWMgV2ViTW9kdWxlRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBJU2VydmVyQXR0cmlidXRlcyBzZXJ2ZXIyLCBJVG9tY2F0U2VydmVyIHNlcnZlciwgSVRvbWNhdENvbmZpZ3VyYXRpb24gY29uZmlnLCBib29sZWFuIGlzUHJvamVjdCkgewotCQl0aGlzKHBhcmVudFNoZWxsLCBzZXJ2ZXIyLCBzZXJ2ZXIsIGNvbmZpZywgbmV3IFdlYk1vZHVsZSgiLyIsICIiLCBudWxsLCB0cnVlKSk7Ci0JCWlzRWRpdCA9IGZhbHNlOwotCQl0aGlzLmlzUHJvamVjdCA9IGlzUHJvamVjdDsKLQl9Ci0KLQkvKioKLQkgKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIG5ld1NoZWxsKSB7Ci0JCXN1cGVyLmNvbmZpZ3VyZVNoZWxsKG5ld1NoZWxsKTsKLQkJaWYgKGlzRWRpdCkKLQkJCW5ld1NoZWxsLnNldFRleHQoTWVzc2FnZXMuY29uZmlndXJhdGlvbkVkaXRvcldlYk1vZHVsZURpYWxvZ1RpdGxlRWRpdCk7Ci0JCWVsc2UKLQkJCW5ld1NoZWxsLnNldFRleHQoTWVzc2FnZXMuY29uZmlndXJhdGlvbkVkaXRvcldlYk1vZHVsZURpYWxvZ1RpdGxlQWRkKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIHRoZSBjb250ZW50cyBvZiB0aGUgdXBwZXIgcGFydCAKLQkgKiBvZiB0aGlzIGRpYWxvZyAoYWJvdmUgdGhlIGJ1dHRvbiBiYXIpLgotCSAqIDxwPgotCSAqIFRoZSA8Y29kZT5EaWFsb2c8L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZnJhbWV3b3JrIG1ldGhvZAotCSAqIGNyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPiB3aXRoCi0JICogc3RhbmRhcmQgbWFyZ2lucyBhbmQgc3BhY2luZy4gU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUuCi0JICogPC9wPgotCSAqCi0JICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IGNvbXBvc2l0ZSB0byBjb250YWluIHRoZSBkaWFsb2cgYXJlYQotCSAqIEByZXR1cm4gdGhlIGRpYWxvZyBhcmVhIGNvbnRyb2wKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gY3JlYXRlIGEgY29tcG9zaXRlIHdpdGggc3RhbmRhcmQgbWFyZ2lucyBhbmQgc3BhY2luZwotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSBjb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5WRVJUSUNBTF9NQVJHSU4pOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLkhPUklaT05UQUxfTUFSR0lOKTsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IGNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLlZFUlRJQ0FMX1NQQUNJTkcpOwotCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLkhPUklaT05UQUxfU1BBQ0lORyk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQljb21wb3NpdGUuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLQkJSVdvcmtiZW5jaEhlbHBTeXN0ZW0gd2hzID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCk7Ci0JCXdocy5zZXRIZWxwKGNvbXBvc2l0ZSwgQ29udGV4dElkcy5DT05GSUdVUkFUSU9OX0VESVRPUl9XRUJNT0RVTEVfRElBTE9HKTsKLQkJLy8gYWRkIHByb2plY3QgZmllbGQgaWYgd2UgYXJlIGFkZGluZyBhIHByb2plY3QKLQkJaWYgKCFpc0VkaXQgJiYgaXNQcm9qZWN0KSB7Ci0JCQlMYWJlbCBsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkJbC5zZXRUZXh0KE1lc3NhZ2VzLmNvbmZpZ3VyYXRpb25FZGl0b3JXZWJNb2R1bGVEaWFsb2dQcm9qZWN0cyk7Ci0JCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyk7Ci0JCQlsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQkKLQkJCXByb2pUYWJsZSA9IG5ldyBUYWJsZShjb21wb3NpdGUsIFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuU0lOR0xFKTsKLQkJCWRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJCWRhdGEud2lkdGhIaW50ID0gMTUwOwotCQkJZGF0YS5oZWlnaHRIaW50ID0gNzU7Ci0JCQlwcm9qVGFibGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCXdocy5zZXRIZWxwKHByb2pUYWJsZSwgQ29udGV4dElkcy5DT05GSUdVUkFUSU9OX0VESVRPUl9XRUJNT0RVTEVfRElBTE9HX1BST0pFQ1QpOwotCQotCQkJLy8gZmlsbCB0YWJsZSB3aXRoIHdlYiBtb2R1bGUgcHJvamVjdHMKLQkJCUlNb2R1bGVbXSBtb2R1bGVzID0gU2VydmVyVXRpbC5nZXRNb2R1bGVzKHNlcnZlcjIuZ2V0U2VydmVyVHlwZSgpLmdldFJ1bnRpbWVUeXBlKCkuZ2V0TW9kdWxlVHlwZXMoKSk7Ci0JCQlpZiAobW9kdWxlcyAhPSBudWxsKSB7Ci0JCQkJaW50IHNpemUgPSBtb2R1bGVzLmxlbmd0aDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCQlJTW9kdWxlIG1vZHVsZTMgPSBtb2R1bGVzW2ldOwotCQkJCQlpZiAoImpzdC53ZWIiLmVxdWFscyhtb2R1bGUzLmdldE1vZHVsZVR5cGUoKS5nZXRJZCgpKSkgewotCQkJCQkJSVN0YXR1cyBzdGF0dXMgPSBzZXJ2ZXIyLmNhbk1vZGlmeU1vZHVsZXMobmV3IElNb2R1bGVbXSB7IG1vZHVsZTMgfSwgbnVsbCwgbnVsbCk7Ci0JCQkJCQlpZiAoc3RhdHVzICE9IG51bGwgJiYgc3RhdHVzLmlzT0soKSkgewotCQkJCQkJCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbShwcm9qVGFibGUsIFNXVC5OT05FKTsKLQkJCQkJCQlpdGVtLnNldFRleHQoMCwgU2VydmVyVUlDb3JlLmdldExhYmVsUHJvdmlkZXIoKS5nZXRUZXh0KG1vZHVsZTMpKTsKLQkJCQkJCQlpdGVtLnNldEltYWdlKDAsIFNlcnZlclVJQ29yZS5nZXRMYWJlbFByb3ZpZGVyKCkuZ2V0SW1hZ2UobW9kdWxlMykpOwotCQkJCQkJCWl0ZW0uc2V0RGF0YShtb2R1bGUzKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCW5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKS5zZXRUZXh0KCIgIik7Ci0JCX0KLQkKLQkJbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpLnNldFRleHQoTWVzc2FnZXMuY29uZmlndXJhdGlvbkVkaXRvcldlYk1vZHVsZURpYWxvZ0RvY3VtZW50QmFzZSk7Ci0JCWRvY0Jhc2UgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCWRvY0Jhc2Uuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJZG9jQmFzZS5zZXRUZXh0KG1vZHVsZS5nZXREb2N1bWVudEJhc2UoKSk7Ci0JCXdocy5zZXRIZWxwKGRvY0Jhc2UsIENvbnRleHRJZHMuQ09ORklHVVJBVElPTl9FRElUT1JfV0VCTU9EVUxFX0RJQUxPR19ET0NCQVNFKTsKLQkKLQkJLy8gZGlzYWJsZSBkb2N1bWVudCBiYXNlIGZvciBwcm9qZWN0IG1vZHVsZXMKLQkJaWYgKGlzUHJvamVjdCB8fCAobW9kdWxlLmdldE1lbWVudG8oKSAhPSBudWxsICYmIG1vZHVsZS5nZXRNZW1lbnRvKCkubGVuZ3RoKCkgPiAwKSkKLQkJCWRvY0Jhc2Uuc2V0RWRpdGFibGUoZmFsc2UpOwotCQllbHNlIHsKLQkJCWRvY0Jhc2UuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCQltb2R1bGUgPSBuZXcgV2ViTW9kdWxlKG1vZHVsZS5nZXRQYXRoKCksIGRvY0Jhc2UuZ2V0VGV4dCgpLCBtb2R1bGUuZ2V0TWVtZW50bygpLCBtb2R1bGUuaXNSZWxvYWRhYmxlKCkpOwotCQkJCQl2YWxpZGF0ZSgpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JCi0JCWlmIChpc0VkaXQgfHwgaXNQcm9qZWN0KQotCQkJbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpLnNldFRleHQoIiAiKTsKLQkJZWxzZSB7Ci0JCQlCdXR0b24gYnJvd3NlID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJCWJyb3dzZS5zZXRUZXh0KE1lc3NhZ2VzLmJyb3dzZSk7Ci0JCQlicm93c2UuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgc2UpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCURpcmVjdG9yeURpYWxvZyBkaWFsb2cgPSBuZXcgRGlyZWN0b3J5RGlhbG9nKGdldFNoZWxsKCkpOwotCQkJCQkJZGlhbG9nLnNldE1lc3NhZ2UoTWVzc2FnZXMuY29uZmlndXJhdGlvbkVkaXRvcldlYk1vZHVsZURpYWxvZ1NlbGVjdERpcmVjdG9yeSk7Ci0JCQkJCQlTdHJpbmcgc2VsZWN0ZWREaXJlY3RvcnkgPSBkaWFsb2cub3BlbigpOwotCQkJCQkJaWYgKHNlbGVjdGVkRGlyZWN0b3J5ICE9IG51bGwpCi0JCQkJCQkJZG9jQmFzZS5zZXRUZXh0KHNlbGVjdGVkRGlyZWN0b3J5KTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGJyb3dzaW5nIiwgZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQkKLQkJLy8gcGF0aCAoY29udGV4dC1yb290KQotCQluZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSkuc2V0VGV4dChNZXNzYWdlcy5jb25maWd1cmF0aW9uRWRpdG9yV2ViTW9kdWxlRGlhbG9nUGF0aCk7Ci0JCWZpbmFsIFRleHQgcGF0aCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLQkJZGF0YS53aWR0aEhpbnQgPSAxNTA7Ci0JCXBhdGguc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJcGF0aC5zZXRUZXh0KG1vZHVsZS5nZXRQYXRoKCkpOwotCQkvKmlmIChtb2R1bGUuZ2V0TWVtZW50bygpICE9IG51bGwgJiYgbW9kdWxlLmdldE1lbWVudG8oKS5sZW5ndGgoKSA+IDApCi0JCQlwYXRoLnNldEVkaXRhYmxlKGZhbHNlKTsKLQkJZWxzZSovCi0JCQlwYXRoLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQkJbW9kdWxlID0gbmV3IFdlYk1vZHVsZShwYXRoLmdldFRleHQoKSwgbW9kdWxlLmdldERvY3VtZW50QmFzZSgpLCBtb2R1bGUuZ2V0TWVtZW50bygpLCBtb2R1bGUuaXNSZWxvYWRhYmxlKCkpOwotCQkJCX0KLQkJCX0pOwotCQl3aHMuc2V0SGVscChwYXRoLCBDb250ZXh0SWRzLkNPTkZJR1VSQVRJT05fRURJVE9SX1dFQk1PRFVMRV9ESUFMT0dfUEFUSCk7Ci0JCQotCQluZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSkuc2V0VGV4dCgiIik7Ci0JCQotCQlpZiAoIWlzUHJvamVjdCkgewotCQkJLy8gYXV0byByZWxvYWQKLQkJCW5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKS5zZXRUZXh0KCIiKTsKLQkJCWZpbmFsIEJ1dHRvbiByZWxvYWRhYmxlID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0JCQlyZWxvYWRhYmxlLnNldFRleHQoTWVzc2FnZXMuY29uZmlndXJhdGlvbkVkaXRvcldlYk1vZHVsZURpYWxvZ1JlbG9hZEVuYWJsZWQpOwotCQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQkJcmVsb2FkYWJsZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkJcmVsb2FkYWJsZS5zZXRTZWxlY3Rpb24obW9kdWxlLmlzUmVsb2FkYWJsZSgpKTsKLQkJCXJlbG9hZGFibGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQltb2R1bGUgPSBuZXcgV2ViTW9kdWxlKG1vZHVsZS5nZXRQYXRoKCksIG1vZHVsZS5nZXREb2N1bWVudEJhc2UoKSwgbW9kdWxlLmdldE1lbWVudG8oKSwgcmVsb2FkYWJsZS5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJfQotCQkJfSk7Ci0JCQl3aHMuc2V0SGVscChyZWxvYWRhYmxlLCBDb250ZXh0SWRzLkNPTkZJR1VSQVRJT05fRURJVE9SX1dFQk1PRFVMRV9ESUFMT0dfUkVMT0FEKTsKLQkJfQotCQkKLQkJaWYgKCFpc0VkaXQgJiYgaXNQcm9qZWN0KSB7Ci0JCQlwcm9qVGFibGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCUlNb2R1bGUgbW9kdWxlMyA9IChJTW9kdWxlKSBwcm9qVGFibGUuZ2V0U2VsZWN0aW9uKClbMF0uZ2V0RGF0YSgpOwotCQkJCQkJSVdlYk1vZHVsZSBtb2R1bGUyID0gKElXZWJNb2R1bGUpIG1vZHVsZTMubG9hZEFkYXB0ZXIoSVdlYk1vZHVsZS5jbGFzcywgbnVsbCk7Ci0JCQkJCQlTdHJpbmcgY29udGV4dFJvb3QgPSBtb2R1bGUyLmdldENvbnRleHRSb290KCk7Ci0JCQkJCQlpZiAoY29udGV4dFJvb3QgIT0gbnVsbCAmJiAhY29udGV4dFJvb3Quc3RhcnRzV2l0aCgiLyIpICYmIGNvbnRleHRSb290Lmxlbmd0aCgpID4gMCkKLQkJCQkJCQljb250ZXh0Um9vdCA9ICIvIiArIGNvbnRleHRSb290OwotCQkJCQkJbW9kdWxlID0gbmV3IFdlYk1vZHVsZShjb250ZXh0Um9vdCwgbW9kdWxlMy5nZXROYW1lKCksIG1vZHVsZTMuZ2V0SWQoKSwgbW9kdWxlLmlzUmVsb2FkYWJsZSgpKTsKLQkJCQkJCWRvY0Jhc2Uuc2V0VGV4dChtb2R1bGUzLmdldE5hbWUoKSk7Ci0JCQkJCQlwYXRoLnNldFRleHQoY29udGV4dFJvb3QpOwotCQkJCQkJbW9kdWxlNCA9IG1vZHVsZTM7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBpZ25vcmUKLQkJCQkJfQotCQkJCQl2YWxpZGF0ZSgpOwotCQkJCX0KLQkJCX0pOwotCQkJbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpLnNldFRleHQoIiIpOwotCQl9Ci0JCi0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQoY29tcG9zaXRlKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29udHJvbCBjb250cm9sID0gc3VwZXIuY3JlYXRlQnV0dG9uQmFyKHBhcmVudCk7Ci0JCXZhbGlkYXRlKCk7Ci0KLQkJcmV0dXJuIGNvbnRyb2w7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGUoKSB7Ci0JCWJvb2xlYW4gb2sgPSB0cnVlOwotCQlpZiAobW9kdWxlLmdldERvY3VtZW50QmFzZSgpID09IG51bGwgfHwgbW9kdWxlLmdldERvY3VtZW50QmFzZSgpLmxlbmd0aCgpIDwgMSkKLQkJCW9rID0gZmFsc2U7Ci0JCQotCQlnZXRCdXR0b24oSURpYWxvZ0NvbnN0YW50cy5PS19JRCkuc2V0RW5hYmxlZChvayk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBtaW1lIG1hcHBpbmcuCi0JICoKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LldlYk1vZHVsZQotCSAqLwotCXB1YmxpYyBXZWJNb2R1bGUgZ2V0V2ViTW9kdWxlKCkgewotCQlyZXR1cm4gbW9kdWxlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDFhMDNjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzamF2YXVpLyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvLmN2c2lnbm9yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTk5N2RkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1iaW4KLWJ1aWxkLnhtbAotb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aV8zLjAuMC5qYXIKLXNqYXZhdWkuamFyCi10ZW1wLmZvbGRlcgotQGRvdAotc3JjLnppcApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpLy5vcHRpb25zIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpLy5vcHRpb25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzQ3ZDY5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotIyBEZWJ1Z2dpbmcgb3B0aW9ucyBmb3IgdGhlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkgcGx1Z2luCi0KLSMgVHVybiBvbiBnZW5lcmFsIGRlYnVnZ2luZwotb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9kZWJ1Zz10cnVlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiZDgzNWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LnNlcnZlci51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmZWRhNWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWk7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS5pbnRlcm5hbC5KYXZhU2VydmVyVUlQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkuaW50ZXJuYWw7eC1pbnRlcm5hbDo9dHJ1ZQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcywKLSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLAotIG9yZy5lY2xpcHNlLmRlYnVnLnVpLAotIG9yZy5lY2xpcHNlLnVpLAotIG9yZy5lY2xpcHNlLmpkdC5jb3JlLAotIG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcsCi0gb3JnLmVjbGlwc2UuamR0Lmp1bml0LAotIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZSwKLSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLAotIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZSwKLSBvcmcuZWNsaXBzZS51aS5pZGUsCi0gb3JnLmVjbGlwc2UuamR0LnVpLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aQotRWNsaXBzZS1BdXRvU3RhcnQ6IHRydWUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9hYm91dC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNmI5NmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+RmVicnVhcnkgMjQsIDIwMDU8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyY2MxYjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbAotYmluLmV4Y2x1ZGVzID0gYmluLyoqLFwKLSAgICAgICAgICAgICAgIEBkb3QvKiosXAotICAgICAgICAgICAgICAgdGVtcC5mb2xkZXIvKioKLXNyYy5pbmNsdWRlcyA9IHNjaGVtYS8KLXNvdXJjZS4uID0gc2phdmF1aS8KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9pY29ucy9vYmoxNi9hcHBjbGllbnRfbW9kdWxlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9pY29ucy9vYmoxNi9hcHBjbGllbnRfbW9kdWxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQyMzU3OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvYXBwY2xpZW50X21vZHVsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvZWFyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9pY29ucy9vYmoxNi9lYXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTYzMGIzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9pY29ucy9vYmoxNi9lYXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpL2ljb25zL29iajE2L2VqYl9tb2R1bGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpL2ljb25zL29iajE2L2VqYl9tb2R1bGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGI1YzBhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9pY29ucy9vYmoxNi9lamJfbW9kdWxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9pY29ucy9vYmoxNi9qYXZhX2phci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvamF2YV9qYXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDU5Zjg2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9pY29ucy9vYmoxNi9qYXZhX2phci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvanJlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9pY29ucy9vYmoxNi9qcmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjU1ZTMzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9pY29ucy9vYmoxNi9qcmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpL2ljb25zL29iajE2L25ld190ZXN0Y2FzZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvbmV3X3Rlc3RjYXNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZmOTNjYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvbmV3X3Rlc3RjYXNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9pY29ucy9vYmoxNi93ZWJfbW9kdWxlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9pY29ucy9vYmoxNi93ZWJfbW9kdWxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmYyMGY3MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvd2ViX21vZHVsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvaWNvbnMvd2l6YmFuL25ld19ydW50aW1lX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvaWNvbnMvd2l6YmFuL25ld19ydW50aW1lX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwZGU5MWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpL2ljb25zL3dpemJhbi9uZXdfcnVudGltZV93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpL2ljb25zL3dpemJhbi9uZXdfdGVzdF93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpL2ljb25zL3dpemJhbi9uZXdfdGVzdF93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTcxZTk1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9pY29ucy93aXpiYW4vbmV3X3Rlc3Rfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9wbHVnaW4ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI0ZGI5Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcGx1Z2luTmFtZT1KYXZhIFNlcnZlciBVSSBTdXBwb3J0Ci1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotY2xhc3NwYXRoQ29udGFpbmVyPVNlcnZlciBSdW50aW1lCi0KLWNhY3R1c0pVbml0Q2xpZW50PUpVbml0IENsaWVudAotY2FjdHVzU2VydmxldFRlc3RDYXNlPVNlcnZsZXQgVGVzdCBDYXNlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvcGx1Z2luLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWI1ODMwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLQotPHBsdWdpbj4KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5zZXJ2ZXJJbWFnZXMiPgotICAgICA8aW1hZ2UKLSAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIiCi0gICAgICAgIHR5cGVJZHM9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5ydW50aW1lVHlwZSIKLSAgICAgICAgaWNvbj0iaWNvbnMvb2JqMTYvamF2YV9qYXIuZ2lmIi8+Ci0gICAgIDxpbWFnZQotICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlciIKLSAgICAgICAgdHlwZUlkcz0ianN0LndlYiIKLSAgICAgICAgaWNvbj0iaWNvbnMvb2JqMTYvd2ViX21vZHVsZS5naWYiLz4KLSAgICAgPGltYWdlCi0gICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyIgotICAgICAgICB0eXBlSWRzPSJqc3QuZWpiIgotICAgICAgICBpY29uPSJpY29ucy9vYmoxNi9lamJfbW9kdWxlLmdpZiIvPgotICAgICA8aW1hZ2UKLSAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIiCi0gICAgICAgIHR5cGVJZHM9ImpzdC5lYXIiCi0gICAgICAgIGljb249Imljb25zL29iajE2L2Vhci5naWYiLz4KLSAgICAgPGltYWdlCi0gICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyIgotICAgICAgICB0eXBlSWRzPSJqc3QuYXBwY2xpZW50IgotICAgICAgICBpY29uPSJpY29ucy9vYmoxNi9hcHBjbGllbnRfbW9kdWxlLmdpZiIvPgotICAgICA8aW1hZ2UKLSAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIiCi0gICAgICAgIHR5cGVJZHM9ImpzdC5jb25uZWN0b3IiCi0gICAgICAgIGljb249Imljb25zL29iajE2L2phdmFfamFyLmdpZiIvPgotICAgICA8aW1hZ2UKLSAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIiCi0gICAgICAgIHR5cGVJZHM9ImpzdC51dGlsaXR5IgotICAgICAgICBpY29uPSJpY29ucy9vYmoxNi9qYXZhX2phci5naWYiLz4KLSAgPC9leHRlbnNpb24+Ci0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmRGcmFnbWVudHMiPgotICAgICA8ZnJhZ21lbnQKLSAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5ydW50aW1lVHlwZSIKLSAgICAgICAgdHlwZUlkcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLnJ1bnRpbWVUeXBlIgotICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS5pbnRlcm5hbC5HZW5lcmljUnVudGltZVdpemFyZEZyYWdtZW50Ii8+Ci0gIDwvZXh0ZW5zaW9uPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5jbGllbnRzIj4KLSAgICAgPGNsaWVudAotICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5jYWN0dXMuY2xpZW50IgotICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS5pbnRlcm5hbC5jYWN0dXMuSlVuaXRDbGllbnREZWxlZ2F0ZSIKLSAgICAgICAgbGF1bmNoYWJsZT0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5jYWN0dXMubGF1bmNoYWJsZSIKLSAgICAgICAgbmFtZT0iJWNhY3R1c0pVbml0Q2xpZW50Ii8+Ci0gIDwvZXh0ZW5zaW9uPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm5ld1dpemFyZHMiPgotICAgICA8d2l6YXJkCi0gICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpLmludGVybmFsLmNhY3R1cy5OZXdTZXJ2bGV0VGVzdENhc2VXaXphcmQiCi0gICAgICAgIGNhbkZpbmlzaEVhcmx5PSJmYWxzZSIKLSAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmpkdC51aS5qYXZhL29yZy5lY2xpcHNlLmpkdC5qdW5pdCIKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuY2FjdHVzLk5ld1NlcnZsZXRUZXN0Q2FzZVdpemFyZCIKLSAgICAgICAgaGFzUGFnZXM9InRydWUiCi0gICAgICAgIGljb249Imljb25zL29iajE2L25ld190ZXN0Y2FzZS5naWYiCi0gICAgICAgIG5hbWU9IiVjYWN0dXNTZXJ2bGV0VGVzdENhc2UiLz4KLSAgPC9leHRlbnNpb24+Ci0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZXMiPgotICAgIDxhZGFwdGVyPgotICAgICAgPHJ1bnRpbWUtY29tcG9uZW50IGlkPSJzdGFuZGFyZC5qcmUiLz4KLSAgICAgIDxmYWN0b3J5IGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpLmludGVybmFsLlN0YW5kYXJkSnJlTGFiZWxQcm92aWRlciRGYWN0b3J5Ii8+Ci0gICAgICA8dHlwZSBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLklSdW50aW1lQ29tcG9uZW50TGFiZWxQcm92aWRlciIvPgotICAgIDwvYWRhcHRlcj4KLSAgPC9leHRlbnNpb24+Ci0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLmltYWdlcyI+Ci0gICAgPGltYWdlIHJ1bnRpbWUtY29tcG9uZW50LXR5cGU9InN0YW5kYXJkLmpyZSIKLSAgICAgICBwYXRoPSJpY29ucy9vYmoxNi9qcmUuZ2lmIi8+Ci0gICAgPGltYWdlIHJ1bnRpbWUtY29tcG9uZW50LXR5cGU9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5ydW50aW1lVHlwZSIKLSAgICAgICBwYXRoPSJpY29ucy9vYmoxNi9qYXZhX2phci5naWYiLz4KLSAgPC9leHRlbnNpb24+Ci0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuamR0LnVpLmNsYXNzcGF0aENvbnRhaW5lclBhZ2UiPgotICAgIDxjbGFzc3BhdGhDb250YWluZXJQYWdlCi0gICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5jb250YWluZXIiCi0gICAgICAgbmFtZT0iJWNsYXNzcGF0aENvbnRhaW5lciIKLSAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS5pbnRlcm5hbC5TZXJ2ZXJDbGFzc3BhdGhDb250YWluZXJQYWdlIj4KLSAgICA8L2NsYXNzcGF0aENvbnRhaW5lclBhZ2U+Ci0gIDwvZXh0ZW5zaW9uPgotPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpL3NqYXZhdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZlci91aS9pbnRlcm5hbC9Db250ZXh0SWRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvc2phdmF1aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3VpL2ludGVybmFsL0NvbnRleHRJZHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmVlMGQzNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvc2phdmF1aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3VpL2ludGVybmFsL0NvbnRleHRJZHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS5pbnRlcm5hbDsKLS8qKgotICogQ29udGV4dCBoZWxwIGlkIGNvbnN0YW50cy4KLSAqLwotcHVibGljIGludGVyZmFjZSBDb250ZXh0SWRzIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSVU5USU1FX0NPTVBPU0lURSA9IEphdmFTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLmp2cnQwMDAwIjsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvc2phdmF1aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3VpL2ludGVybmFsL0dlbmVyaWNSdW50aW1lQ29tcG9zaXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvc2phdmF1aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3VpL2ludGVybmFsL0dlbmVyaWNSdW50aW1lQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViNzI3MjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpL3NqYXZhdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZlci91aS9pbnRlcm5hbC9HZW5lcmljUnVudGltZUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWVXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLndpemFyZC5JV2l6YXJkSGFuZGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CdXN5SW5kaWNhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLklWTUluc3RhbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JVk1JbnN0YWxsVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkphdmFSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSU1lc3NhZ2VQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5HZW5lcmljUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuSUdlbmVyaWNSdW50aW1lV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLS8qKgotICogV2l6YXJkIHBhZ2UgdG8gc2V0IHRoZSBzZXJ2ZXIgaW5zdGFsbCBkaXJlY3RvcnkuCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmljUnVudGltZUNvbXBvc2l0ZSBleHRlbmRzIENvbXBvc2l0ZSB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5TVEFMTEVEX0pSRV9QUkVGRVJFTkNFX1BBR0VfSUQgPSAib3JnLmVjbGlwc2UuamR0LmRlYnVnLnVpLnByZWZlcmVuY2VzLlZNUHJlZmVyZW5jZVBhZ2UiOwotCXByb3RlY3RlZCBJUnVudGltZVdvcmtpbmdDb3B5IHJ1bnRpbWVXQzsKLQlwcm90ZWN0ZWQgSUdlbmVyaWNSdW50aW1lV29ya2luZ0NvcHkgcnVudGltZTsKLQkKLQlwcm90ZWN0ZWQgSVdpemFyZEhhbmRsZSB3aXphcmQ7Ci0JCi0JcHJvdGVjdGVkIFRleHQgbmFtZTsKLQlwcm90ZWN0ZWQgVGV4dCBpbnN0YWxsRGlyOwotCXByb3RlY3RlZCBDb21ibyBjb21ibzsKLQlwcm90ZWN0ZWQgTGlzdCBpbnN0YWxsZWRKUkVzOwotCXByb3RlY3RlZCBTdHJpbmdbXSBqcmVOYW1lczsKLQotCS8qKgotCSAqIEdlbmVyaWNSdW50aW1lQ29tcG9zaXRlIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHJvdGVjdGVkIEdlbmVyaWNSdW50aW1lQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIElXaXphcmRIYW5kbGUgd2l6YXJkKSB7Ci0JCXN1cGVyKHBhcmVudCwgU1dULk5PTkUpOwotCQl0aGlzLndpemFyZCA9IHdpemFyZDsKLQkJCi0JCXdpemFyZC5zZXRUaXRsZShNZXNzYWdlcy5ydW50aW1lVHlwZVRpdGxlKTsKLQkJd2l6YXJkLnNldERlc2NyaXB0aW9uKE1lc3NhZ2VzLnJ1bnRpbWVUeXBlRGVzY3JpcHRpb24pOwotCQl3aXphcmQuc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX1dJWl9SVU5USU1FX1RZUEUpKTsKLQkJCi0JCWNyZWF0ZUNvbnRyb2woKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRSdW50aW1lKElSdW50aW1lV29ya2luZ0NvcHkgbmV3UnVudGltZSkgewotCQlpZiAobmV3UnVudGltZSA9PSBudWxsKSB7Ci0JCQlydW50aW1lV0MgPSBudWxsOwotCQkJcnVudGltZSA9IG51bGw7Ci0JCX0gZWxzZSB7Ci0JCQlydW50aW1lV0MgPSBuZXdSdW50aW1lOwotCQkJcnVudGltZSA9IChJR2VuZXJpY1J1bnRpbWVXb3JraW5nQ29weSkgbmV3UnVudGltZS5nZXRBZGFwdGVyKElHZW5lcmljUnVudGltZVdvcmtpbmdDb3B5LmNsYXNzKTsKLQkJfQotCQkKLQkJaW5pdCgpOwotCQl2YWxpZGF0ZSgpOwotCX0KLQotCS8qKgotCSAqIFByb3ZpZGUgYSB3aXphcmQgcGFnZSB0byBjaGFuZ2UgdGhlIHJvb3QgZGlyZWN0b3J5LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRyb2woKSB7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlzZXRMYXlvdXQobGF5b3V0KTsKLQkJc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodGhpcywgQ29udGV4dElkcy5SVU5USU1FX0NPTVBPU0lURSk7Ci0JCQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbCh0aGlzLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoTWVzc2FnZXMucnVudGltZVR5cGVOYW1lKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCi0JCW5hbWUgPSBuZXcgVGV4dCh0aGlzLCBTV1QuQk9SREVSKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQluYW1lLnNldExheW91dERhdGEoZGF0YSk7Ci0JCW5hbWUuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJcnVudGltZVdDLnNldE5hbWUobmFtZS5nZXRUZXh0KCkpOwotCQkJCXZhbGlkYXRlKCk7Ci0JCQl9Ci0JCX0pOwotCQotCQlsYWJlbCA9IG5ldyBMYWJlbCh0aGlzLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoTWVzc2FnZXMucnVudGltZVR5cGVMb2NhdGlvbik7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCi0JCWluc3RhbGxEaXIgPSBuZXcgVGV4dCh0aGlzLCBTV1QuQk9SREVSKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlpbnN0YWxsRGlyLnNldExheW91dERhdGEoZGF0YSk7Ci0JCWluc3RhbGxEaXIuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJcnVudGltZVdDLnNldExvY2F0aW9uKG5ldyBQYXRoKGluc3RhbGxEaXIuZ2V0VGV4dCgpKSk7Ci0JCQkJdmFsaWRhdGUoKTsKLQkJCX0KLQkJfSk7Ci0JCi0JCUJ1dHRvbiBicm93c2UgPSBTV1RVdGlsLmNyZWF0ZUJ1dHRvbih0aGlzLCBNZXNzYWdlcy5icm93c2UpOwotCQlicm93c2UuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBzZSkgewotCQkJCURpcmVjdG9yeURpYWxvZyBkaWFsb2cgPSBuZXcgRGlyZWN0b3J5RGlhbG9nKEdlbmVyaWNSdW50aW1lQ29tcG9zaXRlLnRoaXMuZ2V0U2hlbGwoKSk7Ci0JCQkJZGlhbG9nLnNldE1lc3NhZ2UoTWVzc2FnZXMucnVudGltZVR5cGVTZWxlY3RMb2NhdGlvbik7Ci0JCQkJZGlhbG9nLnNldEZpbHRlclBhdGgoaW5zdGFsbERpci5nZXRUZXh0KCkpOwotCQkJCVN0cmluZyBzZWxlY3RlZERpcmVjdG9yeSA9IGRpYWxvZy5vcGVuKCk7Ci0JCQkJaWYgKHNlbGVjdGVkRGlyZWN0b3J5ICE9IG51bGwpCi0JCQkJCWluc3RhbGxEaXIuc2V0VGV4dChzZWxlY3RlZERpcmVjdG9yeSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJdXBkYXRlSlJFcygpOwotCQkKLQkJLy8gSkRLIGxvY2F0aW9uCi0JCWxhYmVsID0gbmV3IExhYmVsKHRoaXMsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChNZXNzYWdlcy5ydW50aW1lVHlwZUpSRSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQljb21ibyA9IG5ldyBDb21ibyh0aGlzLCBTV1QuRFJPUF9ET1dOIHwgU1dULlJFQURfT05MWSk7Ci0JCWNvbWJvLnNldEl0ZW1zKGpyZU5hbWVzKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQljb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkKLQkJY29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWludCBzZWwgPSBjb21iby5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQkJCUlWTUluc3RhbGwgdm1JbnN0YWxsID0gbnVsbDsKLQkJCQlpZiAoc2VsID4gMCkKLQkJCQkJdm1JbnN0YWxsID0gKElWTUluc3RhbGwpIGluc3RhbGxlZEpSRXMuZ2V0KHNlbCAtIDEpOwotCQkJCQotCQkJCXJ1bnRpbWUuc2V0Vk1JbnN0YWxsKHZtSW5zdGFsbCk7Ci0JCQkJdmFsaWRhdGUoKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQl3aWRnZXRTZWxlY3RlZChlKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlCdXR0b24gYnV0dG9uID0gU1dUVXRpbC5jcmVhdGVCdXR0b24odGhpcywgTWVzc2FnZXMucnVudGltZVR5cGVJbnN0YWxsZWRKUkVzKTsKLQkJYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCVN0cmluZyBjdXJyZW50Vk0gPSBjb21iby5nZXRUZXh0KCk7Ci0JCQkJaWYgKHNob3dQcmVmZXJlbmNlUGFnZSgpKSB7Ci0JCQkJCXVwZGF0ZUpSRXMoKTsKLQkJCQkJY29tYm8uc2V0SXRlbXMoanJlTmFtZXMpOwotCQkJCQljb21iby5zZXRUZXh0KGN1cnJlbnRWTSk7Ci0JCQkJCWlmIChjb21iby5nZXRTZWxlY3Rpb25JbmRleCgpID09IC0xKQotCQkJCQkJY29tYm8uc2VsZWN0KDApOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCQotCQlpbml0KCk7Ci0JCXZhbGlkYXRlKCk7Ci0KLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udCh0aGlzKTsKLQotCQluYW1lLmZvcmNlRm9jdXMoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlSlJFcygpIHsKLQkJLy8gZ2V0IGFsbCBpbnN0YWxsZWQgSlZNcwotCQlpbnN0YWxsZWRKUkVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlJVk1JbnN0YWxsVHlwZVtdIHZtSW5zdGFsbFR5cGVzID0gSmF2YVJ1bnRpbWUuZ2V0Vk1JbnN0YWxsVHlwZXMoKTsKLQkJaW50IHNpemUgPSB2bUluc3RhbGxUeXBlcy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlJVk1JbnN0YWxsW10gdm1JbnN0YWxscyA9IHZtSW5zdGFsbFR5cGVzW2ldLmdldFZNSW5zdGFsbHMoKTsKLQkJCWludCBzaXplMiA9IHZtSW5zdGFsbHMubGVuZ3RoOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBzaXplMjsgaisrKSB7Ci0JCQkJaW5zdGFsbGVkSlJFcy5hZGQodm1JbnN0YWxsc1tqXSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIGdldCBuYW1lcwotCQlzaXplID0gaW5zdGFsbGVkSlJFcy5zaXplKCk7Ci0JCWpyZU5hbWVzID0gbmV3IFN0cmluZ1tzaXplKzFdOwotCQlqcmVOYW1lc1swXSA9IE1lc3NhZ2VzLnJ1bnRpbWVUeXBlRGVmYXVsdEpSRTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCUlWTUluc3RhbGwgdm1JbnN0YWxsID0gKElWTUluc3RhbGwpIGluc3RhbGxlZEpSRXMuZ2V0KGkpOwotCQkJanJlTmFtZXNbaSsxXSA9IHZtSW5zdGFsbC5nZXROYW1lKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG93UHJlZmVyZW5jZVBhZ2UoKSB7Ci0JCVByZWZlcmVuY2VNYW5hZ2VyIG1hbmFnZXIgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFByZWZlcmVuY2VNYW5hZ2VyKCk7Ci0JCUlQcmVmZXJlbmNlTm9kZSBub2RlID0gbWFuYWdlci5maW5kKCJvcmcuZWNsaXBzZS5qZHQudWkucHJlZmVyZW5jZXMuSmF2YUJhc2VQcmVmZXJlbmNlUGFnZSIpLmZpbmRTdWJOb2RlKCJvcmcuZWNsaXBzZS5qZHQuZGVidWcudWkucHJlZmVyZW5jZXMuVk1QcmVmZXJlbmNlUGFnZSIpOwotCQlQcmVmZXJlbmNlTWFuYWdlciBtYW5hZ2VyMiA9IG5ldyBQcmVmZXJlbmNlTWFuYWdlcigpOwotCQltYW5hZ2VyMi5hZGRUb1Jvb3Qobm9kZSk7Ci0JCWZpbmFsIFByZWZlcmVuY2VEaWFsb2cgZGlhbG9nID0gbmV3IFByZWZlcmVuY2VEaWFsb2coZ2V0U2hlbGwoKSwgbWFuYWdlcjIpOwotCQlmaW5hbCBib29sZWFuW10gcmVzdWx0ID0gbmV3IGJvb2xlYW5bXSB7IGZhbHNlIH07Ci0JCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGdldERpc3BsYXkoKSwgbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWRpYWxvZy5jcmVhdGUoKTsKLQkJCQlpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spCi0JCQkJCXJlc3VsdFswXSA9IHRydWU7Ci0JCQl9Ci0JCX0pOwotCQlyZXR1cm4gcmVzdWx0WzBdOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0KCkgewotCQlpZiAoaW5zdGFsbERpciA9PSBudWxsIHx8IHJ1bnRpbWUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCW5hbWUuc2V0VGV4dChydW50aW1lV0MuZ2V0TmFtZSgpKTsKLQkJCi0JCWlmIChydW50aW1lV0MuZ2V0TG9jYXRpb24oKSAhPSBudWxsKQotCQkJaW5zdGFsbERpci5zZXRUZXh0KHJ1bnRpbWVXQy5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKSk7Ci0JCWVsc2UKLQkJCWluc3RhbGxEaXIuc2V0VGV4dCgiIik7Ci0JCQotCQkvLyBzZXQgc2VsZWN0aW9uCi0JCWlmICgoKEdlbmVyaWNSdW50aW1lKXJ1bnRpbWUpLmlzVXNpbmdEZWZhdWx0SlJFKCkpCi0JCQljb21iby5zZWxlY3QoMCk7Ci0JCWVsc2UgewotCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQkJaW50IHNpemUgPSBpbnN0YWxsZWRKUkVzLnNpemUoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJSVZNSW5zdGFsbCB2bUluc3RhbGwgPSAoSVZNSW5zdGFsbCkgaW5zdGFsbGVkSlJFcy5nZXQoaSk7Ci0JCQkJaWYgKHZtSW5zdGFsbC5lcXVhbHMocnVudGltZS5nZXRWTUluc3RhbGwoKSkpIHsKLQkJCQkJY29tYm8uc2VsZWN0KGkgKyAxKTsKLQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCWlmICghZm91bmQpCi0JCQkJY29tYm8uc2VsZWN0KDApOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGUoKSB7Ci0JCWlmIChydW50aW1lID09IG51bGwpIHsKLQkJCXdpemFyZC5zZXRNZXNzYWdlKCIiLCBJTWVzc2FnZVByb3ZpZGVyLkVSUk9SKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCUlTdGF0dXMgc3RhdHVzID0gcnVudGltZVdDLnZhbGlkYXRlKG51bGwpOwotCQlpZiAoc3RhdHVzID09IG51bGwgfHwgc3RhdHVzLmlzT0soKSkKLQkJCXdpemFyZC5zZXRNZXNzYWdlKG51bGwsIElNZXNzYWdlUHJvdmlkZXIuTk9ORSk7Ci0JCWVsc2UKLQkJCXdpemFyZC5zZXRNZXNzYWdlKHN0YXR1cy5nZXRNZXNzYWdlKCksIElNZXNzYWdlUHJvdmlkZXIuRVJST1IpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvc2phdmF1aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3VpL2ludGVybmFsL0dlbmVyaWNSdW50aW1lV2l6YXJkRnJhZ21lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9zamF2YXVpL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvR2VuZXJpY1J1bnRpbWVXaXphcmRGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmE5MTgwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9zamF2YXVpL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvR2VuZXJpY1J1bnRpbWVXaXphcmRGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuSVdpemFyZEhhbmRsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLndpemFyZC5XaXphcmRGcmFnbWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmljUnVudGltZVdpemFyZEZyYWdtZW50IGV4dGVuZHMgV2l6YXJkRnJhZ21lbnQgewotCXByb3RlY3RlZCBHZW5lcmljUnVudGltZUNvbXBvc2l0ZSBjb21wOwotCQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBmcmFnbWVudC4KLQkgKi8KLQlwdWJsaWMgR2VuZXJpY1J1bnRpbWVXaXphcmRGcmFnbWVudCgpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIEBzZWUgV2l6YXJkRnJhZ21lbnQjaGFzQ29tcG9zaXRlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDb21wb3NpdGUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgV2l6YXJkRnJhZ21lbnQjY3JlYXRlQ29tcG9zaXRlKENvbXBvc2l0ZSwgSVdpemFyZEhhbmRsZSkKLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlIGNyZWF0ZUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBJV2l6YXJkSGFuZGxlIHdpemFyZCkgewotCQljb21wID0gbmV3IEdlbmVyaWNSdW50aW1lQ29tcG9zaXRlKHBhcmVudCwgd2l6YXJkKTsKLQkJcmV0dXJuIGNvbXA7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBXaXphcmRGcmFnbWVudCNpc0NvbXBsZXRlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NvbXBsZXRlKCkgewotCQlJUnVudGltZVdvcmtpbmdDb3B5IHJ1bnRpbWUgPSAoSVJ1bnRpbWVXb3JraW5nQ29weSkgZ2V0VGFza01vZGVsKCkuZ2V0T2JqZWN0KFRhc2tNb2RlbC5UQVNLX1JVTlRJTUUpOwotCQkKLQkJaWYgKHJ1bnRpbWUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJSVN0YXR1cyBzdGF0dXMgPSBydW50aW1lLnZhbGlkYXRlKG51bGwpOwotCQlyZXR1cm4gKHN0YXR1cyAhPSBudWxsICYmIHN0YXR1cy5pc09LKCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgV2l6YXJkRnJhZ21lbnQjZW50ZXIoKQotCSAqLwotCXB1YmxpYyB2b2lkIGVudGVyKCkgewotCQlpZiAoY29tcCAhPSBudWxsKSB7Ci0JCQlJUnVudGltZVdvcmtpbmdDb3B5IHJ1bnRpbWUgPSAoSVJ1bnRpbWVXb3JraW5nQ29weSkgZ2V0VGFza01vZGVsKCkuZ2V0T2JqZWN0KFRhc2tNb2RlbC5UQVNLX1JVTlRJTUUpOwotCQkJY29tcC5zZXRSdW50aW1lKHJ1bnRpbWUpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9zamF2YXVpL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvSW1hZ2VSZXNvdXJjZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpL3NqYXZhdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZlci91aS9pbnRlcm5hbC9JbWFnZVJlc291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MDM0NDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpL3NqYXZhdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZlci91aS9pbnRlcm5hbC9JbWFnZVJlc291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VSZWdpc3RyeTsKLS8qKgotICogVXRpbGl0eSBjbGFzcyB0byBoYW5kbGUgaW1hZ2UgcmVzb3VyY2VzLgotICovCi1wdWJsaWMgY2xhc3MgSW1hZ2VSZXNvdXJjZSB7Ci0JLy8gdGhlIGltYWdlIHJlZ2lzdHJ5Ci0JcHJpdmF0ZSBzdGF0aWMgSW1hZ2VSZWdpc3RyeSBpbWFnZVJlZ2lzdHJ5OwotCi0JLy8gbWFwIG9mIGltYWdlIGRlc2NyaXB0b3JzIHNpbmNlIHRoZXNlCi0JLy8gd2lsbCBiZSBsb3N0IGJ5IHRoZSBpbWFnZSByZWdpc3RyeQotCXByaXZhdGUgc3RhdGljIE1hcCBpbWFnZURlc2NyaXB0b3JzOwotCi0JLy8gbWFwIG9mIElFbGVtZW50IGltYWdlcwotCXByaXZhdGUgc3RhdGljIE1hcCBlbGVtZW50SW1hZ2VzOwotCi0JLy8gYmFzZSB1cmxzIGZvciBpbWFnZXMKLQlwcml2YXRlIHN0YXRpYyBVUkwgSUNPTl9CQVNFX1VSTDsKLQotCXN0YXRpYyB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgcGF0aFN1ZmZpeCA9ICJpY29ucy8iOwotCQkJSUNPTl9CQVNFX1VSTCA9IEphdmFTZXJ2ZXJVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEJ1bmRsZSgpLmdldEVudHJ5KHBhdGhTdWZmaXgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IHNldCBpY29uIGJhc2UgVVJMIiwgZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMX1dJWkJBTiA9ICJ3aXpiYW4vIjsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19XSVpfUlVOVElNRV9UWVBFID0gIndpel9ydW50aW1lVHlwZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1dJWl9DQUNUVVNfVEVTVCA9ICJ3aXpfY2FjdHVzX3Rlc3QiOwotCi0JLyoqCi0JICogQ2Fubm90IGNvbnN0cnVjdCBhbiBJbWFnZVJlc291cmNlLiBVc2Ugc3RhdGljIG1ldGhvZHMgb25seS4KLQkgKi8KLQlwcml2YXRlIEltYWdlUmVzb3VyY2UoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBEaXNwb3NlIG9mIGVsZW1lbnQgaW1hZ2VzIHRoYXQgd2VyZSBjcmVhdGVkLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBkaXNwb3NlKCkgewotCQl0cnkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiRGlzcG9zaW5nIG9mIGVsZW1lbnQgaW1hZ2VzIik7Ci0JCQlJdGVyYXRvciBpdGVyYXRvciA9IGVsZW1lbnRJbWFnZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlJbWFnZSBpbWFnZSA9IChJbWFnZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCWltYWdlLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJDb3VsZCBub3QgZGlzcG9zZSBvZiBpbWFnZXMiKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGltYWdlIHdpdGggdGhlIGdpdmVuIGtleS4KLQkgKgotCSAqIEBwYXJhbSBrZXkgamF2YS5sYW5nLlN0cmluZwotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlCi0JICovCi0JcHVibGljIHN0YXRpYyBJbWFnZSBnZXRJbWFnZShTdHJpbmcga2V5KSB7Ci0JCWlmIChpbWFnZVJlZ2lzdHJ5ID09IG51bGwpCi0JCQlpbml0aWFsaXplSW1hZ2VSZWdpc3RyeSgpOwotCQlyZXR1cm4gaW1hZ2VSZWdpc3RyeS5nZXQoa2V5KTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbWFnZSBkZXNjcmlwdG9yIHdpdGggdGhlIGdpdmVuIGtleS4KLQkgKgotCSAqIEBwYXJhbSBrZXkgamF2YS5sYW5nLlN0cmluZwotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBrZXkpIHsKLQkJaWYgKGltYWdlUmVnaXN0cnkgPT0gbnVsbCkKLQkJCWluaXRpYWxpemVJbWFnZVJlZ2lzdHJ5KCk7Ci0JCXJldHVybiAoSW1hZ2VEZXNjcmlwdG9yKSBpbWFnZURlc2NyaXB0b3JzLmdldChrZXkpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemUgdGhlIGltYWdlIHJlc291cmNlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgaW5pdGlhbGl6ZUltYWdlUmVnaXN0cnkoKSB7Ci0JCWltYWdlUmVnaXN0cnkgPSBuZXcgSW1hZ2VSZWdpc3RyeSgpOwotCQlpbWFnZURlc2NyaXB0b3JzID0gbmV3IEhhc2hNYXAoKTsKLQkKLQkJcmVnaXN0ZXJJbWFnZShJTUdfV0laX1JVTlRJTUVfVFlQRSwgVVJMX1dJWkJBTiArICJuZXdfcnVudGltZV93aXouZ2lmIik7Ci0JCXJlZ2lzdGVySW1hZ2UoSU1HX1dJWl9DQUNUVVNfVEVTVCwgVVJMX1dJWkJBTiArICJuZXdfdGVzdF93aXouZ2lmIik7Ci0JfQotCi0JLyoqCi0JICogUmVnaXN0ZXIgYW4gaW1hZ2Ugd2l0aCB0aGUgcmVnaXN0cnkuCi0JICoKLQkgKiBAcGFyYW0ga2V5IGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gcGFydGlhbFVSTCBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCByZWdpc3RlckltYWdlKFN0cmluZyBrZXksIFN0cmluZyBwYXJ0aWFsVVJMKSB7Ci0JCXRyeSB7Ci0JCQlJbWFnZURlc2NyaXB0b3IgaWQgPSBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTChuZXcgVVJMKElDT05fQkFTRV9VUkwsIHBhcnRpYWxVUkwpKTsKLQkJCWltYWdlUmVnaXN0cnkucHV0KGtleSwgaWQpOwotCQkJaW1hZ2VEZXNjcmlwdG9ycy5wdXQoa2V5LCBpZCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiRXJyb3IgcmVnaXN0ZXJpbmcgaW1hZ2UgIiArIGtleSArICIgZnJvbSAiICsgcGFydGlhbFVSTCwgZSk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpL3NqYXZhdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZlci91aS9pbnRlcm5hbC9KYXZhU2VydmVyVUlQbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9zamF2YXVpL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvSmF2YVNlcnZlclVJUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3NGE1ZjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpL3NqYXZhdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZlci91aS9pbnRlcm5hbC9KYXZhU2VydmVyVUlQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotLyoqCi0gKiBUaGUgbWFpbiBzZXJ2ZXIgdG9vbGluZyBwbHVnaW4gY2xhc3MuCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhU2VydmVyVUlQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQkvKioKLQkgKiBKYXZhIHNlcnZlciBVSSBwbHVnaW4gaWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UuanN0LnNlcnZlci51aSI7Ci0KLQkvLyBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcwotCXByaXZhdGUgc3RhdGljIEphdmFTZXJ2ZXJVSVBsdWdpbiBzaW5nbGV0b247Ci0KLQkvKioKLQkgKiBDcmVhdGUgdGhlIEphdmFTZXJ2ZXJVSVBsdWdpbi4KLQkgKi8KLQlwdWJsaWMgSmF2YVNlcnZlclVJUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlzaW5nbGV0b24gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIHBsdWdpbi4KLQkgKgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS5KYXZhU2VydmVyVUlQbHVnaW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFTZXJ2ZXJVSVBsdWdpbiBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIHNpbmdsZXRvbjsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBsb2dnaW5nLgotCSAqCi0JICogQHBhcmFtIHQgYSB0aHJvd2FibGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFRocm93YWJsZSB0KSB7Ci0JCWdldEluc3RhbmNlKCkuZ2V0TG9nKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUExVR0lOX0lELCBJU3RhdHVzLkVSUk9SLCAiSW50ZXJuYWwgZXJyb3IiLCB0KSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBhY3RpdmUgd29ya2JlbmNoIHNoZWxsCi0JICogCi0JICogQHJldHVybiB0aGUgYWN0aXZlIHdvcmtiZW5jaCBzaGVsbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU2hlbGwgZ2V0QWN0aXZlV29ya2JlbmNoU2hlbGwoKSB7Ci0JCUlXb3JrYmVuY2hXaW5kb3cgd29ya0JlbmNoV2luZG93ID0gZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCWlmICh3b3JrQmVuY2hXaW5kb3cgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gd29ya0JlbmNoV2luZG93LmdldFNoZWxsKCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGFjdGl2ZSB3b3JrYmVuY2ggd2luZG93Ci0JICogCi0JICogQHJldHVybiB0aGUgYWN0aXZlIHdvcmtiZW5jaCB3aW5kb3cKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIElXb3JrYmVuY2hXaW5kb3cgZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkgewotCQlJV29ya2JlbmNoIHdvcmtCZW5jaD0gZ2V0SW5zdGFuY2UoKS5nZXRXb3JrYmVuY2goKTsKLQkJaWYgKHdvcmtCZW5jaCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiB3b3JrQmVuY2guZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9zamF2YXVpL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvTWVzc2FnZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9zamF2YXVpL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ5MGFmNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvc2phdmF1aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3VpL2ludGVybmFsL01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLaAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLS8qKgotICogVHJhbnNsYXRlZCBtZXNzYWdlcy4KLSAqLwotcHVibGljIGNsYXNzIE1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBydW50aW1lVHlwZVRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJ1bnRpbWVUeXBlRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcnVudGltZVR5cGVOYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJ1bnRpbWVUeXBlTG9jYXRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcnVudGltZVR5cGVTZWxlY3RMb2NhdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBydW50aW1lVHlwZUpSRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBicm93c2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcnVudGltZVR5cGVJbnN0YWxsZWRKUkVzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJ1bnRpbWVUeXBlRGVmYXVsdEpSRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckludGVybmFsQ2FjdHVzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2xhc3NwYXRoQ29udGFpbmVyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNsYXNzcGF0aENvbnRhaW5lckRlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNsYXNzcGF0aENvbnRhaW5lclJ1bnRpbWVMaXN0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTGF1bmNoVGVzdEFjdGlvbl9tZXNzYWdlX3NlbGVjdENvbmZpZ3VyYXRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTGF1bmNoVGVzdEFjdGlvbl9tZXNzYWdlX3NlbGVjdERlYnVnQ29uZmlndXJhdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMYXVuY2hUZXN0QWN0aW9uX21lc3NhZ2Vfc2VsZWN0UnVuQ29uZmlndXJhdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld1NlcnZsZXRUZXN0Q2FzZVdpemFyZF9XaW5kb3dUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdTZXJ2bGV0VGVzdENhc2VXaXphcmRfRXJyb3JNZXNzYWdlVGl0bGVNaXNzaW5nTGlicmFyeTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdTZXJ2bGV0VGVzdENhc2VXaXphcmRfRXJyb3JNZXNzYWdlTWlzc2luZ1R5cGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3U2VydmxldFRlc3RDYXNlV2l6YXJkX0Vycm9yTWVzc2FnZU1pc3NpbmdMaWJyYXJ5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld1NlcnZsZXRUZXN0Q2FzZVdpemFyZF9FcnJvclRpdGxlTmV3OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld1NlcnZsZXRUZXN0Q2FzZVdpemFyZF9FcnJvclRpdGxlQ3JlYXRlT2ZFbGVtZW50RmFpbGVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld1NlcnZsZXRUZXN0Q2FzZVdpemFyZF9FcnJvck1lc3NhZ2VTZWVFcnJvckxvZzsKLQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoSmF2YVNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCArICIuaW50ZXJuYWwuTWVzc2FnZXMiLCBNZXNzYWdlcy5jbGFzcyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9zamF2YXVpL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvTWVzc2FnZXMucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9zamF2YXVpL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvTWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ3ZTRhMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvc2phdmF1aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3VpL2ludGVybmFsL01lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1ydW50aW1lVHlwZVRpdGxlPUdlbmVyaWMgSjJFRSBSdW50aW1lCi1ydW50aW1lVHlwZURlc2NyaXB0aW9uPURlZmluZSBhIGdlbmVyaWMgSjJFRSBydW50aW1lLiBTcGVjaWZ5IGEgZGlyZWN0b3J5IGNvbnRhaW5pbmcgamFyIGZpbGVzIHRvIGNvbXBpbGUgYWdhaW5zdC4KLXJ1bnRpbWVUeXBlTmFtZT1OYSZtZToKLXJ1bnRpbWVUeXBlTG9jYXRpb249JkxvY2F0aW9uOgotYnJvd3NlPUImcm93c2UuLi4KLXJ1bnRpbWVUeXBlU2VsZWN0TG9jYXRpb249U2VsZWN0IHRoZSBsb2NhdGlvbiBvZiB0aGUgcnVudGltZS4KLXJ1bnRpbWVUeXBlSlJFPSZKUkU6Ci1ydW50aW1lVHlwZURlZmF1bHRKUkU9V29ya2JlbmNoIGRlZmF1bHQgSlJFCi1ydW50aW1lVHlwZUluc3RhbGxlZEpSRXM9SW4mc3RhbGxlZCBKUkVzLi4uCi0KLWNsYXNzcGF0aENvbnRhaW5lcj1TZXJ2ZXIgUnVudGltZQotY2xhc3NwYXRoQ29udGFpbmVyRGVzY3JpcHRpb249U2VsZWN0IGEgc2VydmVyIHJ1bnRpbWUgdG8gYWRkIHRvIHRoZSBjbGFzc3BhdGgKLWNsYXNzcGF0aENvbnRhaW5lclJ1bnRpbWVMaXN0PVNlbGVjdCBhICZydW50aW1lIHRvIGFkZCB0byB0aGUgY2xhc3NwYXRoOgotCi1lcnJvckludGVybmFsQ2FjdHVzPUludGVybmFsIGVycm9yIHdoaWxlIGF0dGVtcHRpbmcgdG8gbGF1bmNoIENhY3R1cwotCi1MYXVuY2hUZXN0QWN0aW9uX21lc3NhZ2Vfc2VsZWN0Q29uZmlndXJhdGlvbj1TZWxlY3QgYSBUZXN0IENvbmZpZ3VyYXRpb24KLUxhdW5jaFRlc3RBY3Rpb25fbWVzc2FnZV9zZWxlY3REZWJ1Z0NvbmZpZ3VyYXRpb249U2VsZWN0IEpVbml0IGNvbmZpZ3VyYXRpb24gdG8gZGVidWcKLUxhdW5jaFRlc3RBY3Rpb25fbWVzc2FnZV9zZWxlY3RSdW5Db25maWd1cmF0aW9uPVNlbGVjdCBKVW5pdCBjb25maWd1cmF0aW9uIHRvIHJ1bgotCi1OZXdTZXJ2bGV0VGVzdENhc2VXaXphcmRfV2luZG93VGl0bGU9TmV3IEpVbml0IFRlc3QgQ2FzZQotTmV3U2VydmxldFRlc3RDYXNlV2l6YXJkX0Vycm9yTWVzc2FnZVRpdGxlTWlzc2luZ0xpYnJhcnk9TWlzc2luZyBsaWJyYXJ5Ci1OZXdTZXJ2bGV0VGVzdENhc2VXaXphcmRfRXJyb3JNZXNzYWdlTWlzc2luZ1R5cGU9TWlzc2luZyB0eXBlCi1OZXdTZXJ2bGV0VGVzdENhc2VXaXphcmRfRXJyb3JNZXNzYWdlTWlzc2luZ0xpYnJhcnk9WW91IGFyZSBtaXNzaW5nIGNhY3R1cyBkZXBlbmRlbmNpZXMgaW4geW91ciB3ZWIgcHJvamVjdC4gVGhlIGZvbGxvd2luZyBsaWJyYXJpZXMgYXJlIHJlcXVpcmVkOiB7MH0sIHsxfSwgezJ9LCB7M30gYW5kIHs0fS4gT3RoZXIgdmVyc2lvbnMgbWlnaHQgd29yayBidXQgaGF2ZSBub3QgbmVjZXNzYXJpbHkgYmVlbiB0ZXN0ZWQuIEFsbCBsaWJyYXJpZXMgY2FuIGJlIGRvd25sb2FkZWQgYXQgaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9jYWN0dXMvLgotTmV3U2VydmxldFRlc3RDYXNlV2l6YXJkX0Vycm9yVGl0bGVOZXc9TmV3Ci1OZXdTZXJ2bGV0VGVzdENhc2VXaXphcmRfRXJyb3JUaXRsZUNyZWF0ZU9mRWxlbWVudEZhaWxlZD1DcmVhdGlvbiBvZiBlbGVtZW50IGZhaWxlZC4KLU5ld1NlcnZsZXRUZXN0Q2FzZVdpemFyZF9FcnJvck1lc3NhZ2VTZWVFcnJvckxvZz1TZWUgZXJyb3IgbG9nIGZvciBtb3JlIGRldGFpbHMuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpL3NqYXZhdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZlci91aS9pbnRlcm5hbC9SdW50aW1lTGFiZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpL3NqYXZhdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZlci91aS9pbnRlcm5hbC9SdW50aW1lTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWJlMWMxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9zamF2YXVpL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvUnVudGltZUxhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgSUJNIENvcnBvcmF0aW9uIC0gU3VwcG9ydCBmb3IgYWxsIHNlcnZlciB0eXBlcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkuSVJ1bnRpbWVDb21wb25lbnRMYWJlbFByb3ZpZGVyOwotLyoqCi0gKiAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFJ1bnRpbWVMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSVJ1bnRpbWVDb21wb25lbnRMYWJlbFByb3ZpZGVyIHsKLQlwcml2YXRlIGZpbmFsIElSdW50aW1lQ29tcG9uZW50IHJjOwotCi0JcHVibGljIFJ1bnRpbWVMYWJlbFByb3ZpZGVyKGZpbmFsIElSdW50aW1lQ29tcG9uZW50IHJjKSB7Ci0JCXRoaXMucmMgPSByYzsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlyZXR1cm4gcmMuZ2V0UHJvcGVydHkoInR5cGUiKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZhY3RvcnkgaW1wbGVtZW50cyBJQWRhcHRlckZhY3RvcnkgewotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzc1tdIEFEQVBURVJfVFlQRVMgPSB7IElSdW50aW1lQ29tcG9uZW50TGFiZWxQcm92aWRlci5jbGFzcyB9OwotCi0JCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihmaW5hbCBPYmplY3QgYWRhcHRhYmxlLCBmaW5hbCBDbGFzcyBhZGFwdGVyVHlwZSkgewotCQkJZmluYWwgSVJ1bnRpbWVDb21wb25lbnQgcmMgPSAoSVJ1bnRpbWVDb21wb25lbnQpIGFkYXB0YWJsZTsKLQkJCXJldHVybiBuZXcgUnVudGltZUxhYmVsUHJvdmlkZXIocmMpOwotCQl9Ci0KLQkJcHVibGljIENsYXNzW10gZ2V0QWRhcHRlckxpc3QoKSB7Ci0JCQlyZXR1cm4gQURBUFRFUl9UWVBFUzsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvc2phdmF1aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3VpL2ludGVybmFsL1NXVFV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9zamF2YXVpL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvU1dUVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjYzYjAxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9zamF2YXVpL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvU1dUVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnRNZXRyaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLS8qKgotICogU1dUIFV0aWxpdHkgY2xhc3MuCi0gKi8KLXB1YmxpYyBjbGFzcyBTV1RVdGlsIHsKLQlwcml2YXRlIHN0YXRpYyBGb250TWV0cmljcyBmb250TWV0cmljczsKLQotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBpbml0aWFsaXplRGlhbG9nVW5pdHMoQ29udHJvbCB0ZXN0Q29udHJvbCkgewotCQkvLyBDb21wdXRlIGFuZCBzdG9yZSBhIGZvbnQgbWV0cmljCi0JCUdDIGdjID0gbmV3IEdDKHRlc3RDb250cm9sKTsKLQkJZ2Muc2V0Rm9udChKRmFjZVJlc291cmNlcy5nZXREaWFsb2dGb250KCkpOwotCQlmb250TWV0cmljcyA9IGdjLmdldEZvbnRNZXRyaWNzKCk7Ci0JCWdjLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgd2lkdGggaGludCBmb3IgYSBidXR0b24gY29udHJvbC4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGludCBnZXRCdXR0b25XaWR0aEhpbnQoQnV0dG9uIGJ1dHRvbikgewotCQlpbnQgd2lkdGhIaW50ID0gRGlhbG9nLmNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKGZvbnRNZXRyaWNzLCBJRGlhbG9nQ29uc3RhbnRzLkJVVFRPTl9XSURUSCk7Ci0JCXJldHVybiBNYXRoLm1heCh3aWR0aEhpbnQsIGJ1dHRvbi5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIHRydWUpLngpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBidXR0b24gd2l0aCB0aGUgc3RhbmRhcmQgc2l6ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29tcCB0aGUgY29tcG9uZW50IHRvIGFkZCB0aGUgYnV0dG9uIHRvCi0JICogQHBhcmFtIGxhYmVsIHRoZSBidXR0b24gbGFiZWwKLQkgKiBAcmV0dXJuIGEgYnV0dG9uCi0JICovCi0JcHVibGljIHN0YXRpYyBCdXR0b24gY3JlYXRlQnV0dG9uKENvbXBvc2l0ZSBjb21wLCBTdHJpbmcgbGFiZWwpIHsKLQkJQnV0dG9uIGIgPSBuZXcgQnV0dG9uKGNvbXAsIFNXVC5QVVNIKTsKLQkJYi5zZXRUZXh0KGxhYmVsKTsKLQkJaWYgKGZvbnRNZXRyaWNzID09IG51bGwpCi0JCQlpbml0aWFsaXplRGlhbG9nVW5pdHMoY29tcCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLQkJZGF0YS53aWR0aEhpbnQgPSBnZXRCdXR0b25XaWR0aEhpbnQoYik7Ci0JCWIuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJcmV0dXJuIGI7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9zamF2YXVpL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvU2VydmVyQ2xhc3NwYXRoQ29udGFpbmVyUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpL3NqYXZhdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZlci91aS9pbnRlcm5hbC9TZXJ2ZXJDbGFzc3BhdGhDb250YWluZXJQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzZTRkYzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpL3NqYXZhdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZlci91aS9pbnRlcm5hbC9TZXJ2ZXJDbGFzc3BhdGhDb250YWluZXJQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLndpemFyZHMuSUNsYXNzcGF0aENvbnRhaW5lclBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5KYXZhU2VydmVyUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5SdW50aW1lQ2xhc3NwYXRoQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5SdW50aW1lQ2xhc3NwYXRoUHJvdmlkZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXdlcnMuUnVudGltZVRhYmxlTGFiZWxQcm92aWRlcjsKLQotcHVibGljIGNsYXNzIFNlcnZlckNsYXNzcGF0aENvbnRhaW5lclBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlIGltcGxlbWVudHMgSUNsYXNzcGF0aENvbnRhaW5lclBhZ2UgewotCXByb3RlY3RlZCBJQ2xhc3NwYXRoRW50cnkgc2VsZWN0aW9uOwotCi0JcHJvdGVjdGVkIE1hcCBydW50aW1lTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCXB1YmxpYyBTZXJ2ZXJDbGFzc3BhdGhDb250YWluZXJQYWdlKCkgewotCQlzdXBlcigic2VydmVyLmNvbnRhaW5lciIpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfV0laX1JVTlRJTUVfVFlQRSkpOwotCQlzZXRUaXRsZShNZXNzYWdlcy5jbGFzc3BhdGhDb250YWluZXIpOwotCQlzZXREZXNjcmlwdGlvbihNZXNzYWdlcy5jbGFzc3BhdGhDb250YWluZXJEZXNjcmlwdGlvbik7Ci0JCXNldFBhZ2VDb21wbGV0ZShmYWxzZSk7Ci0JCQotCQlJUnVudGltZVtdIHJ1bnRpbWVzID0gU2VydmVyQ29yZS5nZXRSdW50aW1lcygpOwotCQlpbnQgc2l6ZSA9IHJ1bnRpbWVzLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCVJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcldyYXBwZXIgcmNwdyA9IEphdmFTZXJ2ZXJQbHVnaW4uZmluZFJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlcihydW50aW1lc1tpXS5nZXRSdW50aW1lVHlwZSgpKTsKLQkJCWlmIChyY3B3ICE9IG51bGwpIHsKLQkJCQlJUGF0aCBzZXJ2ZXJDb250YWluZXJQYXRoID0gbmV3IFBhdGgoUnVudGltZUNsYXNzcGF0aENvbnRhaW5lci5TRVJWRVJfQ09OVEFJTkVSKQotCQkJCQkJLmFwcGVuZChyY3B3LmdldElkKCkpLmFwcGVuZChydW50aW1lc1tpXS5nZXRJZCgpKTsKLQkJCQlydW50aW1lTWFwLnB1dChydW50aW1lc1tpXSwgSmF2YUNvcmUubmV3Q29udGFpbmVyRW50cnkoc2VydmVyQ29udGFpbmVyUGF0aCkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZmluaXNoKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgSUNsYXNzcGF0aEVudHJ5IGdldFNlbGVjdGlvbigpIHsKLQkJcmV0dXJuIHNlbGVjdGlvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oSUNsYXNzcGF0aEVudHJ5IGNvbnRhaW5lckVudHJ5KSB7Ci0JCXNlbGVjdGlvbiA9IGNvbnRhaW5lckVudHJ5OwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWNvbXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCQotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQljb21wLnNldExheW91dChsYXlvdXQpOwotCQkKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcCwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLmNsYXNzcGF0aENvbnRhaW5lclJ1bnRpbWVMaXN0KTsKLQkJCi0JCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKGNvbXAsIFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuU0lOR0xFIHwgU1dULkZVTExfU0VMRUNUSU9OKTsKLQkJdGFibGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCQotCQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKGZhbHNlKTsKLQkJCi0JCVRhYmxlVmlld2VyIHRhYmxlVmlld2VyID0gbmV3IFRhYmxlVmlld2VyKHRhYmxlKTsKLQkJdGFibGVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcigpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCQkJT2JqZWN0W10gb2JqID0gcnVudGltZU1hcC5rZXlTZXQoKS50b0FycmF5KCk7IAotCQkJCXJldHVybiBvYmo7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQkJCS8vIGlnbm9yZQotCQkJfQotCQl9KTsKLQkJdGFibGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgUnVudGltZVRhYmxlTGFiZWxQcm92aWRlcigpKTsKLQkJdGFibGVWaWV3ZXIuc2V0SW5wdXQoInJvb3QiKTsKLQkJCi0JCXRhYmxlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJdHJ5IHsKLQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudC5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJc2VsZWN0aW9uID0gKElDbGFzc3BhdGhFbnRyeSkgcnVudGltZU1hcC5nZXQoc2VsLmdldEZpcnN0RWxlbWVudCgpKTsKLQkJCQkJc2V0UGFnZUNvbXBsZXRlKHRydWUpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXNlbGVjdGlvbiA9IG51bGw7Ci0JCQkJCXNldFBhZ2VDb21wbGV0ZShmYWxzZSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJCi0JCXNldENvbnRyb2woY29tcCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9zamF2YXVpL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvU3RhbmRhcmRKcmVMYWJlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvc2phdmF1aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3VpL2ludGVybmFsL1N0YW5kYXJkSnJlTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDZlZDhlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9zamF2YXVpL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvU3RhbmRhcmRKcmVMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIFN1cHBvcnQgZm9yIGFsbCBzZXJ2ZXIgdHlwZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuSVJ1bnRpbWVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLklSdW50aW1lQ29tcG9uZW50TGFiZWxQcm92aWRlcjsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTdGFuZGFyZEpyZUxhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJUnVudGltZUNvbXBvbmVudExhYmVsUHJvdmlkZXIgewotICAgcHJpdmF0ZSBmaW5hbCBJUnVudGltZUNvbXBvbmVudCByYzsKLQotICAgcHVibGljIFN0YW5kYXJkSnJlTGFiZWxQcm92aWRlcihmaW5hbCBJUnVudGltZUNvbXBvbmVudCByYykgewotCQl0aGlzLnJjID0gcmM7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJYnVmLmFwcGVuZCgiSlJFICIpOwotCQlidWYuYXBwZW5kKHJjLmdldFJ1bnRpbWVDb21wb25lbnRWZXJzaW9uKCkuZ2V0VmVyc2lvblN0cmluZygpKTsKLQkJYnVmLmFwcGVuZCgiOiAiKTsKLQkJYnVmLmFwcGVuZChyYy5nZXRQcm9wZXJ0eSgibmFtZSIpKTsKLQotCQlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBGYWN0b3J5IGltcGxlbWVudHMgSUFkYXB0ZXJGYWN0b3J5IHsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3NbXSBBREFQVEVSX1RZUEVTID0geyBJUnVudGltZUNvbXBvbmVudExhYmVsUHJvdmlkZXIuY2xhc3MgfTsKLQotCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoZmluYWwgT2JqZWN0IGFkYXB0YWJsZSwgZmluYWwgQ2xhc3MgYWRhcHRlclR5cGUpIHsKLQkJCUlSdW50aW1lQ29tcG9uZW50IHJjID0gKElSdW50aW1lQ29tcG9uZW50KSBhZGFwdGFibGU7Ci0JCQlyZXR1cm4gbmV3IFN0YW5kYXJkSnJlTGFiZWxQcm92aWRlcihyYyk7Ci0JCX0KLQotCQlwdWJsaWMgQ2xhc3NbXSBnZXRBZGFwdGVyTGlzdCgpIHsKLQkJCXJldHVybiBBREFQVEVSX1RZUEVTOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9zamF2YXVpL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvVHJhY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9zamF2YXVpL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvVHJhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjVkNjc5MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvc2phdmF1aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3VpL2ludGVybmFsL1RyYWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkuaW50ZXJuYWw7Ci0vKioKLSAqIEhlbHBlciBjbGFzcyB0byByb3V0ZSB0cmFjZSBvdXRwdXQuCi0gKi8KLXB1YmxpYyBjbGFzcyBUcmFjZSB7Ci0JcHVibGljIHN0YXRpYyBieXRlIENPTkZJRyA9IDA7Ci0JcHVibGljIHN0YXRpYyBieXRlIFdBUk5JTkcgPSAxOwotCXB1YmxpYyBzdGF0aWMgYnl0ZSBTRVZFUkUgPSAyOwotCXB1YmxpYyBzdGF0aWMgYnl0ZSBGSU5FU1QgPSAzOwotCi0JLyoqCi0JICogVHJhY2UgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwcml2YXRlIFRyYWNlKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFRyYWNlIHRoZSBnaXZlbiB0ZXh0LgotCSAqCi0JICogQHBhcmFtIGxldmVsIGEgdHJhY2UgbGV2ZWwKLQkgKiBAcGFyYW0gcyBhIG1lc3NhZ2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2UoYnl0ZSBsZXZlbCwgU3RyaW5nIHMpIHsKLQkJVHJhY2UudHJhY2UobGV2ZWwsIHMsIG51bGwpOwotCX0KLQkKLQkvKioKLQkgKiBUcmFjZSB0aGUgZ2l2ZW4gbWVzc2FnZSBhbmQgZXhjZXB0aW9uLgotCSAqCi0JICogQHBhcmFtIGxldmVsIGEgdHJhY2UgbGV2ZWwKLQkgKiBAcGFyYW0gcyBhIG1lc3NhZ2UKLQkgKiBAcGFyYW0gdCBhIHRocm93YWJsZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZShieXRlIGxldmVsLCBTdHJpbmcgcywgVGhyb3dhYmxlIHQpIHsKLQkJaWYgKCFKYXZhU2VydmVyVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5pc0RlYnVnZ2luZygpKQotCQkJcmV0dXJuOwotCi0JCVN5c3RlbS5vdXQucHJpbnRsbihKYXZhU2VydmVyVUlQbHVnaW4uUExVR0lOX0lEICsgIiAiICsgcyk7Ci0JCWlmICh0ICE9IG51bGwpCi0JCQl0LnByaW50U3RhY2tUcmFjZSgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvc2phdmF1aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3VpL2ludGVybmFsL2NhY3R1cy9KVW5pdENsaWVudERlbGVnYXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkvc2phdmF1aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3VpL2ludGVybmFsL2NhY3R1cy9KVW5pdENsaWVudERlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3NWU5MmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpL3NqYXZhdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZlci91aS9pbnRlcm5hbC9jYWN0dXMvSlVuaXRDbGllbnREZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMsIEluYy4gYW5kIG90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBEYW5pZWwgUi4gU29tZXJmaWVsZCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuY2FjdHVzOwotCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5EZWJ1Z1VJVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuSURlYnVnTW9kZWxQcmVzZW50YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmp1bml0LmxhdW5jaGVyLkpVbml0QmFzZUxhdW5jaENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuY2FjdHVzLkNhY3R1c0xhdW5jaGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS5pbnRlcm5hbC5KYXZhU2VydmVyVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkVsZW1lbnRMaXN0U2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5DbGllbnREZWxlZ2F0ZTsKLS8qKgotICoKLSAqLwotcHVibGljIGNsYXNzIEpVbml0Q2xpZW50RGVsZWdhdGUgZXh0ZW5kcyBDbGllbnREZWxlZ2F0ZSB7Ci0JcHVibGljIElTdGF0dXMgbGF1bmNoKElTZXJ2ZXIgc2VydmVyLCBPYmplY3Qgb2JqZWN0LCBTdHJpbmcgbGF1bmNoTW9kZSwgSUxhdW5jaCBsYXVuY2gpIHsKLQkJQ2FjdHVzTGF1bmNoYWJsZSBsYXVuY2hhYmxlID0gKENhY3R1c0xhdW5jaGFibGUpIG9iamVjdDsKLQkJSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlnID0gZmluZExhdW5jaENvbmZpZ3VyYXRpb24obGF1bmNoYWJsZSwgbGF1bmNoTW9kZSk7Ci0JCWlmIChjb25maWcgPT0gbnVsbCkgewotCQkJU3RyaW5nIHRlc3ROYW1lID0gbGF1bmNoYWJsZS5nZXRUZXN0TmFtZSgpOwotCQkJdGVzdE5hbWUgPSAiIi5lcXVhbHModGVzdE5hbWUpID8gbGF1bmNoYWJsZS5nZXRUZXN0Q2xhc3NOYW1lKCkKLQkJCQkJOiBsYXVuY2hhYmxlLmdldFRlc3RDbGFzc05hbWUoKSArICIuIiArIHRlc3ROYW1lICsgIigpIjsKLQkJCWNvbmZpZyA9IGNyZWF0ZUNvbmZpZ3VyYXRpb24obGF1bmNoYWJsZS5nZXRQcm9qZWN0TmFtZSgpLCB0ZXN0TmFtZSwKLQkJCQkJbGF1bmNoYWJsZS5nZXRUZXN0Q2xhc3NOYW1lKCksICIiLCBsYXVuY2hhYmxlLmdldFRlc3ROYW1lKCkpOwotCQl9Ci0JCQotCQlVUkwgdXJsID0gbGF1bmNoYWJsZS5nZXRDYWN0dXNVUkwoKTsKLQkJU3RyaW5nIHVybFN0cmluZyA9IHVybC50b1N0cmluZygpOwotCQlpZiAodXJsU3RyaW5nLmVuZHNXaXRoKCIvIikpIHsKLQkJCXRyeSB7Ci0JCQkJdXJsID0gbmV3IFVSTCh1cmxTdHJpbmcuc3Vic3RyaW5nKDAsIHVybFN0cmluZy5sZW5ndGgoKSAtIDEpKTsKLQkJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSmF2YVNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCwgSVN0YXR1cy5FUlJPUiwgTWVzc2FnZXMuZXJyb3JJbnRlcm5hbENhY3R1cywgZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXRyeSB7Ci0JCQlmaW5hbCBJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNvcHkgPSBjb25maWcuZ2V0V29ya2luZ0NvcHkoKTsKLQkJCVN0cmluZyB2bUFyZ3M7Ci0JCQl2bUFyZ3MgPSBjb25maWcuZ2V0QXR0cmlidXRlKElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1ZNX0FSR1VNRU5UUywgIiIpOwotCQkJY29weS5zZXRBdHRyaWJ1dGUoSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfVk1fQVJHVU1FTlRTLAotCQkJCQl2bUFyZ3MgKyAiIC1EY2FjdHVzLmNvbnRleHRVUkw9IiArIHVybC50b1N0cmluZygpKTsKLQkJCWNvbmZpZyA9IGNvcHkuZG9TYXZlKCk7Ci0JCQlEZWJ1Z1VJVG9vbHMubGF1bmNoKGNvbmZpZywgbGF1bmNoTW9kZSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSmF2YVNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCwgSVN0YXR1cy5FUlJPUiwgTWVzc2FnZXMuZXJyb3JJbnRlcm5hbENhY3R1cywgZSk7Ci0JCX0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JcHJvdGVjdGVkIElMYXVuY2hDb25maWd1cmF0aW9uIGNyZWF0ZUNvbmZpZ3VyYXRpb24oU3RyaW5nIHByb2plY3ROYW1lLAotCQkJU3RyaW5nIG5hbWUsIFN0cmluZyBtYWluVHlwZSwgU3RyaW5nIGNvbnRhaW5lciwgU3RyaW5nIHRlc3ROYW1lKSB7Ci0JCUlMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlJTGF1bmNoQ29uZmlndXJhdGlvblR5cGUgY29uZmlnVHlwZSA9IGdldEpVbml0TGF1bmNoQ29uZmlnVHlwZSgpOwotCQkJSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSB3YyA9IGNvbmZpZ1R5cGUubmV3SW5zdGFuY2UobnVsbCwKLQkJCQkJRGVidWdQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExhdW5jaE1hbmFnZXIoKQotCQkJCQkJCS5nZW5lcmF0ZVVuaXF1ZUxhdW5jaENvbmZpZ3VyYXRpb25OYW1lRnJvbShuYW1lKSk7Ci0JCQl3Yy5zZXRBdHRyaWJ1dGUoSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfTUFJTl9UWVBFX05BTUUsIG1haW5UeXBlKTsKLQkJCXdjLnNldEF0dHJpYnV0ZShJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9QUk9KRUNUX05BTUUsIHByb2plY3ROYW1lKTsKLQkJCXdjLnNldEF0dHJpYnV0ZShKVW5pdEJhc2VMYXVuY2hDb25maWd1cmF0aW9uLkFUVFJfS0VFUFJVTk5JTkcsIGZhbHNlKTsKLQkJCXdjLnNldEF0dHJpYnV0ZShKVW5pdEJhc2VMYXVuY2hDb25maWd1cmF0aW9uLkxBVU5DSF9DT05UQUlORVJfQVRUUiwgY29udGFpbmVyKTsKLQkJCWlmICh0ZXN0TmFtZS5sZW5ndGgoKSA+IDApCi0JCQkJd2Muc2V0QXR0cmlidXRlKEpVbml0QmFzZUxhdW5jaENvbmZpZ3VyYXRpb24uVEVTVE5BTUVfQVRUUiwgdGVzdE5hbWUpOwotCQkJY29uZmlnID0gd2MuZG9TYXZlKCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJSmF2YVNlcnZlclVJUGx1Z2luLmxvZyhlKTsKLQkJfQotCQlyZXR1cm4gY29uZmlnOwotCX0KLQotCXByaXZhdGUgSUxhdW5jaENvbmZpZ3VyYXRpb24gZmluZExhdW5jaENvbmZpZ3VyYXRpb24oQ2FjdHVzTGF1bmNoYWJsZSBsYXVuY2hhYmxlLCBTdHJpbmcgbW9kZSkgewotCQlTdHJpbmcgdGVzdE5hbWUgPSBsYXVuY2hhYmxlLmdldFRlc3ROYW1lKCk7Ci0JCVN0cmluZyB0ZXN0Q2xhc3MgPSBsYXVuY2hhYmxlLmdldFRlc3RDbGFzc05hbWUoKTsKLQkJU3RyaW5nIGphdmFQcm9qZWN0TmFtZSA9IGxhdW5jaGFibGUuZ2V0UHJvamVjdE5hbWUoKTsKLQkJU3RyaW5nIGNvbnRhaW5lciA9ICIiOwotCQlJTGF1bmNoQ29uZmlndXJhdGlvblR5cGUgY29uZmlnVHlwZSA9IGdldEpVbml0TGF1bmNoQ29uZmlnVHlwZSgpOwotCQlMaXN0IGNhbmRpZGF0ZUNvbmZpZ3MgPSBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQl0cnkgewotCQkJSUxhdW5jaENvbmZpZ3VyYXRpb25bXSBjb25maWdzID0gRGVidWdQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJCS5nZXRMYXVuY2hNYW5hZ2VyKCkuZ2V0TGF1bmNoQ29uZmlndXJhdGlvbnMoY29uZmlnVHlwZSk7Ci0JCQljYW5kaWRhdGVDb25maWdzID0gbmV3IEFycmF5TGlzdChjb25maWdzLmxlbmd0aCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbmZpZ3MubGVuZ3RoOyBpKyspIHsKLQkJCQlJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWcgPSBjb25maWdzW2ldOwotCQkJCS8vIFRPRE86IHdlIHNob3VsZCBwcm9iYWJseSBleHRyYWN0IHRoZSBKVW5pdCBpbnRlcm5hbCBzdHVmZiBhbmQKLQkJCQkvLyBjcmVhdGUgYSBuZXcgQ2FjdHVzTGF1bmNoQ29uZmlndXJhdGlvbgotCQkJCWlmICgoY29uZmlnLmdldEF0dHJpYnV0ZSgKLQkJCQkJCUpVbml0QmFzZUxhdW5jaENvbmZpZ3VyYXRpb24uTEFVTkNIX0NPTlRBSU5FUl9BVFRSLCAiIikuZXF1YWxzKGNvbnRhaW5lcikpICYmIC8vJE5PTi1OTFMtMSQKLQkJCQkJCShjb25maWcuZ2V0QXR0cmlidXRlKElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX01BSU5fVFlQRV9OQU1FLAotCQkJCQkJCQkiIikuZXF1YWxzKHRlc3RDbGFzcykpICYmIC8vJE5PTi1OTFMtMSQKLQkJCQkJCShjb25maWcuZ2V0QXR0cmlidXRlKEpVbml0QmFzZUxhdW5jaENvbmZpZ3VyYXRpb24uVEVTVE5BTUVfQVRUUiwgIiIpLmVxdWFscyh0ZXN0TmFtZSkpICYmIC8vJE5PTi1OTFMtMSQKLQkJCQkJCShjb25maWcuZ2V0QXR0cmlidXRlKElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1BST0pFQ1RfTkFNRSwKLQkJCQkJCQkJIiIpLmVxdWFscyhqYXZhUHJvamVjdE5hbWUpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCWNhbmRpZGF0ZUNvbmZpZ3MuYWRkKGNvbmZpZyk7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUphdmFTZXJ2ZXJVSVBsdWdpbi5sb2coZSk7Ci0JCX0KLQkJCi0JCS8vIElmIHRoZXJlIGFyZSBubyBleGlzdGluZyBjb25maWdzIGFzc29jaWF0ZWQgd2l0aCB0aGUgSVR5cGUsIGNyZWF0ZSBvbmUuCi0JCS8vIElmIHRoZXJlIGlzIGV4YWN0bHkgb25lIGNvbmZpZyBhc3NvY2lhdGVkIHdpdGggdGhlIElUeXBlLCByZXR1cm4gaXQuCi0JCS8vIE90aGVyd2lzZSwgaWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBjb25maWcgYXNzb2NpYXRlZCB3aXRoIHRoZSBJVHlwZSwKLQkJLy8gcHJvbXB0IHRoZQotCQkvLyB1c2VyIHRvIGNob29zZSBvbmUuCi0JCWludCBjYW5kaWRhdGVDb3VudCA9IGNhbmRpZGF0ZUNvbmZpZ3Muc2l6ZSgpOwotCQlpZiAoY2FuZGlkYXRlQ291bnQgPCAxKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfSBlbHNlIGlmIChjYW5kaWRhdGVDb3VudCA9PSAxKSB7Ci0JCQlyZXR1cm4gKElMYXVuY2hDb25maWd1cmF0aW9uKSBjYW5kaWRhdGVDb25maWdzLmdldCgwKTsKLQkJfSBlbHNlIHsKLQkJCS8vIFByb21wdCB0aGUgdXNlciB0byBjaG9vc2UgYSBjb25maWcuIEEgbnVsbCByZXN1bHQgbWVhbnMgdGhlIHVzZXIKLQkJCS8vIGNhbmNlbGxlZCB0aGUgZGlhbG9nLCBpbiB3aGljaCBjYXNlIHRoaXMgbWV0aG9kIHJldHVybnMgbnVsbCwKLQkJCS8vIHNpbmNlIGNhbmNlbGxpbmcgdGhlIGRpYWxvZyBzaG91bGQgYWxzbyBjYW5jZWwgbGF1bmNoaW5nIGFueXRoaW5nLgotCQkJSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlnID0gY2hvb3NlQ29uZmlndXJhdGlvbihjYW5kaWRhdGVDb25maWdzLAotCQkJCQltb2RlKTsKLQkJCWlmIChjb25maWcgIT0gbnVsbCkgewotCQkJCXJldHVybiBjb25maWc7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIElMYXVuY2hDb25maWd1cmF0aW9uIGNob29zZUNvbmZpZ3VyYXRpb24oTGlzdCBjb25maWdMaXN0LCBTdHJpbmcgbW9kZSkgewotCQlJRGVidWdNb2RlbFByZXNlbnRhdGlvbiBsYWJlbFByb3ZpZGVyID0gRGVidWdVSVRvb2xzCi0JCQkJLm5ld0RlYnVnTW9kZWxQcmVzZW50YXRpb24oKTsKLQkJRWxlbWVudExpc3RTZWxlY3Rpb25EaWFsb2cgZGlhbG9nID0gbmV3IEVsZW1lbnRMaXN0U2VsZWN0aW9uRGlhbG9nKAotCQkJCUphdmFTZXJ2ZXJVSVBsdWdpbi5nZXRBY3RpdmVXb3JrYmVuY2hTaGVsbCgpLCBsYWJlbFByb3ZpZGVyKTsKLQkJZGlhbG9nLnNldEVsZW1lbnRzKGNvbmZpZ0xpc3QudG9BcnJheSgpKTsKLQkJZGlhbG9nLnNldFRpdGxlKE1lc3NhZ2VzLkxhdW5jaFRlc3RBY3Rpb25fbWVzc2FnZV9zZWxlY3RDb25maWd1cmF0aW9uKTsKLQkJaWYgKG1vZGUuZXF1YWxzKElMYXVuY2hNYW5hZ2VyLkRFQlVHX01PREUpKQotCQkJZGlhbG9nLnNldE1lc3NhZ2UoTWVzc2FnZXMuTGF1bmNoVGVzdEFjdGlvbl9tZXNzYWdlX3NlbGVjdERlYnVnQ29uZmlndXJhdGlvbik7Ci0JCWVsc2UKLQkJCWRpYWxvZy5zZXRNZXNzYWdlKE1lc3NhZ2VzLkxhdW5jaFRlc3RBY3Rpb25fbWVzc2FnZV9zZWxlY3RSdW5Db25maWd1cmF0aW9uKTsKLQkJCi0JCWRpYWxvZy5zZXRNdWx0aXBsZVNlbGVjdGlvbihmYWxzZSk7Ci0JCWludCByZXN1bHQgPSBkaWFsb2cub3BlbigpOwotCQlsYWJlbFByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKHJlc3VsdCA9PSBXaW5kb3cuT0spCi0JCQlyZXR1cm4gKElMYXVuY2hDb25maWd1cmF0aW9uKSBkaWFsb2cuZ2V0Rmlyc3RSZXN1bHQoKTsKLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBJTGF1bmNoQ29uZmlndXJhdGlvblR5cGUgZ2V0SlVuaXRMYXVuY2hDb25maWdUeXBlKCkgewotCQkvLyBUT0RPOiBtaWdodCB3YW50IHRvIHJlcGxhY2UgdGhpcyB3aXRoIGEgY3VzdG9tIGxhdW5jaCBjb25maWd1cmF0aW9uCi0JCUlMYXVuY2hNYW5hZ2VyIGxtID0gRGVidWdQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExhdW5jaE1hbmFnZXIoKTsKLQkJcmV0dXJuIGxtLmdldExhdW5jaENvbmZpZ3VyYXRpb25UeXBlKCJvcmcuZWNsaXBzZS5qZHQuanVuaXQubGF1bmNoY29uZmlnIik7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoSVNlcnZlciBzZXJ2ZXIsIE9iamVjdCBsYXVuY2hhYmxlLCBTdHJpbmcgbGF1bmNoTW9kZSkgewotCQlyZXR1cm4gbGF1bmNoYWJsZSBpbnN0YW5jZW9mIENhY3R1c0xhdW5jaGFibGU7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS9zamF2YXVpL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvY2FjdHVzL05ld1NlcnZsZXRUZXN0Q2FzZVdpemFyZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpL3NqYXZhdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZlci91aS9pbnRlcm5hbC9jYWN0dXMvTmV3U2VydmxldFRlc3RDYXNlV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3ZmQ4OTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpL3NqYXZhdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZlci91aS9pbnRlcm5hbC9jYWN0dXMvTmV3U2VydmxldFRlc3RDYXNlV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcywgSW5jLiBhbmQgb3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIERhbmllbCBSLiBTb21lcmZpZWxkIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS5pbnRlcm5hbC5jYWN0dXM7Ci0KLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0Lmp1bml0LndpemFyZHMuTmV3VGVzdENhc2VXaXphcmRQYWdlT25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5qdW5pdC53aXphcmRzLk5ld1Rlc3RDYXNlV2l6YXJkUGFnZVR3bzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS5pbnRlcm5hbC5JbWFnZVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuSmF2YVNlcnZlclVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuV29ya3NwYWNlTW9kaWZ5RGVsZWdhdGluZ09wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSURFOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLndpemFyZHMubmV3cmVzb3VyY2UuQmFzaWNOZXdSZXNvdXJjZVdpemFyZDsKLS8qKgotICoKLSAqLwotcHVibGljIGNsYXNzIE5ld1NlcnZsZXRUZXN0Q2FzZVdpemFyZCBleHRlbmRzIFdpemFyZCBpbXBsZW1lbnRzIElOZXdXaXphcmQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVVBFUkNMQVNTX05BTUUgPSAib3JnLmFwYWNoZS5jYWN0dXMuU2VydmxldFRlc3RDYXNlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBDTEFTU0VTX1RPX0NIRUNLID0gewotCQkib3JnLmFwYWNoZS5jYWN0dXMuU2VydmxldFRlc3RDYXNlIiwgImp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSIsCi0JCSJvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2ciLCAib3JnLmFzcGVjdGoubGFuZy5Kb2luUG9pbnQiLAotCQkib3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQuSHR0cENsaWVudCIgfTsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nW10gUkVRVUlSRURfTElCUkFSSUVTID0gewotCQkiY2FjdHVzLTEuNy5qYXIiLCAianVuaXQtMy44LjEuamFyIiwgImFzcGVjdGpydC0xLjIuMS5qYXIiLAotCQkiY29tbW9ucy1sb2dnaW5nLTEuMC40LmphciIsICJjb21tb25zLWh0dHBjbGllbnQtMi4wLjIuamFyIiB9OwotCi0JcHJpdmF0ZSBJV29ya2JlbmNoIGZXb3JrYmVuY2g7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZFNlbGVjdGlvbiBmU2VsZWN0aW9uOwotCXByaXZhdGUgTmV3VGVzdENhc2VXaXphcmRQYWdlVHdvIGZQYWdlMjsKLQlwcml2YXRlIE5ld1Rlc3RDYXNlV2l6YXJkUGFnZU9uZSBmUGFnZTE7Ci0JCi0JcHVibGljIE5ld1NlcnZsZXRUZXN0Q2FzZVdpemFyZCgpIHsKLQkJc3VwZXIoKTsKLQkJc2V0V2luZG93VGl0bGUoTWVzc2FnZXMuTmV3U2VydmxldFRlc3RDYXNlV2l6YXJkX1dpbmRvd1RpdGxlKTsKLQkJc2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfV0laX0NBQ1RVU19URVNUKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWZXb3JrYmVuY2ggPSB3b3JrYmVuY2g7Ci0JCWZTZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7Ci0JCXN1cGVyLmFkZFBhZ2VzKCk7Ci0JCWZQYWdlMiA9IG5ldyBOZXdUZXN0Q2FzZVdpemFyZFBhZ2VUd28oKTsKLQkJZlBhZ2UxID0gbmV3IE5ld1Rlc3RDYXNlV2l6YXJkUGFnZU9uZShmUGFnZTIpIHsKLQkJCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQkJCXN1cGVyLmNyZWF0ZUNvbnRyb2wocGFyZW50KTsKLQkJCQlzZXRTdXBlckNsYXNzKFNVUEVSQ0xBU1NfTkFNRSwgdHJ1ZSk7Ci0JCQl9Ci0KLQkJCXByb3RlY3RlZCBJU3RhdHVzIHZhbGlkYXRlSWZKVW5pdFByb2plY3QoKSB7Ci0JCQkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IGdldFBhY2thZ2VGcmFnbWVudFJvb3QoKTsKLQkJCQlpZiAocm9vdCA9PSBudWxsKQotCQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQotCQkJCUlKYXZhUHJvamVjdCBwcm9qZWN0ID0gcm9vdC5nZXRKYXZhUHJvamVjdCgpOwotCQkJCXRyeSB7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgQ0xBU1NFU19UT19DSEVDSy5sZW5ndGg7IGkrKykgewotCQkJCQkJSVR5cGUgdHlwZSA9IHByb2plY3QuZmluZFR5cGUoQ0xBU1NFU19UT19DSEVDS1tpXSk7Ci0JCQkJCQlpZiAodHlwZSA9PSBudWxsKSB7Ci0JCQkJCQkJTWVzc2FnZURpYWxvZy5vcGVuRXJyb3IoZ2V0U2hlbGwoKSwKLQkJCQkJCQkJCU1lc3NhZ2VzLk5ld1NlcnZsZXRUZXN0Q2FzZVdpemFyZF9FcnJvck1lc3NhZ2VUaXRsZU1pc3NpbmdMaWJyYXJ5LAotCQkJCQkJCQkJTkxTLmJpbmQoTWVzc2FnZXMuTmV3U2VydmxldFRlc3RDYXNlV2l6YXJkX0Vycm9yTWVzc2FnZU1pc3NpbmdMaWJyYXJ5LCBSRVFVSVJFRF9MSUJSQVJJRVMpKTsKLQkJCQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUphdmFTZXJ2ZXJVSVBsdWdpbi5sb2coZSk7Ci0JCQkJfQotCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJfQotCQl9OwotCQlhZGRQYWdlKGZQYWdlMSk7Ci0JCWZQYWdlMS5pbml0KGdldFNlbGVjdGlvbigpKTsKLQkJYWRkUGFnZShmUGFnZTIpOwotCi0JfQotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZFNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKSB7Ci0JCXJldHVybiBmU2VsZWN0aW9uOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7Ci0JCWlmIChmaW5pc2hQYWdlKGZQYWdlMS5nZXRSdW5uYWJsZSgpKSkgewotCQkJSVR5cGUgbmV3Q2xhc3MgPSBmUGFnZTEuZ2V0Q3JlYXRlZFR5cGUoKTsKLQotCQkJSVJlc291cmNlIHJlc291cmNlID0gbmV3Q2xhc3MuZ2V0Q29tcGlsYXRpb25Vbml0KCkuZ2V0UmVzb3VyY2UoKTsKLQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJQmFzaWNOZXdSZXNvdXJjZVdpemFyZC5zZWxlY3RBbmRSZXZlYWwocmVzb3VyY2UsIGZXb3JrYmVuY2gKLQkJCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKSk7Ci0JCQkJb3BlblJlc291cmNlKHJlc291cmNlKTsKLQkJCQkvLyBjaGVja0xpYnJhcnlNaXNzaW5nKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLypwcml2YXRlIHZvaWQgY2hlY2tMaWJyYXJ5TWlzc2luZygpIHsKLQkJSVR5cGUgbmV3Q2xhc3MgPSBmUGFnZTEuZ2V0Q3JlYXRlZFR5cGUoKTsKLQkJSUphdmFQcm9qZWN0IHByb2plY3QgPSBuZXdDbGFzcy5nZXRKYXZhUHJvamVjdCgpOwotCQl0cnkgewotCQkJSVR5cGUgdHlwZSA9IHByb2plY3QuZmluZFR5cGUoU1VQRVJDTEFTU19OQU1FKTsKLQkJCU1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKGdldFNoZWxsKCksIE5MUy5iaW5kKAotCQkJCQlNZXNzYWdlcy5OZXdTZXJ2bGV0VGVzdENhc2VXaXphcmRfRXJyb3JNZXNzYWdlTWlzc2luZ0xpYnJhcnksIFJFUVVJUkVEX0xJQlJBUklFUyksCi0JCQkJCU1lc3NhZ2VzLk5ld1NlcnZsZXRUZXN0Q2FzZVdpemFyZF9FcnJvck1lc3NhZ2VNaXNzaW5nVHlwZSk7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQlKYXZhU2VydmVyVUlQbHVnaW4ubG9nKGUpOwotCQl9Ci0JfSovCi0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBmaW5pc2hQYWdlKElSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSkgewotCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3Mgb3AgPSBuZXcgV29ya3NwYWNlTW9kaWZ5RGVsZWdhdGluZ09wZXJhdGlvbihydW5uYWJsZSk7Ci0JCXRyeSB7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFByb2dyZXNzU2VydmljZSgpLnJ1bkluVUkoZ2V0Q29udGFpbmVyKCksIG9wLAotCQkJCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpKTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQlTdHJpbmcgdGl0bGUgPSBNZXNzYWdlcy5OZXdTZXJ2bGV0VGVzdENhc2VXaXphcmRfRXJyb3JUaXRsZU5ldzsgLy8gTmV3SlVuaXRXaXphcmRfb3BfZXJyb3JfdGl0bGUKLQkJCVN0cmluZyBtZXNzYWdlID0gTWVzc2FnZXMuTmV3U2VydmxldFRlc3RDYXNlV2l6YXJkX0Vycm9yVGl0bGVDcmVhdGVPZkVsZW1lbnRGYWlsZWQ7IC8vIE5ld0pVbml0V2l6YXJkX29wX2Vycm9yX21lc3NhZ2UKLQkJCS8vIEV4Y2VwdGlvbkhhbmRsZXIuaGFuZGxlKGUsIHNoZWxsLCB0aXRsZSwgbWVzc2FnZSk7Ci0JCQlkaXNwbGF5TWVzc2FnZURpYWxvZyhlLCBlLmdldE1lc3NhZ2UoKSwgZ2V0U2hlbGwoKSwgdGl0bGUsIG1lc3NhZ2UpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGRpc3BsYXlNZXNzYWdlRGlhbG9nKFRocm93YWJsZSB0LCBTdHJpbmcgZXhjZXB0aW9uTWVzc2FnZSwKLQkJCVNoZWxsIHNoZWxsLCBTdHJpbmcgdGl0bGUsIFN0cmluZyBtZXNzYWdlKSB7Ci0JCVN0cmluZ1dyaXRlciBtc2cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCWlmIChtZXNzYWdlICE9IG51bGwpIHsKLQkJCW1zZy53cml0ZShtZXNzYWdlKTsKLQkJCW1zZy53cml0ZSgiXG5cbiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKGV4Y2VwdGlvbk1lc3NhZ2UgPT0gbnVsbCB8fCBleGNlcHRpb25NZXNzYWdlLmxlbmd0aCgpID09IDApCi0JCQltc2cud3JpdGUoTWVzc2FnZXMuTmV3U2VydmxldFRlc3RDYXNlV2l6YXJkX0Vycm9yTWVzc2FnZVNlZUVycm9yTG9nKTsKLQkJZWxzZQotCQkJbXNnLndyaXRlKGV4Y2VwdGlvbk1lc3NhZ2UpOwotCQlNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihzaGVsbCwgdGl0bGUsIG1zZy50b1N0cmluZygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBvcGVuUmVzb3VyY2UoZmluYWwgSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpIHsKLQkJCWZpbmFsIElXb3JrYmVuY2hQYWdlIGFjdGl2ZVBhZ2UgPSBnZXRBY3RpdmVQYWdlKCk7Ci0JCQlpZiAoYWN0aXZlUGFnZSAhPSBudWxsKSB7Ci0JCQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXREZWZhdWx0KCk7Ci0JCQkJaWYgKGRpc3BsYXkgIT0gbnVsbCkgewotCQkJCQlkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJSURFLm9wZW5FZGl0b3IoYWN0aXZlUGFnZSwgKElGaWxlKSByZXNvdXJjZSwgdHJ1ZSk7Ci0JCQkJCQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJCQkJCQlKYXZhU2VydmVyVUlQbHVnaW4ubG9nKGUpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJV29ya2JlbmNoUGFnZSBnZXRBY3RpdmVQYWdlKCkgewotCQlJV29ya2JlbmNoV2luZG93IGFjdGl2ZVdvcmtiZW5jaFdpbmRvdyA9IGdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQlpZiAoYWN0aXZlV29ya2JlbmNoV2luZG93ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGFjdGl2ZVdvcmtiZW5jaFdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJV29ya2JlbmNoV2luZG93IGdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpIHsKLQkJSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBKYXZhU2VydmVyVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRXb3JrYmVuY2goKTsKLQkJaWYgKHdvcmtiZW5jaCAhPSBudWxsKQotCQkJcmV0dXJuIHdvcmtiZW5jaC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJCi0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIud2Vic3BoZXJlLmNvcmUvLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci53ZWJzcGhlcmUuY29yZS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTFjOGYyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci53ZWJzcGhlcmUuY29yZS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLndlYnNwaGVyZS5jb3JlLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIud2Vic3BoZXJlLmNvcmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ5ZWU1MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIud2Vic3BoZXJlLmNvcmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotYmluCi0qLnhtbAotdGVtcC5mb2xkZXIKLXdlYnNwaGVyZWNvcmUuamFyCi13ZWJzcGhlcmVjb3Jlc3JjLnppcApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLndlYnNwaGVyZS5jb3JlLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLndlYnNwaGVyZS5jb3JlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2NmMjE3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci53ZWJzcGhlcmUuY29yZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIud2Vic3BoZXJlLmNvcmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLndlYnNwaGVyZS5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLndlYnNwaGVyZS5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2Y0MWRiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci53ZWJzcGhlcmUuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IFdlYlNwaGVyZSBHZW5lcmljIFNlcnZlciBEZWZpbml0aW9uIENvcmUgUGx1Zy1pbgotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LnNlcnZlci53ZWJzcGhlcmUuY29yZTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAucXVhbGlmaWVyCi1CdW5kbGUtQ2xhc3NQYXRoOiB3ZWJzcGhlcmVjb3JlLmphcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanN0LnNlcnZlci53ZWJzcGhlcmUuY29yZS5Db3JlUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiBFY2xpcHNlLm9yZwotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUsCi0gb3JnLmVjbGlwc2UuamR0LmNvcmUsCi0gb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZywKLSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUsCi0gb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLAotIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLAotIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aSwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZSwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMKLUVjbGlwc2UtQXV0b1N0YXJ0OiB0cnVlCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanN0LnNlcnZlci53ZWJzcGhlcmUuY29yZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLndlYnNwaGVyZS5jb3JlL2Fib3V0Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIud2Vic3BoZXJlLmNvcmUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY2Yjk2Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIud2Vic3BoZXJlLmNvcmUvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5GZWJydWFyeSAyNCwgMjAwNTwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLndlYnNwaGVyZS5jb3JlL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIud2Vic3BoZXJlLmNvcmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDc3YzAxOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIud2Vic3BoZXJlLmNvcmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgc2VydmVyZGVmLyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICB3ZWJzcGhlcmVjb3JlLmphcixcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLWphcnMuY29tcGlsZS5vcmRlciA9IHdlYnNwaGVyZWNvcmUuamFyCi1zb3VyY2Uud2Vic3BoZXJlY29yZS5qYXIgPSBzcmMvCi1vdXRwdXQud2Vic3BoZXJlY29yZS5qYXIgPSBiaW4vCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIud2Vic3BoZXJlLmNvcmUvaWNvbnMvb2JqMTYvd2Vic3BoZXJlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci53ZWJzcGhlcmUuY29yZS9pY29ucy9vYmoxNi93ZWJzcGhlcmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTM1Yzk3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci53ZWJzcGhlcmUuY29yZS9pY29ucy9vYmoxNi93ZWJzcGhlcmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLndlYnNwaGVyZS5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLndlYnNwaGVyZS5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDE2ODAyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci53ZWJzcGhlcmUuY29yZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLXBsdWdpbk5hbWU9IFdlYlNwaGVyZSBHZW5lcmljIFNlcnZlciBEZWZpbml0aW9uIENvcmUgUGx1Zy1pbgotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi1wbHVnaW5EZXNjcmlwdGlvbj1Qcm92aWRlcyBzZXJ2ZXIgZGVmaW5pdGlvbiBJQk0gV2ViU3BoZXJlIGFwcGxpY2F0aW9uIHNlcnZlcgotZ2VuZXJpY0NhdGVnb3J5PUlCTQotCi0jID09PT09PT09PT09PSB3ZWJzcGhlcmUgPT09PT09PT09PT09PT09PT09PT0KLXdlYnNwaGVyZS42LnJ1bnRpbWUubmFtZT1JQk0gV2ViU3BoZXJlIHY2LjAKLXdlYnNwaGVyZS42LnJ1bnRpbWUuZGVzY3JpcHRpb249UHVibGlzaGVzIGFuZCBydW5zIEoyRUUgMS40IG1vZHVsZXMgb24gYSBsb2NhbCBzZXJ2ZXIuIFwKLVByb3ZpZGVzIGJhc2ljIHNlcnZlciBmdW5jdGlvbmFsaXR5Ci13ZWJzcGhlcmUuNi5zZXJ2ZXIubmFtZT1JQk0gV2ViU3BoZXJlIHY2LjAKLXdlYnNwaGVyZS42LnNlcnZlci5kZXNjcmlwdGlvbj1QdWJsaXNoZXMgYW5kIHJ1bnMgSjJFRSAxLjQgbW9kdWxlcyBvbiBhIGxvY2FsIHNlcnZlci4gXAotUHJvdmlkZXMgYmFzaWMgc2VydmVyIGZ1bmN0aW9uYWxpdHkKLQotd2FzSG9tZT1JQk0gV2ViU3BoZXJlIEluc3RhbGxhdGlvbiBEaXJlY3Rvcnk6Ci1wb3J0PVBvcnQ6Ci13YXNQcm9maWxlPVNlcnZlciBQcm9maWxlIERpcmVjdG9yeToKLXdhc0NlbGw9Q2VsbDoKLXdhc05vZGU9Tm9kZToKLXdhc1NlcnZlcj1TZXJ2ZXI6CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIud2Vic3BoZXJlLmNvcmUvcGx1Z2luLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci53ZWJzcGhlcmUuY29yZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzc2YzU1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci53ZWJzcGhlcmUuY29yZS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5ydW50aW1lVHlwZXMiPgotICAgIDxydW50aW1lVHlwZQotICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucnVudGltZS53ZWJzcGhlcmUuNiIKLSAgICAgICBuYW1lPSIld2Vic3BoZXJlLjYucnVudGltZS5uYW1lIgotICAgICAgIGRlc2NyaXB0aW9uPSIld2Vic3BoZXJlLjYucnVudGltZS5kZXNjcmlwdGlvbiIKLSAgICAgICB2ZW5kb3I9IiVnZW5lcmljQ2F0ZWdvcnkiCi0gICAgICAgdmVyc2lvbj0iNi4wIgotICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5pbnRlcm5hbC5HZW5lcmljU2VydmVyUnVudGltZSI+Ci0gICAgICA8bW9kdWxlVHlwZQotICAgICAgICAgdHlwZXM9ImpzdC53ZWIiCi0gICAgICAgICB2ZXJzaW9ucz0iMi4yLCAyLjMsIDIuNCIvPgotICAgICAgPG1vZHVsZVR5cGUKLSAgICAgICAgIHR5cGVzPSJqc3QuZWpiIgotICAgICAgICAgdmVyc2lvbnM9IjEuMSwgMi4wLCAyLjEiLz4KLSAgICAgIDxtb2R1bGVUeXBlCi0gICAgICAgICB0eXBlcz0ianN0LmVhciIKLSAgICAgICAgIHZlcnNpb25zPSIxLjIsIDEuMywgMS40Ii8+Ci0gICAgICA8bW9kdWxlVHlwZQotICAgICAgICAgdHlwZXM9ImpzdC5jb25uZWN0b3IiCi0gICAgICAgICB2ZXJzaW9ucz0iMS4wLCAxLjUiLz4KLSAgICAgICA8bW9kdWxlVHlwZQotICAgICAgICAgdHlwZXM9ImpzdC51dGlsaXR5IgotICAgICAgICAgdmVyc2lvbnM9IjEuMCIvPgotICAgCi0gICAgPC9ydW50aW1lVHlwZT4KLSAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5zZXJ2ZXJUeXBlcyI+Ci0KLSAgICAgPHNlcnZlclR5cGUKLSAgICAgICAgICAgcnVudGltZT0idHJ1ZSIKLSAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsLkdlbmVyaWNTZXJ2ZXIiCi0gICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVycy53ZWJzcGhlcmUuNiIKLSAgICAgICAgICAgaW5pdGlhbFN0YXRlPSJzdG9wcGVkIgotCQkgICBzdGFydFRpbWVvdXQ9IjMwMDAwMCIKLSAgICAgICAgICAgc3RvcFRpbWVvdXQ9IjE1MDAwIgotICAgICAgICAgICBzdXBwb3J0c1JlbW90ZUhvc3RzPSJmYWxzZSIKLSAgICAgICAgICAgcnVudGltZVR5cGVJZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnJ1bnRpbWUud2Vic3BoZXJlLjYiCi0gICAgICAgICAgIGRlc2NyaXB0aW9uPSIld2Vic3BoZXJlLjYuc2VydmVyLmRlc2NyaXB0aW9uIgotICAgICAgICAgICBsYXVuY2hDb25maWdJZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUubGF1bmNoQ29uZmlndXJhdGlvblR5cGUiCi0gICAgICAgICAgIGJlaGF2aW91ckNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5pbnRlcm5hbC5HZW5lcmljU2VydmVyQmVoYXZpb3VyIgotICAgICAgICAgICBuYW1lPSIld2Vic3BoZXJlLjYuc2VydmVyLm5hbWUiCi0gICAgICAgICAgIGhhc0NvbmZpZ3VyYXRpb249ImZhbHNlIgotICAgICAgICAgICBsYXVuY2hNb2Rlcz0icnVuLGRlYnVnIgotICAgICAgICAgICBzdGFydEJlZm9yZVB1Ymxpc2g9InRydWUiPgotICAgICA8L3NlcnZlclR5cGU+Ci0gICAgIAotICAgICAKLQk8L2V4dGVuc2lvbj4KLQotPCEtLSBVSSBDb21wb25lbnRzLS0+Ci0gICAgPGV4dGVuc2lvbgotICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLndpemFyZEZyYWdtZW50cyI+Ci0KLSAgICAgPGZyYWdtZW50Ci0gICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucnVudGltZSIKLSAgICAgICAgdHlwZUlkcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnJ1bnRpbWUud2Vic3BoZXJlLjYiCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkuaW50ZXJuYWwuR2VuZXJpY1NlcnZlclJ1bnRpbWVXaXphcmRGcmFnbWVudCIvPiAgICAgICAgICAgCi0gICAgIDxmcmFnbWVudAotICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlciIKLSAgICAgICAgdHlwZUlkcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlcnMud2Vic3BoZXJlLjYiCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudWkuaW50ZXJuYWwuR2VuZXJpY1NlcnZlcldpemFyZEZyYWdtZW50Ii8+ICAgCi0gICAgICAgIAotICA8L2V4dGVuc2lvbj4KLSAgCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuc2VydmVySW1hZ2VzIj4KLSAgICAgICAgIAotICAgICA8aW1hZ2UKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW1hZ2UiCi0gICAgICAgICBpY29uPSJpY29ucy9vYmoxNi93ZWJzcGhlcmUuZ2lmIgotICAgICAgICAgdHlwZUlkcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlcnMud2Vic3BoZXJlLjYiIC8+Ci0gICAgIDxpbWFnZQotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbWFnZSIKLSAgICAgICAgIGljb249Imljb25zL29iajE2L3dlYnNwaGVyZS5naWYiCi0gICAgICAgICB0eXBlSWRzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucnVudGltZS53ZWJzcGhlcmUuNiIvPgotCi0JPC9leHRlbnNpb24+Ci0gIAotPCEtLSBTZXJ2ZXIgdHlwZSBkZWZpbml0aW9ucyAtLT4KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLnNlcnZlcmRlZmluaXRpb24iPgotCQk8c2VydmVyZGVmaW5pdGlvbiBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnJ1bnRpbWUud2Vic3BoZXJlLjYiIGRlZmluaXRpb25maWxlPSIvc2VydmVyZGVmL3dlYnNwaGVyZS42LnNlcnZlcmRlZiI+Ci0JCTwvc2VydmVyZGVmaW5pdGlvbj4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5nZW5lcmljcHVibGlzaGVyIj4KLSAgICAgIDxnZW5lcmljcHVibGlzaGVyCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci53ZWJzcGhlcmUuY29yZS5BbnRQdWJsaXNoZXIiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLndlYnNwaGVyZS5hbnRwdWJsaXNoZXIiLz4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWVzIj4KLSAgICA8cnVudGltZS1jb21wb25lbnQtdHlwZQotICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucnVudGltZS53ZWJzcGhlcmUiPgotICAgIDwvcnVudGltZS1jb21wb25lbnQtdHlwZT4KLQotICAgIDxydW50aW1lLWNvbXBvbmVudC12ZXJzaW9uCi0gICAgICAgdHlwZT0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnJ1bnRpbWUud2Vic3BoZXJlIgotICAgICAgIHZlcnNpb249IjYuMCIvPgotCi0gICAgPGFkYXB0ZXI+Ci0gICAgICA8cnVudGltZS1jb21wb25lbnQKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucnVudGltZS53ZWJzcGhlcmUiLz4KLSAgICAgIDxmYWN0b3J5Ci0gICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLmludGVybmFsLlJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlciRGYWN0b3J5Ii8+Ci0gICAgICA8dHlwZQotICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklDbGFzc3BhdGhQcm92aWRlciIvPgotICAgIDwvYWRhcHRlcj4KLQotICAgIDxzdXBwb3J0ZWQ+Ci0gICAgICA8cnVudGltZS1jb21wb25lbnQKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucnVudGltZS53ZWJzcGhlcmUiCi0gICAgICAgICB2ZXJzaW9uPSI2LjAiLz4KLSAgICAgIDxmYWNldAotICAgICAgICAgaWQ9ImpzdC53ZWIiCi0gICAgICAgICB2ZXJzaW9uPSIyLjIsMi4zLDIuNCIvPgotICAgICAgPGZhY2V0Ci0gICAgICAgICBpZD0ianN0LmVqYiIKLSAgICAgICAgIHZlcnNpb249IjEuMSwyLjAsMi4xIi8+Ci0gICAgICA8ZmFjZXQKLSAgICAgICAgIGlkPSJqc3QuZWFyIgotICAgICAgICAgdmVyc2lvbj0iMS4yLDEuMywxLjQiLz4KLSAgICAgICAgIAotICAgICAgIDxmYWNldAotICAgICAgICAgaWQ9ImpzdC5hcHBjbGllbnQiCi0gICAgICAgICB2ZXJzaW9uPSIxLjIsMS4zLDEuNCIvPgotICAgICAgIAotICAgICAgIDxmYWNldAotICAgICAgICAgaWQ9ImpzdC51dGlsaXR5IgotICAgICAgICAgdmVyc2lvbj0iMS4wIi8+ICAKLSAgICAgICAgIAotICAgICAgIDxmYWNldAotICAgICAgICAgaWQ9ImpzdC5jb25uZWN0b3IiCi0gICAgICAgICB2ZXJzaW9uPSIxLjAsMS41Ii8+Ci0gICAgPC9zdXBwb3J0ZWQ+Ci0gIDwvZXh0ZW5zaW9uPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5pbWFnZXMiPgotICAgIDxpbWFnZSBydW50aW1lLWNvbXBvbmVudC10eXBlPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMucnVudGltZS53ZWJzcGhlcmUiCi0gICAgICBwYXRoPSJpY29ucy9vYmoxNi93ZWJzcGhlcmUuZ2lmIi8+Ci0gIDwvZXh0ZW5zaW9uPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWVzIj4KLSAgICA8YWRhcHRlcj4KLSAgICAgIDxydW50aW1lLWNvbXBvbmVudCBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnJ1bnRpbWUud2Vic3BoZXJlIi8+Ci0gICAgICA8ZmFjdG9yeSBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci51aS5pbnRlcm5hbC5SdW50aW1lTGFiZWxQcm92aWRlciRGYWN0b3J5Ii8+Ci0gICAgICA8dHlwZSBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLklSdW50aW1lQ29tcG9uZW50TGFiZWxQcm92aWRlciIvPgotICAgIDwvYWRhcHRlcj4KLSAgPC9leHRlbnNpb24+Ci08L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIud2Vic3BoZXJlLmNvcmUvc2VydmVyZGVmL3NjcmlwdHMvd2Vic3BoZXJlLjYueC54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIud2Vic3BoZXJlLmNvcmUvc2VydmVyZGVmL3NjcmlwdHMvd2Vic3BoZXJlLjYueC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkM2VhNDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLndlYnNwaGVyZS5jb3JlL3NlcnZlcmRlZi9zY3JpcHRzL3dlYnNwaGVyZS42LngueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLTxwcm9qZWN0IG5hbWU9ImRlcGxveWV4dGVuc2lvbiIgIGRlZmF1bHQ9ImRlcGxveS5qMmVlLndlYiIgIGJhc2VkaXI9Ii4iPgotCi0JPHByb3BlcnR5IG5hbWU9Indhcy5ob21lIiB2YWx1ZT0iJHt3YXNIb21lfSIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJtb2R1bGUud29ya2luZy5kaXIiIHZhbHVlPSIke3Byb2plY3Qud29ya2luZy5kaXJ9LyR7cHJvamVjdC5uYW1lfSI+PC9wcm9wZXJ0eT4KLQk8cGF0aCBpZD0idG9vbHBhdGgiPgotCQk8ZmlsZXNldCBkaXI9IiR7d2FzLmhvbWV9L2xpYiI+Ci0JCQk8aW5jbHVkZSBuYW1lPSIqLmphciIgLz4KLQkJPC9maWxlc2V0PgotCQk8cGF0aGVsZW1lbnQgcGF0aD0iJHt3YXMuaG9tZX0vbGliL3Byb3BlcnRpZXMiIC8+Ci0JCTxwYXRoZWxlbWVudCBwYXRoPSIke3dhcy5ob21lfS9vcHRpb25hbExpYnJhcmllcy9qeXRob24uamFyIiAvPgotCTwvcGF0aD4KLQotCTx0YXNrZGVmIGNsYXNzcGF0aHJlZj0idG9vbHBhdGgiIG5hbWU9IndzYWRtaW4iIGNsYXNzbmFtZT0iY29tLmlibS53ZWJzcGhlcmUuYW50LnRhc2tzLldzQWRtaW4iIC8+Ci0JPHRhc2tkZWYgY2xhc3NwYXRocmVmPSJ0b29scGF0aCIgbmFtZT0id3NlamJkZXBsb3kiIGNsYXNzbmFtZT0iY29tLmlibS53ZWJzcGhlcmUuYW50LnRhc2tzLldzRWpiRGVwbG95IiAvPgkKLQk8dGFza2RlZiBjbGFzc3BhdGhyZWY9InRvb2xwYXRoIiBuYW1lPSJ3c2luc3RhbGxhcHAiIGNsYXNzbmFtZT0iY29tLmlibS53ZWJzcGhlcmUuYW50LnRhc2tzLkluc3RhbGxBcHBsaWNhdGlvbiIgLz4JCi0KLQk8dGFyZ2V0IG5hbWU9ImRlcGxveS5qMmVlLndlYiI+Ci0JCTxlY2hvIG1lc3NhZ2U9Ik1vZHVsZSBXb3JraW5nIERheSAgJHttb2R1bGUud29ya2luZy5kaXJ9IFByb2plY3QgV29ya2luZyBEaXI9JHtwcm9qZWN0LndvcmtpbmcuZGlyfSBNZXNzYWdlIERpcj0ke21vZHVsZS5kaXJ9IE1vZHVsZSBOYW1lICR7bW9kdWxlLm5hbWV9Ij48L2VjaG8+Ci0JCTxqYXIgZGVzdGZpbGU9IiR7cHJvamVjdC53b3JraW5nLmRpcn0vJHttb2R1bGUubmFtZX0ud2FyIj4gCi0JCQk8emlwZmlsZXNldCBkaXI9IiR7bW9kdWxlLndvcmtpbmcuZGlyfSI+Ci0JCQkJPGluY2x1ZGUgbmFtZT0iKiovKi4qIi8+Ci0JCQkJPGV4Y2x1ZGUgbmFtZT0iKiovKi53YXIiLz4KLQkJCTwvemlwZmlsZXNldD4KLQkJPC9qYXI+Ci0JCTx3c2FkbWluICAKLQkJCXdhc2hvbWU9IiR7d2FzLmhvbWV9IiAJCi0JCQlwcm9wZXJ0aWVzPSIke3dhc1Byb2ZpbGV9L3Byb3BlcnRpZXMvd3NhZG1pbi5wcm9wZXJ0aWVzIiAKLQkJCWNvbW1hbmQ9IiRBZG1pbkFwcCB1bmluc3RhbGwgJHttb2R1bGUubmFtZX0iIAotCQkJZmFpbG9uZXJyb3I9ImZhbHNlIj4KLQkJPC93c2FkbWluPgotCSAgICA8d3NhZG1pbiAgCi0JCQl3YXNob21lPSIke3dhcy5ob21lfSIgCQkJCQotCQkJcHJvcGVydGllcz0iJHt3YXNQcm9maWxlfS9wcm9wZXJ0aWVzL3dzYWRtaW4ucHJvcGVydGllcyIgCi0JCQljb21tYW5kPSIkQWRtaW5BcHAgaW5zdGFsbCAke3Byb2plY3Qud29ya2luZy5kaXJ9LyR7bW9kdWxlLm5hbWV9LndhciB7LWFwcG5hbWUgJHttb2R1bGUubmFtZX0gLWNvbnRleHRyb290ICAke21vZHVsZS5uYW1lfSAtdXNlZGVmYXVsdGJpbmRpbmdzfSIgCi0JCQlmYWlsb25lcnJvcj0idHJ1ZSI+Ci0JCTwvd3NhZG1pbj4KLQkgICAgPHdzYWRtaW4gIAotCQkgIHdhc2hvbWU9IiR7d2FzLmhvbWV9IiAKLQkJICBwcm9wZXJ0aWVzPSIke3dhc1Byb2ZpbGV9L3Byb3BlcnRpZXMvd3NhZG1pbi5wcm9wZXJ0aWVzIiAKLQkJICBjb21tYW5kPSIkQWRtaW5Db250cm9sIGludm9rZSBbJEFkbWluQ29udHJvbCBxdWVyeU5hbWVzIHR5cGU9QXBwbGljYXRpb25NYW5hZ2VyLCpdIHN0YXJ0QXBwbGljYXRpb24gJHttb2R1bGUubmFtZX0iIAotCQkgIGZhaWxvbmVycm9yPSJ0cnVlIj4KLQkgICAgPC93c2FkbWluPgkJCQotCTwvdGFyZ2V0PgotCQotCTx0YXJnZXQgbmFtZT0iZGVwbG95LmoyZWUuZWpiIj4KLQkJPGphciBkZXN0ZmlsZT0iJHtwcm9qZWN0LndvcmtpbmcuZGlyfS8ke21vZHVsZS5uYW1lfS5qYXIiPiAKLQkJCTx6aXBmaWxlc2V0IGRpcj0iJHttb2R1bGUuZGlyfSI+Ci0JICAgICAgICAJPGluY2x1ZGUgbmFtZT0iKiovKi4qIi8+Ci0JICAgICAgIAkJPGV4Y2x1ZGUgbmFtZT0iKiovKi5qYXZhIi8+Ci0JCQk8L3ppcGZpbGVzZXQ+Ci0JCTwvamFyPgotCQk8d3NlamJkZXBsb3kgCi0JCQkJaW5wdXRKYXI9IiR7cHJvamVjdC53b3JraW5nLmRpcn0vJHttb2R1bGUubmFtZX0uamFyIiAKLQkJCQl3YXNIb21lPSIke3dhcy5ob21lfSIgCi0JCQkJd2FzaG9tZT0iJHt3YXMuaG9tZX0iIAotCQkJCWNsYXNzcGF0aHJlZj0idG9vbHBhdGgiCi0JCQkJb3V0cHV0SmFyPSIke3Byb2plY3Qud29ya2luZy5kaXJ9LyR7bW9kdWxlLm5hbWV9LXdhcy5qYXIiIAotCQkJCWNvZGVnZW49InRydWUgIiAKLQkJCQlrZWVwR2VuZXJhdGVkPSJ0cnVlIiAKLQkJCQlxdWlldD0iZmFsc2UiIAotCQkJCW5vVmFsaWRhdGU9InRydWUiIAotCQkJCW5vV2FybmluZ3M9ImZhbHNlIiAKLQkJCQlub0luZm9ybT0iZmFsc2UiIAotCQkJCWNvbXBhdGlibGUzNT0iZmFsc2UiIAotCQkJCWZhaWxvbmVycm9yPSJ0cnVlIiAKLQkJCQl0cmFjZT0idHJ1ZSIgCi0JCQkJanZtTWF4TWVtb3J5PSIyNTZNIiAvPgotCQotCQkJPHdzYWRtaW4gIAotCQkJCXdhc2hvbWU9IiR7d2FzLmhvbWV9IiAKLQkJCQlwcm9wZXJ0aWVzPSIke3dhc1Byb2ZpbGV9L3Byb3BlcnRpZXMvd3NhZG1pbi5wcm9wZXJ0aWVzIiAKLQkJCQljb21tYW5kPSIkQWRtaW5BcHAgdW5pbnN0YWxsICR7bW9kdWxlLm5hbWV9IiAKLQkJCQlmYWlsb25lcnJvcj0iZmFsc2UiPgotCQkJPC93c2FkbWluPgotCi0JCSAgICA8d3NhZG1pbiAgCi0JCQkJd2FzaG9tZT0iJHt3YXMuaG9tZX0iIAkJCQkKLQkJCQlwcm9wZXJ0aWVzPSIke3dhc1Byb2ZpbGV9L3Byb3BlcnRpZXMvd3NhZG1pbi5wcm9wZXJ0aWVzIiAKLQkJCQljb21tYW5kPSIkQWRtaW5BcHAgaW5zdGFsbCAke3Byb2plY3Qud29ya2luZy5kaXJ9LyR7bW9kdWxlLm5hbWV9LmphciB7LWFwcG5hbWUgJHttb2R1bGUubmFtZX0gLXVzZWRlZmF1bHRiaW5kaW5nc30iIAotCQkJCWZhaWxvbmVycm9yPSJ0cnVlIj4KLQkJCTwvd3NhZG1pbj4KLQotCQkJPHdzYWRtaW4gIAotCQkJICB3YXNob21lPSIke3dhcy5ob21lfSIgCi0JCQkgIHByb3BlcnRpZXM9IiR7d2FzUHJvZmlsZX0vcHJvcGVydGllcy93c2FkbWluLnByb3BlcnRpZXMiIAotCQkJICBjb21tYW5kPSIkQWRtaW5Db250cm9sIGludm9rZSBbJEFkbWluQ29udHJvbCBxdWVyeU5hbWVzIHR5cGU9QXBwbGljYXRpb25NYW5hZ2VyLCpdIHN0YXJ0QXBwbGljYXRpb24gJHttb2R1bGUubmFtZX0iIAotCQkJICBmYWlsb25lcnJvcj0idHJ1ZSI+Ci0JCSAgICA8L3dzYWRtaW4+CQotCTwvdGFyZ2V0PgotCQotCTx0YXJnZXQgbmFtZT0iZGVwbG95LmoyZWUuZWFyIj4KLQkJPGphciBkZXN0ZmlsZT0iJHtwcm9qZWN0LndvcmtpbmcuZGlyfS8ke21vZHVsZS5uYW1lfS5lYXIiPiAKLQkJCTx6aXBmaWxlc2V0IGRpcj0iJHttb2R1bGUuZGlyfSI+Ci0JICAgICAgICAJPGluY2x1ZGUgbmFtZT0iKiovKi4qIi8+Ci0JICAgICAgIAkJPGV4Y2x1ZGUgbmFtZT0iKiovKi5qYXZhIi8+Ci0JCQk8L3ppcGZpbGVzZXQ+Ci0JCTwvamFyPgotCi0JCTx3c2FkbWluICAKLQkJCQkJd2FzaG9tZT0iJHt3YXMuaG9tZX0iIAotCQkJCQlwcm9wZXJ0aWVzPSIke3dhc1Byb2ZpbGV9L3Byb3BlcnRpZXMvd3NhZG1pbi5wcm9wZXJ0aWVzIiAKLQkJCQkJY29tbWFuZD0iJEFkbWluQXBwIHVuaW5zdGFsbCAke21vZHVsZS5uYW1lfSIgCi0JCQkJCWZhaWxvbmVycm9yPSJmYWxzZSI+Ci0JCTwvd3NhZG1pbj4KLQotCQk8d3NhZG1pbiAgCi0JCQkJCXdhc2hvbWU9IiR7d2FzLmhvbWV9IiAJCQkJCi0JCQkJCXByb3BlcnRpZXM9IiR7d2FzUHJvZmlsZX0vcHJvcGVydGllcy93c2FkbWluLnByb3BlcnRpZXMiIAotCQkJCQljb21tYW5kPSIkQWRtaW5BcHAgaW5zdGFsbCAke3Byb2plY3Qud29ya2luZy5kaXJ9LyR7bW9kdWxlLm5hbWV9LmVhciB7LWFwcG5hbWUgJHttb2R1bGUubmFtZX0gLWRlcGxveWVqYiAtdXNlZGVmYXVsdGJpbmRpbmdzfSIgCi0JCQkJCWZhaWxvbmVycm9yPSJ0cnVlIj4KLQkJPC93c2FkbWluPgotCQk8d3NhZG1pbiAgCi0JCQkJICB3YXNob21lPSIke3dhcy5ob21lfSIgCi0JCQkJICBwcm9wZXJ0aWVzPSIke3dhc1Byb2ZpbGV9L3Byb3BlcnRpZXMvd3NhZG1pbi5wcm9wZXJ0aWVzIiAKLQkJCQkgIGNvbW1hbmQ9IiRBZG1pbkNvbnRyb2wgaW52b2tlIFskQWRtaW5Db250cm9sIHF1ZXJ5TmFtZXMgdHlwZT1BcHBsaWNhdGlvbk1hbmFnZXIsKl0gc3RhcnRBcHBsaWNhdGlvbiAke21vZHVsZS5uYW1lfSIgCi0JCQkJICBmYWlsb25lcnJvcj0idHJ1ZSI+Ci0JCSA8L3dzYWRtaW4+CQotCQkKLQk8L3RhcmdldD4JCi0JCi0JPHRhcmdldCBuYW1lPSJ1bmRlcGxveS5qMmVlLndlYiI+Ci0JCQotCQk8d3NhZG1pbiAgCi0JCQl3YXNob21lPSIke3dhcy5ob21lfSIgCi0JCQkKLQkJCXByb3BlcnRpZXM9IiR7d2FzUHJvZmlsZX0vcHJvcGVydGllcy93c2FkbWluLnByb3BlcnRpZXMiIAotCQkJY29tbWFuZD0iJEFkbWluQXBwIHVuaW5zdGFsbCAke21vZHVsZS5uYW1lfSIgCi0JCQlmYWlsb25lcnJvcj0iZmFsc2UiPgotCQk8L3dzYWRtaW4+Ci0JPC90YXJnZXQ+Ci0JPHRhcmdldCBuYW1lPSJ1bmRlcGxveS5qMmVlLmVqYiI+Ci0JCTx3c2FkbWluICAKLQkJCXdhc2hvbWU9IiR7d2FzLmhvbWV9IiAKLQkJCQotCQkJcHJvcGVydGllcz0iJHt3YXNQcm9maWxlfS9wcm9wZXJ0aWVzL3dzYWRtaW4ucHJvcGVydGllcyIgCi0JCQljb21tYW5kPSIkQWRtaW5BcHAgdW5pbnN0YWxsICR7bW9kdWxlLm5hbWV9IiAKLQkJCWZhaWxvbmVycm9yPSJmYWxzZSI+Ci0JCTwvd3NhZG1pbj4KLQk8L3RhcmdldD4JCi0JCi0JPHRhcmdldCBuYW1lPSJ1bmRlcGxveS5qMmVlLmVhciI+Ci0JCTx3c2FkbWluICAKLQkJCXdhc2hvbWU9IiR7d2FzLmhvbWV9IiAKLQkJCQotCQkJcHJvcGVydGllcz0iJHt3YXNQcm9maWxlfS9wcm9wZXJ0aWVzL3dzYWRtaW4ucHJvcGVydGllcyIgCi0JCQljb21tYW5kPSIkQWRtaW5BcHAgdW5pbnN0YWxsICR7bW9kdWxlLm5hbWV9IiAKLQkJCWZhaWxvbmVycm9yPSJmYWxzZSI+Ci0JCTwvd3NhZG1pbj4KLQk8L3RhcmdldD4JCi0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci53ZWJzcGhlcmUuY29yZS9zZXJ2ZXJkZWYvd2Vic3BoZXJlLjYuc2VydmVyZGVmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLndlYnNwaGVyZS5jb3JlL3NlcnZlcmRlZi93ZWJzcGhlcmUuNi5zZXJ2ZXJkZWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhOGRjM2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLndlYnNwaGVyZS5jb3JlL3NlcnZlcmRlZi93ZWJzcGhlcmUuNi5zZXJ2ZXJkZWYKKysrIC9kZXYvbnVsbApAQCAtMSwyMTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx0bnM6U2VydmVyUnVudGltZQotCXhtbG5zOnRucz0iaHR0cDovL2VjbGlwc2Uub3JnL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9TZXJ2ZXJUeXBlRGVmaW5pdGlvbiIKLQl4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotCXhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2VjbGlwc2Uub3JnL2pzdC9zZXJ2ZXIvZ2VuZXJpYy9TZXJ2ZXJUeXBlRGVmaW5pdGlvbiBTZXJ2ZXJUeXBlRGVmaW5pdGlvblNjaGVtYS54c2QgIgotCW5hbWU9IklCTSBXZWJTcGhlcmUgNiIgdmVyc2lvbj0idjYuMCI+Ci0JPHByb3BlcnR5IGlkPSJ3YXNIb21lIgotCQlsYWJlbD0iJXdhc0hvbWUiCi0JCXR5cGU9ImRpcmVjdG9yeSIKLQkJY29udGV4dD0icnVudGltZSIKLQkJZGVmYXVsdD0iL3lvdXJfc2VydmVyX3Jvb3Qvd2FzLTYuMCIgLz4KLQotCTxwcm9wZXJ0eSBpZD0icG9ydCIKLQkJbGFiZWw9IiVwb3J0IgotCQl0eXBlPSJzdHJpbmciCi0JCWNvbnRleHQ9InNlcnZlciIKLQkJZGVmYXVsdD0iOTA4MCIgLz4KLQotCTxwcm9wZXJ0eSBpZD0id2FzUHJvZmlsZSIKLQkJbGFiZWw9IiV3YXNQcm9maWxlIgotCQl0eXBlPSJkaXJlY3RvcnkiCi0JCWNvbnRleHQ9InNlcnZlciIKLQkJZGVmYXVsdD0iL3lvdXJfc2VydmVyX3Jvb3Qvd2FzLTYuMC9wcm9maWxlcy9kZWZhdWx0IiAvPgotCi0JPHByb3BlcnR5IGlkPSJ3YXNDZWxsIgotCQlsYWJlbD0iJXdhc0NlbGwiCi0JCXR5cGU9InN0cmluZyIKLQkJY29udGV4dD0ic2VydmVyIgotCQlkZWZhdWx0PSJbY2VsbF0iIC8+Ci0KLQk8cHJvcGVydHkgaWQ9Indhc05vZGUiCi0JCWxhYmVsPSIld2FzTm9kZSIKLQkJdHlwZT0ic3RyaW5nIgotCQljb250ZXh0PSJzZXJ2ZXIiCi0JCWRlZmF1bHQ9IltOb2RlXSIgLz4KLQk8cHJvcGVydHkgaWQ9Indhc1NlcnZlciIKLQkJbGFiZWw9IiV3YXNTZXJ2ZXIiCi0JCXR5cGU9InN0cmluZyIKLQkJY29udGV4dD0ic2VydmVyIgotCQlkZWZhdWx0PSJzZXJ2ZXIxIiAvPgotCi0JPHBvcnQ+Ci0JCTxubz4ke3BvcnR9PC9ubz4KLQkJPG5hbWU+SHR0cDwvbmFtZT4KLQkJPHByb3RvY29sPmh0dHA8L3Byb3RvY29sPgotCTwvcG9ydD4KLQotCTxtb2R1bGU+Ci0JCTx0eXBlPmpzdC53ZWI8L3R5cGU+Ci0JCTxwdWJsaXNoRGlyPiR7d2FzSG9tZX08L3B1Ymxpc2hEaXI+Ci0JCTxwdWJsaXNoZXJSZWZlcmVuY2U+b3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLndlYnNwaGVyZS5hbnRwdWJsaXNoZXI8L3B1Ymxpc2hlclJlZmVyZW5jZT4KLQk8L21vZHVsZT4KLQk8bW9kdWxlPgotCQk8dHlwZT5qc3QuZWpiPC90eXBlPgotCQk8cHVibGlzaERpcj4ke3dhc0hvbWV9PC9wdWJsaXNoRGlyPgotCQk8cHVibGlzaGVyUmVmZXJlbmNlPm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy53ZWJzcGhlcmUuYW50cHVibGlzaGVyPC9wdWJsaXNoZXJSZWZlcmVuY2U+Ci0JPC9tb2R1bGU+Ci0JPG1vZHVsZT4KLQkJPHR5cGU+anN0LmVhcjwvdHlwZT4KLQkJPHB1Ymxpc2hEaXI+JHt3YXNIb21lfTwvcHVibGlzaERpcj4KLQkJPHB1Ymxpc2hlclJlZmVyZW5jZT5vcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMud2Vic3BoZXJlLmFudHB1Ymxpc2hlcjwvcHVibGlzaGVyUmVmZXJlbmNlPgotCTwvbW9kdWxlPgotCTxtb2R1bGU+Ci0JCTx0eXBlPmpzdC5jb25uZWN0b3I8L3R5cGU+Ci0JCTxwdWJsaXNoRGlyPiR7d2FzSG9tZX08L3B1Ymxpc2hEaXI+Ci0JCTxwdWJsaXNoZXJSZWZlcmVuY2U+b3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLndlYnNwaGVyZS5hbnRwdWJsaXNoZXI8L3B1Ymxpc2hlclJlZmVyZW5jZT4KLQk8L21vZHVsZT4KLQk8cHJvamVjdD4KLQkJPGNsYXNzcGF0aFJlZmVyZW5jZT53YXMucHJvamVjdDwvY2xhc3NwYXRoUmVmZXJlbmNlPgotCTwvcHJvamVjdD4KLQkKLQk8c3RhcnQ+Ci0JCTxtYWluQ2xhc3M+Y29tLmlibS53cy5ib290c3RyYXAuV1NMYXVuY2hlcjwvbWFpbkNsYXNzPgotCQk8d29ya2luZ0RpcmVjdG9yeT4ke3dhc1Byb2ZpbGV9PC93b3JraW5nRGlyZWN0b3J5PgotCQk8cHJvZ3JhbUFyZ3VtZW50cz5jb20uaWJtLndzLnJ1bnRpbWUuV3NTZXJ2ZXIgIiR7d2FzUHJvZmlsZX0vY29uZmlnIiAiJHt3YXNDZWxsfSIgIiR7d2FzTm9kZX0iICIke3dhc1NlcnZlcn0iPC9wcm9ncmFtQXJndW1lbnRzPgotCQk8dm1QYXJhbWV0ZXJzPiItRHVzZXIuaW5zdGFsbC5yb290PSR7d2FzUHJvZmlsZX0iICAiLURzZXJ2ZXIucm9vdD0ke3dhc1Byb2ZpbGV9IiAgIi1Ed2FzLmluc3RhbGwucm9vdD0ke3dhc0hvbWV9IiAiLURjb20uaWJtLml0cC5sb2NhdGlvbj0ke3dhc0hvbWV9L2JpbiIgIi1Ed3MuZXh0LmRpcnM9JHt3YXNIb21lfS9qYXZhL2xpYiR7cGF0aENoYXJ9JHt3YXNQcm9maWxlfS9jbGFzc2VzJHtwYXRoQ2hhcn0ke3dhc0hvbWV9L2NsYXNzZXMke3BhdGhDaGFyfSR7d2FzSG9tZX0vbGliJHtwYXRoQ2hhcn0ke3dhc0hvbWV9L2luc3RhbGxlZENoYW5uZWxzJHtwYXRoQ2hhcn0ke3dhc0hvbWV9L2xpYi9leHQke3BhdGhDaGFyfSR7d2FzSG9tZX0vd2ViL2hlbHAke3BhdGhDaGFyfSR7d2FzSG9tZX0vZGVwbG95dG9vbC9pdHAvcGx1Z2lucy9jb20uaWJtLmV0b29scy5lamJkZXBsb3kvcnVudGltZSIgIC1YYm9vdGNsYXNzcGF0aC9wOiR7d2FzSG9tZX0vamF2YS9qcmUvbGliL2V4dC9pYm1vcmIuamFyJHtwYXRoQ2hhcn0ke3dhc0hvbWV9L2phdmEvanJlL2xpYi9leHQvaWJtZXh0LmphciAtWG1zNTBtIC1YbXgyNTZtICItRGNvbS5pYm0uQ09SQkEuQ29uZmlnVVJMPWZpbGU6JHt3YXNQcm9maWxlfS9wcm9wZXJ0aWVzL3Nhcy5jbGllbnQucHJvcHMiICItRGNvbS5pYm0uU09BUC5Db25maWdVUkw9ZmlsZToke3dhc1Byb2ZpbGV9L3Byb3BlcnRpZXMvc29hcC5jbGllbnQucHJvcHMiICAgIi1EamF2YS51dGlsLmxvZ2dpbmcubWFuYWdlcj1jb20uaWJtLndzLmJvb3RzdHJhcC5Xc0xvZ01hbmFnZXIiICItRGphdmEudXRpbC5sb2dnaW5nLmNvbmZpZ3VyZUJ5U2VydmVyPXRydWUiICItRGlibS53ZWJzcGhlcmUucHJlbG9hZC5jbGFzc2VzPXRydWUiICAiLURqYXZhLmxpYnJhcnkucGF0aD0ke3dhc0hvbWV9L2phdmEvYmluJHtwYXRoQ2hhcn0ke3dhc0hvbWV9L2JpbiR7cGF0aENoYXJ9JHt3YXNIb21lfS9qYXZhL2JpbiR7cGF0aENoYXJ9JHt3YXNIb21lfS9qYXZhL2pyZS9iaW4iPC92bVBhcmFtZXRlcnM+Ci0JCTxjbGFzc3BhdGhSZWZlcmVuY2U+d2FzPC9jbGFzc3BhdGhSZWZlcmVuY2U+Ci0JPC9zdGFydD4KLQotCTxzdG9wPgotCQk8bWFpbkNsYXNzPmNvbS5pYm0ud3MuYm9vdHN0cmFwLldTTGF1bmNoZXI8L21haW5DbGFzcz4KLQkJPHdvcmtpbmdEaXJlY3Rvcnk+JHt3YXNIb21lfTwvd29ya2luZ0RpcmVjdG9yeT4KLQkJPHByb2dyYW1Bcmd1bWVudHM+Y29tLmlibS53cy5tYW5hZ2VtZW50LnRvb2xzLldzU2VydmVyU3RvcCAiJHt3YXNQcm9maWxlfS9jb25maWciICIke3dhc0NlbGx9IiAiJHt3YXNOb2RlfSIgIiR7d2FzU2VydmVyfSI8L3Byb2dyYW1Bcmd1bWVudHM+Ci0JCTx2bVBhcmFtZXRlcnM+Ii1EdXNlci5pbnN0YWxsLnJvb3Q9JHt3YXNQcm9maWxlfSIgICItRHNlcnZlci5yb290PSR7d2FzUHJvZmlsZX0iICAiLUR3YXMuaW5zdGFsbC5yb290PSR7d2FzSG9tZX0iICItRHdzLmV4dC5kaXJzPSR7d2FzSG9tZX0vamF2YS9saWIke3BhdGhDaGFyfSR7d2FzSG9tZX0vY2xhc3NlcyR7cGF0aENoYXJ9JHt3YXNIb21lfS9saWIke3BhdGhDaGFyfSR7d2FzSG9tZX0vaW5zdGFsbGVkQ2hhbm5lbHMke3BhdGhDaGFyfSR7d2FzSG9tZX0vbGliL2V4dCR7cGF0aENoYXJ9JHt3YXNIb21lfS93ZWIvaGVscCR7cGF0aENoYXJ9JHt3YXNIb21lfS9kZXBsb3l0b29sL2l0cC9wbHVnaW5zL2NvbS5pYm0uZXRvb2xzLmVqYmRlcGxveS9ydW50aW1lIiAgICItWGJvb3RjbGFzc3BhdGgvcDoke3dhc0hvbWV9L2phdmEvanJlL2xpYi9leHQvaWJtb3JiLmphciR7cGF0aENoYXJ9JHt3YXNIb21lfS9qYXZhL2pyZS9saWIvZXh0L2libWV4dC5qYXIiIC1YbXM1MG0gLVhteDI1Nm0gIi1EY29tLmlibS5DT1JCQS5Db25maWdVUkw9ZmlsZToke3dhc1Byb2ZpbGV9L3Byb3BlcnRpZXMvc2FzLmNsaWVudC5wcm9wcyIgIi1EY29tLmlibS5TT0FQLkNvbmZpZ1VSTD1maWxlOiR7d2FzUHJvZmlsZX0vcHJvcGVydGllcy9zb2FwLmNsaWVudC5wcm9wcyIgICAiLURqYXZhLnV0aWwubG9nZ2luZy5tYW5hZ2VyPWNvbS5pYm0ud3MuYm9vdHN0cmFwLldzTG9nTWFuYWdlciIgIi1EamF2YS51dGlsLmxvZ2dpbmcuY29uZmlndXJlQnlTZXJ2ZXI9dHJ1ZSIgIi1EaWJtLndlYnNwaGVyZS5wcmVsb2FkLmNsYXNzZXM9dHJ1ZSIgICItRGphdmEubGlicmFyeS5wYXRoPSR7d2FzSG9tZX0vamF2YS9iaW4ke3BhdGhDaGFyfSR7d2FzSG9tZX0vYmluJHtwYXRoQ2hhcn0ke3dhc0hvbWV9L2phdmEvYmluJHtwYXRoQ2hhcn0ke3dhc0hvbWV9L2phdmEvanJlL2JpbiI8L3ZtUGFyYW1ldGVycz4KLQkJPGNsYXNzcGF0aFJlZmVyZW5jZT53YXM8L2NsYXNzcGF0aFJlZmVyZW5jZT4KLQk8L3N0b3A+Ci0JCi0JPHB1Ymxpc2hlciBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmFudHB1Ymxpc2hlciI+Ci0JCTxwdWJsaXNoZXJkYXRhPgotCQkJPGRhdGFuYW1lPmJ1aWxkLmZpbGU8L2RhdGFuYW1lPgotCQkJPGRhdGF2YWx1ZT4vc2VydmVyZGVmL3NjcmlwdHMvd2Vic3BoZXJlLjYueC54bWw8L2RhdGF2YWx1ZT4KLQkJPC9wdWJsaXNoZXJkYXRhPgotCQk8cHVibGlzaGVyZGF0YT4KLQkJCTxkYXRhbmFtZT50YXJnZXQucHVibGlzaC5qc3Qud2ViPC9kYXRhbmFtZT4KLQkJCTxkYXRhdmFsdWU+ZGVwbG95LmoyZWUud2ViPC9kYXRhdmFsdWU+Ci0JCTwvcHVibGlzaGVyZGF0YT4KLQkJPHB1Ymxpc2hlcmRhdGE+Ci0JCQk8ZGF0YW5hbWU+dGFyZ2V0LnB1Ymxpc2guanN0LmVqYjwvZGF0YW5hbWU+Ci0JCQk8ZGF0YXZhbHVlPmRlcGxveS5qMmVlLmVqYjwvZGF0YXZhbHVlPgotCQk8L3B1Ymxpc2hlcmRhdGE+Ci0JCTxwdWJsaXNoZXJkYXRhPgotCQkJPGRhdGFuYW1lPnRhcmdldC51bnB1Ymxpc2guanN0LndlYjwvZGF0YW5hbWU+Ci0JCQk8ZGF0YXZhbHVlPnVuZGVwbG95LmoyZWUud2ViPC9kYXRhdmFsdWU+Ci0JCTwvcHVibGlzaGVyZGF0YT4KLQkJPHB1Ymxpc2hlcmRhdGE+Ci0JCQk8ZGF0YW5hbWU+dGFyZ2V0LnVucHVibGlzaC5qc3QuZWpiPC9kYXRhbmFtZT4KLQkJCTxkYXRhdmFsdWU+dW5kZXBsb3kuajJlZS5lamI8L2RhdGF2YWx1ZT4KLQkJPC9wdWJsaXNoZXJkYXRhPgotCQk8cHVibGlzaGVyZGF0YT4KLQkJCTxkYXRhbmFtZT50YXJnZXQucHVibGlzaC5qc3QuZWFyPC9kYXRhbmFtZT4KLQkJCTxkYXRhdmFsdWU+ZGVwbG95LmoyZWUuZWFyPC9kYXRhdmFsdWU+Ci0JCTwvcHVibGlzaGVyZGF0YT4KLQkJPHB1Ymxpc2hlcmRhdGE+Ci0JCQk8ZGF0YW5hbWU+dGFyZ2V0LnVucHVibGlzaC5qc3QuZWFyPC9kYXRhbmFtZT4KLQkJCTxkYXRhdmFsdWU+dW5kZXBsb3kuajJlZS5lYXI8L2RhdGF2YWx1ZT4KLQkJPC9wdWJsaXNoZXJkYXRhPgkJCi0JPC9wdWJsaXNoZXI+Ci0KLQk8Y2xhc3NwYXRoIGlkPSJ3YXMiID4KLQkgICAgPGFyY2hpdmUgcGF0aD0iJHt3YXNIb21lfS9wcm9wZXJ0aWVzIiAvPgotCSAgICA8YXJjaGl2ZSBwYXRoPSIke3dhc0hvbWV9L2xpYi9ib290c3RyYXAuamFyIiAvPgotICAgICAgICA8YXJjaGl2ZSBwYXRoPSIke3dhc0hvbWV9L2xpYi9qMmVlLmphciIgLz4KLSAgICAgICAgPGFyY2hpdmUgcGF0aD0iJHt3YXNIb21lfS9saWIvbG1wcm94eS5qYXIiIC8+Ci0gICAgICAgIDxhcmNoaXZlIHBhdGg9IiR7d2FzSG9tZX0vbGliL3VybHByb3RvY29scy5qYXIiIC8+Ci0JPC9jbGFzc3BhdGg+Ci0KLQk8Y2xhc3NwYXRoIGlkPSJ3YXMucHJvamVjdCI+Ci0JICAgIDxhcmNoaXZlIHBhdGg9IiR7d2FzSG9tZX0vbGliL2FjdGl2aXR5U2Vzc2lvbi5qYXIiIC8+Ci0gICAgICAgIDxhcmNoaXZlIHBhdGg9IiR7d2FzSG9tZX0vbGliL2Fjd2EuamFyIiAvPgotCQk8YXJjaGl2ZSBwYXRoPSIke3dhc0hvbWV9L2xpYi9hZG1pbi5qYXIiIC8+ICAgICAgICAKLQkJPGFyY2hpdmUgcGF0aD0iJHt3YXNIb21lfS9saWIvYXBwcHJvZmlsZS5qYXIiIC8+ICAgICAgICAKLQkJPGFyY2hpdmUgcGF0aD0iJHt3YXNIb21lfS9saWIvYXN5bmNoYmVhbnMuamFyIiAvPiAgIAotCQk8YXJjaGl2ZSBwYXRoPSIke3dhc0hvbWV9L2xpYi9ib290c3RyYXAuamFyIiAvPgkJICAgICAKLQkJPGFyY2hpdmUgcGF0aD0iJHt3YXNIb21lfS9saWIvYnNmLmphciIgLz4gICAgICAgIAotCQk8YXJjaGl2ZSBwYXRoPSIke3dhc0hvbWV9L2xpYi9jaGFubmVsZncuamFyIiAvPiAgICAgICAgCi0JCTxhcmNoaXZlIHBhdGg9IiR7d2FzSG9tZX0vbGliL2NsdXN0ZXIuamFyIiAvPiAgICAgICAgCi0JCTxhcmNoaXZlIHBhdGg9IiR7d2FzSG9tZX0vbGliL2NsdXN0ZXJhZGFwdGVyLmphciIgLz4gICAgICAgIAotCQk8YXJjaGl2ZSBwYXRoPSIke3dhc0hvbWV9L2xpYi9jb21tb25qLXR3bS5qYXIiIC8+ICAgICAgICAKLQkJPGFyY2hpdmUgcGF0aD0iJHt3YXNIb21lfS9saWIvY29tbW9ucy1kaXNjb3ZlcnkuamFyIiAvPiAgICAgICAgCi0JCTxhcmNoaXZlIHBhdGg9IiR7d2FzSG9tZX0vbGliL2NvbW1vbnMtbG9nZ2luZy1hcGkuamFyIiAvPiAgICAgICAgCi0JCTxhcmNoaXZlIHBhdGg9IiR7d2FzSG9tZX0vbGliL2Rpc3RleGNlcC5qYXIiIC8+ICAgICAgICAKLQkJPGFyY2hpdmUgcGF0aD0iJHt3YXNIb21lfS9saWIvZHdsbWNsaWVudC5qYXIiIC8+ICAgICAgICAKLQkJPGFyY2hpdmUgcGF0aD0iJHt3YXNIb21lfS9saWIvZHluYWNhY2hlLmphciIgLz4gICAgICAgIAotCQk8YXJjaGl2ZSBwYXRoPSIke3dhc0hvbWV9L2xpYi9lY3V0aWxzLmphciIgLz4gICAgICAgIAotCQk8YXJjaGl2ZSBwYXRoPSIke3dhc0hvbWV9L2xpYi9lamJjb250YWluZXIuamFyIiAvPiAgICAgICAgCi0JCTxhcmNoaXZlIHBhdGg9IiR7d2FzSG9tZX0vbGliL2VqYmNvbnRhaW5lckltcGwuamFyIiAvPiAgICAgICAgCi0JCTxhcmNoaXZlIHBhdGg9IiR7d2FzSG9tZX0vbGliL2VqYnBvcnRhYmxlLmphciIgLz4gICAgICAgIAotCQk8YXJjaGl2ZSBwYXRoPSIke3dhc0hvbWV9L2xpYi9lbWYuamFyIiAvPiAgICAgIAotCQk8YXJjaGl2ZSBwYXRoPSIke3dhc0hvbWV9L2xpYi9mZmRjLmphciIgLz4gICAgICAgIAotCQk8YXJjaGl2ZSBwYXRoPSIke3dhc0hvbWV9L2xpYi9pMThuY3R4LmphciIgLz4gICAgICAgIAotCQk8YXJjaGl2ZSBwYXRoPSIke3dhc0hvbWV9L2luc3RhbGxlZENoYW5uZWxzL2NoYW5uZWwuaHR0cC5qYXIiIC8+ICAgICAgICAKLQkJPGFyY2hpdmUgcGF0aD0iJHt3YXNIb21lfS9pbnN0YWxsZWRDaGFubmVscy9jaGFubmVsLnNzbC5qYXIiIC8+ICAgICAgICAKLQkJPGFyY2hpdmUgcGF0aD0iJHt3YXNIb21lfS9pbnN0YWxsZWRDaGFubmVscy9jaGFubmVsLnRjcC5qYXIiIC8+ICAgICAgICAKLQkJPGFyY2hpdmUgcGF0aD0iJHt3YXNIb21lfS9saWIvaXZqZWpiMzUuamFyIiAvPiAgICAgICAgCi0JCTxhcmNoaXZlIHBhdGg9IiR7d2FzSG9tZX0vbGliL2oyY0ludGYuamFyIiAvPiAgICAgICAgCi0JCTxhcmNoaXZlIHBhdGg9IiR7d2FzSG9tZX0vbGliL2oyZWUuamFyIiAvPiAgICAgICAgCi0JCTxhcmNoaXZlIHBhdGg9IiR7d2FzSG9tZX0vbGliL2pkYmNtZWRpYXRvci5qYXIiIC8+ICAgICAgIAotCQk8YXJjaGl2ZSBwYXRoPSIke3dhc0hvbWV9L2xpYi9qc2YtYXBpLmphciIgLz4gICAgICAgCi0JCTxhcmNoaXZlIHBhdGg9IiR7d2FzSG9tZX0vbGliL2pzdGwuamFyIiAvPiAgICAgICAKLQkJPGFyY2hpdmUgcGF0aD0iJHt3YXNIb21lfS9saWIvbWFuYWdlbWVudC5qYXIiLz4KLQkJPGFyY2hpdmUgcGF0aD0iJHt3YXNIb21lfS9saWIvbWFyc2hhbGwuamFyIi8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7d2FzSG9tZX0vbGliL29iamVjdHBvb2wuamFyIi8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7d2FzSG9tZX0vbGliL29kYy5qYXIiLz4KLQkJPGFyY2hpdmUgcGF0aD0iJHt3YXNIb21lfS9saWIvcG0uamFyIi8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7d2FzSG9tZX0vbGliL3BtaW1wbC5qYXIiLz4KLQkJPGFyY2hpdmUgcGF0aD0iJHt3YXNIb21lfS9saWIvcHJvY2Vzc2ludGYuamFyIi8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7d2FzSG9tZX0vbGliL3FyeWNsaWVudC5qYXIiLz4KLQkJPGFyY2hpdmUgcGF0aD0iJHt3YXNIb21lfS9saWIvcXVlcnkuamFyIi8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7d2FzSG9tZX0vbGliL3F1ZXJ5bWQuamFyIi8+IAotCQk8YXJjaGl2ZSBwYXRoPSIke3dhc0hvbWV9L2xpYi9xdWVyeXdzLmphciIvPgotCQk8YXJjaGl2ZSBwYXRoPSIke3dhc0hvbWV9L2xpYi9yYXMuamFyIi8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7d2FzSG9tZX0vbGliL3JzYWRhcHRlcmNjaS5qYXIiLz4KLQkJPGFyY2hpdmUgcGF0aD0iJHt3YXNIb21lfS9saWIvcnNhZGFwdGVyc3BpLmphciIvPgotCQk8YXJjaGl2ZSBwYXRoPSIke3dhc0hvbWV9L2xpYi9yc2FleHRlcm5hbC5qYXIiLz4KLQkJPGFyY2hpdmUgcGF0aD0iJHt3YXNIb21lfS9saWIvcnVudGltZS5qYXIiLz4KLQkJPGFyY2hpdmUgcGF0aD0iJHt3YXNIb21lfS9saWIvcnVudGltZWZ3LmphciIvPgotCQk8YXJjaGl2ZSBwYXRoPSIke3dhc0hvbWV9L2xpYi9zYXMuamFyIi8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7d2FzSG9tZX0vbGliL3NjaGVkdWxlci1jbGllbnQuamFyIi8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7d2FzSG9tZX0vbGliL3NjaGVkdWxlci1zZXJ2aWNlLmphciIvPgotCQk8YXJjaGl2ZSBwYXRoPSIke3dhc0hvbWV9L2xpYi9zZWN1cml0eS5qYXIiLz4KLQkJPGFyY2hpdmUgcGF0aD0iJHt3YXNIb21lfS9saWIvc2VjdXJpdHlJbXBsLmphciIvPgotCQk8YXJjaGl2ZSBwYXRoPSIke3dhc0hvbWV9L2xpYi9zZXJ2bGV0ZXZlbnQuamFyIi8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7d2FzSG9tZX0vbGliL3NpYi5jb21tb24uamFyIi8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7d2FzSG9tZX0vbGliL3NpYi5zZXJ2ZXIuamFyIi8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7d2FzSG9tZX0vbGliL3NvYXAuamFyIi8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7d2FzSG9tZX0vbGliL3NvYXAtc2VjLmphciIvPgotCQk8YXJjaGl2ZSBwYXRoPSIke3dhc0hvbWV9L2xpYi9zdGFuZGFyZC5qYXIiLz4KLQkJPGFyY2hpdmUgcGF0aD0iJHt3YXNIb21lfS9saWIvc3RhcnR1cGJlYW4uamFyIi8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7d2FzSG9tZX0vbGliL3R4LmphciIvPgotCQk8YXJjaGl2ZSBwYXRoPSIke3dhc0hvbWV9L2xpYi91ZGRpNGp2Mi5qYXIiLz4KLQkJPGFyY2hpdmUgcGF0aD0iJHt3YXNIb21lfS9saWIvdXRpbHMuamFyIi8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7d2FzSG9tZX0vbGliL3ZhcHJ0LmphciIvPgotCQk8YXJjaGl2ZSBwYXRoPSIke3dhc0hvbWV9L2xpYi93Y2NtX2Jhc2UuamFyIi8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7d2FzSG9tZX0vbGliL3dlYmNvbnRhaW5lci5qYXIiLz4KLQkJPGFyY2hpdmUgcGF0aD0iJHt3YXNIb21lfS9saWIvd2Vic2VydmljZXMuamFyIi8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7d2FzSG9tZX0vbGliL3dzYXRsaWIuamFyIi8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7d2FzSG9tZX0vbGliL3dzLWNvbW1vbnMtbG9nZ2luZy5qYXIiLz4KLQkJPGFyY2hpdmUgcGF0aD0iJHt3YXNIb21lfS9saWIvd3NkbDRqLmphciIvPgotCQk8YXJjaGl2ZSBwYXRoPSIke3dhc0hvbWV9L2xpYi93c2V4Y2VwdGlvbi5qYXIiLz4KLQkJPGFyY2hpdmUgcGF0aD0iJHt3YXNIb21lfS9saWIvd3NpZi5qYXIiLz4KLQkJPGFyY2hpdmUgcGF0aD0iJHt3YXNIb21lfS9saWIvd3NpZi1qMmMuamFyIi8+Ci0JCTxhcmNoaXZlIHBhdGg9IiR7d2FzSG9tZX0vbGliL3dzLWpzZi5qYXIiLz4KLQkJPGFyY2hpdmUgcGF0aD0iJHt3YXNIb21lfS9saWIvd3NzZWMuamFyIi8+Ci0JPC9jbGFzc3BhdGg+Ci0JPGpuZGlDb25uZWN0aW9uPgotCQk8cHJvdmlkZXJVcmw+aWlvcDovLyR7c2VydmVyQWRkcmVzc306MjAwMTwvcHJvdmlkZXJVcmw+Ci0JCTxpbml0aWFsQ29udGV4dEZhY3Rvcnk+b3JnLm9iamVjdHdlYi5jYXJvbC5qbmRpLnNwaS5NdWx0aU9yYkluaXRpYWxDb250ZXh0RmFjdG9yeTwvaW5pdGlhbENvbnRleHRGYWN0b3J5PgotCQk8am5kaVByb3BlcnR5PgotCQkJPG5hbWU+PC9uYW1lPgotCQkJPHZhbHVlPjwvdmFsdWU+Ci0JCTwvam5kaVByb3BlcnR5PgotCTwvam5kaUNvbm5lY3Rpb24+Ci08L3RuczpTZXJ2ZXJSdW50aW1lPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci53ZWJzcGhlcmUuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci93ZWJzcGhlcmUvY29yZS9BbnRQdWJsaXNoZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci53ZWJzcGhlcmUuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci93ZWJzcGhlcmUvY29yZS9BbnRQdWJsaXNoZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU5MzE3MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIud2Vic3BoZXJlLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9zZXJ2ZXIvd2Vic3BoZXJlL2NvcmUvQW50UHVibGlzaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIud2Vic3BoZXJlLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHM7Ci0KLXB1YmxpYyBjbGFzcyBBbnRQdWJsaXNoZXIgZXh0ZW5kcyBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuY29yZS5pbnRlcm5hbC5wdWJsaXNoZXJzLkFudFB1Ymxpc2hlciB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElTSEVSX0lEPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMud2Vic3BoZXJlLmFudHB1Ymxpc2hlciI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCB2b2lkIHNldHVwQW50TGF1bmNoQ29uZmlndXJhdGlvbihJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IHdjKSB7Ci0JCVN0cmluZyB3YXNQcm9maWxlID0gKFN0cmluZyl0aGlzLmdldFNlcnZlclJ1bnRpbWUoKS5nZXRTZXJ2ZXJJbnN0YW5jZVByb3BlcnRpZXMoKS5nZXQoIndhc1Byb2ZpbGUiKTsKLQkJd2Muc2V0QXR0cmlidXRlKElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1ZNX0FSR1VNRU5UUywiLUR1c2VyLmluc3RhbGwucm9vdD0iK3dhc1Byb2ZpbGUpOwotCi0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLndlYnNwaGVyZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3dlYnNwaGVyZS9jb3JlL0NvcmVQbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZlci53ZWJzcGhlcmUuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3NlcnZlci93ZWJzcGhlcmUvY29yZS9Db3JlUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkNjEzNjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLndlYnNwaGVyZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvc2VydmVyL3dlYnNwaGVyZS9jb3JlL0NvcmVQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci53ZWJzcGhlcmUuY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLQotLyoqCi0gKiBUaGUgbWFpbiBwbHVnaW4gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZGVza3RvcC4KLSAqLwotcHVibGljIGNsYXNzIENvcmVQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gewotCS8vVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBDb3JlUGx1Z2luIHBsdWdpbjsKLQkvL1Jlc291cmNlIGJ1bmRsZS4KLQlwcml2YXRlIFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlOwotCQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgQ29yZVBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBDb3JlUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RyaW5nIGZyb20gdGhlIHBsdWdpbidzIHJlc291cmNlIGJ1bmRsZSwKLQkgKiBvciAna2V5JyBpZiBub3QgZm91bmQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSkgewotCQlSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRSZXNvdXJjZUJ1bmRsZSgpOwotCQl0cnkgewotCQkJcmV0dXJuIChidW5kbGUgIT0gbnVsbCkgPyBidW5kbGUuZ2V0U3RyaW5nKGtleSkgOiBrZXk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4ga2V5OwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGx1Z2luJ3MgcmVzb3VyY2UgYnVuZGxlLAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKLQkJdHJ5IHsKLQkJCWlmIChyZXNvdXJjZUJ1bmRsZSA9PSBudWxsKQotCQkJCXJlc291cmNlQnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLndlYnNwaGVyZS5jb3JlLkNvcmVQbHVnaW5SZXNvdXJjZXMiKTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHgpIHsKLQkJCXJlc291cmNlQnVuZGxlID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gcmVzb3VyY2VCdW5kbGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLy5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE0OTgxMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ibW9uaXRvcmNvcmUvIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkZWIxNWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLWJpbgotbW9uaXRvcmNvcmUuamFyCi1idWlsZC54bWwKLXRlbXAuZm9sZGVyCi1vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlXzMuMC4wLmphcgotQGRvdAotc3JjLnppcApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLy5vcHRpb25zIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLy5vcHRpb25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzA3MGVlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBEZWJ1Z2dpbmcgb3B0aW9ucyBmb3IgdGhlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUgcGx1Z2luCi0KLSMgVHVybiBvbiBnZW5lcmFsIGRlYnVnZ2luZwotb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9kZWJ1Zz10cnVlCi0KLW9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvcGFyc2luZz1mYWxzZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2IyMzljLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODc4ODQyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwuTW9uaXRvclBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5odHRwO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lCi1FY2xpcHNlLUF1dG9TdGFydDogdHJ1ZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL2Fib3V0Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY2Yjk2Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5GZWJydWFyeSAyNCwgMjAwNTwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFhODRhMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgLm9wdGlvbnMsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKLWJpbi5leGNsdWRlcyA9IGJpbi8qKixcCi0gICAgICAgICAgICAgICBAZG90LyoqLFwKLSAgICAgICAgICAgICAgIHRlbXAuZm9sZGVyLyoqCi1zcmMuaW5jbHVkZXMgPSBzY2hlbWEvLFwKLSAgICAgICAgICAgICAgIGNvbXBvbmVudC54bWwKLXNvdXJjZS4uID0gbW9uaXRvcmNvcmUvCi1vdXRwdXQuLiA9IGJpbi8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvY29tcG9uZW50LnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9jb21wb25lbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTc0NTYyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9jb21wb25lbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNvbXBvbmVudCB4bWxucz0iaHR0cDovL2VjbGlwc2Uub3JnL3d0cC9yZWxlbmcvdG9vbHMvY29tcG9uZW50LW1vZGVsIiBuYW1lPSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQiPgotICA8Y29tcG9uZW50LWRlcGVuZHMgdW5yZXN0cmljdGVkPSJ0cnVlIi8+Ci0gIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUiIGZyYWdtZW50PSJmYWxzZSIvPgotICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aSIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci0gIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5wcm94eSIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci0gIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZSIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci08L2NvbXBvbmVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9BY2NlcHRUaHJlYWQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL0FjY2VwdFRocmVhZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Yzk0OGQ1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL0FjY2VwdFRocmVhZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uSW50ZXJydXB0ZWRJT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9uaXRvcjsKLS8qKgotICogVGhlIGFjdHVhbCBUQ1AvSVAgbW9uaXRvcmluZyBzZXJ2ZXIuIFRoaXMgaXMgYSB0aHJlYWQgdGhhdAotICogbGlzdGVucyBvbiBhIHBvcnQgYW5kIHJlbGF5cyBhIGNhbGwgdG8gYW5vdGhlciBzZXJ2ZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBBY2NlcHRUaHJlYWQgewotCXByb3RlY3RlZCBJTW9uaXRvciBtb25pdG9yOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWxpdmUgPSB0cnVlOwotCXByb3RlY3RlZCBTZXJ2ZXJTb2NrZXQgc2VydmVyU29ja2V0OwotCi0JcHJvdGVjdGVkIFRocmVhZCB0aHJlYWQ7Ci0KLQljbGFzcyBTZXJ2ZXJUaHJlYWQgZXh0ZW5kcyBUaHJlYWQgewotCQkvKioKLQkJICogU2VydmVyVGhyZWFkIGFjY2VwdHMgaW5jb21pbmcgY29ubmVjdGlvbnMgYW5kIGRlbGVnYXRlcyB0byB0aGUgcHJvdG9jb2wKLQkJICogYWRhcHRlciB0byBkZWFsIHdpdGggdGhlIGNvbm5lY3Rpb24uCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkvLyBjcmVhdGUgYSBuZXcgc2VydmVyIHNvY2tldAotCQkJdHJ5IHsKLQkJCQlzZXJ2ZXJTb2NrZXQgPSBuZXcgU2VydmVyU29ja2V0KG1vbml0b3IuZ2V0TG9jYWxQb3J0KCkpOwotCQkJCXNlcnZlclNvY2tldC5zZXRTb1RpbWVvdXQoMjAwMCk7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiTW9uaXRvcmluZyBsb2NhbGhvc3Q6IiArIG1vbml0b3IuZ2V0TG9jYWxQb3J0KCkgKyAiIC0+ICIgKyBtb25pdG9yLmdldFJlbW90ZUhvc3QoKQotCQkJCQkJKyAiOiIgKyBtb25pdG9yLmdldFJlbW90ZVBvcnQoKSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBzdGFydCBtb25pdG9yaW5nIik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJCi0JCQl3aGlsZSAoYWxpdmUpIHsKLQkJCQl0cnkgewotCQkJCQkvLyBhY2NlcHQgdGhlIGNvbm5lY3Rpb24gZnJvbSB0aGUgY2xpZW50Ci0JCQkJCVNvY2tldCBsb2NhbFNvY2tldCA9IHNlcnZlclNvY2tldC5hY2NlcHQoKTsKLQkJCQkJCi0JCQkJCXRyeSB7Ci0JCQkJCQkvLyBjb25uZWN0IHRvIHRoZSByZW1vdGUgc2VydmVyCi0JCQkJCQlTb2NrZXQgcmVtb3RlU29ja2V0ID0gbmV3IFNvY2tldCgpOwotCQkJCQkJcmVtb3RlU29ja2V0LmNvbm5lY3QobmV3IEluZXRTb2NrZXRBZGRyZXNzKG1vbml0b3IuZ2V0UmVtb3RlSG9zdCgpLCBtb25pdG9yLmdldFJlbW90ZVBvcnQoKSksIG1vbml0b3IuZ2V0VGltZW91dCgpKTsKLQkJCQkJCQotCQkJCQkJLy8gcmVsYXkgdGhlIGNhbGwgdGhyb3VnaAotCQkJCQkJU3RyaW5nIHByb3RvY29sSWQgPSBtb25pdG9yLmdldFByb3RvY29sKCk7Ci0JCQkJCQlQcm90b2NvbEFkYXB0ZXIgYWRhcHRlciA9IE1vbml0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRQcm90b2NvbEFkYXB0ZXIocHJvdG9jb2xJZCk7Ci0JCQkJCQlhZGFwdGVyLmNvbm5lY3QobW9uaXRvciwgbG9jYWxTb2NrZXQsIHJlbW90ZVNvY2tldCk7Ci0JCQkJCX0gY2F0Y2ggKFNvY2tldFRpbWVvdXRFeGNlcHRpb24gZSkgewotCQkJCQkJRmFpbGVkQ29ubmVjdGlvblRocmVhZCB0aHJlYWQyID0gbmV3IEZhaWxlZENvbm5lY3Rpb25UaHJlYWQoKE1vbml0b3IpIG1vbml0b3IsIGxvY2FsU29ja2V0LCBNZXNzYWdlcy5lcnJvckNvbm5lY3RUaW1lb3V0KTsKLQkJCQkJCXRocmVhZDIuc3RhcnQoKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUZhaWxlZENvbm5lY3Rpb25UaHJlYWQgdGhyZWFkMiA9IG5ldyBGYWlsZWRDb25uZWN0aW9uVGhyZWFkKChNb25pdG9yKSBtb25pdG9yLCBsb2NhbFNvY2tldCwgbnVsbCk7Ci0JCQkJCQl0aHJlYWQyLnN0YXJ0KCk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gZG8gbm90aGluZwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWlmIChhbGl2ZSkKLQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIHdoaWxlIG1vbml0b3JpbmciLCBlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBY2NlcHRUaHJlYWQgY29uc3RydWN0b3IuCi0JICogCi0JICogQHBhcmFtIG1vbml0b3IgYSBtb25pdG9yCi0JICovCi0JcHVibGljIEFjY2VwdFRocmVhZChJTW9uaXRvciBtb25pdG9yKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMubW9uaXRvciA9IG1vbml0b3I7Ci0JfQotCQotCS8qKgotCSAqIFN0YXJ0IHRoZSBzZXJ2ZXIuCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnRTZXJ2ZXIoKSB7Ci0JCWlmICh0aHJlYWQgIT0gbnVsbCkKLQkJCXJldHVybjsKLQkJdGhyZWFkID0gbmV3IFNlcnZlclRocmVhZCgpOwotCQl0aHJlYWQuc2V0RGFlbW9uKHRydWUpOwotCQl0aHJlYWQuc2V0UHJpb3JpdHkoVGhyZWFkLk5PUk1fUFJJT1JJVFkgKyAxKTsKLQkJdGhyZWFkLnN0YXJ0KCk7Ci0JCQotCQlUaHJlYWQueWllbGQoKTsKLQkJCi0JCS8vIHdhaXQgdXAgdG8gMiBzZWNvbmRzIGZvciBpbml0aWFsaXphdGlvbgotCQlpbnQgaSA9IDA7Ci0JCXdoaWxlIChzZXJ2ZXJTb2NrZXQgPT0gbnVsbCAmJiBpIDwgMTApIHsKLQkJCXRyeSB7Ci0JCQkJVGhyZWFkLnNsZWVwKDIwMCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCS8vIGlnbm9yZQotCQkJfQotCQkJaSsrOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc2VydmVyIGlzIHJ1bm5pbmcuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc2VydmVyIGlzIHJ1bm5pbmcsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiAgICBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1J1bm5pbmcoKSB7Ci0JCXJldHVybiAodGhyZWFkICE9IG51bGwpOwotCX0KLQotCS8qKgotCSAqIENvcnJlY3RseSBjbG9zZSB0aGUgc2VydmVyIHNvY2tldCBhbmQgc2h1dCBkb3duIHRoZSBzZXJ2ZXIuCi0JICovCi0JcHVibGljIHZvaWQgc3RvcFNlcnZlcigpIHsKLQkJdHJ5IHsKLQkJCWFsaXZlID0gZmFsc2U7Ci0JCQl0aHJlYWQgPSBudWxsOwotCQkJCi0JCQlTdHJpbmcgcHJvdG9jb2xJZCA9IG1vbml0b3IuZ2V0UHJvdG9jb2woKTsKLQkJICAgUHJvdG9jb2xBZGFwdGVyIGFkYXB0ZXIgPSBNb25pdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0UHJvdG9jb2xBZGFwdGVyKHByb3RvY29sSWQpOwotCQkJYWRhcHRlci5kaXNjb25uZWN0KG1vbml0b3IpOwotCQkJaWYgKHNlcnZlclNvY2tldCAhPSBudWxsKQotCQkJCXNlcnZlclNvY2tldC5jbG9zZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3Igc3RvcHBpbmcgc2VydmVyIiwgZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoaXMgcG9ydCBpcyBpbiB1c2UuCi0JICoKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKiBAcGFyYW0gcG9ydCBpbnQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNQb3J0SW5Vc2UoaW50IHBvcnQpIHsKLQkJU2VydmVyU29ja2V0IHMgPSBudWxsOwotCQl0cnkgewotCQkJcyA9IG5ldyBTZXJ2ZXJTb2NrZXQocG9ydCk7Ci0JCX0gY2F0Y2ggKFNvY2tldEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKHMgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCXMuY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkvLyBpZ25vcmUKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL0Nvbm5lY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL0Nvbm5lY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFhZjEzOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9Db25uZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLm5ldC5Tb2NrZXQ7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQ29ubmVjdGlvbiB7Ci0JcHJvdGVjdGVkIFNvY2tldCBpbjsKLQlwcm90ZWN0ZWQgU29ja2V0IG91dDsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNvbm5lY3Rpb24uCi0JICogCi0JICogQHBhcmFtIGluIGluYm91bmQgc29ja2V0Ci0JICogQHBhcmFtIG91dCBvdXRib3VuZCBzb2NrZXQKLQkgKi8KLQlwdWJsaWMgQ29ubmVjdGlvbihTb2NrZXQgaW4sIFNvY2tldCBvdXQpIHsKLQkJdGhpcy5pbiA9IGluOwotCQl0aGlzLm91dCA9IG91dDsKLQl9Ci0KLQkvKioKLQkgKiBDbG9zZSB0aGUgY29ubmVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjbG9zZSgpIHsKLQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiQ2xvc2luZyBjb25uZWN0aW9uIik7Ci0JCXRyeSB7Ci0JCQlpbi5nZXRPdXRwdXRTdHJlYW0oKS5mbHVzaCgpOwotCQkJaW4uc2h1dGRvd25JbnB1dCgpOwotCQkJaW4uc2h1dGRvd25PdXRwdXQoKTsKLQkJCQotCQkJb3V0LmdldE91dHB1dFN0cmVhbSgpLmZsdXNoKCk7Ci0JCQlvdXQuc2h1dGRvd25JbnB1dCgpOwotCQkJb3V0LnNodXRkb3duT3V0cHV0KCk7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJDb25uZWN0aW9uIGNsb3NlZCIpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJFcnJvciBjbG9zaW5nIGNvbm5lY3Rpb24gIiArIHRoaXMgKyAiICIgKyBleC5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL0NvbnRlbnRGaWx0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL0NvbnRlbnRGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk0NTFmZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9Db250ZW50RmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5Db250ZW50RmlsdGVyRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5SZXF1ZXN0OwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIENvbnRlbnRGaWx0ZXIgaW1wbGVtZW50cyBJQ29udGVudEZpbHRlciB7Ci0JcHJvdGVjdGVkIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50OwotCXByb3RlY3RlZCBDb250ZW50RmlsdGVyRGVsZWdhdGUgZGVsZWdhdGU7Ci0JCi0JcHJvdGVjdGVkIENvbnRlbnRGaWx0ZXIoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGlkLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGlkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJpZCIpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZWxhdGl2ZSBvcmRlciBmb3IgdGhpcyBmaWx0ZXIuCi0JICogCi0JICogQHJldHVybiB0aGUgb3JkZXIKLQkgKi8gCi0JcHVibGljIGludCBnZXRPcmRlcigpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBJbnRlZ2VyLnBhcnNlSW50KGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJvcmRlciIpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAwOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmFtZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBuYW1lCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoIm5hbWUiKTsKLQl9Ci0KLQkvKioKLQkgKiBEbyB0aGUgZmlsdGVyaW5nLgotCSAqIAotCSAqIEBwYXJhbSByZXF1ZXN0IHRoZSByZXF1ZXN0Ci0JICogQHBhcmFtIGlzUmVxdWVzdCB0cnVlIGlmIHJlcXVlc3QsIGZhbHNlIGlmIHJlc3BvbnNlCi0JICogQHBhcmFtIGNvbnRlbnQgdGhlIGNvbnRlbnQKLQkgKiBAcmV0dXJuIHRoZSBmaWx0ZXJlZCBjb250ZW50Ci0JICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIGNvbm5lY3Rpb24gaXNzdWUKLQkgKi8KLQlwdWJsaWMgYnl0ZVtdIGZpbHRlcihSZXF1ZXN0IHJlcXVlc3QsIGJvb2xlYW4gaXNSZXF1ZXN0LCBieXRlW10gY29udGVudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKGRlbGVnYXRlID09IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJZGVsZWdhdGUgPSAoQ29udGVudEZpbHRlckRlbGVnYXRlKSBlbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBjcmVhdGUgY29udGVudCBmaWx0ZXIgZGVsZWdhdGU6ICIgKyBnZXRJZCgpLCBlKTsKLQkJCQlyZXR1cm4gbmV3IGJ5dGVbMF07Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRlbGVnYXRlLmZpbHRlcihyZXF1ZXN0LCBpc1JlcXVlc3QsIGNvbnRlbnQpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9GYWlsZWRDb25uZWN0aW9uVGhyZWFkLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9GYWlsZWRDb25uZWN0aW9uVGhyZWFkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxZDQ1NDcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvRmFpbGVkQ29ubmVjdGlvblRocmVhZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5Tb2NrZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLlJlcXVlc3Q7Ci0KLS8qKgotICogVGhyZWFkIHVzZWQgaWYgdGhlIGNvbm5lY3Rpb24gdG8gdGhlIHNlcnZlciBmYWlscy4KLSAqLwotcHVibGljIGNsYXNzIEZhaWxlZENvbm5lY3Rpb25UaHJlYWQgZXh0ZW5kcyBUaHJlYWQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCVUZGRVIgPSAyMDQ4OwotCXByb3RlY3RlZCBNb25pdG9yIG1vbml0b3I7Ci0JcHJvdGVjdGVkIFNvY2tldCBzb2NrZXQ7Ci0JcHJvdGVjdGVkIFN0cmluZyBlcnJvcjsKLQotCXB1YmxpYyBGYWlsZWRDb25uZWN0aW9uVGhyZWFkKE1vbml0b3IgbW9uaXRvciwgU29ja2V0IHNvY2tldCwgU3RyaW5nIGVycm9yKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMubW9uaXRvciA9IG1vbml0b3I7Ci0JCXRoaXMuc29ja2V0ID0gc29ja2V0OwotCQl0aGlzLmVycm9yID0gZXJyb3I7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlSZXF1ZXN0IHJlcXVlc3QgPSBuZXcgUmVxdWVzdChtb25pdG9yLCBJUHJvdG9jb2xBZGFwdGVyLlRDUElQX1BST1RPQ09MX0lELCBtb25pdG9yLmdldExvY2FsUG9ydCgpLCBtb25pdG9yLmdldFJlbW90ZUhvc3QoKSwgbW9uaXRvci5nZXRSZW1vdGVQb3J0KCkpOwotCQlTdHJpbmcgZXJyID0gZXJyb3I7Ci0JCWlmIChlcnIgPT0gbnVsbCkKLQkJCWVyciA9IE1lc3NhZ2VzLmVycm9yQ29ubmVjdFRvU2VydmVyOwotCQlyZXF1ZXN0LmFkZFRvUmVzcG9uc2UoZXJyLmdldEJ5dGVzKCkpOwotCQkKLQkJdHJ5IHsKLQkJCUlucHV0U3RyZWFtIGluID0gc29ja2V0LmdldElucHV0U3RyZWFtKCk7Ci0JCQlieXRlW10gYiA9IG5ldyBieXRlW0JVRkZFUl07Ci0JCQl3aGlsZSAoaW4uYXZhaWxhYmxlKCkgPiAwKSB7Ci0JCQkJaW50IG4gPSBpbi5yZWFkKGIpOwotCQkJCWJ5dGVbXSBjID0gbmV3IGJ5dGVbbl07Ci0JCQkJU3lzdGVtLmFycmF5Y29weShiLCAwLCBjLCAwLCBuKTsKLQkJCQlyZXF1ZXN0LmFkZFRvUmVxdWVzdChjKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9IGZpbmFsbHkgewotCQkJdHJ5IHsKLQkJCQlzb2NrZXQuc2h1dGRvd25JbnB1dCgpOwotCQkJCXNvY2tldC5zaHV0ZG93bk91dHB1dCgpOwotCQkJCXNvY2tldC5jbG9zZSgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvSUNvbnRlbnRGaWx0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL0lDb250ZW50RmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyZDMxNDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvSUNvbnRlbnRGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5SZXF1ZXN0OwotLyoqCi0gKiBBIGNvbnRlbnQgZmlsdGVyIHRoYXQgZmlsdGVycyBzcGVjaWZpYyBjb250ZW50cyBmcm9tIHRoZSBtb25pdG9yIHRyYWZmaWMKLSAqIG9mIGEgcmVxdWVzdC4gCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogPC9wPgotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbnRlbnRGaWx0ZXIgewotCS8qKgotCSAqIFJldHVybnMgdGhlIGlkIG9mIHRoaXMgZmlsdGVyLgotCSAqIEVhY2ggZmlsdGVyIGhhcyBhIGRpc3RpbmN0LCBmaXhlZCBpZC4gSWRzIGFyZSBpbnRlbmRlZCB0byBiZSB1c2VkIGludGVybmFsbHkgYXMga2V5czsKLQkgKiB0aGV5IGFyZSBub3QgaW50ZW5kZWQgdG8gYmUgc2hvd24gdG8gZW5kIHVzZXJzLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGVsZW1lbnQgaWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkaXNwbGF5YWJsZSAodHJhbnNsYXRlZCkgbmFtZSBmb3IgdGhpcyBmaWx0ZXIuCi0JICoKLQkgKiBAcmV0dXJuIGEgZGlzcGxheWFibGUgbmFtZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVsYXRpdmUgb3JkZXIgb2YgdGhpcyBmaWx0ZXIuCi0JICogRWFjaCBmaWx0ZXIgaGFzIGEgcmVsYXRpdmUgb3JkZXIgdGhhdCBhbGxvd3MgdGhlbSB0byBiZSBhcHBsaWVkIGluIHRoZSBjb3JyZWN0Ci0JICogb3JkZXIgcmVsYXRpdmUgdG8gZWFjaCBvdGhlci4gTG93ZXIgb3JkZXJzIGFyZSBwcm9jZXNzZWQgZmlyc3QuCi0JICoKLQkgKiBAcmV0dXJuIHRoZSByZWxhdGl2ZSBvcmRlcgotCSAqIAotCSAqIFtpc3N1ZTogQ1MgLSBUaGUgc2NoZW1hIChjb250ZW50RmlsdGVybnMuZXhzZCkgZGVmaW5lcyBhbiAnb3JkZXInIGF0dHJpYnV0ZS4gIAotCSAqIFRoZSBjb21tZW50cyBhYm92ZSBzdWdnZXN0IHRoYXQgZmlsdGVycyBzaG91bGQgYmUgZGVzaWduZWQgdG8gYmUgY29tcG9zYWJsZS4gIElzIHRoaXMgY29ycmVjdD8gIAotCSAqIEl0IHdvdWxkIGJlIGdvb2QgdG8gbWFrZSB0aGlzIG9wdGlvbmFsIGlmIHRoZSB1c2VyIGhhZCBubyBpZGVhIGhvdyBoaXMgZmlsdGVyIHNob3VsZCBiZSBvcmRlcmVkLgotCSAqIEkndmUgZm91bmQgdGhhdCBzb21ldGltZXMgJ2xvdycsICdtZWRpdW0nLCAnaGlnaCcgYXJlIGFkZXF1YXRlIHRvIGhhbmRsZSBvcmRlcmluZyBpc3N1ZXMgYW5kIGFyZSAKLQkgKiBlYXNpZXIgZm9yIHRoZSBleHRlbnNpb24gd3JpdGVyIGRlYWwgd2l0aCBhbmQgZ2V0IGEgc2Vuc2Ugb2YgdGhlIHByb3BlciB2YWx1ZSB0byBhc3NpZ24uIF0KLQkgKi8KLQkvL3B1YmxpYyBpbnQgZ2V0T3JkZXIoKTsKLQotCS8qKgotCSAqIEZpbHRlciB0aGUgZ2l2ZW4gY29udGVudCBmcm9tIHRoZSBnaXZlbiByZXF1ZXN0LiBUaGUgY29udGVudCB0aGF0IGhhcyBiZWVuIGZpbHRlcmVkIG91dCB3aWxsIAotCSAqIG5vdCBiZSBzaG93biB0byBjbGllbnRzIG9mIHRoZSBUQ1AvSVAgbW9uaXRvci4KLQkgKiAKLQkgKiBAcGFyYW0gcmVxdWVzdCB0aGUgcmVxdWVzdCB0aGF0IHRoZSBmaWx0ZXIgd2lsbCBiZSBwZXJmb3JtZWQgb24KLQkgKiBAcGFyYW0gaXNSZXF1ZXN0IHNldCB0byB0cnVlIGlmIHRoZSBjb250ZW50IGZpbHRlciBhcHBsaWVzIHRvIHJlcXVlc3QgbW9uaXRvciB0cmFmZmljLAotCSAqICAgIG9yIHNldCB0byBmYWxzZSBpZiB0aGUgY29udGVudCBmaWx0ZXIgYXBwbGllcyB0byB0aGUgcmVzcG9uc2UgbW9uaXRvciB0cmFmZmljCi0JICogQHBhcmFtIGNvbnRlbnQgdGhlIG1lc3NhZ2UgY29udGVudCB0byBiZSBmaWx0ZXJlZCBvdXQKLQkgKiBAcmV0dXJuIHRoZSBmaWx0ZXJlZCBjb250ZW50Ci0JICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhbiBlcnJvciB3aGlsZSBwYXJzaW5nIG9yIGZpbHRlcmluZyB0aGUgY29udGVudAotCSAqLwotCXB1YmxpYyBieXRlW10gZmlsdGVyKFJlcXVlc3QgcmVxdWVzdCwgYm9vbGVhbiBpc1JlcXVlc3QsIGJ5dGVbXSBjb250ZW50KSB0aHJvd3MgSU9FeGNlcHRpb247Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvSU1lbWVudG8uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL0lNZW1lbnRvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhMDRhYjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvSU1lbWVudG8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLS8qKgotICogSW50ZXJmYWNlIHRvIGEgbWVtZW50byB1c2VkIGZvciBzYXZpbmcgdGhlIGltcG9ydGFudCBzdGF0ZSBvZiBhbiBvYmplY3QKLSAqIGluIGEgZm9ybSB0aGF0IGNhbiBiZSBwZXJzaXN0ZWQgaW4gdGhlIGZpbGUgc3lzdGVtLgotICogPHA+Ci0gKiBNZW1lbnRvcyB3ZXJlIGRlc2lnbmVkIHdpdGggdGhlIGZvbGxvd2luZyByZXF1aXJlbWVudHMgaW4gbWluZDoKLSAqIDxvbD4KLSAqICA8bGk+Q2VydGFpbiBvYmplY3RzIG5lZWQgdG8gYmUgc2F2ZWQgYW5kIHJlc3RvcmVkIGFjcm9zcyBwbGF0Zm9ybSBzZXNzaW9ucy4KLSAqICAgIDwvbGk+Ci0gKiAgPGxpPldoZW4gYW4gb2JqZWN0IGlzIHJlc3RvcmVkLCBhbiBhcHByb3ByaWF0ZSBjbGFzcyBmb3IgYW4gb2JqZWN0IG1pZ2h0IG5vdAotICogICAgYmUgYXZhaWxhYmxlLiBJdCBtdXN0IGJlIHBvc3NpYmxlIHRvIHNraXAgYW4gb2JqZWN0IGluIHRoaXMgY2FzZS48L2xpPgotICogIDxsaT5XaGVuIGFuIG9iamVjdCBpcyByZXN0b3JlZCwgdGhlIGFwcHJvcHJpYXRlIGNsYXNzIGZvciB0aGUgb2JqZWN0IG1heSBiZQotICogICAgZGlmZmVyZW50IGZyb20gdGhlIG9uZSB3aGVuIHRoZSBvYmplY3Qgd2FzIG9yaWdpbmFsbHkgc2F2ZWQuIElmIHNvLCB0aGUKLSAqICAgIG5ldyBjbGFzcyBzaG91bGQgc3RpbGwgYmUgYWJsZSB0byByZWFkIHRoZSBvbGQgZm9ybSBvZiB0aGUgZGF0YS48L2xpPgotICogPC9vbD4KLSAqIDwvcD4KLSAqIDxwPgotICogTWVtZW50b3MgbWVldCB0aGVzZSByZXF1aXJlbWVudHMgYnkgcHJvdmlkaW5nIHN1cHBvcnQgZm9yIHN0b3JpbmcgYQotICogbWFwcGluZyBvZiBhcmJpdHJhcnkgc3RyaW5nIGtleXMgdG8gcHJpbWl0aXZlIHZhbHVlcywgYW5kIGJ5IGFsbG93aW5nCi0gKiBtZW1lbnRvcyB0byBoYXZlIG90aGVyIG1lbWVudG9zIGFzIGNoaWxkcmVuIChhcnJhbmdlZCBpbnRvIGEgdHJlZSkuCi0gKiBBIHJvYnVzdCBleHRlcm5hbCBzdG9yYWdlIGZvcm1hdCBiYXNlZCBvbiBYTUwgaXMgdXNlZC4KLSAqIDwvcD48cD4KLSAqIFRoZSBrZXkgZm9yIGFuIGF0dHJpYnV0ZSBtYXkgYmUgYW55IGFscGhhIG51bWVyaWMgdmFsdWUuICBIb3dldmVyLCB0aGUKLSAqIHZhbHVlIG9mIDxjb2RlPlRBR19JRDwvY29kZT4gaXMgcmVzZXJ2ZWQgZm9yIGludGVybmFsIHVzZS4KLSAqIDwvcD48cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogPC9wPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNZW1lbnRvIHsKLQkvKioKLQkgKiBTcGVjaWFsIHJlc2VydmVkIGtleSB1c2VkIHRvIHN0b3JlIHRoZSBtZW1lbnRvIGlkIAotCSAqICh2YWx1ZSA8Y29kZT4ib3JnLmVjbGlwc2UudWkuaWQiPC9jb2RlPikuCi0JICoKLQkgKiBAc2VlICNnZXRJZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19JRCA9ICJJTWVtZW50by5pbnRlcm5hbC5pZCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY2hpbGQgb2YgdGhpcyBtZW1lbnRvIHdpdGggdGhlIGdpdmVuIHR5cGUuCi0JICogPHA+Ci0JICogVGhlIDxjb2RlPmdldENoaWxkPC9jb2RlPiBhbmQgPGNvZGU+Z2V0Q2hpbGRyZW48L2NvZGU+IG1ldGhvZHMKLQkgKiBhcmUgdXNlZCB0byByZXRyaWV2ZSBjaGlsZHJlbiBvZiBhIGdpdmVuIHR5cGUuCi0JICogPC9wPgotCSAqCi0JICogQHBhcmFtIHR5cGUgdGhlIHR5cGUKLQkgKiBAcmV0dXJuIGEgbmV3IGNoaWxkIG1lbWVudG8KLQkgKiBAc2VlICNnZXRDaGlsZAotCSAqIEBzZWUgI2dldENoaWxkcmVuCi0JICovCi0JcHVibGljIElNZW1lbnRvIGNyZWF0ZUNoaWxkKFN0cmluZyB0eXBlKTsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNoaWxkIG9mIHRoaXMgbWVtZW50byB3aXRoIHRoZSBnaXZlbiB0eXBlIGFuZCBpZC4KLQkgKiBUaGUgaWQgaXMgc3RvcmVkIGluIHRoZSBjaGlsZCBtZW1lbnRvICh1c2luZyBhIHNwZWNpYWwgcmVzZXJ2ZWQKLQkgKiBrZXksIDxjb2RlPlRBR19JRDwvY29kZT4pIGFuZCBjYW4gYmUgcmV0cmlldmVkIHVzaW5nIDxjb2RlPmdldElkPC9jb2RlPi4KLQkgKiA8cD4KLQkgKiBUaGUgPGNvZGU+Z2V0Q2hpbGQ8L2NvZGU+IGFuZCA8Y29kZT5nZXRDaGlsZHJlbjwvY29kZT4gbWV0aG9kcwotCSAqIGFyZSB1c2VkIHRvIHJldHJpZXZlIGNoaWxkcmVuIG9mIGEgZ2l2ZW4gdHlwZS4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZQotCSAqIEBwYXJhbSBpZCB0aGUgY2hpbGQgaWQKLQkgKiBAcmV0dXJuIGEgbmV3IGNoaWxkIG1lbWVudG8gd2l0aCB0aGUgZ2l2ZW4gdHlwZSBhbmQgaWQKLQkgKiBAc2VlICNnZXRJZAotCSAqLwotCXB1YmxpYyBJTWVtZW50byBjcmVhdGVDaGlsZChTdHJpbmcgdHlwZSwgU3RyaW5nIGlkKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmaXJzdCBjaGlsZCB3aXRoIHRoZSBnaXZlbiB0eXBlIGlkLgotCSAqCi0JICogQHBhcmFtIHR5cGUgdGhlIHR5cGUgaWQKLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBjaGlsZCB3aXRoIHRoZSBnaXZlbiB0eXBlCi0JICovCi0JcHVibGljIElNZW1lbnRvIGdldENoaWxkKFN0cmluZyB0eXBlKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIGFsbCBjaGlsZHJlbiB3aXRoIHRoZSBnaXZlbiB0eXBlIGlkLgotCSAqCi0JICogQHBhcmFtIHR5cGUgdGhlIHR5cGUgaWQKLQkgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIGNoaWxkcmVuIHdpdGggdGhlIGdpdmVuIHR5cGUKLQkgKi8KLQlwdWJsaWMgSU1lbWVudG9bXSBnZXRDaGlsZHJlbihTdHJpbmcgdHlwZSk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmxvYXRpbmcgcG9pbnQgdmFsdWUgb2YgdGhlIGdpdmVuIGtleS4KLQkgKgotCSAqIEBwYXJhbSBrZXkgdGhlIGtleQotCSAqIEByZXR1cm4gdGhlIHZhbHVlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUga2V5IHdhcyBub3QgZm91bmQgb3Igd2FzIGZvdW5kCi0JICogICBidXQgd2FzIG5vdCBhIGZsb2F0aW5nIHBvaW50IG51bWJlcgotCSAqLwotCXB1YmxpYyBGbG9hdCBnZXRGbG9hdChTdHJpbmcga2V5KTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpZCBmb3IgdGhpcyBtZW1lbnRvLgotCSAqCi0JICogQHJldHVybiB0aGUgbWVtZW50byBpZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotCSAqIEBzZWUgI2NyZWF0ZUNoaWxkKGphdmEubGFuZy5TdHJpbmcsamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmFtZSBmb3IgdGhpcyBtZW1lbnRvLgotCSAqCi0JICogQHJldHVybiB0aGUgbWVtZW50byBuYW1lLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICogQHNlZSAjY3JlYXRlQ2hpbGQoamF2YS5sYW5nLlN0cmluZyxqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW50ZWdlciB2YWx1ZSBvZiB0aGUgZ2l2ZW4ga2V5LgotCSAqCi0JICogQHBhcmFtIGtleSB0aGUga2V5Ci0JICogQHJldHVybiB0aGUgdmFsdWUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBrZXkgd2FzIG5vdCBmb3VuZCBvciB3YXMgZm91bmQKLQkgKiAgIGJ1dCB3YXMgbm90IGFuIGludGVnZXIKLQkgKi8KLQlwdWJsaWMgSW50ZWdlciBnZXRJbnRlZ2VyKFN0cmluZyBrZXkpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RyaW5nIHZhbHVlIG9mIHRoZSBnaXZlbiBrZXkuCi0JICoKLQkgKiBAcGFyYW0ga2V5IHRoZSBrZXkKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGtleSB3YXMgbm90IGZvdW5kIG9yIHdhcyBmb3VuZAotCSAqICBidXQgd2FzIG5vdCBhbiBpbnRlZ2VyCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBib29sZWFuIHZhbHVlIG9mIHRoZSBnaXZlbiBrZXkuCi0JICoKLQkgKiBAcGFyYW0ga2V5IHRoZSBrZXkKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGtleSB3YXMgbm90IGZvdW5kIG9yIHdhcyBmb3VuZAotCSAqICBidXQgd2FzIG5vdCBhIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBnZXRCb29sZWFuKFN0cmluZyBrZXkpOwotCQotCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIGFsbCB0aGUgbmFtZXMgaW4gdGhpcyBtZW1lbnRvLgotCSAqIAotCSAqIEByZXR1cm4gYSBsaXN0IG9mIG5hbWVzCi0JICovCi0JcHVibGljIExpc3QgZ2V0TmFtZXMoKTsKLQkKLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4ga2V5IHRvIHRoZSBnaXZlbiBmbG9hdGluZyBwb2ludCBudW1iZXIuCi0JICoKLQkgKiBAcGFyYW0ga2V5IHRoZSBrZXkKLQkgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlCi0JICovCi0JcHVibGljIHZvaWQgcHV0RmxvYXQoU3RyaW5nIGtleSwgZmxvYXQgdmFsdWUpOwotCQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBrZXkgdG8gdGhlIGdpdmVuIGludGVnZXIuCi0JICoKLQkgKiBAcGFyYW0ga2V5IHRoZSBrZXkKLQkgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlCi0JICovCi0JcHVibGljIHZvaWQgcHV0SW50ZWdlcihTdHJpbmcga2V5LCBpbnQgdmFsdWUpOwotCQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBrZXkgdG8gdGhlIGdpdmVuIGJvb2xlYW4gdmFsdWUuCi0JICoKLQkgKiBAcGFyYW0ga2V5IHRoZSBrZXkKLQkgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlCi0JICovCi0JcHVibGljIHZvaWQgcHV0Qm9vbGVhbihTdHJpbmcga2V5LCBib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIENvcHkgdGhlIGF0dHJpYnV0ZXMgYW5kIGNoaWxkcmVuIGZyb20gIDxjb2RlPm1lbWVudG88L2NvZGU+Ci0JICogdG8gdGhlIHJlY2VpdmVyLgotCSAqCi0JICogQHBhcmFtIG1lbWVudG8gdGhlIElNZW1lbnRvIHRvIGJlIGNvcGllZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBwdXRNZW1lbnRvKElNZW1lbnRvIG1lbWVudG8pOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIGtleSB0byB0aGUgZ2l2ZW4gc3RyaW5nLgotCSAqCi0JICogQHBhcmFtIGtleSB0aGUga2V5Ci0JICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZQotCSAqLwotCXB1YmxpYyB2b2lkIHB1dFN0cmluZyhTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL0lQcm90b2NvbEFkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL0lQcm90b2NvbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk1MjA4Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9JUHJvdG9jb2xBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWw7Ci0vKioKLSAqIEEgcHJvdG9jb2wgYWRhcHRlciBlbmFibGVzIGEgbW9uaXRvciB0byBzdXBwb3J0IGEgcGFydGljdWxhciBuZXR3b3JrCi0gKiBwcm90b2NvbCB1c2VkIHRvIGNvbW11bmljYXRlIGJldHdlZW4gYSBjbGllbnQgYW5kIHNlcnZlci4gQWxsIHN1cHBvcnRlZAotICogcHJvdG9jb2xzIHdpbGwgYmUgYmFzZWQgb24gVENQL0lQLgotICogPHA+Ci0gKiBQcm90b2NvbCBhZGFwdGVycyBhcmUgcmVnaXN0ZXJlZCB2aWEgdGhlIDxjb2RlPnByb3RvY29sQWRhcGF0ZXJzPC9jb2RlPgotICogZXh0ZW5zaW9uIHBvaW50IGluIHRoZSA8Y29kZT5vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlPC9jb2RlPgotICogcGx1Zy1pbi4gVGhlIGdsb2JhbCBsaXN0IG9mIGtub3duIHByb3RvY29sIGFkYXB0ZXJzIGlzIGF2YWlsYWJsZSB2aWEKLSAqIHtAbGluayBNb25pdG9yUGx1Z2luI2dldFByb3RvY29sQWRhcHRlcnMoKX0uIFN0YW5kYXJkIHByb3RvY29sCi0gKiBhZGFwdGVycyBmb3Ige0BsaW5rcGxhaW4gI0hUVFBfUFJPVE9DT0xfSUQgSFRUUH0gYW5kCi0gKiB7QGxpbmtwbGFpbiAjVENQSVBfUFJPVE9DT0xfSUQgVENQL0lQfSBhcmUgYnVpbHQtaW4uCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogPC9wPgotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJUHJvdG9jb2xBZGFwdGVyIHsKLQkvKioKLQkgKiBQcm90b2NvbCBhZGFwdGVyIGlkICh2YWx1ZSB7QHZhbHVlfSkgZm9yIFRDUC9JUC4KLQkgKiBUaGUgVENQL0lQIHByb3RvY29sIGFkYXB0ZXIgaXMgc3RhbmRhcmQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVENQSVBfUFJPVE9DT0xfSUQgPSAiVENQL0lQIjsKLQotCS8qKgotCSAqIFByb3RvY29sIGFkYXB0ZXIgaWQgKHZhbHVlIHtAdmFsdWV9KSBmb3IgSFRUUC4KLQkgKiBUaGUgSFRUUCBwcm90b2NvbCBhZGFwdGVyIGlzIHN0YW5kYXJkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEhUVFBfUFJPVE9DT0xfSUQgPSAiSFRUUCI7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpZCBvZiB0aGlzIGFkYXB0ZXIuCi0JICogRWFjaCBhZGFwdGVyIGhhcyBhIGRpc3RpbmN0LCBmaXhlZCBpZC4gSWRzIGFyZSBpbnRlbmRlZCB0byBiZSB1c2VkCi0JICogaW50ZXJuYWxseSBhcyBrZXlzOyB0aGV5IGFyZSBub3QgaW50ZW5kZWQgdG8gYmUgc2hvd24gdG8gZW5kIHVzZXJzLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGVsZW1lbnQgaWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkaXNwbGF5YWJsZSAodHJhbnNsYXRlZCkgbmFtZSBmb3IgdGhpcyBhZGFwdGVyLgotCSAqCi0JICogQHJldHVybiBhIGRpc3BsYXlhYmxlIG5hbWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9JU3RhcnR1cC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvSVN0YXJ0dXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTZiNjQ4MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9JU3RhcnR1cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi2gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbDsKLS8qKgotICogQW4gaW50ZXJmYWNlIGZvciB0aGUgc3RhcnR1cCBleHRlbnNpb24gcG9pbnQuCi0gKiBQbHVnLWlucyB0aGF0IHJlZ2lzdGVyIGEgc3RhcnR1cCBleHRlbnNpb24gd2lsbCBiZSBhY3RpdmF0ZWQgd2hlbiB0aGUgbW9uaXRvcgotICogY29yZSBwbHVnLWluIGluaXRpYWxpemVzIGFuZCBoYXZlIGFuIG9wcG9ydHVuaXR5IHRvIHJ1biBjb2RlIHRoYXQgY2FuJ3QgYmUKLSAqIGltcGxlbWVudGVkIHVzaW5nIHRoZSBub3JtYWwgY29udHJpYnV0aW9uIG1lY2hhbmlzbXMuCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTdGFydHVwIHsKLQkvKioKLQkgKiBXaWxsIGJlIGNhbGxlZCBvbiBtb25pdG9yIGNvcmUgc3RhcnR1cC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydHVwKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvTWVzc2FnZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4OTczNWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotoCoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotLyoqCi0gKiBUcmFuc2xhdGVkIG1lc3NhZ2VzLgotICovCi1wdWJsaWMgY2xhc3MgTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9ySW52YWxpZExvY2FsUG9ydDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckludmFsaWRSZW1vdGVQb3J0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9ySW52YWxpZFJlbW90ZUhvc3Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JDb25uZWN0VG9TZXJ2ZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JDb25uZWN0VGltZW91dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtb25pdG9yVmFsaWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JQb3J0SW5Vc2U7Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKE1vbml0b3JQbHVnaW4uUExVR0lOX0lEICsgIi5pbnRlcm5hbC5NZXNzYWdlcyIsIE1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvTWVzc2FnZXMucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL01lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2YTFlZjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvTWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgLS0tLS0tLS0tLS0tLS0tIEVycm9ycyAtLS0tLS0tLS0tLS0tLS0KLWVycm9yUG9ydEluVXNlPVRoZSBUQ1AvSVAgbW9uaXRvciBjb3VsZCBub3Qgc3RhcnQgYmVjYXVzZSBwb3J0IHswfSBpcyBpbiB1c2UuCi1lcnJvckludmFsaWRMb2NhbFBvcnQ9VGhlIGxvY2FsIHBvcnQgbnVtYmVyIGlzIGludmFsaWQuCi1lcnJvckludmFsaWRSZW1vdGVQb3J0PVRoZSByZW1vdGUgcG9ydCBudW1iZXIgaXMgaW52YWxpZC4KLWVycm9ySW52YWxpZFJlbW90ZUhvc3Q9VGhlIHJlbW90ZSBob3N0IG5hbWUgaXMgaW52YWxpZC4KLWVycm9yQ29ubmVjdFRvU2VydmVyPUVycm9yOiBDb3VsZCBub3QgY29ubmVjdCB0byBzZXJ2ZXIuCi1lcnJvckNvbm5lY3RUaW1lb3V0PUVycm9yOiBUaW1lb3V0IGNvbm5lY3RpbmcgdG8gc2VydmVyLgotCi1tb25pdG9yVmFsaWQ9VGhlIG1vbml0b3IgaXMgdmFsaWQuCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9Nb25pdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9Nb25pdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhZWMyNDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvTW9uaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLio7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgTW9uaXRvciBpbXBsZW1lbnRzIElNb25pdG9yIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVNRU5UT19JRCA9ICJpZCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FTUVOVE9fTE9DQUxfUE9SVCA9ICJsb2NhbC1wb3J0IjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVNRU5UT19SRU1PVEVfSE9TVCA9ICJyZW1vdGUtaG9zdCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FTUVOVE9fUkVNT1RFX1BPUlQgPSAicmVtb3RlLXBvcnQiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRU1FTlRPX1RZUEVfSUQgPSAidHlwZS1pZCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FTUVOVE9fVElNRU9VVCA9ICJ0aW1lb3V0IjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBREQgPSAwOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDSEFOR0UgPSAxOwotCi0JcHJvdGVjdGVkIFN0cmluZyBpZDsKLQlwcm90ZWN0ZWQgU3RyaW5nIHJlbW90ZUhvc3Q7Ci0JcHJvdGVjdGVkIGludCByZW1vdGVQb3J0ID0gODA7Ci0JcHJvdGVjdGVkIGludCBsb2NhbFBvcnQgPSA4MDsKLQlwcm90ZWN0ZWQgU3RyaW5nIHByb3RvY29sSWQ7Ci0JcHJvdGVjdGVkIGludCB0aW1lb3V0OwotCi0JcHJvdGVjdGVkIExpc3QgcmVxdWVzdExpc3RlbmVycyA9IG5ldyBBcnJheUxpc3QoMik7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgbW9uaXRvci4KLQkgKi8KLQlwdWJsaWMgTW9uaXRvcigpIHsKLQkJcHJvdG9jb2xJZCA9IE1vbml0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXREZWZhdWx0VHlwZSgpOwotCX0KLQkKLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgSU1vbml0b3IjZ2V0SWQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgSU1vbml0b3IjZ2V0UmVtb3RlSG9zdCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSZW1vdGVIb3N0KCkgewotCQlyZXR1cm4gcmVtb3RlSG9zdDsKLQl9Ci0KLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgSU1vbml0b3IjZ2V0UmVtb3RlUG9ydCgpCi0JICovCi0JcHVibGljIGludCBnZXRSZW1vdGVQb3J0KCkgewotCQlyZXR1cm4gcmVtb3RlUG9ydDsKLQl9Ci0KLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgSU1vbml0b3IjZ2V0TG9jYWxQb3J0KCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldExvY2FsUG9ydCgpIHsKLQkJcmV0dXJuIGxvY2FsUG9ydDsKLQl9Ci0KLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgSU1vbml0b3IjZ2V0UHJvdG9jb2woKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvdG9jb2woKSB7Ci0JCXJldHVybiBwcm90b2NvbElkOwotCX0KLQotCS8qKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBJTW9uaXRvciNnZXRUaW1lb3V0KCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldFRpbWVvdXQoKSB7Ci0JCXJldHVybiB0aW1lb3V0OwotCX0KLQotCS8qKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBJTW9uaXRvciNpc1J1bm5pbmcoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUnVubmluZygpIHsKLQkJaWYgKGlzV29ya2luZ0NvcHkoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIE1vbml0b3JNYW5hZ2VyLmdldEluc3RhbmNlKCkuaXNSdW5uaW5nKHRoaXMpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIElNb25pdG9yI2RlbGV0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGVsZXRlKCkgewotCQlpZiAoaXNXb3JraW5nQ29weSgpKQotCQkJcmV0dXJuOwotCQlNb25pdG9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnJlbW92ZU1vbml0b3IodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJTW9uaXRvciNpc1dvcmtpbmdDb3B5KCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1dvcmtpbmdDb3B5KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgSU1vbml0b3IjY3JlYXRlV29ya2luZ0NvcHkoKQotCSAqLwotCXB1YmxpYyBJTW9uaXRvcldvcmtpbmdDb3B5IGNyZWF0ZVdvcmtpbmdDb3B5KCkgewotCQlyZXR1cm4gbmV3IE1vbml0b3JXb3JraW5nQ29weSh0aGlzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRJbnRlcm5hbChJTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlkID0gbW9uaXRvci5nZXRJZCgpOwotCQlyZW1vdGVIb3N0ID0gbW9uaXRvci5nZXRSZW1vdGVIb3N0KCk7Ci0JCXJlbW90ZVBvcnQgPSBtb25pdG9yLmdldFJlbW90ZVBvcnQoKTsKLQkJbG9jYWxQb3J0ID0gbW9uaXRvci5nZXRMb2NhbFBvcnQoKTsKLQkJcHJvdG9jb2xJZCA9IG1vbml0b3IuZ2V0UHJvdG9jb2woKTsKLQkJdGltZW91dCA9IG1vbml0b3IuZ2V0VGltZW91dCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNhdmUoSU1lbWVudG8gbWVtZW50bykgewotCQltZW1lbnRvLnB1dFN0cmluZyhNRU1FTlRPX0lELCBpZCk7Ci0JCW1lbWVudG8ucHV0U3RyaW5nKE1FTUVOVE9fVFlQRV9JRCwgcHJvdG9jb2xJZCk7Ci0JCW1lbWVudG8ucHV0SW50ZWdlcihNRU1FTlRPX0xPQ0FMX1BPUlQsIGxvY2FsUG9ydCk7Ci0JCW1lbWVudG8ucHV0U3RyaW5nKE1FTUVOVE9fUkVNT1RFX0hPU1QsIHJlbW90ZUhvc3QpOwotCQltZW1lbnRvLnB1dEludGVnZXIoTUVNRU5UT19SRU1PVEVfUE9SVCwgcmVtb3RlUG9ydCk7Ci0JCW1lbWVudG8ucHV0SW50ZWdlcihNRU1FTlRPX1RJTUVPVVQsIHRpbWVvdXQpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGxvYWQoSU1lbWVudG8gbWVtZW50bykgewotCQlpZCA9IG1lbWVudG8uZ2V0U3RyaW5nKE1FTUVOVE9fSUQpOwotCQlwcm90b2NvbElkID0gbWVtZW50by5nZXRTdHJpbmcoTUVNRU5UT19UWVBFX0lEKTsKLQkJSW50ZWdlciB0ZW1wID0gbWVtZW50by5nZXRJbnRlZ2VyKE1FTUVOVE9fTE9DQUxfUE9SVCk7Ci0JCWlmICh0ZW1wICE9IG51bGwpCi0JCQlsb2NhbFBvcnQgPSB0ZW1wLmludFZhbHVlKCk7Ci0JCXJlbW90ZUhvc3QgPSBtZW1lbnRvLmdldFN0cmluZyhNRU1FTlRPX1JFTU9URV9IT1NUKTsKLQkJdGVtcCA9IG1lbWVudG8uZ2V0SW50ZWdlcihNRU1FTlRPX1JFTU9URV9QT1JUKTsKLQkJaWYgKHRlbXAgIT0gbnVsbCkKLQkJCXJlbW90ZVBvcnQgPSB0ZW1wLmludFZhbHVlKCk7Ci0JCXRlbXAgPSBtZW1lbnRvLmdldEludGVnZXIoTUVNRU5UT19USU1FT1VUKTsKLQkJaWYgKHRlbXAgIT0gbnVsbCkKLQkJCXRpbWVvdXQgPSB0ZW1wLmludFZhbHVlKCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgSU1vbml0b3Ijc3RhcnQoKQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdGFydCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGlzUnVubmluZygpKQotCQkJcmV0dXJuOwotCQlpZiAoaXNXb3JraW5nQ29weSgpIHx8ICFNb25pdG9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmV4aXN0cyh0aGlzKSkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJCi0JCUlTdGF0dXMgc3RhdHVzID0gdmFsaWRhdGUoKTsKLQkJaWYgKCFzdGF0dXMuaXNPSygpKQotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oc3RhdHVzKTsKLQkJCi0JCU1vbml0b3JNYW5hZ2VyLmdldEluc3RhbmNlKCkuc3RhcnRNb25pdG9yKHRoaXMpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIElNb25pdG9yI3N0YXJ0KCkKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc3RvcCgpIHsKLQkJaWYgKGlzV29ya2luZ0NvcHkoKSB8fCAhTW9uaXRvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5leGlzdHModGhpcykpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCWlmICghaXNSdW5uaW5nKCkpCi0JCQlyZXR1cm47Ci0JCU1vbml0b3JNYW5hZ2VyLmdldEluc3RhbmNlKCkuc3RvcE1vbml0b3IodGhpcyk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgSU1vbml0b3IjYWRkUmVxdWVzdExpc3RlbmVyKElSZXF1ZXN0TGlzdGVuZXIpCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZFJlcXVlc3RMaXN0ZW5lcihJUmVxdWVzdExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChsaXN0ZW5lciA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQlpZiAoIXJlcXVlc3RMaXN0ZW5lcnMuY29udGFpbnMobGlzdGVuZXIpKQotCQkJcmVxdWVzdExpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIElNb25pdG9yI3JlbW92ZVJlcXVlc3RMaXN0ZW5lcihJUmVxdWVzdExpc3RlbmVyKQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVSZXF1ZXN0TGlzdGVuZXIoSVJlcXVlc3RMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAobGlzdGVuZXIgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJcmVxdWVzdExpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCX0KLQkKLQkvKioKLQkgKiBGaXJlIGEgcmVxdWVzdCBldmVudC4KLQkgKiBAcGFyYW0gcnIKLQkgKiBAcGFyYW0gdHlwZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVSZXF1ZXN0RXZlbnQoUmVxdWVzdCByciwgaW50IHR5cGUpIHsKLQkJaW50IHNpemUgPSByZXF1ZXN0TGlzdGVuZXJzLnNpemUoKTsKLQkJSVJlcXVlc3RMaXN0ZW5lcltdIHJsID0gbmV3IElSZXF1ZXN0TGlzdGVuZXJbc2l6ZV07Ci0JCXJlcXVlc3RMaXN0ZW5lcnMudG9BcnJheShybCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCUlSZXF1ZXN0TGlzdGVuZXIgbGlzdGVuZXIgPSBybFtpXTsKLQkJCWlmICh0eXBlID09IEFERCkKLQkJCQlsaXN0ZW5lci5yZXF1ZXN0QWRkZWQodGhpcywgcnIpOwotCQkJZWxzZSBpZiAodHlwZSA9PSBDSEFOR0UpCi0JCQkJbGlzdGVuZXIucmVxdWVzdENoYW5nZWQodGhpcywgcnIpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEFkZCBhIG5ldyByZXF1ZXN0IHJlc3BvbnNlIHBhaXIuCi0JICogCi0JICogQHBhcmFtIHJlcXVlc3QgYSByZXF1ZXN0Ci0JICovCi0JcHVibGljIHZvaWQgYWRkUmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJZmlyZVJlcXVlc3RFdmVudChyZXF1ZXN0LCBBREQpOwotCX0KLQotCS8qKgotCSAqIEEgcmVxdWVzdCByZXNwb25zZSBwYWlyIGhhcyBiZWVuIGNoYW5nZWQuCi0JICogCi0JICogQHBhcmFtIHJlcXVlc3QgYSByZXF1ZXN0Ci0JICovCi0JcHVibGljIHZvaWQgcmVxdWVzdENoYW5nZWQoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCWZpcmVSZXF1ZXN0RXZlbnQocmVxdWVzdCwgQ0hBTkdFKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBJTW9uaXRvciN2YWxpZGF0ZSgpCi0JICovCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGUoKSB7Ci0JCWlmIChsb2NhbFBvcnQgPCAwKQotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgTW9uaXRvclBsdWdpbi5QTFVHSU5fSUQsIDAsIE1lc3NhZ2VzLmVycm9ySW52YWxpZExvY2FsUG9ydCwgbnVsbCk7Ci0JCQotCQlpZiAocmVtb3RlUG9ydCA8IDApCi0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBNb25pdG9yUGx1Z2luLlBMVUdJTl9JRCwgMCwgTWVzc2FnZXMuZXJyb3JJbnZhbGlkUmVtb3RlUG9ydCwgbnVsbCk7Ci0JCQotCQlpZiAocmVtb3RlSG9zdCA9PSBudWxsIHx8IHJlbW90ZUhvc3QubGVuZ3RoKCkgPT0gMCB8fCAhaXNWYWxpZEhvc3RuYW1lKHJlbW90ZUhvc3QpKQotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgTW9uaXRvclBsdWdpbi5QTFVHSU5fSUQsIDAsIE1lc3NhZ2VzLmVycm9ySW52YWxpZFJlbW90ZUhvc3QsIG51bGwpOwotCQkKLQkJaWYgKGlzTG9jYWxob3N0KHJlbW90ZUhvc3QpICYmIGxvY2FsUG9ydCA9PSByZW1vdGVQb3J0KQotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgTW9uaXRvclBsdWdpbi5QTFVHSU5fSUQsIDAsIE1lc3NhZ2VzLmVycm9ySW52YWxpZExvY2FsUG9ydCwgbnVsbCk7Ci0JCi0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkSG9zdG5hbWUoU3RyaW5nIGhvc3QpIHsKLQkJaWYgKGhvc3QgPT0gbnVsbCB8fCBob3N0LnRyaW0oKS5sZW5ndGgoKSA8IDEpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQlpbnQgbGVuZ3RoID0gaG9zdC5sZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJY2hhciBjID0gaG9zdC5jaGFyQXQoaSk7Ci0JCQlpZiAoIUNoYXJhY3Rlci5pc0xldHRlck9yRGlnaXQoYykgJiYgYyAhPSAnOicgJiYgYyAhPSAnLicpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmIChob3N0LmVuZHNXaXRoKCI6IikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBpc0xvY2FsaG9zdChTdHJpbmcgaG9zdCkgewotCQlpZiAoaG9zdCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQl0cnkgewotCQkJaWYgKCJsb2NhbGhvc3QiLmVxdWFscyhob3N0KSB8fCAiMTI3LjAuMC4xIi5lcXVhbHMoaG9zdCkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlJbmV0QWRkcmVzcyBsb2NhbEhvc3RhZGRyID0gSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCk7Ci0JCQlpZiAobG9jYWxIb3N0YWRkci5nZXRIb3N0TmFtZSgpLmVxdWFscyhob3N0KSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJFcnJvciBjaGVja2luZyBmb3IgbG9jYWxob3N0IiwgZSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgT2JqZWN0I3RvU3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIk1vbml0b3IgWyIgKyBnZXRJZCgpICsgIiwgIiArIGdldFByb3RvY29sKCkgKyAiLCAiICsgZ2V0TG9jYWxQb3J0KCkgKyAiLCAiCi0JCQkrIGdldFJlbW90ZUhvc3QoKSArICIsICIgKyBnZXRSZW1vdGVQb3J0KCkgKyAiXSI7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgT2JqZWN0I2VxdWFscyhPYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJaWYgKCEob2JqIGluc3RhbmNlb2YgTW9uaXRvcikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQlJTW9uaXRvciBtID0gKElNb25pdG9yKSBvYmo7Ci0JCWlmIChtLmlzV29ya2luZ0NvcHkoKSkgewotCQkJbSA9ICgoSU1vbml0b3JXb3JraW5nQ29weSkgbSkuZ2V0T3JpZ2luYWwoKTsKLQkJCWlmIChtID09IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmIChpZCA9PSBudWxsICYmIG0uZ2V0SWQoKSAhPSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoaWQgIT0gbnVsbCAmJiAhaWQuZXF1YWxzKG0uZ2V0SWQoKSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQlpZiAobG9jYWxQb3J0ICE9IG0uZ2V0TG9jYWxQb3J0KCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChyZW1vdGVQb3J0ICE9IG0uZ2V0UmVtb3RlUG9ydCgpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJaWYgKHJlbW90ZUhvc3QgPT0gbnVsbCAmJiBtLmdldFJlbW90ZUhvc3QoKSAhPSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAocmVtb3RlSG9zdCAhPSBudWxsICYmICFyZW1vdGVIb3N0LmVxdWFscyhtLmdldFJlbW90ZUhvc3QoKSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQlpZiAocHJvdG9jb2xJZCA9PSBudWxsICYmIG0uZ2V0UHJvdG9jb2woKSAhPSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAocHJvdG9jb2xJZCAhPSBudWxsICYmICFwcm90b2NvbElkLmVxdWFscyhtLmdldFByb3RvY29sKCkpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJcmV0dXJuIHRydWU7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL01vbml0b3JNYW5hZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9Nb25pdG9yTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDMzNjE1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL01vbml0b3JNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi2gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwuaHR0cC5SZXNlbmRIVFRQUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLio7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgTW9uaXRvck1hbmFnZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBREQgPSAwOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDSEFOR0UgPSAxOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRU1PVkUgPSAyOwotCi0JLy8gbW9uaXRvcnMKLQlwcm90ZWN0ZWQgTGlzdCBtb25pdG9yczsKLQlwcm90ZWN0ZWQgTWFwIHRocmVhZHMgPSBuZXcgSGFzaE1hcCgpOwotCQotCXByb3RlY3RlZCBMaXN0IG1vbml0b3JMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcml2YXRlIFByZWZlcmVuY2VzLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHBjbDsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpZ25vcmVQcmVmZXJlbmNlQ2hhbmdlcyA9IGZhbHNlOwotCQotCXByb3RlY3RlZCBNYXAgcmVzZW5kTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIE1vbml0b3JNYW5hZ2VyIGluc3RhbmNlOwotCQotCXN0YXRpYyB7Ci0JCU1vbml0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5leGVjdXRlU3RhcnR1cHMoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGEgc3RhdGljIGluc3RhbmNlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGluc3RhbmNlCi0JICovCi0JcHVibGljIHN0YXRpYyBNb25pdG9yTWFuYWdlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpCi0JCQlpbnN0YW5jZSA9IG5ldyBNb25pdG9yTWFuYWdlcigpOwotCQotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCQotCXByaXZhdGUgTW9uaXRvck1hbmFnZXIoKSB7Ci0JCWxvYWRNb25pdG9ycygpOwotCQkKLQkJcGNsID0gbmV3IFByZWZlcmVuY2VzLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJlZmVyZW5jZXMuUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCWlmIChpZ25vcmVQcmVmZXJlbmNlQ2hhbmdlcykKLQkJCQkJcmV0dXJuOwotCQkJCVN0cmluZyBwcm9wZXJ0eSA9IGV2ZW50LmdldFByb3BlcnR5KCk7Ci0JCQkJaWYgKHByb3BlcnR5LmVxdWFscygibW9uaXRvcnMiKSkgewotCQkJCQlsb2FkTW9uaXRvcnMoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCQotCQlNb25pdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHBjbCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGRpc3Bvc2UoKSB7Ci0JCU1vbml0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIocGNsKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IG1vbml0b3IuCi0JICogCi0JICogQHJldHVybiB0aGUgbmV3IG1vbml0b3IKLQkgKi8KLQlwdWJsaWMgSU1vbml0b3JXb3JraW5nQ29weSBjcmVhdGVNb25pdG9yKCkgewotCQlyZXR1cm4gbmV3IE1vbml0b3JXb3JraW5nQ29weSgpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxpc3Qgb2YgbW9uaXRvcnMuCi0JICogCi0JICogQHJldHVybiB0aGUgbGlzdCBvZiBtb25pdG9ycwotCSAqLwotCXB1YmxpYyBMaXN0IGdldE1vbml0b3JzKCkgewotCQlyZXR1cm4gbmV3IEFycmF5TGlzdChtb25pdG9ycyk7Ci0JfQotCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIGFkZE1vbml0b3IoSU1vbml0b3IgbW9uaXRvcikgewotCQlpZiAoIW1vbml0b3JzLmNvbnRhaW5zKG1vbml0b3IpKQotCQkJbW9uaXRvcnMuYWRkKG1vbml0b3IpOwotCQlmaXJlTW9uaXRvckV2ZW50KG1vbml0b3IsIEFERCk7Ci0JCXNhdmVNb25pdG9ycygpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1J1bm5pbmcoSU1vbml0b3IgbW9uaXRvcikgewotCQlyZXR1cm4gKHRocmVhZHMuZ2V0KG1vbml0b3IpICE9IG51bGwpOwotCX0KLQotCS8qKgotCSAqIFN0YXJ0IGEgbW9uaXRvci4KLQkgKiAKLQkgKiBAcGFyYW0gbW9uaXRvciB0aGUgbW9uaXRvcgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0TW9uaXRvcihJTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmICghbW9uaXRvcnMuY29udGFpbnMobW9uaXRvcikpCi0JCQlyZXR1cm47Ci0JCQotCQlpZiAoQWNjZXB0VGhyZWFkLmlzUG9ydEluVXNlKG1vbml0b3IuZ2V0TG9jYWxQb3J0KCkpKQotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBNb25pdG9yUGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JQb3J0SW5Vc2UsIG1vbml0b3IuZ2V0TG9jYWxQb3J0KCkgKyAiIiksIG51bGwpKTsKLQkJCi0JCUFjY2VwdFRocmVhZCB0aHJlYWQgPSBuZXcgQWNjZXB0VGhyZWFkKG1vbml0b3IpOwotCQl0aHJlYWQuc3RhcnRTZXJ2ZXIoKTsKLQkJdGhyZWFkcy5wdXQobW9uaXRvciwgdGhyZWFkKTsKLQl9Ci0JCi0JLyoqCi0JICogU3RvcCBhIG1vbml0b3IuCi0JICogCi0JICogQHBhcmFtIG1vbml0b3IgdGhlIG1vbml0b3IKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wTW9uaXRvcihJTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmICghbW9uaXRvcnMuY29udGFpbnMobW9uaXRvcikpCi0JCQlyZXR1cm47Ci0JCQotCQlBY2NlcHRUaHJlYWQgdGhyZWFkID0gKEFjY2VwdFRocmVhZCkgdGhyZWFkcy5nZXQobW9uaXRvcik7Ci0JCWlmICh0aHJlYWQgIT0gbnVsbCkgewotCQkJdGhyZWFkLnN0b3BTZXJ2ZXIoKTsKLQkJCXRocmVhZHMucmVtb3ZlKG1vbml0b3IpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVNb25pdG9yKElNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKG1vbml0b3IuaXNSdW5uaW5nKCkpCi0JCQlzdG9wTW9uaXRvcihtb25pdG9yKTsKLQkJbW9uaXRvcnMucmVtb3ZlKG1vbml0b3IpOwotCQlmaXJlTW9uaXRvckV2ZW50KG1vbml0b3IsIFJFTU9WRSk7Ci0JCXNhdmVNb25pdG9ycygpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgbW9uaXRvckNoYW5nZWQoSU1vbml0b3IgbW9uaXRvcikgewotCQlmaXJlTW9uaXRvckV2ZW50KG1vbml0b3IsIENIQU5HRSk7Ci0JCXNhdmVNb25pdG9ycygpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBleGlzdHMoSU1vbml0b3IgbW9uaXRvcikgewotCQlyZXR1cm4gKG1vbml0b3JzLmNvbnRhaW5zKG1vbml0b3IpKTsKLQl9Ci0JCi0JLyoqCi0JICogQWRkIG1vbml0b3IgbGlzdGVuZXIuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZE1vbml0b3JMaXN0ZW5lcihJTW9uaXRvckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmICghbW9uaXRvckxpc3RlbmVycy5jb250YWlucyhsaXN0ZW5lcikpCi0JCQltb25pdG9yTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIG1vbml0b3IgbGlzdGVuZXIuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZU1vbml0b3JMaXN0ZW5lcihJTW9uaXRvckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChtb25pdG9yTGlzdGVuZXJzLmNvbnRhaW5zKGxpc3RlbmVyKSkKLQkJCW1vbml0b3JMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQl9Ci0JCi0JLyoqCi0JICogRmlyZSBhIG1vbml0b3IgZXZlbnQuCi0JICogCi0JICogQHBhcmFtIG1vbml0b3IgdGhlIG1vbml0b3IKLQkgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSBvZiBldmVudAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVNb25pdG9yRXZlbnQoSU1vbml0b3IgbW9uaXRvciwgaW50IHR5cGUpIHsKLQkJT2JqZWN0W10gb2JqID0gbW9uaXRvckxpc3RlbmVycy50b0FycmF5KCk7Ci0JCQotCQlpbnQgc2l6ZSA9IG9iai5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlJTW9uaXRvckxpc3RlbmVyIGxpc3RlbmVyID0gKElNb25pdG9yTGlzdGVuZXIpIG9ialtpXTsKLQkJCWlmICh0eXBlID09IEFERCkKLQkJCQlsaXN0ZW5lci5tb25pdG9yQWRkZWQobW9uaXRvcik7Ci0JCQllbHNlIGlmICh0eXBlID09IENIQU5HRSkKLQkJCQlsaXN0ZW5lci5tb25pdG9yQ2hhbmdlZChtb25pdG9yKTsKLQkJCWVsc2UgaWYgKHR5cGUgPT0gUkVNT1ZFKQotCQkJCWxpc3RlbmVyLm1vbml0b3JSZW1vdmVkKG1vbml0b3IpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIGxvYWRNb25pdG9ycygpIHsKLQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiTG9hZGluZyBtb25pdG9ycyIpOwotCQkKLQkJbW9uaXRvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCVByZWZlcmVuY2VzIHByZWZzID0gTW9uaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCVN0cmluZyB4bWxTdHJpbmcgPSBwcmVmcy5nZXRTdHJpbmcoIm1vbml0b3JzIik7Ci0JCWlmICh4bWxTdHJpbmcgIT0gbnVsbCAmJiB4bWxTdHJpbmcubGVuZ3RoKCkgPiAwKSB7Ci0JCQl0cnkgewotCQkJCUJ5dGVBcnJheUlucHV0U3RyZWFtIGluID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHhtbFN0cmluZy5nZXRCeXRlcygiVVRGLTgiKSk7Ci0JCQkJSU1lbWVudG8gbWVtZW50byA9IFhNTE1lbWVudG8ubG9hZE1lbWVudG8oaW4pOwotCQkKLQkJCQlJTWVtZW50b1tdIGNoaWxkcmVuID0gbWVtZW50by5nZXRDaGlsZHJlbigibW9uaXRvciIpOwotCQkJCWlmIChjaGlsZHJlbiAhPSBudWxsKSB7Ci0JCQkJCWludCBzaXplID0gY2hpbGRyZW4ubGVuZ3RoOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCQkJTW9uaXRvciBtb25pdG9yID0gbmV3IE1vbml0b3IoKTsKLQkJCQkJCW1vbml0b3IubG9hZChjaGlsZHJlbltpXSk7Ci0JCQkJCQltb25pdG9ycy5hZGQobW9uaXRvcik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJDb3VsZCBub3QgbG9hZCBtb25pdG9yczogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgc2F2ZU1vbml0b3JzKCkgewotCQl0cnkgewotCQkJaWdub3JlUHJlZmVyZW5jZUNoYW5nZXMgPSB0cnVlOwotCQkJWE1MTWVtZW50byBtZW1lbnRvID0gWE1MTWVtZW50by5jcmVhdGVXcml0ZVJvb3QoIm1vbml0b3JzIik7Ci0KLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbW9uaXRvcnMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlNb25pdG9yIG1vbml0b3IgPSAoTW9uaXRvcikgaXRlcmF0b3IubmV4dCgpOwotCQkJCUlNZW1lbnRvIGNoaWxkID0gbWVtZW50by5jcmVhdGVDaGlsZCgibW9uaXRvciIpOwotCQkJCW1vbml0b3Iuc2F2ZShjaGlsZCk7Ci0JCQl9Ci0JCQkKLQkJCVN0cmluZyB4bWxTdHJpbmcgPSBtZW1lbnRvLnNhdmVUb1N0cmluZygpOwotCQkJUHJlZmVyZW5jZXMgcHJlZnMgPSBNb25pdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJCXByZWZzLnNldFZhbHVlKCJtb25pdG9ycyIsIHhtbFN0cmluZyk7Ci0JCQlNb25pdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3Qgc2F2ZSBicm93c2VycyIsIGUpOwotCQl9Ci0JCWlnbm9yZVByZWZlcmVuY2VDaGFuZ2VzID0gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgcmVzZW5kIHJlcXVlc3QgZnJvbSB0aGUgZ2l2ZW4gcmVxdWVzdC4KLQkgKiAKLQkgKiBAcGFyYW0gcmVxdWVzdCB0aGUgcmVxdWVzdCB0aGF0IGlzIHRvIGJlIHJlc2VudDsgbWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEByZXR1cm4gYSBuZXcgcmVzZW5kIHJlcXVlc3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlc2VuZEhUVFBSZXF1ZXN0IGNyZWF0ZVJlc2VuZFJlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCWlmIChyZXF1ZXN0ID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCXJldHVybiBuZXcgUmVzZW5kSFRUUFJlcXVlc3QoKE1vbml0b3IpcmVxdWVzdC5nZXRNb25pdG9yKCksIHJlcXVlc3QpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgYSByZXNlbmQgcmVxdWVzdCB0byB0aGlzIHJlcXVlc3QuCi0JICogCi0JICogQHBhcmFtIHJlcXVlc3QgdGhlIHJlc2VuZCByZXF1ZXN0IHRvIGFkZAotCSAqIEBwYXJhbSByZXNlbmRSZXEgdGhlIHJlc2VuZCByZXF1ZXN0Ci0JICovCi0JcHVibGljIHZvaWQgYWRkUmVzZW5kUmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QsIFJlc2VuZEhUVFBSZXF1ZXN0IHJlc2VuZFJlcSkgewotCQlpZiAocmVxdWVzdCA9PSBudWxsIHx8IHJlc2VuZFJlcSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkKLQkJTGlzdCBsaXN0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWxpc3QgPSAoTGlzdCkgcmVzZW5kTWFwLmdldChyZXF1ZXN0KTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCQotCQlpZiAobGlzdCA9PSBudWxsKSB7Ci0JCQlsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJcmVzZW5kTWFwLnB1dChyZXF1ZXN0LCBsaXN0KTsKLQkJfQotCQlsaXN0LmFkZChyZXNlbmRSZXEpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgcmVzZW5kIHJlcXVlc3RzIGJhc2VkIG9uIHRoaXMgcmVxdWVzdC4gCi0JICogCi0JICogQHBhcmFtIHJlcXVlc3QgYSByZXF1ZXN0Ci0JICogQHJldHVybiB0aGUgYXJyYXkgb2YgcmVzZW5kIHJlcXVlc3RzIGJhc2VkIG9uIHRoaXMgcmVxdWVzdAotCSAqLwotCXB1YmxpYyBSZXNlbmRIVFRQUmVxdWVzdFtdIGdldFJlc2VuZFJlcXVlc3RzKFJlcXVlc3QgcmVxdWVzdCkgewotCQlMaXN0IGxpc3QgPSAoTGlzdCkgcmVzZW5kTWFwLmdldChyZXF1ZXN0KTsKLQkJaWYgKGxpc3QgIT0gbnVsbCkKLQkJCXJldHVybiAoUmVzZW5kSFRUUFJlcXVlc3RbXSkgbGlzdC50b0FycmF5KG5ldyBSZXNlbmRIVFRQUmVxdWVzdFtsaXN0LnNpemUoKV0pOwotCi0JCXJldHVybiBuZXcgUmVzZW5kSFRUUFJlcXVlc3RbMF07Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL01vbml0b3JQbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL01vbml0b3JQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTkyNTZlYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9Nb25pdG9yUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi2gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci0vKioKLSAqIFRoZSBtb25pdG9yIGNvcmUgcGx1Z2luLgotICovCi1wdWJsaWMgY2xhc3MgTW9uaXRvclBsdWdpbiBleHRlbmRzIFBsdWdpbiB7Ci0JLyoqCi0JICogVGhlIHBsdWdpbi9idW5kbGUgaWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUiOwotCi0JcHJpdmF0ZSBzdGF0aWMgTW9uaXRvclBsdWdpbiBzaW5nbGV0b247Ci0JCi0JcHJvdGVjdGVkIE1hcCBwcm90b2NvbEFkYXB0ZXJzOwotCXByb3RlY3RlZCBNYXAgY29udGVudEZpbHRlcnM7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gc3RhcnR1cHNMb2FkZWQ7Ci0KLQkvKioKLQkgKiBNb25pdG9yUGx1Z2luIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIE1vbml0b3JQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXNpbmdsZXRvbiA9IHRoaXM7Ci0JCWxvYWRQcm90b2NvbEFkYXB0ZXJzKCk7Ci0JCWxvYWRDb250ZW50RmlsdGVycygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIHBsdWdpbi4KLQkgKgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5Nb25pdG9yUGx1Z2luCi0JICovCi0JcHVibGljIHN0YXRpYyBNb25pdG9yUGx1Z2luIGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gc2luZ2xldG9uOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRlZmF1bHQgcHJvdG9jb2wgdHlwZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBwcm90b2NvbAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFR5cGUoKSB7Ci0JCXJldHVybiAiSFRUUCI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcHJvdG9jb2wgYWRhcHRlciB3aXRoIHRoZSBnaXZlbiBpZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBpZiBub25lLiBUaGlzIGNvbnZlbmllbmNlIG1ldGhvZCBzZWFyY2hlcyB0aGUgbGlzdCBvZiBrbm93bgotCSAqIHByb3RvY29sIGFkYXB0ZXJzICh7QGxpbmsgI2dldFByb3RvY29sQWRhcHRlcnMoKX0pIGZvciB0aGUgb25lIHdpdGggYQotCSAqIG1hdGNoaW5nIGlkLgotCSAqCi0JICogQHBhcmFtIGlkIHRoZSBwcm90b2NvbCBhZGFwdGVyIGlkOyBtdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEByZXR1cm4gdGhlIHByb3RvY29sIGFkYXB0ZXIgaW5zdGFuY2UsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlCi0JICogICBpcyBubyBwcm90b2NvbCBhZGFwdGVyIHdpdGggdGhlIGdpdmVuIGlkCi0JICovCi0JcHVibGljIFByb3RvY29sQWRhcHRlciBnZXRQcm90b2NvbEFkYXB0ZXIoU3RyaW5nIGlkKSB7Ci0JCXJldHVybiAoUHJvdG9jb2xBZGFwdGVyKSBwcm90b2NvbEFkYXB0ZXJzLmdldChpZCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGxpc3Qgb2YgYWxsIGtub3duIHByb3RvY29sIGFkYXB0ZXIgaW5zdGFuY2VzLgotCSAqIDxwPgotCSAqIFByb3RvY29sIGFkYXB0ZXJzIGFyZSByZWdpc3RlcmVkIHZpYSB0aGUgPGNvZGU+cHJvdG9jb2xBZGFwYXRlcnM8L2NvZGU+Ci0JICogZXh0ZW5zaW9uIHBvaW50IGluIHRoZSA8Y29kZT5vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlPC9jb2RlPgotCSAqIHBsdWctaW4uCi0JICogPC9wPgotCSAqIDxwPgotCSAqIEEgbmV3IGFycmF5IGlzIHJldHVybmVkIG9uIGVhY2ggY2FsbDsgY2xpZW50cyBtYXkgc2FmZWx5IHN0b3JlIG9yIG1vZGlmeSB0aGUgcmVzdWx0LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgcG9zc2libHktZW1wdHkgYXJyYXkgb2YgcHJvdG9jb2wgYWRhcHRlciBpbnN0YW5jZXMKLQkgKi8KLQlwdWJsaWMgUHJvdG9jb2xBZGFwdGVyW10gZ2V0UHJvdG9jb2xBZGFwdGVycygpIHsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IHByb3RvY29sQWRhcHRlcnMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJbGlzdC5hZGQoaXRlcmF0b3IubmV4dCgpKTsKLQkJfQotCQlQcm90b2NvbEFkYXB0ZXJbXSB0eXBlcyA9IG5ldyBQcm90b2NvbEFkYXB0ZXJbbGlzdC5zaXplKCldOwotCQlsaXN0LnRvQXJyYXkodHlwZXMpOwotCQlyZXR1cm4gdHlwZXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjb250ZW50IGZpbHRlcnMuCi0JICogCi0JICogQHJldHVybiBhbiBhcnJheSBvZiBjb250ZW50IGZpbHRlcnMKLQkgKi8KLQlwdWJsaWMgSUNvbnRlbnRGaWx0ZXJbXSBnZXRDb250ZW50RmlsdGVycygpIHsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IGNvbnRlbnRGaWx0ZXJzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCWxpc3QuYWRkKGl0ZXJhdG9yLm5leHQoKSk7Ci0JCX0KLQkJSUNvbnRlbnRGaWx0ZXJbXSBjZiA9IG5ldyBJQ29udGVudEZpbHRlcltsaXN0LnNpemUoKV07Ci0JCWxpc3QudG9BcnJheShjZik7Ci0JCXJldHVybiBjZjsKLQl9Ci0JCi0JLyoqCi0JICogRmluZCBhIGNvbnRlbnQgZmlsdGVyIGJ5IHRoZSBpZC4KLQkgKiAKLQkgKiBAcGFyYW0gaWQgYW4gaWQKLQkgKiBAcmV0dXJuIHRoZSBjb250ZW50IGZpbHRlciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgaXQgY291bGRuJ3QgYmUgZm91bmQKLQkgKi8KLQlwdWJsaWMgSUNvbnRlbnRGaWx0ZXIgZmluZENvbnRlbnRGaWx0ZXIoU3RyaW5nIGlkKSB7Ci0JCWlmIChpZCA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQlyZXR1cm4gKElDb250ZW50RmlsdGVyKSBjb250ZW50RmlsdGVycy5nZXQoaWQpOwotCX0KLQotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBsb2FkUHJvdG9jb2xBZGFwdGVycygpIHsKLQkJaWYgKHByb3RvY29sQWRhcHRlcnMgIT0gbnVsbCkKLQkJCXJldHVybjsKLQkJVHJhY2UudHJhY2UoVHJhY2UuQ09ORklHLCAiTG9hZGluZyBwcm90b2NvbCBhZGFwdGVycyIpOyAKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2YgPSByZWdpc3RyeS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoTW9uaXRvclBsdWdpbi5QTFVHSU5fSUQsICJpbnRlcm5hbFByb3RvY29sQWRhcHRlcnMiKTsKLQotCQlpbnQgc2l6ZSA9IGNmLmxlbmd0aDsKLQkJcHJvdG9jb2xBZGFwdGVycyA9IG5ldyBIYXNoTWFwKHNpemUpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJU3RyaW5nIGlkID0gY2ZbaV0uZ2V0QXR0cmlidXRlKCJpZCIpOwotCQkJVHJhY2UudHJhY2UoVHJhY2UuQ09ORklHLCAiTG9hZGluZyBhZGFwdGVyOiAiICsgaWQpOwotCQkJcHJvdG9jb2xBZGFwdGVycy5wdXQoaWQsIG5ldyBQcm90b2NvbEFkYXB0ZXIoY2ZbaV0pKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgbG9hZENvbnRlbnRGaWx0ZXJzKCkgewotCQlpZiAoY29udGVudEZpbHRlcnMgIT0gbnVsbCkKLQkJCXJldHVybjsKLQkJVHJhY2UudHJhY2UoVHJhY2UuQ09ORklHLCAiTG9hZGluZyBjb250ZW50IGZpbHRlcnMiKTsgCi0JCUlFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNmID0gcmVnaXN0cnkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKE1vbml0b3JQbHVnaW4uUExVR0lOX0lELCAiaW50ZXJuYWxDb250ZW50RmlsdGVycyIpOwotCi0JCWludCBzaXplID0gY2YubGVuZ3RoOwotCQljb250ZW50RmlsdGVycyA9IG5ldyBIYXNoTWFwKHNpemUpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJU3RyaW5nIGlkID0gY2ZbaV0uZ2V0QXR0cmlidXRlKCJpZCIpOwotCQkJVHJhY2UudHJhY2UoVHJhY2UuQ09ORklHLCAiTG9hZGluZyBmaWx0ZXI6ICIgKyBpZCk7Ci0JCQljb250ZW50RmlsdGVycy5wdXQoaWQsIG5ldyBDb250ZW50RmlsdGVyKGNmW2ldKSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIGV4ZWN1dGVTdGFydHVwcygpIHsKLQkJaWYgKHN0YXJ0dXBzTG9hZGVkKQotCQkJcmV0dXJuOwotCQkKLQkJVHJhY2UudHJhY2UoVHJhY2UuQ09ORklHLCAiTG9hZGluZyBzdGFydHVwcyIpOyAKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2YgPSByZWdpc3RyeS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoTW9uaXRvclBsdWdpbi5QTFVHSU5fSUQsICJpbnRlcm5hbFN0YXJ0dXAiKTsKLQotCQlpbnQgc2l6ZSA9IGNmLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCVN0cmluZyBpZCA9IGNmW2ldLmdldEF0dHJpYnV0ZSgiaWQiKTsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLkNPTkZJRywgIkxvYWRpbmcgc3RhcnR1cDogIiArIGlkKTsKLQkJCXRyeSB7Ci0JCQkJSVN0YXJ0dXAgc3RhcnR1cCA9IChJU3RhcnR1cCkgY2ZbaV0uY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsKLQkJCQl0cnkgewotCQkJCQlzdGFydHVwLnN0YXJ0dXAoKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiU3RhcnR1cCBmYWlsZWQiICsgc3RhcnR1cC50b1N0cmluZygpLCBleCk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3QgY3JlYXRlIHN0YXJ0dXA6ICIgKyBpZCwgZSk7Ci0JCQl9Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvTW9uaXRvcldvcmtpbmdDb3B5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9Nb25pdG9yV29ya2luZ0NvcHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE5ZGU3Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9Nb25pdG9yV29ya2luZ0NvcHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vbml0b3JXb3JraW5nQ29weTsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBNb25pdG9yV29ya2luZ0NvcHkgZXh0ZW5kcyBNb25pdG9yIGltcGxlbWVudHMgSU1vbml0b3JXb3JraW5nQ29weSB7Ci0JcHJvdGVjdGVkIE1vbml0b3IgbW9uaXRvcjsKLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgbW9uaXRvciB3b3JraW5nIGNvcHkuICh1c2VkIGZvciBpbml0aWFsIGNyZWF0aW9uKQotCSAqLwotCXB1YmxpYyBNb25pdG9yV29ya2luZ0NvcHkoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgbW9uaXRvciB3b3JraW5nIGNvcHkuICh1c2VkIGZvciB3b3JraW5nIGNvcGllcykKLQkgKiAKLQkgKiBAcGFyYW0gbW9uaXRvciB0aGUgbW9uaXRvciB0aGlzIHdvcmtpbmcgY29weSBpcyBmb3IKLQkgKi8KLQlwdWJsaWMgTW9uaXRvcldvcmtpbmdDb3B5KE1vbml0b3IgbW9uaXRvcikgewotCQl0aGlzLm1vbml0b3IgPSBtb25pdG9yOwotCQlzZXRJbnRlcm5hbChtb25pdG9yKTsKLQl9Ci0KLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgSU1vbml0b3JXb3JraW5nQ29weSNnZXRPcmlnaW5hbCgpCi0JICovCi0JcHVibGljIElNb25pdG9yIGdldE9yaWdpbmFsKCkgewotCQlyZXR1cm4gbW9uaXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGlkLgotCSAqIAotCSAqIEBwYXJhbSBuZXdJZCB0aGUgaWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbmV3SWQpIHsKLQkJaWQgPSBuZXdJZDsKLQl9Ci0KLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgSU1vbml0b3JXb3JraW5nQ29weSNzZXRSZW1vdGVIb3N0KFN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZW1vdGVIb3N0KFN0cmluZyBob3N0KSB7Ci0JCXJlbW90ZUhvc3QgPSBob3N0OwotCX0KLQotCS8qKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBJTW9uaXRvcldvcmtpbmdDb3B5I3NldFJlbW90ZVBvcnQoaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlbW90ZVBvcnQoaW50IHBvcnQpIHsKLQkJcmVtb3RlUG9ydCA9IHBvcnQ7Ci0JfQotCi0JLyoqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIElNb25pdG9yV29ya2luZ0NvcHkjc2V0TG9jYWxQb3J0KGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMb2NhbFBvcnQoaW50IHBvcnQpIHsKLQkJbG9jYWxQb3J0ID0gcG9ydDsKLQl9Ci0KLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgSU1vbml0b3JXb3JraW5nQ29weSNzZXRQcm90b2NvbChTdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvdG9jb2woU3RyaW5nIHByb3RvY29sSWQyKSB7Ci0JCXByb3RvY29sSWQgPSBwcm90b2NvbElkMjsKLQl9Ci0KLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgSU1vbml0b3JXb3JraW5nQ29weSNzZXRUaW1lb3V0KGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUaW1lb3V0KGludCB0aW1lb3V0MikgewotCQl0aW1lb3V0ID0gdGltZW91dDI7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJTW9uaXRvciNpc1dvcmtpbmdDb3B5KCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1dvcmtpbmdDb3B5KCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBJTW9uaXRvciNjcmVhdGVXb3JraW5nQ29weSgpCi0JICovCi0JcHVibGljIElNb25pdG9yV29ya2luZ0NvcHkgY3JlYXRlV29ya2luZ0NvcHkoKSB7Ci0JCXJldHVybiB0aGlzOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSU1vbml0b3JXb3JraW5nQ29weSNzYXZlKCkKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIElNb25pdG9yIHNhdmUoKSB7Ci0JCU1vbml0b3JNYW5hZ2VyIG1tID0gTW9uaXRvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKTsKLQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgewotCQkJLy9ib29sZWFuIHJlc3RhcnQgPSBmYWxzZTsKLQkJCWlmIChtb25pdG9yLmlzUnVubmluZygpKSB7Ci0JCQkJLy9yZXN0YXJ0ID0gdHJ1ZTsKLQkJCQltbS5zdG9wTW9uaXRvcihtb25pdG9yKTsKLQkJCX0KLQkJCW1vbml0b3Iuc2V0SW50ZXJuYWwodGhpcyk7Ci0JCQltbS5tb25pdG9yQ2hhbmdlZChtb25pdG9yKTsKLQkJCS8vaWYgKHJlc3RhcnQpCi0JCQkvLwltbS5zdGFydE1vbml0b3IobW9uaXRvcik7Ci0JCX0gZWxzZSB7Ci0JCQltb25pdG9yID0gbmV3IE1vbml0b3IoKTsKLQkJCW1vbml0b3Iuc2V0SW50ZXJuYWwodGhpcyk7Ci0JCQltbS5hZGRNb25pdG9yKG1vbml0b3IpOwotCQl9Ci0JCXJldHVybiBtb25pdG9yOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9Qcm90b2NvbEFkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL1Byb3RvY29sQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGY4YzBlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL1Byb3RvY29sQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5Tb2NrZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb25pdG9yOwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFByb3RvY29sQWRhcHRlciBpbXBsZW1lbnRzIElQcm90b2NvbEFkYXB0ZXIgewotCXByb3RlY3RlZCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudDsKLQlwcm90ZWN0ZWQgUHJvdG9jb2xBZGFwdGVyRGVsZWdhdGUgZGVsZWdhdGU7Ci0KLQlwcm90ZWN0ZWQgUHJvdG9jb2xBZGFwdGVyKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJUHJvdG9jb2xBZGFwdGVyI2dldElkKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImlkIik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJUHJvdG9jb2xBZGFwdGVyI2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJuYW1lIik7Ci0JfQotCi0JcHJvdGVjdGVkIFByb3RvY29sQWRhcHRlckRlbGVnYXRlIGdldERlbGVnYXRlKCkgewotCQlpZiAoZGVsZWdhdGUgIT0gbnVsbCkKLQkJCXJldHVybiBkZWxlZ2F0ZTsKLQkJCi0JCXRyeSB7Ci0JCQlkZWxlZ2F0ZSA9IChQcm90b2NvbEFkYXB0ZXJEZWxlZ2F0ZSkgZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJjbGFzcyIpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IGNyZWF0ZSBwcm90b2NvbCBhZGFwdGVyIGRlbGVnYXRlOiAiICsgZ2V0SWQoKSwgZSk7Ci0JCX0KLQkJcmV0dXJuIGRlbGVnYXRlOwotCX0KLQotCS8qKgotCSAqIENvbm5lY3Qgd2l0aCB0aGUgcHJvdG9jb2wuCi0JICogCi0JICogQHBhcmFtIG1vbml0b3IgYSBtb25pdG9yCi0JICogQHBhcmFtIGluIGFuIGluYm91bmQgc29ja2V0Ci0JICogQHBhcmFtIG91dCBhbiBvdXRib3VuZCBzb2NrZXQKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgY29ubmVjdChJTW9uaXRvciBtb25pdG9yLCBTb2NrZXQgaW4sIFNvY2tldCBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWdldERlbGVnYXRlKCkuY29ubmVjdChtb25pdG9yLCBpbiwgb3V0KTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNjb25uZWN0IGZyb20gdGhlIHNvY2tldHMuCi0JICogCi0JICogQHBhcmFtIG1vbml0b3IgYSBtb25pdG9yCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc2Nvbm5lY3QoSU1vbml0b3IgbW9uaXRvcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZ2V0RGVsZWdhdGUoKS5kaXNjb25uZWN0KG1vbml0b3IpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9Qcm90b2NvbEFkYXB0ZXJEZWxlZ2F0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvUHJvdG9jb2xBZGFwdGVyRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU5NDcyMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9Qcm90b2NvbEFkYXB0ZXJEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5Tb2NrZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9uaXRvcjsKLS8qKgotICogQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgcHJvdG9jb2wgYWRhcHRlciBkZWxlZ2F0ZXMsIHdoaWNoIHByb3ZpZGUgdGhlCi0gKiBpbXBsZW1lbnRhdGlvbiBiZWhpbmQgYSBwYXJ0aWN1bGFyIHByb3RvY29sIGFkYXB0ZXIuCi0gKiBBIHByb3RvY29sIGFkYXB0ZXIgd2F0Y2hlcyB0aGUgbWVzc2FnZSB0cmFmZmljIHBhc3NpbmcgYmV0d2VlbiBjbGllbnQgYW5kCi0gKiBzZXJ2ZXI7IGl0IHBhcnNlcyB0aGUgbWVzc2FnZXMgYW5kIHJlcG9ydHMgdGhlbSBpbiB0aGUgZm9ybSBvZiAKLSAqIFJlcXVlc3Qgb2JqZWN0cy4KLSAqIDxwPgotICogVGhpcyBhYnN0cmFjdCBjbGFzcyBpcyBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkIG9ubHkgYnkgY2xpZW50cwotICogdG8gZXh0ZW5kIHRoZSA8Y29kZT5wcm90b2NvbEFkYXB0ZXJzPC9jb2RlPiBleHRlbnNpb24gcG9pbnQuCi0gKiBUaGUgc3ViY2xhc3MgbXVzdCBoYXZlIGEgcHVibGljIDAtYXJndW1lbnQgY29uc3RydWN0b3IsIHdoaWNoIHdpbGwgYmUgdXNlZAotICogYXV0b21hdGljYWxseSB0byBpbnN0YW50aWF0ZSB0aGUgZGVsZWdhdGUgd2hlbiByZXF1aXJlZC4gCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRoZXJlIGlzIG9ubHkgb25lIGRlbGVnYXRlIGNyZWF0ZWQgcGVyIHByb3RvY29sLCBhbmQgdGhpcyBkZWxlZ2F0ZSBtdXN0Ci0gKiBiZSBhYmxlIHRvIGhhbmRsZSBtdWx0aXBsZSBtb25pdG9yIGluc3RhbmNlcy4gVGhpcyBtZWFucyB0aGF0IHRoZSBkZWxlZ2F0ZQotICogdHlwaWNhbGx5IHdpbGwgbm90IGhhdmUgaW5zdGFuY2Ugc3RhdGUsIG9yIG11c3Qgc3luY2hyb25pemUgYW5kIGtlZXAgdGhlCi0gKiBzdGF0ZSBzZXBhcmF0ZS4KLSAqIDwvcD4KLSAqIDxwPgotICogW2lzc3VlOiBUaGUgSFRUUCBhbmQgVENQL0lQIGRlbGVnYXRlIGltcGxlbWVudGF0aW9ucyBjcmVhdGUgdGhyZWFkcyB3aGljaAotICogc2h1ZmZsZSBpbmZvIGJldHdlZW4gc29ja2V0cy4gSWYgdGhlIG1vbml0b3IgaXMgY2hhbmdlZCBvciBkZWxldGVkLCBob3cgZG8KLSAqIHRoZXNlIHRocmVhZHMgZ28gYXdheT8gTWV0aGlua3MgdGhhdCBkZWxlZ2F0ZXMgaW4gZ2VuZXJhbCBzaG91bGQgYmUgZm9yY2VkCi0gKiB0byBpbXBsZW1lbnQgZGlzY29ubmVjdChJTW9uaXRvcikgYXMgd2VsbC4gVGhpcyBtZXRob2Qgd291bGQgYmUgY2FsbGVkIGJ5IHRoZQotICogc3lzdGVtIHdoZW4gdGhlIG1vbml0b3IgaXMgY2hhbmdlZCBvciBkZWxldGVkLCBvciB3aGVuIHRoZSBwbHVnLWluIGlzCi0gKiBiZWluZyBzaHV0IGRvd24uXQotICogPC9wPgotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFByb3RvY29sQWRhcHRlckRlbGVnYXRlIHsKLQkvKioKLQkgKiBFc3RhYmxpc2hlcyBhbiBvbmdvaW5nIGNvbm5lY3Rpb24gYmV0d2VlbiBjbGllbnQgYW5kIHNlcnZlciBiZWluZwotCSAqIG1vbml0b3JlZCBieSB0aGUgZ2l2ZW4gbW9uaXRvci4gVGhlIDxjb2RlPmluPC9jb2RlPiBzb2NrZXQgaXMgYXNzb2NpYXRlZAotCSAqIHdpdGggdGhlIG1vbml0b3IncyBjbGllbnQuIFRoZSA8Y29kZT5vdXQ8L2NvZGU+IHNvY2tldCBpcyBhc3NvY2lhdGVkIHdpdGgKLQkgKiB0aGUgbW9uaXRvcidzIHNlcnZlci4gRGlmZmVyZW50IGFkYXBhdGVycyBoYW5kbGUgZGlmZmVyZW50IG5ldHdvcmsKLQkgKiBwcm90b2NvbHMuCi0JICogPHA+Ci0JICogU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byBhY2hpZXZlIHRoZSBmb2xsb3dpbmc6Ci0JICogPHVsPgotCSAqIDxsaT5DbGllbnQgdG8gc2VydmVyIGNvbW11bmljYXRpb24gLQotCSAqIE9wZW5pbmcgYW4gaW5wdXQgc3RyZWFtIG9uIHRoZSA8Y29kZT5pbjwvY29kZT4gc29ja2V0LCBvcGVuaW5nIGFuIG91dHB1dAotCSAqIHN0cmVhbSBvbiB0aGUgPGNvZGU+b3V0PC9jb2RlPiBzb2NrZXQsIGFuZCBlc3RhYmxpc2hpbmcgYSBtZWNoYW5pc20gdGhhdAotCSAqIHdpbGwgcGFzcyBhbG9uZyBhbGwgYnl0ZXMgcmVjZWl2ZWQgb24gdGhlIGlucHV0IHN0cmVhbSB0byB0aGUgb3V0cHV0Ci0JICogc3RyZWFtLjwvbGk+Ci0JICogPGxpPlNlcnZlciB0byBjbGllbnQgY29tbXVuaWNhdGlvbiAtIE9wZW5pbmcgYW4gaW5wdXQgc3RyZWFtIG9uIHRoZQotCSAqIDxjb2RlPm91dDwvY29kZT4gc29ja2V0LCBvcGVuaW5nIGFuIG91dHB1dCBzdHJlYW0gb24gdGhlIDxjb2RlPmluPC9jb2RlPgotCSAqIHNvY2tldCwgYW5kIGVzdGFibGlzaGluZyBhIG1lY2hhbmlzbSB0aGF0IHdpbGwgcGFzcyBhbG9uZyBhbGwgYnl0ZXMKLQkgKiByZWNlaXZlZCBvbiB0aGUgaW5wdXQgc3RyZWFtIHRvIHRoZSBvdXRwdXQgc3RyZWFtLjwvbGk+Ci0JICogPGxpPlBhcnNpbmcgdGhlIHByb3RvY29sLXNwZWNpZmljIG1lc3NhZ2UgdHJhZmZpYyB0byBjcmVhdGUgYW5kIHJlcG9ydAotCSAqIHJlcXVlc3Qgb2JqZWN0cyBmb3IgZWFjaCBtZXNzYWdlIHBhc3NlZCBiZXR3ZWVuIGNsaWVudCBhbmQgc2VydmVyLjwvbGk+Ci0JICogPGxpPkNsb3NpbmcgdGhlIGlucHV0IGFuZCBvdXRwdXQgc29ja2V0cyBhbmQgb3RoZXJ3aXNlIGNsZWFuaW5nIHVwCi0JICogYWZ0ZXJ3YXJkcy48L2xpPgotCSAqIDwvdWw+Ci0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBtb25pdG9yIHRoZSBtb25pdG9yIHRoYXQgdXNlcyB0aGlzIHByb3RvY29sIGFkYXB0ZXIKLQkgKiBAcGFyYW0gaW4gdGhlIGlucHV0IHNvY2tldCBvZiB0aGUgbW9uaXRvciBjbGllbnQKLQkgKiBAcGFyYW0gb3V0IHRoZSBvdXRwdXQgc29ja2V0IG9mIHRoZSBtb25pdG9yIHNlcnZlcgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYW4gZXhjZXB0aW9uIG9jY3VyIHdoZW4gb3BlbmluZyB0aGUgc3RyZWFtcyBvZiB0aGUKLQkgKiAgICBpbnB1dCBvciBvdXRwdXQgc29ja2V0cwotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIGNvbm5lY3QoSU1vbml0b3IgbW9uaXRvciwgU29ja2V0IGluLCBTb2NrZXQgb3V0KSB0aHJvd3MgSU9FeGNlcHRpb247Ci0JCi0JLyoqCi0JICogQ2FsbGVkIGlmIHRoZSBtb25pdG9yIGlzIGNoYW5nZWQgb3IgZGVsZXRlZCwgb3IgdGhlIHBsdWdpbiBpcyBzaHV0dGluZyBkb3duLgotCSAqIFRoZSBkZWxlZ2F0ZSBtdXN0IGNsZWFuIHVwIHRoZSBjb25uZWN0aW9ucyBhbmQgdGhyZWFkcyBjcmVhdGVkIHRvIHJlc3BvbmQgdG8KLQkgKiB0aGlzIG1vbml0b3IuIAotCSAqIAotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIGRpc2Nvbm5lY3QoSU1vbml0b3IgbW9uaXRvcikgdGhyb3dzIElPRXhjZXB0aW9uOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL1NvY2tldFdyYXBwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL1NvY2tldFdyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJiNGRkOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9Tb2NrZXRXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOwotaW1wb3J0IGphdmEubmV0LlNvY2tldDsKLWltcG9ydCBqYXZhLm5ldC5Tb2NrZXRBZGRyZXNzOwotaW1wb3J0IGphdmEubmV0LlNvY2tldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5pby5jaGFubmVscy5Tb2NrZXRDaGFubmVsOwotLyoqCi0gKiBBIHNvY2tldCB0aGF0IGlzIG9ubHkgdXNlZCBmb3IgcmVzZW5kaW5nIHJlcXVlc3RzLiBBbGwgaW5wdXQgb3BlcmF0aW9ucyBhcmUKLSAqIGlnbm9yZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBTb2NrZXRXcmFwcGVyIGV4dGVuZHMgU29ja2V0IHsKLQlwcml2YXRlIElucHV0U3RyZWFtIGlucHV0U3RyZWFtOwotCXByaXZhdGUgT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbTsKLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgc29ja2V0IHdyYXBwZXIuCi0JICogCi0JICogQHBhcmFtIGlucHV0U3RyZWFtCi0JICovCi0JcHVibGljIFNvY2tldFdyYXBwZXIoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHsKLQkgIHRoaXMuaW5wdXRTdHJlYW0gPSBpbnB1dFN0cmVhbTsKLQkgIHRoaXMub3V0cHV0U3RyZWFtID0gbmV3IER1bW15T3V0cHV0U3RyZWFtKCk7Ci0JfQotCi0JLyoqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEubmV0LlNvY2tldCNiaW5kKGphdmEubmV0LlNvY2tldEFkZHJlc3MpCi0JICovCi0JcHVibGljIHZvaWQgYmluZChTb2NrZXRBZGRyZXNzIGFyZzApIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5uZXQuU29ja2V0I2Nsb3NlKCkKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEubmV0LlNvY2tldCNjb25uZWN0KGphdmEubmV0LlNvY2tldEFkZHJlc3MsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb25uZWN0KFNvY2tldEFkZHJlc3MgYXJnMCwgaW50IGFyZzEpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5uZXQuU29ja2V0I2Nvbm5lY3QoamF2YS5uZXQuU29ja2V0QWRkcmVzcykKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb25uZWN0KFNvY2tldEFkZHJlc3MgYXJnMCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLm5ldC5Tb2NrZXQjZ2V0Q2hhbm5lbCgpCi0JICovCi0JcHVibGljIFNvY2tldENoYW5uZWwgZ2V0Q2hhbm5lbCgpIHsKLQkJcmV0dXJuIHN1cGVyLmdldENoYW5uZWwoKTsKLQl9Ci0JCi0JLyoqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEubmV0LlNvY2tldCNnZXRJbmV0QWRkcmVzcygpCi0JICovCi0JcHVibGljIEluZXRBZGRyZXNzIGdldEluZXRBZGRyZXNzKCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0SW5ldEFkZHJlc3MoKTsKLQl9Ci0KLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5uZXQuU29ja2V0I2dldElucHV0U3RyZWFtKCkKLQkgKi8KLQlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gaW5wdXRTdHJlYW07Ci0JfQotCi0JLyoqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEubmV0LlNvY2tldCNnZXRLZWVwQWxpdmUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldEtlZXBBbGl2ZSgpIHRocm93cyBTb2NrZXRFeGNlcHRpb24gewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEubmV0LlNvY2tldCNnZXRMb2NhbEFkZHJlc3MoKQotCSAqLwotCXB1YmxpYyBJbmV0QWRkcmVzcyBnZXRMb2NhbEFkZHJlc3MoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRMb2NhbEFkZHJlc3MoKTsKLQl9Ci0KLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5uZXQuU29ja2V0I2dldExvY2FsUG9ydCgpCi0JICovCi0JcHVibGljIGludCBnZXRMb2NhbFBvcnQoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRMb2NhbFBvcnQoKTsKLQl9Ci0KLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5uZXQuU29ja2V0I2dldExvY2FsU29ja2V0QWRkcmVzcygpCi0JICovCi0JcHVibGljIFNvY2tldEFkZHJlc3MgZ2V0TG9jYWxTb2NrZXRBZGRyZXNzKCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0TG9jYWxTb2NrZXRBZGRyZXNzKCk7Ci0JfQotCQotCS8qKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLm5ldC5Tb2NrZXQjZ2V0T09CSW5saW5lKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRPT0JJbmxpbmUoKSB0aHJvd3MgU29ja2V0RXhjZXB0aW9uIHsKLQkJcmV0dXJuIHN1cGVyLmdldE9PQklubGluZSgpOwotCX0KLQotCS8qKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLm5ldC5Tb2NrZXQjZ2V0T3V0cHV0U3RyZWFtKCkKLQkgKi8KLQlwdWJsaWMgT3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBvdXRwdXRTdHJlYW07Ci0JfQotCi0JLyoqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEubmV0LlNvY2tldCNnZXRQb3J0KCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldFBvcnQoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRQb3J0KCk7Ci0JfQotCi0JLyoqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEubmV0LlNvY2tldCNnZXRSZWNlaXZlQnVmZmVyU2l6ZSgpCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBpbnQgZ2V0UmVjZWl2ZUJ1ZmZlclNpemUoKSB0aHJvd3MgU29ja2V0RXhjZXB0aW9uIHsKLQkJcmV0dXJuIHN1cGVyLmdldFJlY2VpdmVCdWZmZXJTaXplKCk7Ci0JfQotCi0JLyoqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEubmV0LlNvY2tldCNnZXRSZW1vdGVTb2NrZXRBZGRyZXNzKCkKLQkgKi8KLQlwdWJsaWMgU29ja2V0QWRkcmVzcyBnZXRSZW1vdGVTb2NrZXRBZGRyZXNzKCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0UmVtb3RlU29ja2V0QWRkcmVzcygpOwotCX0KLQotCS8qKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLm5ldC5Tb2NrZXQjZ2V0UmV1c2VBZGRyZXNzKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRSZXVzZUFkZHJlc3MoKSB0aHJvd3MgU29ja2V0RXhjZXB0aW9uIHsKLQkJcmV0dXJuIHN1cGVyLmdldFJldXNlQWRkcmVzcygpOwotCX0KLQotCS8qKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLm5ldC5Tb2NrZXQjZ2V0U2VuZEJ1ZmZlclNpemUoKQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGdldFNlbmRCdWZmZXJTaXplKCkgdGhyb3dzIFNvY2tldEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBzdXBlci5nZXRTZW5kQnVmZmVyU2l6ZSgpOwotCX0KLQotCS8qKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLm5ldC5Tb2NrZXQjZ2V0U29MaW5nZXIoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U29MaW5nZXIoKSB0aHJvd3MgU29ja2V0RXhjZXB0aW9uIHsKLQkJcmV0dXJuIHN1cGVyLmdldFNvTGluZ2VyKCk7Ci0JfQotCi0JLyoqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEubmV0LlNvY2tldCNnZXRTb1RpbWVvdXQoKQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGdldFNvVGltZW91dCgpIHRocm93cyBTb2NrZXRFeGNlcHRpb24gewotCQlyZXR1cm4gc3VwZXIuZ2V0U29UaW1lb3V0KCk7Ci0JfQotCi0JLyoqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEubmV0LlNvY2tldCNnZXRUY3BOb0RlbGF5KCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRUY3BOb0RlbGF5KCkgdGhyb3dzIFNvY2tldEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBzdXBlci5nZXRUY3BOb0RlbGF5KCk7Ci0JfQotCi0JLyoqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEubmV0LlNvY2tldCNnZXRUcmFmZmljQ2xhc3MoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VHJhZmZpY0NsYXNzKCkgdGhyb3dzIFNvY2tldEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBzdXBlci5nZXRUcmFmZmljQ2xhc3MoKTsKLQl9Ci0KLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5uZXQuU29ja2V0I2lzQm91bmQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQm91bmQoKSB7Ci0JCXJldHVybiBzdXBlci5pc0JvdW5kKCk7Ci0JfQotCi0JLyoqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEubmV0LlNvY2tldCNpc0Nsb3NlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDbG9zZWQoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5uZXQuU29ja2V0I2lzQ29ubmVjdGVkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Nvbm5lY3RlZCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEubmV0LlNvY2tldCNpc0lucHV0U2h1dGRvd24oKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSW5wdXRTaHV0ZG93bigpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLm5ldC5Tb2NrZXQjaXNPdXRwdXRTaHV0ZG93bigpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNPdXRwdXRTaHV0ZG93bigpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLm5ldC5Tb2NrZXQjc2VuZFVyZ2VudERhdGEoaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNlbmRVcmdlbnREYXRhKGludCBhcmcwKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlzdXBlci5zZW5kVXJnZW50RGF0YShhcmcwKTsKLQl9Ci0JCi0JLyoqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEubmV0LlNvY2tldCNzZXRLZWVwQWxpdmUoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRLZWVwQWxpdmUoYm9vbGVhbiBhcmcwKSB0aHJvd3MgU29ja2V0RXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0S2VlcEFsaXZlKGFyZzApOwotCX0KLQotCS8qKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLm5ldC5Tb2NrZXQjc2V0T09CSW5saW5lKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2V0T09CSW5saW5lKGJvb2xlYW4gYXJnMCkgdGhyb3dzIFNvY2tldEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldE9PQklubGluZShhcmcwKTsKLQl9Ci0KLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5uZXQuU29ja2V0I3NldFJlY2VpdmVCdWZmZXJTaXplKGludCkKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0UmVjZWl2ZUJ1ZmZlclNpemUoaW50IGFyZzApIHRocm93cyBTb2NrZXRFeGNlcHRpb24gewotCQlzdXBlci5zZXRSZWNlaXZlQnVmZmVyU2l6ZShhcmcwKTsKLQl9Ci0KLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5uZXQuU29ja2V0I3NldFJldXNlQWRkcmVzcyhib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJldXNlQWRkcmVzcyhib29sZWFuIGFyZzApIHRocm93cyBTb2NrZXRFeGNlcHRpb24gewotCQlzdXBlci5zZXRSZXVzZUFkZHJlc3MoYXJnMCk7Ci0JfQotCi0JLyoqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEubmV0LlNvY2tldCNzZXRTZW5kQnVmZmVyU2l6ZShpbnQpCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldFNlbmRCdWZmZXJTaXplKGludCBhcmcwKSB0aHJvd3MgU29ja2V0RXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0U2VuZEJ1ZmZlclNpemUoYXJnMCk7Ci0JfQotCi0JLyoqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEubmV0LlNvY2tldCNzZXRTb0xpbmdlcihib29sZWFuLCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0U29MaW5nZXIoYm9vbGVhbiBhcmcwLCBpbnQgYXJnMSkgdGhyb3dzIFNvY2tldEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFNvTGluZ2VyKGFyZzAsIGFyZzEpOwotCX0KLQotCS8qKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLm5ldC5Tb2NrZXQjc2V0U29UaW1lb3V0KGludCkKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0U29UaW1lb3V0KGludCBhcmcwKSB0aHJvd3MgU29ja2V0RXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0U29UaW1lb3V0KGFyZzApOwotCX0KLQotCS8qKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLm5ldC5Tb2NrZXQjc2V0VGNwTm9EZWxheShib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRjcE5vRGVsYXkoYm9vbGVhbiBhcmcwKSB0aHJvd3MgU29ja2V0RXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VGNwTm9EZWxheShhcmcwKTsKLQl9Ci0KLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5uZXQuU29ja2V0I3NldFRyYWZmaWNDbGFzcyhpbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHJhZmZpY0NsYXNzKGludCBhcmcwKSB0aHJvd3MgU29ja2V0RXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VHJhZmZpY0NsYXNzKGFyZzApOwotCX0KLQotCS8qKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLm5ldC5Tb2NrZXQjc2h1dGRvd25JbnB1dCgpCi0JICovCi0JcHVibGljIHZvaWQgc2h1dGRvd25JbnB1dCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlucHV0U3RyZWFtLmNsb3NlKCk7Ci0JfQotCi0JLyoqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEubmV0LlNvY2tldCNzaHV0ZG93bk91dHB1dCgpCi0JICovCi0JcHVibGljIHZvaWQgc2h1dGRvd25PdXRwdXQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogQSBkdW1teSBPdXRwdXRTdHJlYW0gdGhhdCBhbGxvd3MgdXMgdG8gZmFrZSBvdXRwdXQgZm9yIGEgc29ja2V0LgotCSAqLwotCXB1YmxpYyBjbGFzcyBEdW1teU91dHB1dFN0cmVhbSBleHRlbmRzIE91dHB1dFN0cmVhbSB7Ci0JCS8qKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgamF2YS5pby5PdXRwdXRTdHJlYW0jY2xvc2UoKQotCQkgKi8KLQkJcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0JCQotCQkvKiogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIGphdmEuaW8uT3V0cHV0U3RyZWFtI2ZsdXNoKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGZsdXNoKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCQotCQkvKiogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIGphdmEuaW8uT3V0cHV0U3RyZWFtI3dyaXRlKGJ5dGVbXSwgaW50LCBpbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gYXJnMCwgaW50IGFyZzEsIGludCBhcmcyKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0JCi0JCS8qKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgamF2YS5pby5PdXRwdXRTdHJlYW0jd3JpdGUoYnl0ZVtdKQotCQkgKi8KLQkJcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGFyZzApIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQotCQkvKiogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIGphdmEuaW8uT3V0cHV0U3RyZWFtI3dyaXRlKGludCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHdyaXRlKGludCBhcmcwKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL1RDUElQUHJvdG9jb2xBZGFwdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9UQ1BJUFByb3RvY29sQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjM4ZDM4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL1RDUElQUHJvdG9jb2xBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLaAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5Tb2NrZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5SZXF1ZXN0OwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFRDUElQUHJvdG9jb2xBZGFwdGVyIGV4dGVuZHMgUHJvdG9jb2xBZGFwdGVyRGVsZWdhdGUgewotCXByb3RlY3RlZCBNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLQkKLQkvKioKLQkgKiBAc2VlIFByb3RvY29sQWRhcHRlckRlbGVnYXRlI2Nvbm5lY3QoSU1vbml0b3IsIFNvY2tldCwgU29ja2V0KQotCSAqLwotCXB1YmxpYyB2b2lkIGNvbm5lY3QoSU1vbml0b3IgbW9uaXRvciwgU29ja2V0IGluLCBTb2NrZXQgb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlSZXF1ZXN0IHJlcXVlc3QgPSBuZXcgUmVxdWVzdCgoTW9uaXRvcikgbW9uaXRvciwgSVByb3RvY29sQWRhcHRlci5UQ1BJUF9QUk9UT0NPTF9JRCwgbW9uaXRvci5nZXRMb2NhbFBvcnQoKSwgbW9uaXRvci5nZXRSZW1vdGVIb3N0KCksIG1vbml0b3IuZ2V0UmVtb3RlUG9ydCgpKTsKLQkJQ29ubmVjdGlvbiBjb25uID0gbmV3IENvbm5lY3Rpb24oaW4sIG91dCk7Ci0JCW1hcC5wdXQobW9uaXRvciwgY29ubik7Ci0JCVRDUElQVGhyZWFkIHJlcXVlc3RUaHJlYWQgPSBuZXcgVENQSVBUaHJlYWQoY29ubiwgcmVxdWVzdCwgaW4uZ2V0SW5wdXRTdHJlYW0oKSwgb3V0LmdldE91dHB1dFN0cmVhbSgpLCB0cnVlKTsKLQkJcmVxdWVzdFRocmVhZC5zdGFydCgpOwotCQluZXcgVENQSVBUaHJlYWQoY29ubiwgcmVxdWVzdCwgb3V0LmdldElucHV0U3RyZWFtKCksIGluLmdldE91dHB1dFN0cmVhbSgpLCBmYWxzZSkuc3RhcnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFByb3RvY29sQWRhcHRlckRlbGVnYXRlI2Rpc2Nvbm5lY3QoSU1vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgZGlzY29ubmVjdChJTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQl0cnkgewotCQkJQ29ubmVjdGlvbiBjb25uID0gKENvbm5lY3Rpb24pIG1hcC5nZXQobW9uaXRvcik7Ci0JCQljb25uLmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9UQ1BJUFRocmVhZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvVENQSVBUaHJlYWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2I3NTBjNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9UQ1BJUFRocmVhZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuUmVxdWVzdDsKLS8qKgotICogTW9uaXRvciBzZXJ2ZXIgSS9PIHRocmVhZC4KLSAqLwotcHVibGljIGNsYXNzIFRDUElQVGhyZWFkIGV4dGVuZHMgVGhyZWFkIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQlVGRkVSID0gMjA0ODsKLQlwcm90ZWN0ZWQgSW5wdXRTdHJlYW0gaW47Ci0JcHJvdGVjdGVkIE91dHB1dFN0cmVhbSBvdXQ7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaXNSZXF1ZXN0OwotCQotCXByb3RlY3RlZCBDb25uZWN0aW9uIGNvbm47Ci0JcHJvdGVjdGVkIFJlcXVlc3QgcmVxdWVzdDsKLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBUQ1AvSVAgdGhyZWFkLgotCSAqIAotCSAqIEBwYXJhbSBjb25uCi0JICogQHBhcmFtIHJlcXVlc3QKLQkgKiBAcGFyYW0gaW4KLQkgKiBAcGFyYW0gb3V0Ci0JICogQHBhcmFtIGlzUmVxdWVzdAotCSAqLwotCXB1YmxpYyBUQ1BJUFRocmVhZChDb25uZWN0aW9uIGNvbm4sIFJlcXVlc3QgcmVxdWVzdCwgSW5wdXRTdHJlYW0gaW4sIE91dHB1dFN0cmVhbSBvdXQsIGJvb2xlYW4gaXNSZXF1ZXN0KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuY29ubiA9IGNvbm47Ci0JCXRoaXMucmVxdWVzdCA9IHJlcXVlc3Q7Ci0JCXRoaXMuaW4gPSBpbjsKLQkJdGhpcy5vdXQgPSBvdXQ7Ci0JCXRoaXMuaXNSZXF1ZXN0ID0gaXNSZXF1ZXN0OwotCQlzZXRQcmlvcml0eShUaHJlYWQuTk9STV9QUklPUklUWSArIDEpOwotCQlzZXREYWVtb24odHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogTGlzdGVuIGZvciBpbnB1dCwgc2F2ZSBpdCwgYW5kIHBhc3MgdG8gdGhlIG91dHB1dCBzdHJlYW0uCi0JICovCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQl0cnkgewotCQkJYnl0ZVtdIGIgPSBuZXcgYnl0ZVtCVUZGRVJdOwotCQkJaW50IG4gPSBpbi5yZWFkKGIpOwotCQkJd2hpbGUgKG4gPiAwKSB7Ci0JCQkJb3V0LndyaXRlKGIsIDAsIG4pOwotCQkJCWlmIChiICE9IG51bGwgJiYgbiA+IDApIHsKLQkJCQkJYnl0ZVtdIHggPSBudWxsOwotCQkJCQlpZiAobiA9PSBCVUZGRVIpCi0JCQkJCQl4ID0gYjsKLQkJCQkJZWxzZSB7Ci0JCQkJCQl4ID0gbmV3IGJ5dGVbbl07Ci0JCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGIsIDAsIHgsIDAsIG4pOwotCQkJCQl9Ci0JCQkJCWlmIChpc1JlcXVlc3QpCi0JCQkJCQlyZXF1ZXN0LmFkZFRvUmVxdWVzdCh4KTsKLQkJCQkJZWxzZQotCQkJCQkJcmVxdWVzdC5hZGRUb1Jlc3BvbnNlKHgpOwotCQkJCX0KLQkJCQluID0gaW4ucmVhZChiKTsKLQkJCQlUaHJlYWQueWllbGQoKTsKLQkJCX0KLQkJCW91dC5mbHVzaCgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfSBmaW5hbGx5IHsKLQkJCS8vcmVxdWVzdC5maXJlQ2hhbmdlZEV2ZW50KCk7Ci0JCQlpZiAoIWlzUmVxdWVzdCkKLQkJCQljb25uLmNsb3NlKCk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvVHJhY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL1RyYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwZmVjNzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvVHJhY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbDsKLS8qKgotICogSGVscGVyIGNsYXNzIHRvIHJvdXRlIHRyYWNlIG91dHB1dC4KLSAqLwotcHVibGljIGNsYXNzIFRyYWNlIHsKLQkvKioKLQkgKiBDb25maWcgdHJhY2UgZXZlbnQuCi0JICovCi0JcHVibGljIHN0YXRpYyBieXRlIENPTkZJRyA9IDA7Ci0JCi0JLyoqCi0JICogV2FybmluZyB0cmFjZSBldmVudC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJ5dGUgV0FSTklORyA9IDE7Ci0JCi0JLyoqCi0JICogU2V2ZXJlIHRyYWNlIGV2ZW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYnl0ZSBTRVZFUkUgPSAyOwotCQotCS8qKgotCSAqIEZpbmVzdCB0cmFjZSBldmVudC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJ5dGUgRklORVNUID0gMzsKLQkKLQkvKioKLQkgKiBQYXJzaW5nIHRyYWNlIGV2ZW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYnl0ZSBQQVJTSU5HID0gNDsKLQotCS8qKgotCSAqIFRyYWNlIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHJpdmF0ZSBUcmFjZSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JLyoqCi0JICogVHJhY2UgdGhlIGdpdmVuIHRleHQuCi0JICoKLQkgKiBAcGFyYW0gbGV2ZWwgdGhlIHRyYWNlIGxldmVsCi0JICogQHBhcmFtIHMgYSBtZXNzYWdlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlKGJ5dGUgbGV2ZWwsIFN0cmluZyBzKSB7Ci0JCXRyYWNlKGxldmVsLCBzLCBudWxsKTsKLQl9Ci0JCi0JLyoqCi0JICogVHJhY2UgdGhlIGdpdmVuIG1lc3NhZ2UgYW5kIGV4Y2VwdGlvbi4KLQkgKgotCSAqIEBwYXJhbSBsZXZlbCB0aGUgdHJhY2UgbGV2ZWwKLQkgKiBAcGFyYW0gcyBhIG1lc3NhZ2UKLQkgKiBAcGFyYW0gdCBhIHRocm93YWJsZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZShieXRlIGxldmVsLCBTdHJpbmcgcywgVGhyb3dhYmxlIHQpIHsKLQkJaWYgKCFNb25pdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuaXNEZWJ1Z2dpbmcoKSkKLQkJCXJldHVybjsKLQotCQlTeXN0ZW0ub3V0LnByaW50bG4oTW9uaXRvclBsdWdpbi5QTFVHSU5fSUQgKyAiICIgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArICIgIiArIHMpOwotCQlpZiAodCAhPSBudWxsKQotCQkJdC5wcmludFN0YWNrVHJhY2UoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvWE1MTWVtZW50by5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvWE1MTWVtZW50by5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTIzMDVjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL1hNTE1lbWVudG8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgb3JnLnczYy5kb20uKjsKLWltcG9ydCBvcmcueG1sLnNheC4qOwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuKjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLio7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5kb20uRE9NU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsKLS8qKgotICogQSBNZW1lbnRvIGlzIGEgY2xhc3MgaW5kZXBlbmRlbnQgY29udGFpbmVyIGZvciBwZXJzaXN0ZW5jZQotICogaW5mby4gIEl0IGlzIGEgcmVmbGVjdGlvbiBvZiAzIHN0b3JhZ2UgcmVxdWlyZW1lbnRzLgotICoKLSAqIDEpICAgV2UgbmVlZCB0aGUgYWJpbGl0eSB0byBwZXJzaXN0IGFuIG9iamVjdCBhbmQgcmVzdG9yZSBpdC4gIAotICogMikgICBUaGUgY2xhc3MgZm9yIGFuIG9iamVjdCBtYXkgYmUgYWJzZW50LiAgSWYgc28gd2Ugd291bGQgCi0gKiAgICAgIGxpa2UgdG8gc2tpcCB0aGUgb2JqZWN0IGFuZCBrZWVwIHJlYWRpbmcuIAotICogMykgICBUaGUgY2xhc3MgZm9yIGFuIG9iamVjdCBtYXkgY2hhbmdlLiAgSWYgc28gdGhlIG5ldyBjbGFzcyAKLSAqICAgICAgc2hvdWxkIGJlIGFibGUgdG8gcmVhZCB0aGUgb2xkIHBlcnNpc3RlbmNlIGluZm8uCi0gKgotICogV2UgY291bGQgYXNrIHRoZSBvYmplY3RzIHRvIHNlcmlhbGl6ZSB0aGVtc2VsdmVzIGludG8gYW4gCi0gKiBPYmplY3RPdXRwdXRTdHJlYW0sIERhdGFPdXRwdXRTdHJlYW0sIG9yIEhhc2h0YWJsZS4gIEhvd2V2ZXIgCi0gKiBhbGwgb2YgdGhlc2UgYXBwcm9hY2hlcyBmYWlsIHRvIG1lZXQgdGhlIHNlY29uZCByZXF1aXJlbWVudC4KLSAqCi0gKiBNZW1lbnRvIHN1cHBvcnRzIGJpbmFyeSBwZXJzaXN0YW5jZSB3aXRoIGEgdmVyc2lvbiBJRC4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFhNTE1lbWVudG8gaW1wbGVtZW50cyBJTWVtZW50byB7Ci0JcHJpdmF0ZSBEb2N1bWVudCBmYWN0b3J5OwotCXByaXZhdGUgRWxlbWVudCBlbGVtZW50OwotCi0JLyoqCi0JICogQW5zd2VyIGEgbWVtZW50byBmb3IgdGhlIGRvY3VtZW50IGFuZCBlbGVtZW50LiAgRm9yIHNpbXBsaWNpdHkKLQkgKiB5b3Ugc2hvdWxkIHVzZSBjcmVhdGVSZWFkUm9vdCBhbmQgY3JlYXRlV3JpdGVSb290IHRvIGNyZWF0ZSB0aGUgaW5pdGlhbAotCSAqIG1lbWVudG9zIG9uIGEgZG9jdW1lbnQuCi0JICovCi0JcHJpdmF0ZSBYTUxNZW1lbnRvKERvY3VtZW50IGRvYywgRWxlbWVudCBlbCkgewotCQlmYWN0b3J5ID0gZG9jOwotCQllbGVtZW50ID0gZWw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJTWVtZW50byNjcmVhdGVDaGlsZChTdHJpbmcpCi0JICovCi0JcHVibGljIElNZW1lbnRvIGNyZWF0ZUNoaWxkKFN0cmluZyB0eXBlKSB7Ci0JCUVsZW1lbnQgY2hpbGQgPSBmYWN0b3J5LmNyZWF0ZUVsZW1lbnQodHlwZSk7Ci0JCWVsZW1lbnQuYXBwZW5kQ2hpbGQoY2hpbGQpOwotCQlyZXR1cm4gbmV3IFhNTE1lbWVudG8oZmFjdG9yeSwgY2hpbGQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSU1lbWVudG8jY3JlYXRlQ2hpbGQoU3RyaW5nLCBTdHJpbmcpCi0JICovCi0JcHVibGljIElNZW1lbnRvIGNyZWF0ZUNoaWxkKFN0cmluZyB0eXBlLCBTdHJpbmcgaWQpIHsKLQkJRWxlbWVudCBjaGlsZCA9IGZhY3RvcnkuY3JlYXRlRWxlbWVudCh0eXBlKTsKLQkJY2hpbGQuc2V0QXR0cmlidXRlKFRBR19JRCwgaWQpOwotCQllbGVtZW50LmFwcGVuZENoaWxkKGNoaWxkKTsKLQkJcmV0dXJuIG5ldyBYTUxNZW1lbnRvKGZhY3RvcnksIGNoaWxkKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBEb2N1bWVudCBmcm9tIGEgUmVhZGVyIGFuZCBhbnN3ZXIgYSByb290IG1lbWVudG8gZm9yIHJlYWRpbmcgCi0JICogYSBkb2N1bWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFhNTE1lbWVudG8gY3JlYXRlUmVhZFJvb3QoSW5wdXRTdHJlYW0gaW4pIHsKLQkJRG9jdW1lbnQgZG9jdW1lbnQgPSBudWxsOwotCQl0cnkgewotCQkJRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBmYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCQkJRG9jdW1lbnRCdWlsZGVyIHBhcnNlciA9IGZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0JCQlkb2N1bWVudCA9IHBhcnNlci5wYXJzZShuZXcgSW5wdXRTb3VyY2UoaW4pKTsKLQkJCU5vZGUgbm9kZSA9IGRvY3VtZW50LmdldEZpcnN0Q2hpbGQoKTsKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgRWxlbWVudCkKLQkJCQlyZXR1cm4gbmV3IFhNTE1lbWVudG8oZG9jdW1lbnQsIChFbGVtZW50KSBub2RlKTsKLQkJfSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJaW4uY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIEFuc3dlciBhIHJvb3QgbWVtZW50byBmb3Igd3JpdGluZyBhIGRvY3VtZW50LgotCSAqIAotCSAqIEBwYXJhbSB0eXBlCi0JICogQHJldHVybiBhIG1lbWVudG8KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFhNTE1lbWVudG8gY3JlYXRlV3JpdGVSb290KFN0cmluZyB0eXBlKSB7Ci0JCURvY3VtZW50IGRvY3VtZW50OwotCQl0cnkgewotCQkJZG9jdW1lbnQgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3RG9jdW1lbnRCdWlsZGVyKCkubmV3RG9jdW1lbnQoKTsKLQkJCUVsZW1lbnQgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodHlwZSk7Ci0JCQlkb2N1bWVudC5hcHBlbmRDaGlsZChlbGVtZW50KTsKLQkJCXJldHVybiBuZXcgWE1MTWVtZW50byhkb2N1bWVudCwgZWxlbWVudCk7ICAgICAgICAgICAgCi0JCX0gY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IEVycm9yKGUpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgSU1lbWVudG8jZ2V0Q2hpbGQoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJTWVtZW50byBnZXRDaGlsZChTdHJpbmcgdHlwZSkgewotCQkvLyBHZXQgdGhlIG5vZGVzLgotCQlOb2RlTGlzdCBub2RlcyA9IGVsZW1lbnQuZ2V0Q2hpbGROb2RlcygpOwotCQlpbnQgc2l6ZSA9IG5vZGVzLmdldExlbmd0aCgpOwotCQlpZiAoc2l6ZSA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCi0JCS8vIEZpbmQgdGhlIGZpcnN0IG5vZGUgd2hpY2ggaXMgYSBjaGlsZCBvZiB0aGlzIG5vZGUuCi0JCWZvciAoaW50IG5YID0gMDsgblggPCBzaXplOyBuWCArKykgewotCQkJTm9kZSBub2RlID0gbm9kZXMuaXRlbShuWCk7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCQlFbGVtZW50IGVsZW1lbnQyID0gKEVsZW1lbnQpbm9kZTsKLQkJCQlpZiAoZWxlbWVudDIuZ2V0Tm9kZU5hbWUoKS5lcXVhbHModHlwZSkpCi0JCQkJCXJldHVybiBuZXcgWE1MTWVtZW50byhmYWN0b3J5LCBlbGVtZW50Mik7Ci0JCQl9Ci0JCX0KLQkKLQkJLy8gQSBjaGlsZCB3YXMgbm90IGZvdW5kLgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElNZW1lbnRvI2dldENoaWxkcmVuKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgSU1lbWVudG8gW10gZ2V0Q2hpbGRyZW4oU3RyaW5nIHR5cGUpIHsKLQkJLy8gR2V0IHRoZSBub2Rlcy4KLQkJTm9kZUxpc3Qgbm9kZXMgPSBlbGVtZW50LmdldENoaWxkTm9kZXMoKTsKLQkJaW50IHNpemUgPSBub2Rlcy5nZXRMZW5ndGgoKTsKLQkJaWYgKHNpemUgPT0gMCkKLQkJCXJldHVybiBuZXcgSU1lbWVudG9bMF07Ci0JCi0JCS8vIEV4dHJhY3QgZWFjaCBub2RlIHdpdGggZ2l2ZW4gdHlwZS4KLQkJQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KHNpemUpOwotCQlmb3IgKGludCBuWCA9IDA7IG5YIDwgc2l6ZTsgblggKyspIHsKLQkJCU5vZGUgbm9kZSA9IG5vZGVzLml0ZW0oblgpOwotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0JCQkJRWxlbWVudCBlbGVtZW50MiA9IChFbGVtZW50KW5vZGU7Ci0JCQkJaWYgKGVsZW1lbnQyLmdldE5vZGVOYW1lKCkuZXF1YWxzKHR5cGUpKQotCQkJCQlsaXN0LmFkZChlbGVtZW50Mik7Ci0JCQl9Ci0JCX0KLQkKLQkJLy8gQ3JlYXRlIGEgbWVtZW50byBmb3IgZWFjaCBub2RlLgotCQlzaXplID0gbGlzdC5zaXplKCk7Ci0JCUlNZW1lbnRvIFtdIHJlc3VsdHMgPSBuZXcgSU1lbWVudG9bc2l6ZV07Ci0JCWZvciAoaW50IHggPSAwOyB4IDwgc2l6ZTsgeCArKykgewotCQkJcmVzdWx0c1t4XSA9IG5ldyBYTUxNZW1lbnRvKGZhY3RvcnksIChFbGVtZW50KWxpc3QuZ2V0KHgpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0czsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGlucHV0IHN0cmVhbSBmb3Igd3JpdGluZyB0byB0aGUgZGlzayB3aXRoIGEgbG9jYWwgbG9jYWxlLgotCSAqCi0JICogQHJldHVybiB0aGUgaW5wdXQgc3RyZWFtCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCXNhdmUob3V0KTsKLQkJcmV0dXJuIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvdXQudG9CeXRlQXJyYXkoKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJTWVtZW50byNnZXRGbG9hdChTdHJpbmcpCi0JICovCi0JcHVibGljIEZsb2F0IGdldEZsb2F0KFN0cmluZyBrZXkpIHsKLQkJQXR0ciBhdHRyID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVOb2RlKGtleSk7Ci0JCWlmIChhdHRyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgCi0JCVN0cmluZyBzdHJWYWx1ZSA9IGF0dHIuZ2V0VmFsdWUoKTsKLQkJdHJ5IHsKLQkJCXJldHVybiBuZXcgRmxvYXQoc3RyVmFsdWUpOwotCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElNZW1lbnRvI2dldElkKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoVEFHX0lEKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBJTWVtZW50byNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBlbGVtZW50LmdldE5vZGVOYW1lKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJTWVtZW50byNnZXRJbnRlZ2VyKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgSW50ZWdlciBnZXRJbnRlZ2VyKFN0cmluZyBrZXkpIHsKLQkJQXR0ciBhdHRyID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVOb2RlKGtleSk7Ci0JCWlmIChhdHRyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgCi0JCVN0cmluZyBzdHJWYWx1ZSA9IGF0dHIuZ2V0VmFsdWUoKTsKLQkJdHJ5IHsKLQkJCXJldHVybiBuZXcgSW50ZWdlcihzdHJWYWx1ZSk7Ci0JCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgSU1lbWVudG8jZ2V0U3RyaW5nKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCUF0dHIgYXR0ciA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlTm9kZShrZXkpOwotCQlpZiAoYXR0ciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7IAotCQlyZXR1cm4gYXR0ci5nZXRWYWx1ZSgpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIElNZW1lbnRvI2dldE5hbWVzKCkKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXROYW1lcygpIHsKLQkJTmFtZWROb2RlTWFwIG1hcCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlcygpOwotCQlpbnQgc2l6ZSA9IG1hcC5nZXRMZW5ndGgoKTsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJTm9kZSBub2RlID0gbWFwLml0ZW0oaSk7Ci0JCQlTdHJpbmcgbmFtZSA9IG5vZGUuZ2V0Tm9kZU5hbWUoKTsKLQkJCWxpc3QuYWRkKG5hbWUpOwotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCS8qKgotCSAqIExvYWRzIGEgbWVtZW50byBmcm9tIHRoZSBnaXZlbiBmaWxlbmFtZS4KLQkgKgotCSAqIEBwYXJhbSBpbiB0aGUgaW5wdXQgc3RyZWFtCi0JICogQHJldHVybiBhIG1lbWVudG8KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElNZW1lbnRvIGxvYWRNZW1lbnRvKElucHV0U3RyZWFtIGluKSB7Ci0JCXJldHVybiBjcmVhdGVSZWFkUm9vdChpbik7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElNZW1lbnRvCi0JICovCi0JcHJpdmF0ZSB2b2lkIHB1dEVsZW1lbnQoRWxlbWVudCBlbGVtZW50MikgewotCQlOYW1lZE5vZGVNYXAgbm9kZU1hcCA9IGVsZW1lbnQyLmdldEF0dHJpYnV0ZXMoKTsKLQkJaW50IHNpemUgPSBub2RlTWFwLmdldExlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKyl7Ci0JCQlBdHRyIGF0dHIgPSAoQXR0cilub2RlTWFwLml0ZW0oaSk7Ci0JCQlwdXRTdHJpbmcoYXR0ci5nZXROYW1lKCksYXR0ci5nZXRWYWx1ZSgpKTsKLQkJfQotCQkKLQkJTm9kZUxpc3Qgbm9kZXMgPSBlbGVtZW50Mi5nZXRDaGlsZE5vZGVzKCk7Ci0JCXNpemUgPSBub2Rlcy5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpICsrKSB7Ci0JCQlOb2RlIG5vZGUgPSBub2Rlcy5pdGVtKGkpOwotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0JCQkJWE1MTWVtZW50byBjaGlsZCA9IChYTUxNZW1lbnRvKWNyZWF0ZUNoaWxkKG5vZGUuZ2V0Tm9kZU5hbWUoKSk7Ci0JCQkJY2hpbGQucHV0RWxlbWVudCgoRWxlbWVudClub2RlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgSU1lbWVudG8jcHV0RmxvYXQoU3RyaW5nLCBmbG9hdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBwdXRGbG9hdChTdHJpbmcga2V5LCBmbG9hdCBmKSB7Ci0JCWVsZW1lbnQuc2V0QXR0cmlidXRlKGtleSwgU3RyaW5nLnZhbHVlT2YoZikpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSU1lbWVudG8jcHV0SW50ZWdlcihTdHJpbmcsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBwdXRJbnRlZ2VyKFN0cmluZyBrZXksIGludCBuKSB7Ci0JCWVsZW1lbnQuc2V0QXR0cmlidXRlKGtleSwgU3RyaW5nLnZhbHVlT2YobikpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSU1lbWVudG8jcHV0TWVtZW50byhJTWVtZW50bykKLQkgKi8KLQlwdWJsaWMgdm9pZCBwdXRNZW1lbnRvKElNZW1lbnRvIG1lbWVudG8pIHsKLQkJWE1MTWVtZW50byB4bWxNZW1lbnRvID0gKFhNTE1lbWVudG8pIG1lbWVudG87Ci0JCXB1dEVsZW1lbnQoeG1sTWVtZW50by5lbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElNZW1lbnRvI3B1dFN0cmluZyhTdHJpbmcsIFN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBwdXRTdHJpbmcoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQllbGVtZW50LnNldEF0dHJpYnV0ZShrZXksIHZhbHVlKTsKLQl9Ci0JCi0JLyoqCi0JICogU2F2ZSB0aGlzIE1lbWVudG8gdG8gYW4gb3V0cHV0IHN0cmVhbS4KLQkgKiAKLQkgKiBAcGFyYW0gb3MKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZShPdXRwdXRTdHJlYW0gb3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVJlc3VsdCByZXN1bHQgPSBuZXcgU3RyZWFtUmVzdWx0KG9zKTsKLQkJU291cmNlIHNvdXJjZSA9IG5ldyBET01Tb3VyY2UoZmFjdG9yeSk7Ci0JCXRyeSB7Ci0JCQlUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1RyYW5zZm9ybWVyKCk7Ci0JCQl0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLklOREVOVCwgInllcyIpOyAvLyROT04tTkxTLTEkCi0JCQl0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLk1FVEhPRCwgInhtbCIpOyAvLyROT04tTkxTLTEkCi0JCQl0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLkVOQ09ESU5HLCAiVVRGLTgiKTsgLy8kTk9OLU5MUy0xJAotCQkJdHJhbnNmb3JtZXIudHJhbnNmb3JtKHNvdXJjZSwgcmVzdWx0KTsgICAgICAgICAgICAKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IChJT0V4Y2VwdGlvbikgKG5ldyBJT0V4Y2VwdGlvbigpLmluaXRDYXVzZShlKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTYXZlIHRvIHN0cmluZy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzdHJpbmcKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHVibGljIFN0cmluZyBzYXZlVG9TdHJpbmcoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQlzYXZlKG91dCk7Ci0JCXJldHVybiBvdXQudG9TdHJpbmcoIlVURi04Iik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJTWVtZW50byNnZXRCb29sZWFuKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBnZXRCb29sZWFuKFN0cmluZyBrZXkpIHsKLQkJQXR0ciBhdHRyID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVOb2RlKGtleSk7Ci0JCWlmIChhdHRyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nIHN0clZhbHVlID0gYXR0ci5nZXRWYWx1ZSgpOwotCQlpZiAoInRydWUiLmVxdWFsc0lnbm9yZUNhc2Uoc3RyVmFsdWUpKQotCQkJcmV0dXJuIG5ldyBCb29sZWFuKHRydWUpOwotCQkKLQkJcmV0dXJuIG5ldyBCb29sZWFuKGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElNZW1lbnRvI3B1dEJvb2xlYW4oU3RyaW5nLCBib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHB1dEJvb2xlYW4oU3RyaW5nIGtleSwgYm9vbGVhbiB2YWx1ZSkgewotCQllbGVtZW50LnNldEF0dHJpYnV0ZShrZXksIHZhbHVlID8gInRydWUiIDogImZhbHNlIik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL2h0dHAvSFRUUENvbm5lY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL2h0dHAvSFRUUENvbm5lY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI1NzQ4MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9odHRwL0hUVFBDb25uZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi2gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5odHRwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5Nb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwuVHJhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLlJlcXVlc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotLyoqCi0gKiBNYW5hZ2VzIGEgbW9uaXRvciBzZXJ2ZXIgY29ubmVjdGlvbiBiZXR3ZWVuIHR3byBob3N0cy4gVGhpcwotICogY29ubmVjdGlvbiBtYXkgc3Bhd24gb25lIG9yIG1vcmUgVENQL0lQIHJlcXVlc3RzIHRvIGJlIGRpc3BsYXllZAotICogaW4gdGhlIG1vbml0b3Igc2VydmVyIHZpZXcuCi0gKi8KLXB1YmxpYyBjbGFzcyBIVFRQQ29ubmVjdGlvbiB7Ci0JcHJvdGVjdGVkIElNb25pdG9yIG1vbml0b3I7Ci0KLQlwcm90ZWN0ZWQgaW50IHJlcSA9IC0xOwotCXByb3RlY3RlZCBpbnQgcmVzcCA9IC0xOwotCi0JcHJvdGVjdGVkIExpc3QgcmVxdWVzdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkvKioKLQkgKiBIVFRQQ29ubmVjdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBtb25pdG9yIGEgbW9uaXRvcgotCSAqLwotCXB1YmxpYyBIVFRQQ29ubmVjdGlvbihJTW9uaXRvciBtb25pdG9yKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMubW9uaXRvciA9IG1vbml0b3I7Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLlBBUlNJTkcsICJUQ1AvSVAgbW9uaXRvciBjb25uZWN0aW9uIG9wZW5lZCAiICsgbW9uaXRvcik7Ci0JfQotCi0JLyoqCi0JICogQWRkIGEgcmVxdWVzdC4KLQkgKiAKLQkgKiBAcGFyYW0gYiB0aGUgcmVxdWVzdCBkYXRhCi0JICogQHBhcmFtIGlzTmV3IHRydWUgaWYgbmV3Ci0JICovCi0JcHVibGljIHZvaWQgYWRkUmVxdWVzdChieXRlW10gYiwgYm9vbGVhbiBpc05ldykgewotCQlpZiAoaXNOZXcpCi0JCQlyZXEgKys7Ci0JCUhUVFBSZXF1ZXN0IHJlcXVlc3QgPSAoSFRUUFJlcXVlc3QpIGdldFJlcXVlc3RSZXNwb25zZShyZXEpOwotCQlyZXF1ZXN0LmFkZFRvUmVxdWVzdChiKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgYSByZXNwb25zZS4KLQkgKiAKLQkgKiBAcGFyYW0gYiB0aGUgcmVzcG9uc2UgZGF0YQotCSAqIEBwYXJhbSBpc05ldyB0cnVlIGlmIG5ldwotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFJlc3BvbnNlKGJ5dGVbXSBiLCBib29sZWFuIGlzTmV3KSB7Ci0JCWlmIChpc05ldykKLQkJCXJlc3AgKys7Ci0JCUhUVFBSZXF1ZXN0IHJlcXVlc3QgPSAoSFRUUFJlcXVlc3QpIGdldFJlcXVlc3RSZXNwb25zZShyZXNwKTsKLQkJcmVxdWVzdC5hZGRUb1Jlc3BvbnNlKGIpOwotCX0KLQotCS8qKgotCSAqIEFkZCBhIHByb3BlcnR5LgotCSAqIAotCSAqIEBwYXJhbSBrZXkKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQcm9wZXJ0eShTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUpIHsKLQkJUmVxdWVzdCByZXF1ZXN0ID0gZ2V0UmVxdWVzdFJlc3BvbnNlKHJlcSk7Ci0JCXJlcXVlc3Quc2V0UHJvcGVydHkoa2V5LCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSByZXF1ZXN0LgotCSAqIAotCSAqIEBwYXJhbSBpc1JlcXVlc3QKLQkgKiBAcmV0dXJuIHRoZSByZXF1ZXN0Ci0JICovCi0JcHVibGljIFJlcXVlc3QgZ2V0UmVxdWVzdFJlc3BvbnNlKGJvb2xlYW4gaXNSZXF1ZXN0KSB7Ci0JCWlmIChpc1JlcXVlc3QpCi0JCQlyZXR1cm4gZ2V0UmVxdWVzdFJlc3BvbnNlKHJlcSk7Ci0JCQotCQlyZXR1cm4gZ2V0UmVxdWVzdFJlc3BvbnNlKHJlc3ApOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBSZXF1ZXN0IGdldFJlcXVlc3RSZXNwb25zZShpbnQgaSkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCXdoaWxlIChpID49IHJlcXVlc3RzLnNpemUoKSkgewotCQkJCVJlcXVlc3QgcmVxdWVzdCA9IG5ldyBIVFRQUmVxdWVzdCgoTW9uaXRvcikgbW9uaXRvciwgbW9uaXRvci5nZXRMb2NhbFBvcnQoKSwgbW9uaXRvci5nZXRSZW1vdGVIb3N0KCksIG1vbml0b3IuZ2V0UmVtb3RlUG9ydCgpKTsKLQkJCQlyZXF1ZXN0cy5hZGQocmVxdWVzdCk7Ci0JCQkJcmV0dXJuIHJlcXVlc3Q7Ci0JCQl9Ci0JCQlyZXR1cm4gKFJlcXVlc3QpIHJlcXVlc3RzLmdldChpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdGl0bGUuCi0JICogCi0JICogQHBhcmFtIHRpdGxlIHRoZSB0aXRsZQotCSAqIEBwYXJhbSBpc05ldyBib29sZWFuCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoU3RyaW5nIHRpdGxlLCBib29sZWFuIGlzTmV3KSB7Ci0JCWlmIChpc05ldykKLQkJCXJlcSArKzsKLQkJSFRUUFJlcXVlc3QgcmVxdWVzdCA9IChIVFRQUmVxdWVzdCkgZ2V0UmVxdWVzdFJlc3BvbnNlKHJlcSk7Ci0JCXJlcXVlc3Quc2V0TmFtZSh0aXRsZSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL2h0dHAvSFRUUFByb3RvY29sQWRhcHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvaHR0cC9IVFRQUHJvdG9jb2xBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5NjhlNzAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvaHR0cC9IVFRQUHJvdG9jb2xBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSCgKgotICogQ29udHJpYnV0b3JzOgotICogICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5odHRwOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5Tb2NrZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwuQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLlByb3RvY29sQWRhcHRlckRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vbml0b3I7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgSFRUUFByb3RvY29sQWRhcHRlciBleHRlbmRzIFByb3RvY29sQWRhcHRlckRlbGVnYXRlIHsKLQlwcm90ZWN0ZWQgTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkvKioKLQkgKiBAc2VlIFByb3RvY29sQWRhcHRlckRlbGVnYXRlI2Nvbm5lY3QoSU1vbml0b3IsIFNvY2tldCwgU29ja2V0KQotCSAqLwotCXB1YmxpYyB2b2lkIGNvbm5lY3QoSU1vbml0b3IgbW9uaXRvciwgU29ja2V0IGluLCBTb2NrZXQgb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlDb25uZWN0aW9uIGNvbm4yID0gbmV3IENvbm5lY3Rpb24oaW4sIG91dCk7Ci0JCW1hcC5wdXQobW9uaXRvciwgY29ubjIpOwotCQlIVFRQQ29ubmVjdGlvbiBjb25uID0gbmV3IEhUVFBDb25uZWN0aW9uKG1vbml0b3IpOwotCQlIVFRQVGhyZWFkIHJlcXVlc3QgPSBuZXcgSFRUUFRocmVhZChjb25uMiwgaW4uZ2V0SW5wdXRTdHJlYW0oKSwgb3V0LmdldE91dHB1dFN0cmVhbSgpLCBjb25uLCB0cnVlLCBtb25pdG9yLmdldFJlbW90ZUhvc3QoKSwgbW9uaXRvci5nZXRSZW1vdGVQb3J0KCkpOwotCQlIVFRQVGhyZWFkIHJlc3BvbnNlID0gbmV3IEhUVFBUaHJlYWQoY29ubjIsIG91dC5nZXRJbnB1dFN0cmVhbSgpLCBpbi5nZXRPdXRwdXRTdHJlYW0oKSwgY29ubiwgZmFsc2UsICJsb2NhbGhvc3QiLCBtb25pdG9yLmdldExvY2FsUG9ydCgpLCByZXF1ZXN0KTsKLQkJcmVxdWVzdC5zdGFydCgpOwotCQlyZXNwb25zZS5zdGFydCgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgUHJvdG9jb2xBZGFwdGVyRGVsZWdhdGUjZGlzY29ubmVjdChJTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNjb25uZWN0KElNb25pdG9yIG1vbml0b3IpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlDb25uZWN0aW9uIGNvbm4gPSAoQ29ubmVjdGlvbikgbWFwLmdldChtb25pdG9yKTsKLQkJCWlmIChjb25uICE9IG51bGwpCi0JCQkJY29ubi5jbG9zZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvaHR0cC9IVFRQUmVxdWVzdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvaHR0cC9IVFRQUmVxdWVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTRmMzRmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL2h0dHAvSFRUUFJlcXVlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5odHRwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5JUHJvdG9jb2xBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwuTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLlJlcXVlc3Q7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgSFRUUFJlcXVlc3QgZXh0ZW5kcyBSZXF1ZXN0IHsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQX1JFUVVFU1RfSEVBREVSID0gInJlcXVlc3QtaGVhZGVyIjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQX1JFU1BPTlNFX0hFQURFUiA9ICJyZXNwb25zZS1oZWFkZXIiOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUF9SRVFVRVNUX0JPRFkgPSAicmVxdWVzdC1ib2R5IjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQX1JFU1BPTlNFX0JPRFkgPSAicmVzcG9uc2UtYm9keSI7Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBieXRlW10gRU1QVFkgPSBuZXcgYnl0ZVswXTsKLQotCS8qKgotCSAqIENyZWF0ZSBhbiBIVFRQUmVxdWVzdC4KLQkgKiAKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqIEBwYXJhbSBsb2NhbFBvcnQKLQkgKiBAcGFyYW0gcmVtb3RlSG9zdAotCSAqIEBwYXJhbSByZW1vdGVQb3J0Ci0JICovCi0JcHVibGljIEhUVFBSZXF1ZXN0KE1vbml0b3IgbW9uaXRvciwgaW50IGxvY2FsUG9ydCwgU3RyaW5nIHJlbW90ZUhvc3QsIGludCByZW1vdGVQb3J0KSB7Ci0JCXN1cGVyKG1vbml0b3IsIElQcm90b2NvbEFkYXB0ZXIuSFRUUF9QUk9UT0NPTF9JRCwgbG9jYWxQb3J0LCByZW1vdGVIb3N0LCByZW1vdGVQb3J0KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFJlcXVlc3QjZ2V0UmVxdWVzdChpbnQpCi0JICovCi0JcHVibGljIGJ5dGVbXSBnZXRSZXF1ZXN0KGludCB0eXBlMikgewotCQlpZiAodHlwZTIgPT0gQUxMKQotCQkJcmV0dXJuIHJlcXVlc3Q7Ci0JCWVsc2UgaWYgKHR5cGUyID09IFRSQU5TUE9SVCkKLQkJCXJldHVybiBnZXRSZXF1ZXN0SGVhZGVyKCk7Ci0JCWVsc2UKLQkJCXJldHVybiBnZXRSZXF1ZXN0Q29udGVudCgpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIFJlcXVlc3QjZ2V0UmVzcG9uc2UoaW50KQotCSAqLwotCXB1YmxpYyBieXRlW10gZ2V0UmVzcG9uc2UoaW50IHR5cGUyKSB7Ci0JCWlmICh0eXBlMiA9PSBBTEwpCi0JCQlyZXR1cm4gcmVzcG9uc2U7Ci0JCWVsc2UgaWYgKHR5cGUyID09IFRSQU5TUE9SVCkKLQkJCXJldHVybiBnZXRSZXNwb25zZUhlYWRlcigpOwotCQllbHNlCi0JCQlyZXR1cm4gZ2V0UmVzcG9uc2VDb250ZW50KCk7Ci0JfQotCQotCXByb3RlY3RlZCBieXRlW10gZ2V0UmVxdWVzdEhlYWRlcigpIHsKLQkJT2JqZWN0IG9iaiA9IGdldFByb3BlcnR5KEhUVFBfUkVRVUVTVF9IRUFERVIpOwotCQlpZiAob2JqID09IG51bGwgfHwgIShvYmogaW5zdGFuY2VvZiBieXRlW10pKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoYnl0ZVtdKSBvYmo7Ci0JfQotCQotCXByb3RlY3RlZCBieXRlW10gZ2V0UmVxdWVzdENvbnRlbnQoKSB7Ci0JCU9iamVjdCBvYmogPSBnZXRQcm9wZXJ0eShIVFRQX1JFUVVFU1RfQk9EWSk7Ci0JCWlmIChvYmogPT0gbnVsbCB8fCAhKG9iaiBpbnN0YW5jZW9mIGJ5dGVbXSkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChieXRlW10pIG9iajsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJ5dGVbXSBnZXRSZXNwb25zZUhlYWRlcigpIHsKLQkJT2JqZWN0IG9iaiA9IGdldFByb3BlcnR5KEhUVFBfUkVTUE9OU0VfSEVBREVSKTsKLQkJaWYgKG9iaiA9PSBudWxsIHx8ICEob2JqIGluc3RhbmNlb2YgYnl0ZVtdKSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKGJ5dGVbXSkgb2JqOwotCX0KLQkKLQlwcm90ZWN0ZWQgYnl0ZVtdIGdldFJlc3BvbnNlQ29udGVudCgpIHsKLQkJT2JqZWN0IG9iaiA9IGdldFByb3BlcnR5KEhUVFBfUkVTUE9OU0VfQk9EWSk7Ci0JCWlmIChvYmogPT0gbnVsbCB8fCAhKG9iaiBpbnN0YW5jZW9mIGJ5dGVbXSkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChieXRlW10pIG9iajsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0TmFtZShTdHJpbmcgbikgewotCQlzdXBlci5zZXROYW1lKG4pOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9odHRwL0hUVFBUaHJlYWQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL2h0dHAvSFRUUFRocmVhZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjY1MGQxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL2h0dHAvSFRUUFRocmVhZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5odHRwOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwuQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLlRyYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuUmVxdWVzdDsKLS8qKgotICogTW9uaXRvciBzZXJ2ZXIgSS9PIHRocmVhZC4KLSAqLwotcHVibGljIGNsYXNzIEhUVFBUaHJlYWQgZXh0ZW5kcyBUaHJlYWQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCVUZGRVIgPSAyMDQ4OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgQ1IgPSAoYnl0ZSkgJ1xyJzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIExGID0gKGJ5dGUpICdcbic7Ci0JcHJvdGVjdGVkIHN0YXRpYyBpbnQgdGhyZWFkQ291bnQgPSAwOwotCi0JcHJpdmF0ZSBieXRlW10gcmVhZEJ1ZmZlciA9IG5ldyBieXRlW0JVRkZFUl07Ci0KLQkvLyBidWZmZXIgYW5kIGluZGV4Ci0JcHJvdGVjdGVkIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVswXTsKLQlwcm90ZWN0ZWQgaW50IGJ1ZmZlckluZGV4ID0gMDsKLQotCXByb3RlY3RlZCBJbnB1dFN0cmVhbSBpbjsKLQlwcm90ZWN0ZWQgT3V0cHV0U3RyZWFtIG91dDsKLQlwcm90ZWN0ZWQgSFRUUENvbm5lY3Rpb24gY29ubjsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1JlcXVlc3Q7Ci0JcHJvdGVjdGVkIENvbm5lY3Rpb24gY29ubjI7Ci0JCi0JcHJvdGVjdGVkIEhUVFBUaHJlYWQgcmVxdWVzdDsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1dhaXRpbmc7Ci0JCi0JLy8gdXNlciB0byB0cmFuc2xhdGUgdGhlIEhvc3Q6IGhlYWRlcgotCXByb3RlY3RlZCBTdHJpbmcgaG9zdDsKLQlwcm90ZWN0ZWQgaW50IHBvcnQ7Ci0KLQlwcm90ZWN0ZWQgaW50IGNvbnRlbnRMZW5ndGggPSAtMTsKLQlwcm90ZWN0ZWQgYnl0ZSB0cmFuc2ZlckVuY29kaW5nID0gLTE7Ci0JcHJvdGVjdGVkIFN0cmluZyByZXNwb25zZVR5cGUgPSBudWxsOwotCXByb3RlY3RlZCBib29sZWFuIGNvbm5lY3Rpb25LZWVwQWxpdmUgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBjb25uZWN0aW9uQ2xvc2UgPSBmYWxzZTsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nW10gRU5DT0RJTkdfU1RSSU5HID0gbmV3IFN0cmluZ1tdIHsKLQkJImNodW5rZWQiLCAiaWRlbnRpdHkiLCAiZ3ppcCIsICJjb21wcmVzc2VkIiwgImRlZmxhdGUifTsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYnl0ZSBFTkNPRElOR19DSFVOS0VEID0gMDsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJ5dGUgRU5DT0RJTkdfSURFTlRJVFkgPSAxOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYnl0ZSBFTkNPRElOR19HWklQID0gMjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJ5dGUgRU5DT0RJTkdfQ09NUFJFU1NFRCA9IDM7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBieXRlIEVOQ09ESU5HX0RFRkxBVEUgPSA0OwotCi0vKiBjaGFuZ2U6Ci1SZWZlcmVyOiBodHRwOi8vbG9jYWxob3N0OjgwODEvaW5kZXguaHRtbAotSG9zdDogbG9jYWxob3N0OjgwODEKLSovCi0vKiBUaGUgQ29ubmVjdGlvbiBoZWFkZXIgaGFzIHRoZSBmb2xsb3dpbmcgZ3JhbW1hcjoKLQotCSAgIENvbm5lY3Rpb24gPSAiQ29ubmVjdGlvbiIgIjoiIDEjKGNvbm5lY3Rpb24tdG9rZW4pCi0JICAgY29ubmVjdGlvbi10b2tlbiAgPSB0b2tlbgotCi0gICBIVFRQLzEuMSBwcm94aWVzIE1VU1QgcGFyc2UgdGhlIENvbm5lY3Rpb24gaGVhZGVyIGZpZWxkIGJlZm9yZSBhCi0gICBtZXNzYWdlIGlzIGZvcndhcmRlZCBhbmQsIGZvciBlYWNoIGNvbm5lY3Rpb24tdG9rZW4gaW4gdGhpcyBmaWVsZCwKLSAgIHJlbW92ZSBhbnkgaGVhZGVyIGZpZWxkKHMpIGZyb20gdGhlIG1lc3NhZ2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIHRoZQotICAgY29ubmVjdGlvbi10b2tlbi4gKi8KLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBIVFRQIHRocmVhZC4KLQkgKiAKLQkgKiBAcGFyYW0gY29ubjIKLQkgKiBAcGFyYW0gaW4KLQkgKiBAcGFyYW0gb3V0Ci0JICogQHBhcmFtIGNvbm4KLQkgKiBAcGFyYW0gaXNSZXF1ZXN0Ci0JICogQHBhcmFtIGhvc3QKLQkgKiBAcGFyYW0gcG9ydAotCSAqLwotCXB1YmxpYyBIVFRQVGhyZWFkKENvbm5lY3Rpb24gY29ubjIsIElucHV0U3RyZWFtIGluLCBPdXRwdXRTdHJlYW0gb3V0LCBIVFRQQ29ubmVjdGlvbiBjb25uLCBib29sZWFuIGlzUmVxdWVzdCwgU3RyaW5nIGhvc3QsIGludCBwb3J0KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuY29ubjIgPSBjb25uMjsKLQkJdGhpcy5pbiA9IGluOwotCQl0aGlzLm91dCA9IG91dDsKLQkJdGhpcy5jb25uID0gY29ubjsKLQkJdGhpcy5pc1JlcXVlc3QgPSBpc1JlcXVlc3Q7Ci0JCXRoaXMuaG9zdCA9IGhvc3Q7Ci0JCXRoaXMucG9ydCA9IHBvcnQ7Ci0JCi0JCXNldE5hbWUoIkhUVFAgKCIgKyBob3N0ICsgIjoiICsgcG9ydCArICIpICIgKyAoaXNSZXF1ZXN0ID8gIlJFUVVFU1QiIDogIlJFU1BPTlNFIikgKyAiICIgKyAodGhyZWFkQ291bnQrKykpOwotCQlzZXRQcmlvcml0eShUaHJlYWQuTk9STV9QUklPUklUWSArIDEpOwotCQlzZXREYWVtb24odHJ1ZSk7Ci0JCQotCQlUcmFjZS50cmFjZShUcmFjZS5QQVJTSU5HLCAiU3RhcnRlZDogIiArIHRoaXMpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgSFRUUCB0aHJlYWQuCi0JICogCi0JICogQHBhcmFtIGNvbm4yCi0JICogQHBhcmFtIGluCi0JICogQHBhcmFtIG91dAotCSAqIEBwYXJhbSBjb25uCi0JICogQHBhcmFtIGlzUmVxdWVzdAotCSAqIEBwYXJhbSBob3N0Ci0JICogQHBhcmFtIHBvcnQKLQkgKiBAcGFyYW0gcmVxdWVzdAotCSAqLwotCXB1YmxpYyBIVFRQVGhyZWFkKENvbm5lY3Rpb24gY29ubjIsIElucHV0U3RyZWFtIGluLCBPdXRwdXRTdHJlYW0gb3V0LCBIVFRQQ29ubmVjdGlvbiBjb25uLCBib29sZWFuIGlzUmVxdWVzdCwgU3RyaW5nIGhvc3QsIGludCBwb3J0LCBIVFRQVGhyZWFkIHJlcXVlc3QpIHsKLQkJdGhpcyhjb25uMiwgaW4sIG91dCwgY29ubiwgaXNSZXF1ZXN0LCBob3N0LCBwb3J0KTsKLQkJCi0JCXRoaXMucmVxdWVzdCA9IHJlcXVlc3Q7Ci0JfQotCi0JLyoqCi0JICogQWRkIGEgbGluZSBmZWVkIHRvIHRoZSBlbmQgb2YgdGhlIGJ5dGUgYXJyYXkuCi0JICogQHJldHVybiBieXRlW10KLQkgKiBAcGFyYW0gYiBieXRlW10KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGJ5dGVbXSBjb252ZXJ0KGJ5dGVbXSBiKSB7Ci0JCWlmIChiID09IG51bGwgfHwgYi5sZW5ndGggPT0gMCkKLQkJCXJldHVybiBiOwotCQotCQlpbnQgc2l6ZSA9IGIubGVuZ3RoOwotCQlieXRlW10geCA9IG5ldyBieXRlW3NpemUgKyAyXTsKLQkJU3lzdGVtLmFycmF5Y29weShiLCAwLCB4LCAwLCBzaXplKTsKLQkJeFtzaXplXSA9IChieXRlKSAnXHInOyAgICAgLy8gQ1IKLQkJeFtzaXplICsgMV0gPSAoYnl0ZSkgJ1xuJzsgLy8gTEYKLQkJcmV0dXJuIHg7Ci0JfQotCi0JLyoqCi0JICogUmVhZCBtb3JlIGRhdGEgaW50byB0aGUgYnVmZmVyLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpbGxCdWZmZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpbnQgbiA9IGluLnJlYWQocmVhZEJ1ZmZlcik7Ci0JCi0JCWlmIChuIDw9IDApCi0JCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkVuZCBvZiBpbnB1dCIpOwotCQotCQkvLyBhZGQgdG8gZnVsbCBidWZmZXIKLQkJaW50IGxlbiA9IGJ1ZmZlci5sZW5ndGggLSBidWZmZXJJbmRleDsKLQkJaWYgKGxlbiA8IDApCi0JCQlsZW4gPSAwOwotCQlieXRlW10geCA9IG5ldyBieXRlW24gKyBsZW5dOwotCQlTeXN0ZW0uYXJyYXljb3B5KGJ1ZmZlciwgYnVmZmVySW5kZXgsIHgsIDAsIGxlbik7Ci0JCVN5c3RlbS5hcnJheWNvcHkocmVhZEJ1ZmZlciwgMCwgeCwgbGVuLCBuKTsKLQkJYnVmZmVySW5kZXggPSAwOwotCQlidWZmZXIgPSB4OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpcnN0IGxvY2F0aW9uIG9mIGEgQ1JMRi4KLQkgKgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHJvdGVjdGVkIGludCBnZXRGaXJzdENSTEYoKSB7Ci0JCWludCBzaXplID0gYnVmZmVyLmxlbmd0aDsKLQkJaW50IGkgPSBidWZmZXJJbmRleCArIDE7Ci0JCXdoaWxlIChpIDwgc2l6ZSkgewotCQkJaWYgKGJ1ZmZlcltpIC0gMV0gPT0gQ1IgJiYgYnVmZmVyW2ldID09IExGKQotCQkJCXJldHVybiBpOwotCQkJaSsrOwotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBPdXRwdXQgdGhlIGdpdmVuIGJ5dGVzLgotCSAqIEBwYXJhbSBiIGJ5dGVbXQotCSAqLwotCXByb3RlY3RlZCB2b2lkIG91dHB1dEJ5dGVzKGJ5dGVbXSBiLCBib29sZWFuIGlzTmV3KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlvdXQud3JpdGUoYik7Ci0JCWlmIChpc1JlcXVlc3QpCi0JCQljb25uLmFkZFJlcXVlc3QoYiwgaXNOZXcpOwotCQllbHNlCi0JCQljb25uLmFkZFJlc3BvbnNlKGIsIGlzTmV3KTsKLQl9Ci0KLQkvKioKLQkgKiBQYXJzZSB0aGUgSFRUUCBib2R5LgotCSAqIAotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBwYXJzZUJvZHkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlUcmFjZS50cmFjZShUcmFjZS5QQVJTSU5HLCAiUGFyc2luZyBib2R5IGZvcjogIiArIHRoaXMpOwotCQkKLQkJaWYgKHJlc3BvbnNlVHlwZSAhPSBudWxsICYmICgiMjA0Ii5lcXVhbHMocmVzcG9uc2VUeXBlKSB8fCAiMzA0Ii5lcXVhbHMocmVzcG9uc2VUeXBlKSkpIHsKLQkJCXNldEhUVFBCb2R5KG5ldyBieXRlWzBdKTsKLQkJCXJldHVybjsKLQkJfQotCQotCQlpZiAoaXNSZXF1ZXN0KSB7Ci0JCQlpZiAoY29udGVudExlbmd0aCAhPSAtMSkgewotCQkJCWJ5dGVbXSBiID0gcmVhZEJ5dGVzKGNvbnRlbnRMZW5ndGgpOwotCQkJCW91dC53cml0ZShiKTsKLQkJCQljb25uLmFkZFJlcXVlc3QoYiwgZmFsc2UpOwotCQkJCXNldEhUVFBCb2R5KGIpOwotCQkJfSBlbHNlIGlmICh0cmFuc2ZlckVuY29kaW5nICE9IC0xICYmIHRyYW5zZmVyRW5jb2RpbmcgIT0gRU5DT0RJTkdfSURFTlRJVFkpIHsKLQkJCQlwYXJzZUNodW5rKCk7Ci0JCQl9Ci0JCQkKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlBBUlNJTkcsICJEb25lIHBhcnNpbmcgcmVxdWVzdCBib2R5IGZvcjogIiArIHRoaXMpOwotCQkJcmV0dXJuOwotCQl9Ci0JCi0JCS8vIGp1c3QgcmV0dXJuIGJvZHkgZm9yIEhUVFAgMS4wIHJlc3BvbnNlcwotCQlpZiAoIWlzUmVxdWVzdCAmJiAhY29ubmVjdGlvbktlZXBBbGl2ZSAmJiBjb250ZW50TGVuZ3RoID09IC0xICYmIHRyYW5zZmVyRW5jb2RpbmcgPT0gLTEpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlBBUlNJTkcsICJBc3N1bWluZyBIVFRQIDEuMCBmb3I6ICIgKyB0aGlzKTsKLQkJCWludCBuID0gYnVmZmVyLmxlbmd0aCAtIGJ1ZmZlckluZGV4OwotCQkJYnl0ZVtdIGIgPSByZWFkQnl0ZXMobik7Ci0JCQlieXRlW10gYm9keSA9IG5ldyBieXRlWzBdOwotCQkJd2hpbGUgKG4gPj0gMCkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlBBUlNJTkcsICJCeXRlcyByZWFkOiAiICsgbiArICIgIiArIHRoaXMpOwotCQkJCWlmIChiICE9IG51bGwgJiYgbiA+IDApIHsKLQkJCQkJYnl0ZVtdIHggPSBudWxsOwotCQkJCQlpZiAobiA9PSBiLmxlbmd0aCkKLQkJCQkJCXggPSBiOwotCQkJCQllbHNlIHsKLQkJCQkJCXggPSBuZXcgYnl0ZVtuXTsKLQkJCQkJCVN5c3RlbS5hcnJheWNvcHkoYiwgMCwgeCwgMCwgbik7Ci0JCQkJCX0KLQkJCQkJb3V0cHV0Qnl0ZXMoeCwgZmFsc2UpOwotCQkJCQkKLQkJCQkJLy8gY29weSB0byBIVFRQIGJvZHkKLQkJCQkJYnl0ZVtdIHRlbXAgPSBuZXcgYnl0ZVtib2R5Lmxlbmd0aCArIHgubGVuZ3RoXTsKLQkJCQkJU3lzdGVtLmFycmF5Y29weShib2R5LCAwLCB0ZW1wLCAwLCBib2R5Lmxlbmd0aCk7Ci0JCQkJCVN5c3RlbS5hcnJheWNvcHkoeCwgMCwgdGVtcCwgYm9keS5sZW5ndGgsIHgubGVuZ3RoKTsKLQkJCQkJYm9keSA9IHRlbXA7Ci0JCQkJfQotCQkJCWlmIChiLmxlbmd0aCA8IEJVRkZFUikKLQkJCQkJYiA9IG5ldyBieXRlW0JVRkZFUl07Ci0JCQkJbiA9IGluLnJlYWQoYik7Ci0JCQkJVGhyZWFkLnlpZWxkKCk7Ci0JCQl9Ci0JCQlvdXQuZmx1c2goKTsKLQkJCXNldEhUVFBCb2R5KGJvZHkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCi0JCS8vIHNwZWMgNC40LjEKLQkJaWYgKHJlc3BvbnNlVHlwZSAhPSBudWxsICYmIHJlc3BvbnNlVHlwZS5zdGFydHNXaXRoKCIxIikpIHsKLQkJCXNldEhUVFBCb2R5KG5ldyBieXRlWzBdKTsKLQkJCXJldHVybjsKLQkJfQotCQotCQkvLyBzcGVjIDQuNC4yCi0JCWlmICh0cmFuc2ZlckVuY29kaW5nICE9IC0xICYmIHRyYW5zZmVyRW5jb2RpbmcgIT0gRU5DT0RJTkdfSURFTlRJVFkpIHsKLQkJCXBhcnNlQ2h1bmsoKTsKLQkJCXJldHVybjsKLQkJfQotCQotCQkvLyBzcGVjIDQuNC4zCi0JCWlmIChjb250ZW50TGVuZ3RoICE9IC0xKSB7Ci0JCQlieXRlW10gYiA9IHJlYWRCeXRlcyhjb250ZW50TGVuZ3RoKTsKLQkJCW91dC53cml0ZShiKTsKLQkJCWlmIChpc1JlcXVlc3QpCi0JCQkJY29ubi5hZGRSZXF1ZXN0KGIsIGZhbHNlKTsKLQkJCWVsc2UKLQkJCQljb25uLmFkZFJlc3BvbnNlKGIsIGZhbHNlKTsKLQkJCXNldEhUVFBCb2R5KGIpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQkvLyBzcGVjIDQuNC40ICg/KQotCQkKLQkJVHJhY2UudHJhY2UoVHJhY2UuUEFSU0lORywgIlVua25vd24gYm9keSBmb3I6ICIgKyB0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBQYXJzZSBhbiBIVFRQIGNodW5rLgotCSAqIAotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBwYXJzZUNodW5rKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJVHJhY2UudHJhY2UoVHJhY2UuUEFSU0lORywgIlBhcnNpbmcgY2h1bmsgZm9yOiAiICsgdGhpcyk7Ci0JCWJvb2xlYW4gZG9uZSA9IGZhbHNlOwotCQlieXRlW10gYm9keSA9IG5ldyBieXRlWzBdOwotCQotCQl3aGlsZSAoIWRvbmUpIHsKLQkJCS8vIHJlYWQgY2h1bmsgc2l6ZQotCQkJYnl0ZVtdIGIgPSByZWFkTGluZSgpOwotCQotCQkJU3RyaW5nIHMgPSBuZXcgU3RyaW5nKGIpOwotCQkJaW50IGluZGV4ID0gcy5pbmRleE9mKCIgIik7Ci0JCQlpbnQgbGVuZ3RoID0gLTE7Ci0JCQl0cnkgewotCQkJCWlmIChpbmRleCA+IDApCi0JCQkJCXMgPSBzLnN1YnN0cmluZygwLCBpbmRleCk7Ci0JCQkJbGVuZ3RoID0gSW50ZWdlci5wYXJzZUludChzLnRyaW0oKSwgMTYpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5QQVJTSU5HLCAiRXJyb3IgY2h1bmsgZm9yOiAiICsgdGhpcywgZSk7Ci0JCQl9Ci0JCi0JCQkvLyBvdXRwdXQgYnl0ZXMKLQkJCW91dHB1dEJ5dGVzKGIsIGZhbHNlKTsKLQkKLQkJCWlmIChsZW5ndGggPD0gMCkKLQkJCQlkb25lID0gdHJ1ZTsKLQkJCWVsc2UgewotCQkJCS8vIHJlYWQgYW5kIG91dHB1dCBjaHVuayBkYXRhIHBsdXMgQ1JMRgotCQkJCWIgPSByZWFkQnl0ZXMobGVuZ3RoICsgMik7Ci0JCQkJb3V0cHV0Qnl0ZXMoYiwgZmFsc2UpOwotCQkJCQotCQkJCS8vIGNvcHkgdG8gSFRUUCBib2R5Ci0JCQkJYnl0ZVtdIHRlbXAgPSBuZXcgYnl0ZVtib2R5Lmxlbmd0aCArIGIubGVuZ3RoIC0gMl07Ci0JCQkJU3lzdGVtLmFycmF5Y29weShib2R5LCAwLCB0ZW1wLCAwLCBib2R5Lmxlbmd0aCk7Ci0JCQkJU3lzdGVtLmFycmF5Y29weShiLCAwLCB0ZW1wLCBib2R5Lmxlbmd0aCwgYi5sZW5ndGggLSAyKTsKLQkJCQlib2R5ID0gdGVtcDsKLQkJCX0KLQkJfQotCQotCQkvLyByZWFkIHRyYWlsZXIKLQkJYnl0ZVtdIGIgPSByZWFkTGluZSgpOwotCQl3aGlsZSAoYi5sZW5ndGggPiAyKSB7Ci0JCQlvdXRwdXRCeXRlcyhiLCBmYWxzZSk7Ci0JCQliID0gcmVhZExpbmUoKTsKLQkJfQotCQotCQlvdXRwdXRCeXRlcyhiLCBmYWxzZSk7Ci0JCXNldEhUVFBCb2R5KGJvZHkpOwotCX0KLQotCS8qKgotCSAqIFBhcnNlIGFuIEhUVFAgaGVhZGVyLgotCSAqIAotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBwYXJzZUhlYWRlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLlBBUlNJTkcsICJQYXJzaW5nIGhlYWRlciBmb3I6ICIgKyB0aGlzKTsKLQkKLQkJLy8gcmVhZCB1bnRpbCBmaXJzdCBibGFuayBsaW5lCi0JCWJvb2xlYW4gaXNGaXJzdExpbmUgPSB0cnVlOwotCQlib29sZWFuIGlzTmV3ID0gdHJ1ZTsKLQkKLQkJYnl0ZVtdIGIgPSByZWFkTGluZSgpOwotCQl3aGlsZSAoYi5sZW5ndGggPiA1KSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5QQVJTSU5HLCAiUGFyc2luZyBoZWFkZXIgbGluZTogJyIgKyBuZXcgU3RyaW5nKGIpICsgIiciKTsKLQkJCQotCQkJaWYgKGlzRmlyc3RMaW5lKSB7Ci0JCQkJU3RyaW5nIHMgPSBuZXcgU3RyaW5nKGIpOwotCQkJCWlmIChpc1JlcXVlc3QpIHsKLQkJCQkJc2V0TGFiZWwocyk7Ci0JCQkJCWlzTmV3ID0gZmFsc2U7Ci0JCQkJfQotCQotCQkJCWlmICghaXNSZXF1ZXN0KSB7Ci0JCQkJCWludCBpbmRleDEgPSBzLmluZGV4T2YoJyAnKTsKLQkJCQkJaW50IGluZGV4MiA9IHMuaW5kZXhPZignICcsIGluZGV4MSArIDEpOwotCQotCQkJCQl0cnkgewotCQkJCQkJcmVzcG9uc2VUeXBlID0gcy5zdWJzdHJpbmcoaW5kZXgxICsgMSwgaW5kZXgyKS50cmltKCk7Ci0JCQkJCQlUcmFjZS50cmFjZShUcmFjZS5QQVJTSU5HLCAiUmVzcG9uc2UgVHlwZTogIiArIHRoaXMgKyAiICIgKyByZXNwb25zZVR5cGUpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuUEFSU0lORywgIkVycm9yIHBhcnNpbmcgcmVzcG9uc2UgdHlwZSBmb3I6ICIgKyB0aGlzLCBlKTsKLQkJCQkJfQotCQkJCQlpZiAocmVzcG9uc2VUeXBlICE9IG51bGwgJiYgcmVzcG9uc2VUeXBlLmVxdWFscygiMTAwIikpIHsKLQkJCQkJCW91dHB1dEJ5dGVzKGIsIGlzTmV3KTsKLQkJCQkJCWlzTmV3ID0gZmFsc2U7Ci0KLQkJCQkJCWIgPSByZWFkTGluZSgpOwotCQkJCQkJb3V0cHV0Qnl0ZXMoYiwgZmFsc2UpOwotCi0JCQkJCQliID0gcmVhZExpbmUoKTsKLQotCQkJCQkJaW5kZXgxID0gcy5pbmRleE9mKCcgJyk7Ci0JCQkJCQlpbmRleDIgPSBzLmluZGV4T2YoJyAnLCBpbmRleDEgKyAxKTsKLQotCQkJCQkJdHJ5IHsKLQkJCQkJCQlyZXNwb25zZVR5cGUgPSBzLnN1YnN0cmluZyhpbmRleDEgKyAxLCBpbmRleDIpLnRyaW0oKTsKLQkJCQkJCQlUcmFjZS50cmFjZShUcmFjZS5QQVJTSU5HLCAiUmVzcG9uc2UgVHlwZTogIiArIHRoaXMgKyAiICIgKyByZXNwb25zZVR5cGUpOwotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlUcmFjZS50cmFjZShUcmFjZS5QQVJTSU5HLCAiRXJyb3IgcGFyc2luZyByZXNwb25zZSB0eXBlIGZvcjogIiArIHRoaXMsIGUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWlzRmlyc3RMaW5lID0gZmFsc2U7Ci0JCQl9Ci0JCi0JCQkvLyB0cmFuc2xhdGUKLQkJCWIgPSB0cmFuc2xhdGVIZWFkZXJMaW5lKGIpOwotCQkJCi0JCQlvdXRwdXRCeXRlcyhiLCBpc05ldyk7Ci0JCQlpc05ldyA9IGZhbHNlOwotCQotCQkJYiA9IHJlYWRMaW5lKCk7Ci0JCX0KLQotCQlUcmFjZS50cmFjZShUcmFjZS5QQVJTSU5HLCAiUGFyc2luZyBmaW5hbCBoZWFkZXIgbGluZTogJyIgKyBuZXcgU3RyaW5nKGIpICsgIiciKTsKLQotCQlvdXRwdXRCeXRlcyhiLCBmYWxzZSk7Ci0KLQkJUmVxdWVzdCByciA9IGNvbm4uZ2V0UmVxdWVzdFJlc3BvbnNlKGlzUmVxdWVzdCk7Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLlBBUlNJTkcsICJTZXR0aW5nIGhlYWRlciBsZW5ndGg6ICIgKyByci5nZXRSZXF1ZXN0KFJlcXVlc3QuQUxMKS5sZW5ndGgpOwotCQkKLQkJc2V0SFRUUEhlYWRlcihycik7Ci0JfQotCi0JLyoqCi0JICogUmVhZCBieXRlcyBmcm9tIHRoZSBzdHJlYW0uCi0JICogQHJldHVybiBieXRlW10KLQkgKi8KLQlwcm90ZWN0ZWQgYnl0ZVtdIHJlYWRCeXRlcyhpbnQgbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJVHJhY2UudHJhY2UoVHJhY2UuUEFSU0lORywgInJlYWRCeXRlcygpICIgKyBuICsgIiBmb3I6ICIgKyB0aGlzKTsKLQkJd2hpbGUgKGJ1ZmZlci5sZW5ndGggLSBidWZmZXJJbmRleCA8IG4pCi0JCQlmaWxsQnVmZmVyKCk7Ci0JCi0JCXJldHVybiByZW1vdmVGcm9tQnVmZmVyKGJ1ZmZlckluZGV4ICsgbik7Ci0JfQotCi0JLyoqCi0JICogUmVhZCBhbmQgcmV0dXJuIHRoZSBuZXh0IGZ1bGwgbGluZS4KLQkgKgotCSAqIEByZXR1cm4gYnl0ZVtdCi0JICovCi0JcHJvdGVjdGVkIGJ5dGVbXSByZWFkTGluZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLlBBUlNJTkcsICJyZWFkTGluZSgpIGZvcjogIiArIHRoaXMpOwotCQotCQlpbnQgbiA9IGdldEZpcnN0Q1JMRigpOwotCQl3aGlsZSAobiA8IDApIHsKLQkJCWZpbGxCdWZmZXIoKTsKLQkJCW4gPSBnZXRGaXJzdENSTEYoKTsKLQkJfQotCQlyZXR1cm4gcmVtb3ZlRnJvbUJ1ZmZlcihuICsgMSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGRhdGEgZnJvbSB0aGUgYnVmZmVyIHVwIHRvIHRoZSBhYnNvbHV0ZSBpbmRleCBuLgotCSAqIFJldHVybiB0aGUgZGF0YSBmcm9tIGJldHdlZW4gYnVmZmVySW5kZXggYW5kIG4uCi0JICoKLQkgKiBAcGFyYW0gbiB0aGUgYnl0ZXMgdG8gcmVtb3ZlCi0JICogQHJldHVybiBhIGJ5dGUgYXJyYXkKLQkgKi8KLQlwcm90ZWN0ZWQgYnl0ZVtdIHJlbW92ZUZyb21CdWZmZXIoaW50IG4pIHsKLQkJLy8gY29weSBsaW5lIG91dCBvZiBidWZmZXIKLQkJYnl0ZVtdIGIgPSBuZXcgYnl0ZVtuIC0gYnVmZmVySW5kZXhdOwotCQlTeXN0ZW0uYXJyYXljb3B5KGJ1ZmZlciwgYnVmZmVySW5kZXgsIGIsIDAsIG4gLSBidWZmZXJJbmRleCk7Ci0JCi0JCWlmIChidWZmZXIubGVuZ3RoID4gQlVGRkVSICogMiB8fCBidWZmZXJJbmRleCA+IEJVRkZFUikgewotCQkJLy8gcmVtb3ZlIGxpbmUgZnJvbSBidWZmZXIKLQkJCWludCBzaXplID0gYnVmZmVyLmxlbmd0aDsKLQkJCWJ5dGVbXSB4ID0gbmV3IGJ5dGVbc2l6ZSAtIG5dOwotCQkJU3lzdGVtLmFycmF5Y29weShidWZmZXIsIG4sIHgsIDAsIHNpemUgLSBuKTsKLQkJCWJ1ZmZlciA9IHg7Ci0JCQlidWZmZXJJbmRleCA9IDA7Ci0JCX0gZWxzZQotCQkJYnVmZmVySW5kZXggPSBuOwotCQotCQlyZXR1cm4gYjsKLQl9Ci0KLQkvKioKLQkgKiBMaXN0ZW4gZm9yIGlucHV0LCBzYXZlIGl0LCBhbmQgcGFzcyB0byB0aGUgb3V0cHV0IHN0cmVhbS4KLQkgKiBQaGlsb3NvcGh5OiBSZWFkIGEgc2luZ2xlIGxpbmUgc2VwYXJhdGVseSBhbmQgdHJhbnNsYXRlLgotCSAqIFdoZW4gYmxhbmsgbGluZSBpcyByZWFjaGVkLCBqdXN0IHBhc3MgYWxsIG90aGVyIGRhdGEgdGhyb3VnaC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCXRyeSB7Ci0JCQl0cnkgewotCQkJCXdoaWxlICh0cnVlKSB7Ci0JCQkJCWNvbnRlbnRMZW5ndGggPSAtMTsKLQkJCQkJdHJhbnNmZXJFbmNvZGluZyA9IC0xOwotCQkJCQljb25uZWN0aW9uS2VlcEFsaXZlID0gZmFsc2U7Ci0JCQkJCWNvbm5lY3Rpb25DbG9zZSA9IGZhbHNlOwotCi0JCQkJCXBhcnNlSGVhZGVyKCk7Ci0JCQkJCXBhcnNlQm9keSgpOwotCQkJCQkKLQkJCQkJaWYgKGlzUmVxdWVzdCAmJiBjb25uZWN0aW9uS2VlcEFsaXZlKQotCQkJCQkJd2FpdEZvclJlc3BvbnNlKCk7Ci0JCQkJCQotCQkJCQkvL1JlcXVlc3QgciA9IGNvbm4uZ2V0UmVxdWVzdFJlc3BvbnNlKHRydWUpOwotCQkJCQkvL3IuZmlyZUNoYW5nZWRFdmVudCgpOwotCi0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlBBUlNJTkcsICJEb25lIEhUVFAgcmVxdWVzdCBmb3IgIiArIHRoaXMgKyAiICIgKyBjb25uZWN0aW9uS2VlcEFsaXZlKTsKLQkJCQkJaWYgKCFpc1JlcXVlc3QgJiYgKCFyZXF1ZXN0LmNvbm5lY3Rpb25LZWVwQWxpdmUgfHwgY29ubmVjdGlvbkNsb3NlKSkgewotCQkJCQkJY29ubjIuY2xvc2UoKTsKLQkJCQkJCWlmIChyZXF1ZXN0LmNvbm5lY3Rpb25LZWVwQWxpdmUgJiYgY29ubmVjdGlvbkNsb3NlKQotCQkJCQkJCXJlcXVlc3QuY29ubmVjdGlvbktlZXBBbGl2ZSA9IGZhbHNlOwotCQkJCQkJCW5vdGlmeVJlcXVlc3QoKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCQotCQkJCQlpZiAoIWlzUmVxdWVzdCkKLQkJCQkJCW5vdGlmeVJlcXVlc3QoKTsKLQkJCQkJCi0JCQkJCVRocmVhZC55aWVsZCgpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyByZWFjaGVkIGVuZCBvZiBpbnB1dAotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlBBUlNJTkcsICJFbmQgb2YgYnVmZmVyIGZvcjogIiArIHRoaXMgKyAiICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCQl9Ci0KLQkJCS8vIHNlbmQgcmVzdCBvZiBidWZmZXIKLQkJCW91dC53cml0ZShidWZmZXIsIGJ1ZmZlckluZGV4LCBidWZmZXIubGVuZ3RoIC0gYnVmZmVySW5kZXgpOwotCQkJb3V0LmZsdXNoKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5QQVJTSU5HLCAiRXJyb3IgaW46ICIgKyB0aGlzLCBlKTsKLQkJfQotCQkvL2lmICghaXNSZXF1ZXN0KQotCQkvLwljb25uMi5jbG9zZSgpOwotCi0JCVRyYWNlLnRyYWNlKFRyYWNlLlBBUlNJTkcsICJDbG9zaW5nIHRocmVhZCAiICsgdGhpcyk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdGl0bGUgb2YgdGhlIGNhbGwuCi0JICoKLQkgKiBAcGFyYW0gcyBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWwoU3RyaW5nIHMpIHsKLQkJdHJ5IHsKLQkJCWludCBpbmRleDEgPSBzLmluZGV4T2YoJyAnKTsKLQkJCWlmIChpbmRleDEgPCAwIHx8IGluZGV4MSA+IDE1KQotCQkJCXJldHVybjsKLQkJCWludCBpbmRleDIgPSBzLmluZGV4T2YoJyAnLCBpbmRleDEgKyAxKTsKLQkJCWlmIChpbmRleDIgPCAwKQotCQkJCXJldHVybjsKLQkKLQkJCWNvbm4uc2V0TGFiZWwocy5zdWJzdHJpbmcoaW5kZXgxICsgMSwgaW5kZXgyKSwgdHJ1ZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCX0KLQotCS8qKgotCSAqIFRyYW5zbGF0ZSB0aGUgaGVhZGVyIGxpbmUuCi0JICogCi0JICogQHJldHVybiBieXRlW10KLQkgKiBAcGFyYW0gYiBieXRlW10KLQkgKi8KLQlwcm90ZWN0ZWQgYnl0ZVtdIHRyYW5zbGF0ZUhlYWRlckxpbmUoYnl0ZVtdIGIpIHsKLQkJU3RyaW5nIHMgPSBuZXcgU3RyaW5nKGIpOwotCQotCQlpZiAoaXNSZXF1ZXN0ICYmIHMuc3RhcnRzV2l0aCgiSG9zdDogIikpIHsKLQkJCVN0cmluZyB0ID0gIkhvc3Q6ICIgKyBob3N0OwotCQkJaWYgKHBvcnQgIT0gODApCi0JCQkJdCArPSAiOiIgKyBwb3J0OwotCQkJcmV0dXJuIGNvbnZlcnQodC5nZXRCeXRlcygpKTsKLQkJfSBlbHNlIGlmIChzLnN0YXJ0c1dpdGgoIkNvbnRlbnQtTGVuZ3RoOiAiKSkgewotCQkJdHJ5IHsKLQkJCQljb250ZW50TGVuZ3RoID0gSW50ZWdlci5wYXJzZUludChzLnN1YnN0cmluZygxNikudHJpbSgpKTsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5QQVJTSU5HLCAiQ29udGVudCBsZW5ndGg6ICIgKyB0aGlzICsgIiAiICsgY29udGVudExlbmd0aCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlBBUlNJTkcsICJDb250ZW50IGxlbmd0aCBlcnJvciIsIGUpOwotCQkJfQotCQl9IGVsc2UgaWYgKHMuc3RhcnRzV2l0aCgiQ29ubmVjdGlvbjogIikpIHsKLQkJCXRyeSB7Ci0JCQkJU3RyaW5nIHQgPSBzLnN1YnN0cmluZygxMSkudHJpbSgpOwotCQkJCWlmICh0LmVxdWFsc0lnbm9yZUNhc2UoIktlZXAtQWxpdmUiKSkKLQkJCQkJY29ubmVjdGlvbktlZXBBbGl2ZSA9IHRydWU7Ci0JCQkJLy8gcmVzcG9uc2UgY29udGFpbnMgIkNvbm5lY3Rpb246IGNsb3NlIiBoZWFkZXIKLQkJCQkvLyBjbG9zZSBjb25uZWN0aW9uIHRvIHRoZSBjbGllbnQgZXZlbiBpZiAia2VlcGFsaXZlIiBoYWQgYmVlbiByZXF1ZXN0ZWQKLQkJCQkvLyB3ZSBjYW4ndCBqdXN0IHJlc2V0IHJlcXVlc3Qua2VlcEFsaXZlIC0gaXQncyB1c2VkIGFzIGluZGljYXRvciB3aGV0aGVyCi0JCQkJLy8gdGhlIHJlcXVlc3QgdGhyZWFkIGlzIChnb2luZyB0bykgd2FpdCBmb3IgdGhlIHJlc3BvbnNlIHRocmVhZAotCQkJCS8vIChhbmQgbXVzdCBiZSBub3RpZmllZCAob25seSB0aGVuKSksCi0JCQkJLy8gc28gd2UgaGF2ZSB0byBsZXQgaXQgYWxvbmUKLQkJCQlpZiAodC5lcXVhbHNJZ25vcmVDYXNlKCJjbG9zZSIpKQotCQkJCQljb25uZWN0aW9uQ2xvc2UgPSB0cnVlOwotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlBBUlNJTkcsICJLZWVwIGFsaXZlOiAiICsgY29ubmVjdGlvbktlZXBBbGl2ZSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlBBUlNJTkcsICJFcnJvciBnZXR0aW5nIENvbm5lY3Rpb246IGZyb20gaGVhZGVyIiwgZSk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAocy5zdGFydHNXaXRoKCJUcmFuc2Zlci1FbmNvZGluZzogIikpIHsKLQkJCVN0cmluZyB0ID0gcy5zdWJzdHJpbmcoMTkpLnRyaW0oKTsKLQkJCWludCBzaXplID0gRU5DT0RJTkdfU1RSSU5HLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJaWYgKEVOQ09ESU5HX1NUUklOR1tpXS5lcXVhbHNJZ25vcmVDYXNlKHQpKSB7Ci0JCQkJCXRyYW5zZmVyRW5jb2RpbmcgPSAoYnl0ZSkgaTsKLQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuUEFSU0lORywgIlRyYW5zZmVyIGVuY29kaW5nOiAiICsgRU5DT0RJTkdfU1RSSU5HW2ldKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkKLQkJcmV0dXJuIGI7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGNsb3NlKCkgewotCQl0cnkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuUEFSU0lORywgIkNsb3Npbmc6ICIgKyB0aGlzKTsKLQkJCW91dC5jbG9zZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuUEFSU0lORywgIkVycm9yIGNsb3NpbmcgY29ubmVjdGlvbiAiICsgdGhpcyArICIgIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHdhaXRGb3JSZXNwb25zZSgpIHsKLQkJVHJhY2UudHJhY2UoVHJhY2UuUEFSU0lORywgIldhaXRpbmcgZm9yIHJlc3BvbnNlICIgKyB0aGlzKTsKLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQl0cnkgewotCQkJCWlzV2FpdGluZyA9IHRydWU7Ci0JCQkJd2FpdCgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5QQVJTSU5HLCAiRXJyb3IgaW4gd2FpdEZvclJlc3BvbnNlKCkgIiArIHRoaXMgKyAiICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCQl9Ci0JCQlpc1dhaXRpbmcgPSBmYWxzZTsKLQkJfQotCQlUcmFjZS50cmFjZShUcmFjZS5QQVJTSU5HLCAiRG9uZSB3YWl0aW5nIGZvciByZXNwb25zZSAiICsgdGhpcyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbm90aWZ5UmVxdWVzdCgpIHsKLQkJVHJhY2UudHJhY2UoVHJhY2UuUEFSU0lORywgIk5vdGlmeWluZyByZXF1ZXN0ICIgKyB0aGlzKTsKLQkJd2hpbGUgKHJlcXVlc3QuY29ubmVjdGlvbktlZXBBbGl2ZSAmJiAhcmVxdWVzdC5pc1dhaXRpbmcpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlBBUlNJTkcsICJXYWl0aW5nIGZvciByZXF1ZXN0ICIgKyB0aGlzKTsKLQkJCXRyeSB7Ci0JCQkJVGhyZWFkLnNsZWVwKDEwMCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCS8vIGlnbm9yZQotCQkJfQotCQl9Ci0JCXN5bmNocm9uaXplZCAocmVxdWVzdCkgewotCQkJdHJ5IHsKLQkJCQlyZXF1ZXN0Lm5vdGlmeSgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5QQVJTSU5HLCAiRXJyb3IgaW4gbm90aWZ5UmVxdWVzdCgpICIgKyB0aGlzICsgIiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQkJfQotCQl9Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLlBBUlNJTkcsICJEb25lIG5vdGlmeWluZyByZXF1ZXN0ICIgKyB0aGlzKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0SFRUUEhlYWRlcihSZXF1ZXN0IHJyKSB7Ci0JCWlmIChpc1JlcXVlc3QpIHsKLQkJCWJ5dGVbXSBiID0gcnIuZ2V0UmVxdWVzdChSZXF1ZXN0LkFMTCk7Ci0JCQlieXRlW10gaCA9IG5ldyBieXRlW2IubGVuZ3RoXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoYiwgMCwgaCwgMCwgYi5sZW5ndGgpOwotCQkJcnIuc2V0UHJvcGVydHkoSFRUUFJlcXVlc3QuSFRUUF9SRVFVRVNUX0hFQURFUiwgaCk7Ci0JCX0gZWxzZSB7Ci0JCQlieXRlW10gYiA9IHJyLmdldFJlc3BvbnNlKFJlcXVlc3QuQUxMKTsKLQkJCWJ5dGVbXSBoID0gbmV3IGJ5dGVbYi5sZW5ndGhdOwotCQkJU3lzdGVtLmFycmF5Y29weShiLCAwLCBoLCAwLCBiLmxlbmd0aCk7Ci0JCQlyci5zZXRQcm9wZXJ0eShIVFRQUmVxdWVzdC5IVFRQX1JFU1BPTlNFX0hFQURFUiwgaCk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0SFRUUEJvZHkoYnl0ZVtdIGIpIHsKLQkJUmVxdWVzdCByciA9IGNvbm4uZ2V0UmVxdWVzdFJlc3BvbnNlKGlzUmVxdWVzdCk7Ci0JCWlmIChpc1JlcXVlc3QpCi0JCQlyci5zZXRQcm9wZXJ0eShIVFRQUmVxdWVzdC5IVFRQX1JFUVVFU1RfQk9EWSwgYik7Ci0JCWVsc2UKLQkJCXJyLnNldFByb3BlcnR5KEhUVFBSZXF1ZXN0LkhUVFBfUkVTUE9OU0VfQk9EWSwgYik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL2h0dHAvUmVzZW5kSFRUUENvbm5lY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL2h0dHAvUmVzZW5kSFRUUENvbm5lY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzllMzQ0MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9odHRwL1Jlc2VuZEhUVFBDb25uZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwuaHR0cDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuUmVxdWVzdDsKLS8qKgotICogQSByZXNlbmQgSFRUUCBjb25uZWN0aW9uIHdyYXBzIGFuIEhUVFAgY29ubmVjdGlvbiB0byBzZW5kIGFuIGV4aXN0aW5nIHJlcXVlc3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXNlbmRIVFRQQ29ubmVjdGlvbiBleHRlbmRzIEhUVFBDb25uZWN0aW9uIHsKLQlwcm90ZWN0ZWQgUmVxdWVzdCBleGlzdGluZ1JlcXVlc3Q7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgcmVzZW5kIGNvbm5lY3Rpb24uCi0JICogCi0JICogQHBhcmFtIHJlcXVlc3QKLQkgKi8KLQlwdWJsaWMgUmVzZW5kSFRUUENvbm5lY3Rpb24oUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCXN1cGVyKG51bGwpOwotCQl0aGlzLmV4aXN0aW5nUmVxdWVzdCA9IHJlcXVlc3Q7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5odHRwLkhUVFBDb25uZWN0aW9uI2dldFJlcXVlc3RSZXNwb25zZShpbnQpCi0JICovCi0JcHJvdGVjdGVkIFJlcXVlc3QgZ2V0UmVxdWVzdFJlc3BvbnNlKGludCBpKSB7Ci0JCXJldHVybiBleGlzdGluZ1JlcXVlc3Q7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL2h0dHAvUmVzZW5kSFRUUFJlcXVlc3QuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL2h0dHAvUmVzZW5kSFRUUFJlcXVlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmE0ODg1OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9odHRwL1Jlc2VuZEhUVFBSZXF1ZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5odHRwOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlNvY2tldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwuQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLk1vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5Tb2NrZXRXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuUmVxdWVzdDsKLS8qKgotICogV3JhcHMgYW4gZXhpc3RpbmcgcmVxdWVzdCB0byBjcmVhdGUgYW4gSFRUUCByZXF1ZXN0IHRoYXQgY2FuIGJlIHNlbnQuIFRoZQotICogcmVzcG9uc2UgaXMgaWdub3JlZC4gT25seSB0aGUgcmVxdWVzdCBpcyBpbXBvcnRhbnQgaW4gdGhpcyBjYXNlLgotICovCi1wdWJsaWMgY2xhc3MgUmVzZW5kSFRUUFJlcXVlc3QgZXh0ZW5kcyBIVFRQUmVxdWVzdCB7Ci0JcHJpdmF0ZSBib29sZWFuIHNlbnQgPSBmYWxzZTsKLQotCXByaXZhdGUgYnl0ZVtdIGhlYWRlcjsKLQotCXByaXZhdGUgYnl0ZVtdIGNvbnRlbnQ7Ci0KLQlwcml2YXRlIFJlcXVlc3Qgb3JpZ2luYWxSZXF1ZXN0ID0gbnVsbDsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yLgotCSAqIAotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogQHBhcmFtIHJlcSB0aGUgcmVxdWVzdCB0aGF0IGlzIHRvIGJlIHJlc2VudC4KLQkgKi8KLQlwdWJsaWMgUmVzZW5kSFRUUFJlcXVlc3QoTW9uaXRvciBtb25pdG9yLCBSZXF1ZXN0IHJlcSkgewotCQlzdXBlcihtb25pdG9yLCByZXEuZ2V0TG9jYWxQb3J0KCksIHJlcS5nZXRSZW1vdGVIb3N0KCksIHJlcS5nZXRSZW1vdGVQb3J0KCkpOwotCQlzZXRQcm9wZXJ0eShIVFRQX1JFUVVFU1RfSEVBREVSLCByZXEuZ2V0UHJvcGVydHkoSFRUUF9SRVFVRVNUX0hFQURFUikpOwotCQlzZXRQcm9wZXJ0eShIVFRQX1JFUVVFU1RfQk9EWSwgcmVxLmdldFByb3BlcnR5KEhUVFBfUkVRVUVTVF9CT0RZKSk7Ci0JCWhlYWRlciA9IHJlcS5nZXRSZXF1ZXN0KFRSQU5TUE9SVCk7Ci0JCWNvbnRlbnQgPSByZXEuZ2V0UmVxdWVzdChDT05URU5UKTsKLQkJcmVxdWVzdCA9IHJlcS5nZXRSZXF1ZXN0KEFMTCk7Ci0JCW5hbWUgPSByZXEuZ2V0TmFtZSgpOwotCQl0aGlzLm9yaWdpbmFsUmVxdWVzdCA9IHJlcTsKLQl9Ci0KLQkvKioKLQkgKiBTZW5kIHRoZSByZXF1ZXN0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNlbmRSZXF1ZXN0KCkgewotCQl0cnkgewotCQkJU29ja2V0IGluU29ja2V0ID0gbmV3IFNvY2tldFdyYXBwZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHJlcXVlc3QpKTsKLQkJCVNvY2tldCBvdXRTb2NrZXQgPSBuZXcgU29ja2V0KHJlbW90ZUhvc3QsIHJlbW90ZVBvcnQpOwotCQkJLy9Db25uZWN0aW9uIGNvbm4gPSBuZXcgQ29ubmVjdGlvbihpblNvY2tldCwgb3V0U29ja2V0KTsKLQkJCS8vVENQSVBUaHJlYWQgcmVxdWVzdFRocmVhZCA9IG5ldyBUQ1BJUFRocmVhZChjb25uLCB0aGlzLCBpbiwKLQkJCS8vIG91dFNvY2tldC5nZXRPdXRwdXRTdHJlYW0oKSwgdHJ1ZSk7Ci0JCQkvL3JlcXVlc3RUaHJlYWQuc3RhcnQoKTsKLQkJCS8vbmV3IFRDUElQVGhyZWFkKGNvbm4sIHRoaXMsIG91dFNvY2tldC5nZXRJbnB1dFN0cmVhbSgpLAotCQkJLy8gaW5Tb2NrZXQuZ2V0T3V0cHV0U3RyZWFtKCksIGZhbHNlKS5zdGFydCgpOwotCQkJQ29ubmVjdGlvbiBjb25uMiA9IG5ldyBDb25uZWN0aW9uKGluU29ja2V0LCBvdXRTb2NrZXQpOwotCQkJUmVzZW5kSFRUUENvbm5lY3Rpb24gY29ubiA9IG5ldyBSZXNlbmRIVFRQQ29ubmVjdGlvbih0aGlzKTsKLQotCQkJSFRUUFRocmVhZCByZXF1ZXN0MiA9IG5ldyBIVFRQVGhyZWFkKGNvbm4yLCBpblNvY2tldC5nZXRJbnB1dFN0cmVhbSgpLAotCQkJCQlvdXRTb2NrZXQuZ2V0T3V0cHV0U3RyZWFtKCksIGNvbm4sIHRydWUsIHJlbW90ZUhvc3QsIHJlbW90ZVBvcnQpOwotCQkJSFRUUFRocmVhZCByZXNwb25zZTIgPSBuZXcgSFRUUFRocmVhZChjb25uMiwgb3V0U29ja2V0LmdldElucHV0U3RyZWFtKCksCi0JCQkJCWluU29ja2V0LmdldE91dHB1dFN0cmVhbSgpLCBjb25uLCBmYWxzZSwgImxvY2FsaG9zdCIsIGxvY2FsUG9ydCwgcmVxdWVzdDIpOwotCQkJcmVxdWVzdDIuc3RhcnQoKTsKLQkJCXJlc3BvbnNlMi5zdGFydCgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlyZXNwb25zZSA9ICgiVW5hYmxlIHRvIHJlc2VuZCB0byBzZXJ2ZXIuXG4iICsgZSkuZ2V0Qnl0ZXMoKTsKLQkJfQotCQlzZW50ID0gdHJ1ZTsKLQl9Ci0KLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgUmVxdWVzdCNhZGRUb1JlcXVlc3QoYnl0ZVtdKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFRvUmVxdWVzdChieXRlW10gYWRkUmVxdWVzdCkgewotCQkvLyBEb24ndCB3YW50IHRvIGFkZCB0byB0aGUgcmVxdWVzdCBhcyB3ZSBhbHJlYWR5IGhhdmUgdGhlIHJlcXVlc3QuCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcmVxdWVzdCBoYXMgYmVlbiBzZW50LgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHJlcXVlc3QgaGFzIGJlZW4gc2VudCwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqICAgIG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0JlZW5TZW50KCkgewotCQlyZXR1cm4gc2VudDsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHJlcXVlc3QuCi0JICogCi0JICogQHBhcmFtIHJlcXVlc3QKLQkgKiBAcGFyYW0gdHlwZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlcXVlc3QoYnl0ZVtdIHJlcXVlc3QsIGludCB0eXBlKSB7Ci0JCWlmIChyZXF1ZXN0ID09IG51bGwpCi0JCQlyZXF1ZXN0ID0gbmV3IGJ5dGVbMF07Ci0JCWlmICh0eXBlID09IFRSQU5TUE9SVCkKLQkJCWhlYWRlciA9IHJlcXVlc3Q7Ci0JCWVsc2UgaWYgKHR5cGUgPT0gQ09OVEVOVCkKLQkJCWNvbnRlbnQgPSByZXF1ZXN0OwotCQkKLQkJaW50IGxlbmd0aCA9IDA7Ci0JCWludCBoZWFkZXJMZW5ndGggPSAwOwotCQlpZiAoaGVhZGVyICE9IG51bGwpIHsKLQkJCWxlbmd0aCArPSBoZWFkZXIubGVuZ3RoOwotCQkJaGVhZGVyTGVuZ3RoID0gbGVuZ3RoOwotCQl9Ci0JCWlmIChjb250ZW50ICE9IG51bGwpCi0JCQlsZW5ndGggKz0gY29udGVudC5sZW5ndGg7Ci0JCWJ5dGVbXSBuZXdSZXF1ZXN0ID0gbmV3IGJ5dGVbbGVuZ3RoXTsKLQkJaWYgKGhlYWRlciAhPSBudWxsKQotCQkJU3lzdGVtLmFycmF5Y29weShoZWFkZXIsIDAsIG5ld1JlcXVlc3QsIDAsIGhlYWRlci5sZW5ndGgpOwotCQlpZiAoY29udGVudCAhPSBudWxsKQotCQkJU3lzdGVtLmFycmF5Y29weShjb250ZW50LCAwLCBuZXdSZXF1ZXN0LCBoZWFkZXJMZW5ndGgsIGNvbnRlbnQubGVuZ3RoKTsKLQkJc3VwZXIuc2V0UmVxdWVzdChuZXdSZXF1ZXN0KTsKLQl9Ci0KLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgSFRUUFJlcXVlc3QjZ2V0UmVxdWVzdENvbnRlbnQoKQotCSAqLwotCXByb3RlY3RlZCBieXRlW10gZ2V0UmVxdWVzdENvbnRlbnQoKSB7Ci0JCXJldHVybiBjb250ZW50OwotCX0KLQotCS8qKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBIVFRQUmVxdWVzdCNnZXRSZXF1ZXN0SGVhZGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgYnl0ZVtdIGdldFJlcXVlc3RIZWFkZXIoKSB7Ci0JCXJldHVybiBoZWFkZXI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgb3JpZ2luYWwgcmVxdWVzdC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBvcmlnaW5hbCByZXF1ZXN0Ci0JICovCi0JcHVibGljIFJlcXVlc3QgZ2V0T3JpZ2luYWxSZXF1ZXN0KCkgewotCQlyZXR1cm4gb3JpZ2luYWxSZXF1ZXN0OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9Db250ZW50RmlsdGVyRGVsZWdhdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0NvbnRlbnRGaWx0ZXJEZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNWNhMTQ0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0NvbnRlbnRGaWx0ZXJEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi2gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0vKioKLSAqIEEgY29udGVudCBmaWx0ZXIgdGhhdCBmaWx0ZXJzIGNvbnRlbnRzIGZyb20gdGhlIG1vbml0b3IgdHJhZmZpYyBvbiBhIHJlcXVlc3QuCi0gKiA8cD4KLSAqIFRoaXMgYWJzdHJhY3QgY2xhc3MgaXMgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZCBvbmx5IGJ5IGNsaWVudHMKLSAqIHRvIGV4dGVuZCB0aGUgPGNvZGU+Y29udGVudEZpbHRlcnM8L2NvZGU+IGV4dGVuc2lvbiBwb2ludC4KLSAqIFRoZSBzdWJjbGFzcyBtdXN0IGhhdmUgYSBwdWJsaWMgMC1hcmd1bWVudCBjb25zdHJ1Y3Rvciwgd2hpY2ggd2lsbCBiZSB1c2VkCi0gKiBhdXRvbWF0aWNhbGx5IHRvIGluc3RhbnRpYXRlIHRoZSBkZWxlZ2F0ZSB3aGVuIHJlcXVpcmVkLiAKLSAqIDwvcD4KLSAqIDxwPgotICogW2lzc3VlOiBUaGUgbm90aW9uIG9mIGNvbnRlbnQgZmlsdGVycyBpcyBhIFVJL3ByZXNlbnRhdGlvbgotICogY29uY2Vybiwgbm90IHNvbWV0aGluZyB0aGF0IGlzIG1ha2VzIHNlbnNlIHRvIGhhdmUgYXMgY29yZQotICogZnVuY3Rpb25hbGl0eS4gVGhlIGNvbnRlbnRGaWx0ZXJzIGV4dGVuc2lvbiBwb2ludCwgSUNvbnRlbnRGaWx0ZXIsCi0gKiBhbmQgQ29udGVudEZpbHRlckRlbGVnYXRlIHNob3VsZCBhbGwgbW92ZSB0byB0aGUgby5lLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpCi0gKiBwbHVnLWluLl0KLSAqIFtpc3N1ZTogQ1MgLSBJJ2QgZWNobyB0aGUgY29tbWVudCBhYm92ZSB0aGF0IHRoaXMgc2VlbXMgbGlrZSBhIFVJIGNvbmNlcm4uICAKLSAqIEkgbm90aWNlZCB0aGVyZSdzIGFsc28gYSB2aWV3ZXIgb24gdGhlIFVJIHNpZGUsIHNvIGknbSBub3Qgc3VyZSBob3cgdGhlc2Ugd291bGQgaW50ZXJhY3QuIAotICogSSBhc3N1bWUgdGhhdCBmaWx0ZXJzIG9wZXJhdGUgb24gdGhlIGJ5dGUgc3RyZWFtIGFuZCBhcmVuJ3QgY29uY2VybmVkIHdpdGggVUkgcHJlc2VudGF0aW9uLi4uCi0gKiBidXQgdXN1YWxseSBVSSdzIGFuZCBmaWx0ZXJzIGFyZSB0aWdodGx5IGNvdXBsZWQuCi0gKiA8L3A+Ci0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29udGVudEZpbHRlckRlbGVnYXRlIHsKLQkvKioKLQkgKiBGaWx0ZXIgdGhlIGdpdmVuIGNvbnRlbnQgZnJvbSB0aGUgZ2l2ZW4gcmVxdWVzdC4gVGhlIGNvbnRlbnQgdGhhdCBoYXMgYmVlbiBmaWx0ZXJlZCBvdXQgd2lsbCAKLQkgKiBub3QgYmUgc2hvd24gdG8gY2xpZW50cyBvZiB0aGUgVENQL0lQIG1vbml0b3IuCi0JICogCi0JICogQHBhcmFtIHJlcXVlc3QgdGhlIHJlcXVlc3QgdGhhdCB0aGUgZmlsdGVyIHdpbGwgYmUgcGVyZm9ybWVkIG9uCi0JICogQHBhcmFtIGlzUmVxdWVzdCBzZXQgdG8gdHJ1ZSBpZiB0aGUgY29udGVudCBmaWx0ZXIgYXBwbGllcyB0byByZXF1ZXN0IG1vbml0b3IgdHJhZmZpYywKLQkgKiAgICBvciBzZXQgdG8gZmFsc2UgaWYgdGhlIGNvbnRlbnQgZmlsdGVyIGFwcGxpZXMgdG8gdGhlIHJlc3BvbnNlIG1vbml0b3IgdHJhZmZpYwotCSAqIEBwYXJhbSBjb250ZW50IHRoZSBtZXNzYWdlIGNvbnRlbnQgdG8gYmUgZmlsdGVyZWQgb3V0Ci0JICogQHJldHVybiB0aGUgZmlsdGVyZWQgY29udGVudAotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlcmUgaXMgYW4gZXJyb3Igd2hpbGUgcGFyc2luZyBvciBmaWx0ZXJpbmcgdGhlIGNvbnRlbnQKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgYnl0ZVtdIGZpbHRlcihSZXF1ZXN0IHJlcXVlc3QsIGJvb2xlYW4gaXNSZXF1ZXN0LCBieXRlW10gY29udGVudCkgdGhyb3dzIElPRXhjZXB0aW9uOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0lNb25pdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9JTW9uaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmM3OWI3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0lNb25pdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci0vKioKLSAqIFJlcHJlc2VudHMgYSBtb25pdG9yIGJldHdlZW4gYSBjbGllbnQgYW5kIHNlcnZlci4KLSAqIFRoZSBtb25pdG9yIHdhdGNoZXMgYWxsIG5ldHdvcmsgdHJhZmZpYyBiZXR3ZWVuIGEgbG9jYWwgY2xpZW50ICh0YWxraW5nCi0gKiBvbiBhIGdpdmVuIGxvY2FsIHBvcnQpIGFuZCBhIHJlbW90ZSBzZXJ2ZXIgKGlkZW50aWZpZWQgYnkgaG9zdCBhbmQgcG9ydCkuCi0gKiBUaGUgZ2xvYmFsIGxpc3Qgb2Yga25vd24gbW9uaXRvcnMgaXMgYXZhaWxhYmxlIHZpYSB7QGxpbmsgTW9uaXRvckNvcmUjZ2V0TW9uaXRvcnMoKX0uCi0gKiBJTW9uaXRvciBpcyB0aHJlYWQtc2FmZS4KLSAqIDxwPgotICogSU1vbml0b3JzIGFyZSByZWFkLW9ubHkuIFRvIG1ha2UgY2hhbmdlcyB0byBhIG1vbml0b3IsIHlvdSBtdXN0IGNyZWF0ZSBhbgotICogSU1vbml0b3JXb3JraW5nQ29weSBieSBjYWxsaW5nIGNyZWF0ZVdvcmtpbmdDb3B5KCkuIENoYW5nZXMgdG8gdGhlIHdvcmtpbmcgY29weQotICogYXJlIGFwcGxpZWQgd2hlbiB0aGUgd29ya2luZyBjb3B5IGlzIHNhdmVkLiBNb25pdG9ycyBhbmQgbW9uaXRvciB3b3JraW5nIGNvcGllcwotICogaGF2ZSB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6Ci0gKiAgICogZXF1YWxzKCkgcmV0dXJucyB0cnVlIGZvciBhIG1vbml0b3IgYW5kIGl0J3Mgd29ya2luZyBjb3B5Ci0gKiA8cD4KLSAqIFtpc3N1ZTogV2h5IHRoZSBidWlsdC1pbiBhc3N1bXB0aW9uIHRoYXQgdGhlIGNsaWVudCBpcyBsb2NhbD8gQSBtb25pdG9yCi0gKiB3b3VsZCBtYWtlIGp1c3QgYXMgbXVjaCBzZW5zZSBzaXR0aW5nIGJldHdlZW4gYSBjbGllbnQgb24gYSByZW1vdGUgbWFjaGluZQotICogYW5kIGEgc2VydmVyLl0KLSAqIDwvcD4KLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKiA8L3A+Ci0gKiBAc2VlIElNb25pdG9yV29ya2luZ0NvcHkKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNb25pdG9yIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpZCBvZiB0aGlzIG1vbml0b3IuCi0JICogRWFjaCBtb25pdG9yIGhhcyBhIGRpc3RpbmN0LCBmaXhlZCBpZC4gSWRzIGFyZSBpbnRlbmRlZCB0byBiZSB1c2VkIGludGVybmFsbHkgYXMga2V5czsKLQkgKiB0aGV5IGFyZSBub3QgaW50ZW5kZWQgdG8gYmUgc2hvd24gdG8gZW5kIHVzZXJzLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1vbml0b3IgaWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZW1vdGUgaG9zdCBuYW1lIG9mIHRoZSBzZXJ2ZXIgYmVpbmcgbW9uaXRvcmVkLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHJlbW90ZSBob3N0IG5hbWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJlbW90ZUhvc3QoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZW1vdGUgcG9ydCBudW1iZXIgb2YgdGhlIHNlcnZlciBiZWluZyBtb25pdG9yZWQuCi0JICogIAotCSAqIEByZXR1cm4gdGhlIHJlbW90ZSBwb3J0IG51bWJlcgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0UmVtb3RlUG9ydCgpOwotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxvY2FsIHBvcnQgbnVtYmVyIG9mIHRoZSBjbGllbnQgYmVpbmcgbW9uaXRvcmVkLiBUaGlzCi0JICogaXMgdGhlIHBvcnQgdGhhdCB0aGUgY2xpZW50IGlzIHRhbGtpbmcgdG8gdGhlIHJlbW90ZSBzZXJ2ZXIgb24uCi0JICogIAotCSAqIEByZXR1cm4gdGhlIGxvY2FsIHBvcnQgbnVtYmVyCi0JICovCi0JcHVibGljIGludCBnZXRMb2NhbFBvcnQoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwcm90b2NvbCB0aGF0IHRoaXMgbW9uaXRvciB1c2VzIHRvIHJlYWQgbmV0d29yawotCSAqIHRyYWZmaWMuCi0JICogCi0JICogQHJldHVybiB0aGUgcHJvdG9jb2wgaWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByb3RvY29sKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb25uZWN0aW9uIHRpbWVvdXQuIFJldHVybnMgMCBpZiB0aGVyZSBpcyBubyB0aW1lb3V0LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHRpbWVvdXQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFRpbWVvdXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGlzIG1vbml0b3IgaXMgY3VycmVudGx5IHJ1bm5pbmcuIE1vbml0b3Igd29ya2luZwotCSAqIGNvcGllcyB3aWxsIGFsd2F5cyByZXR1cm4gZmFsc2UgKHNpbmNlIHRoZXkgY2Fubm90IGJlIHJ1bikuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbW9uaXRvciBpcyBjdXJyZW50bHkgcnVubmluZywgb3IKLQkgKiAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNSdW5uaW5nKCk7Ci0JCi0JLyoqCi0JICogRGVsZXRlcyB0aGlzIG1vbml0b3IuIFRoZSBtb25pdG9yIHdpbGwgbm8gbG9uZ2VyIGJlIGF2YWlsYWJsZSB0byBjbGllbnRzLgotCSAqIElmIHRoZSBtb25pdG9yIGlzIGN1cnJlbnRseSBydW5uaW5nLCBpdCB3aWxsIGJlIHN0b3BwZWQgZmlyc3QuCi0JICogVGhpcyBtZXRob2QgaGFzIG5vIGVmZmVjdCBpZiB0aGUgbW9uaXRvciBoYXMgYWxyZWFkeSBiZWVuIGRlbGV0ZWQgb3IgaWYKLQkgKiBpdCBpcyBjYWxsZWQgb24gYSB3b3JraW5nIGNvcHkuIENsaWVudHMgaGF2ZSBubyBvYmxpZ2F0aW9uIHRvIGRlbGV0ZQotCSAqIHdvcmtpbmcgY29waWVzLgotCSAqLwotCXB1YmxpYyB2b2lkIGRlbGV0ZSgpOwotCQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGlzIG1vbml0b3IgaXMgYSB3b3JraW5nIGNvcHkuIE1vbml0b3JzIHdoaWNoIHJldHVybgotCSAqIDxjb2RlPnRydWU8L2NvZGU+IHRvIHRoaXMgbWV0aG9kIGNhbiBiZSBzYWZlbHkgY2FzdCB0bwotCSAqIHtAbGluayBJTW9uaXRvcldvcmtpbmdDb3B5fS4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgbW9uaXRvciBpcyBhIHdvcmtpbmcgY29weSwgYW5kCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzV29ya2luZ0NvcHkoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgd29ya2luZyBjb3B5IGZvciB0aGlzIG1vbml0b3IuIElmIHRoZSByZWNlaXZlciBpcyBub3QgYQotCSAqIHdvcmtpbmcgY29weSwgYSBuZXcgd29ya2luZyBjb3B5IHdpbGwgYmUgY3JlYXRlZCBhbmQgaW5pdGlhbGl6ZWQgdG8gaGF2ZQotCSAqIHRoZSBzYW1lIGF0dHJpYnV0ZXMgYXMgdGhpcyBtb25pdG9yLiBJZiB0aGUgcmVjZWl2ZXIgaXMgYSB3b3JraW5nIGNvcHksCi0JICogdGhpcyBtZXRob2Qgc2ltcGx5IHJldHVybnMgdGhlIHJlY2VpdmVyLiBBZnRlciBjb25maWd1cmluZyBhdHRyaWJ1dGVzIG9uCi0JICogdGhlIHdvcmtpbmcgY29weSwgY2FsbGluZyB7QGxpbmsgSU1vbml0b3JXb3JraW5nQ29weSNzYXZlKCl9IGFwcGxpZXMKLQkgKiB0aGUgY2hhbmdlcyB0byB0aGUgb3JpZ2luYWwgbW9uaXRvci4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgd29ya2luZyBjb3B5IG9mIHRoaXMgbW9uaXRvcgotCSAqLwotCXB1YmxpYyBJTW9uaXRvcldvcmtpbmdDb3B5IGNyZWF0ZVdvcmtpbmdDb3B5KCk7Ci0JCi0JLyoqCi0JICogU3RhcnRzIHRoZSBnaXZlbiBtb25pdG9yIGxpc3RlbmluZyBvbiBpdHMgY2xpZW50IHBvcnQuIFRoaXMgbWV0aG9kIGlzCi0JICogc3luY2hyb25vdXMgYW5kIHRoZSBtb25pdG9yIHdpbGwgYmUgcnVubmluZyBhbmQgcmVhZHkgZm9yIHVzZSBieSB0aGUKLQkgKiB0aW1lIHRoYXQgdGhlIG1ldGhvZCByZXR1cm5zLiBUaGlzIG1ldGhvZCBoYXMgbm8gZWZmZWN0IGlmIHRoZSBtb25pdG9yCi0JICogaXMgYWxyZWFkeSBydW5uaW5nLgotCSAqIDxwPgotCSAqIEEgQ29yZUV4Y2VwdGlvbiBpcyB0aHJvd24gaWYgdGhlIG1vbml0b3IgaXMgbm90IHZhbGlkLCB0aGUgbG9jYWwgcG9ydAotCSAqIGlzIGluIHVzZSwgb3IgaWYgYW5vdGhlciBwcm9ibGVtIG9jY3VycyB3aGVuIHN0YXJ0aW5nIHRoZSBtb25pdG9yLiAKLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgY2FsbGVkIG9uIGEgd29ya2luZyBjb3B5IG9yIGFmdGVyIHRoZSBtb25pdG9yCi0JICogaGFzIGJlZW4gZGVsZXRlZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIHRocm93biBpZiB0aGUgbW9uaXRvcidzIHByb3BlcnRpZXMgYXJlIGludmFsaWQsCi0JICogICBpZiBpdCBmYWlscyB0byBzdGFydCBiZWNhdXNlIHRoZSBwb3J0IGlzIGluIHVzZSwgb3IgYW5vdGhlciBwcm9ibGVtIG9jY3VycwotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KCkgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBTdG9wcyB0aGUgZ2l2ZW4gbW9uaXRvciBhbmQgZnJlZXMgdXAgYWxsIHVuZGVybHlpbmcgb3BlcmF0aW5nIAotCSAqIHN5c3RlbSByZXNvdXJjZXMuIFRoaXMgbWV0aG9kIGlzIHN5bmNocm9ub3VzIGFuZCB0aGUgbW9uaXRvciB3aWxsIGJlCi0JICogcnVubmluZyBhbmQgcmVhZHkgZm9yIHVzZSBieSB0aGUgdGltZSB0aGF0IHRoZSBtZXRob2QgcmV0dXJucy4KLQkgKiBUaGlzIG1ldGhvZCBoYXMgbm8gZWZmZWN0IGlmIHRoZSBtb25pdG9yIHdhcyBub3QgYWxyZWFkeSBydW5uaW5nLgotCSAqIDxwPgotCSAqIEFmdGVyIHJldHVybmluZyBmcm9tIHRoaXMgbWV0aG9kLCB0aGUgbW9uaXRvciBtYXkgYmUgcmVzdGFydGVkIGF0Ci0JICogYW55IHRpbWUuIFRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIGNhbGxlZCBvbiBhIHdvcmtpbmcgY29weSBvciBhZnRlcgotCSAqIHRoZSBtb25pdG9yIGhhcyBiZWVuIGRlbGV0ZWQuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoKTsKLQotCS8qKgotCSAqIEFkZHMgYSByZXF1ZXN0IGxpc3RlbmVyLgotCSAqIE9uY2UgcmVnaXN0ZXJlZCwgYSBsaXN0ZW5lciBzdGFydHMgcmVjZWl2aW5nIG5vdGlmaWNhdGlvbiBvZiAKLQkgKiBjaGFuZ2VzIHRvIHRoZSBnbG9iYWwgbGlzdCBvZiByZXF1ZXN0cy4gVGhlIGxpc3RlbmVyIGNvbnRpbnVlcyB0byByZWNlaXZlCi0JICogbm90aWZpY2F0aW9ucyB1bnRpbCBpdCBpcyByZW1vdmVkLgotCSAqIEhhcyBubyBlZmZlY3QgaWYgYW4gaWRlbnRpY2FsIGxpc3RlbmVyIGlzIGFscmVhZHkgcmVnaXN0ZXJlZC4KLQkgKiA8cD4KLQkgKiBJZiBhIGxpc3RlbmVyIGlzIGFkZGVkIHRvIGEgd29ya2luZyBjb3B5LCBpdCB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgYWRkZWQKLQkgKiB0byB0aGUgb3JpZ2luYWwgbW9uaXRvci4gSWYgdGhlIG1vbml0b3IgZG9lcyBub3QgZXhpc3QgeWV0ICh3aGVuIHRoZSB3b3JraW5nCi0JICogY29weSB3YXMganVzdCBjcmVhdGVkIGZyb20gTW9uaXRvckNvcmUuY3JlYXRlTW9uaXRvcigpKSwgdGhlIGxpc3RlbmVyIHdpbGwKLQkgKiBiZSBhZGRlZCB0byB0aGUgY3JlYXRlZCBtb25pdG9yIHdoZW4gKGlmKSB0aGUgd29ya2luZyBjb3B5IGlzIHNhdmVkLiAKLQkgKiA8L3A+Ci0JICoKLQkgKiBAcGFyYW0gbGlzdGVuZXIgdGhlIHJlcXVlc3QgbGlzdGVuZXIKLQkgKiBAc2VlICNyZW1vdmVSZXF1ZXN0TGlzdGVuZXIoSVJlcXVlc3RMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRSZXF1ZXN0TGlzdGVuZXIoSVJlcXVlc3RMaXN0ZW5lciBsaXN0ZW5lcik7Ci0JCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgZ2l2ZW4gcmVxdWVzdCBsaXN0ZW5lci4gSGFzIG5vIGVmZmVjdCBpZiB0aGUgbGlzdGVuZXIgaXMKLQkgKiBub3QgcmVnaXN0ZXJlZC4KLQkgKiA8cD4KLQkgKiBJZiBhIGxpc3RlbmVyIGlzIHJlbW92ZWQgZnJvbSBhIHdvcmtpbmcgY29weSwgaXQgd2lsbCBhdXRvbWF0aWNhbGx5IGJlCi0JICogcmVtb3ZlZCBmcm9tIHRoZSBjb3JyZXNwb25kaW5nIG9yaWdpbmFsIG1vbml0b3IuIFJlbW92aW5nIGEgbW9uaXRvciBmcm9tCi0JICogYSBuZXdseSBjcmVhdGVkIG1vbml0b3IgaGFzIG5vIGVmZmVjdCB1bmxlc3MgdGhlIG1vbml0b3IgaGFkIGFscmVhZHkgYmVlbgotCSAqIGFkZGVkLCBpbiB3aGljaCBjYXNlIGl0IGlzIHJlbW92ZWQgZnJvbSBub3RpZmljYXRpb24gYW5kIHdpbGwgbm90IGJlIGFkZGVkCi0JICogdG8gdGhlIGNyZWF0ZWQgbW9uaXRvciB3aGVuIChpZikgdGhlIHdvcmtpbmcgY29weSBpcyBzYXZlZC4gCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgbGlzdGVuZXIKLQkgKiBAc2VlICNhZGRSZXF1ZXN0TGlzdGVuZXIoSVJlcXVlc3RMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVSZXF1ZXN0TGlzdGVuZXIoSVJlcXVlc3RMaXN0ZW5lciBsaXN0ZW5lcik7Ci0JCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoaXMgbW9uaXRvci4gVGhpcyBtZXRob2Qgc2hvdWxkIHJldHVybiBhbiBlcnJvciBpZiB0aGUgbW9uaXRvcgotCSAqIGhhcyBpbnZhbGlkIHBvcnRzIG9yIHJlbW90ZSBob3N0bmFtZS4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBpcyBub3Qgb24gdGhlIHdvcmtpbmcgY29weSBzbyB0aGF0IHRoZSBydW50aW1lIGNhbiBiZSB2YWxpZGF0ZWQKLQkgKiBhdCBhbnkgdGltZS4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcmV0dXJuIGEgc3RhdHVzIG9iamVjdCB3aXRoIGNvZGUgPGNvZGU+SVN0YXR1cy5PSzwvY29kZT4gaWYgdGhpcwotCSAqICAgcnVudGltZSBpcyB2YWxpZCwgb3RoZXJ3aXNlIGEgc3RhdHVzIG9iamVjdCBpbmRpY2F0aW5nIHdoYXQgaXMKLQkgKiAgIHdyb25nIHdpdGggaXQKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZSgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0lNb25pdG9yTGlzdGVuZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0lNb25pdG9yTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk0ODc3ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9JTW9uaXRvckxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWw7Ci0vKioKLSAqIExpc3RlbmVyIGZvciBnbG9iYWwgY2hhbmdlcyBhZmZlY3RpbmcgbW9uaXRvcnMuCi0gKiA8cD4KLSAqIENsaWVudHMgc2hvdWxkIGltcGxlbWVudCB0aGlzIGludGVyZmFjZSBhbmQgcmVnaXN0ZXIKLSAqIHRoZWlyIGxpc3RlbmVyIHZpYSB7QGxpbmsgTW9uaXRvckNvcmUjYWRkTW9uaXRvckxpc3RlbmVyKElNb25pdG9yTGlzdGVuZXIpfS4KLSAqIDwvcD4KLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU1vbml0b3JMaXN0ZW5lciB7Ci0JCi0JLyoqCi0JICogTm90aWZpY2F0aW9uIHRoYXQgdGhlIGdpdmVuIG1vbml0b3IgaGFzIGJlZW4gY3JlYXRlZCAoYWRkZWQgdG8gdGhlCi0JICogZ2xvYmFsIGxpc3Qgb2Yga25vd24gbW9uaXRvcnMpLgotCSAqIAotCSAqIEBwYXJhbSBtb25pdG9yIHRoZSBuZXdseS1jcmVhdGVkIG1vbml0b3IKLQkgKi8KLQlwdWJsaWMgdm9pZCBtb25pdG9yQWRkZWQoSU1vbml0b3IgbW9uaXRvcik7Ci0KLQkvKioKLQkgKiBOb3RpZmljYXRpb24gdGhhdCB0aGUgZ2l2ZW4gbW9uaXRvciBoYXMgYmVlbiBjaGFuZ2VkLgotICAgICAqIE5vdGUgdGhhdCB0aGUgbW9uaXRvciBpcyBuZXZlciBhIHdvcmtpbmcgY29weS4KLQkgKiAKLQkgKiBAcGFyYW0gbW9uaXRvciB0aGUgbW9uaXRvciB0aGF0IGhhcyBiZWVuIGNoYW5nZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBtb25pdG9yQ2hhbmdlZChJTW9uaXRvciBtb25pdG9yKTsKLQotCS8qKgotCSAqIE5vdGlmaWNhdGlvbiB0aGF0IHRoZSBnaXZlbiBtb25pdG9yIGhhcyBiZWVuIGRlbGV0ZWQgKHJlbW92ZWQKLQkgKiBmcm9tIHRoZSBnbG9iYWwgbGlzdCBvZiBrbm93biBtb25pdG9ycykuCi0JICogCi0JICogQHBhcmFtIG1vbml0b3IgdGhlIG1vbml0b3IgdGhhdCBoYXMgYmVlbiBkZWxldGVkCi0JICovCi0JcHVibGljIHZvaWQgbW9uaXRvclJlbW92ZWQoSU1vbml0b3IgbW9uaXRvcik7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSU1vbml0b3JXb3JraW5nQ29weS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSU1vbml0b3JXb3JraW5nQ29weS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWNkZTQ5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0lNb25pdG9yV29ya2luZ0NvcHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLS8qKgotICogUmVwcmVzZW50cyBhIHdvcmtpbmcgY29weSBvZiBhIG1vbml0b3IuIEEgd29ya2luZyBjb3B5IGlzIGEgY29weSB0aGF0IHRoZQotICogYXR0cmlidXRlcyBjYW4gYmUgY2hhbmdlZC4KLSAqIElNb25pdG9yV29ya2luZ0NvcHkgaXMgdGhyZWFkLXNhZmUuIEhvd2V2ZXIsIHdvcmtpbmcgY29waWVzIGluc3RhbmNlcwotICogc2hvdWxkIGJlIHNob3J0LWxpdmVkIHRvIHJlZHVjZSB0aGUgY2hhbmNlIG9mIG11bHRpcGxlIHdvcmtpbmcgY29waWVzCi0gKiBiZWluZyBjcmVhdGVkIGJ5IGRpZmZlcmVudCBjbGllbnRzIGFuZCBvbmUgY2xpZW50IG92ZXJ3cml0dGluZyBjaGFuZ2VzCi0gKiBtYWRlIHRvIHRoZSBvdGhlciB3b3JraW5nIGNvcHkuIAotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqIEBzZWUgSU1vbml0b3IKLSAqIEBwbGFubmVkZm9yIDEuMAotICogCi0gKiBbaXNzdWUgOiBDUyAtIGl0IHNvdW5kcyBsaWtlIHRoaXMgaXMgc29tZXRoaW5nIHVzZWZ1bCBmb3IgY3JlYXRpbmcgbW9uaXRvcnMuIAotICogU2hvdWxkbid0IHRoaXMgYmUgY2FsbGVkIGEgSU1vbml0b3JDb25maWd1cmF0aW9uPyAgSXMgdGhlcmUgYW4gYWR2YW50YWdlIHRvIG1ha2luZwotICogdGhpcyBhY3R1YWxseSBzZWVtIHRvIGJlIGEgSU1vbml0b3I/ICBQZXJoYXBzIHNvbWUgVUkgY29udmVuaWVuY2U/ICAKLSAqIElzIGEgSU1vbml0b3JXb3JraW5nQ29weSBhY3R1YWxseSAndXNlYWJsZScgZm9yIG1vbml0b3JpbmcgLi4gb3IgaXMgaXQgcmVhbGx5IGp1c3QgYSBjb25maWd1cmF0aW9uPyBdCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU1vbml0b3JXb3JraW5nQ29weSBleHRlbmRzIElNb25pdG9yIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBvcmlnaW5hbCBtb25pdG9yIHRoYXQgdGhpcyB3b3JraW5nIGNvcHkgY29ycmVzcG9uZHMgdG8sIG9yCi0JICogPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyB3b3JraW5nIGNvcHkgd2FzIGp1c3QgY3JlYXRlZCBmcm9tCi0JICogTW9uaXRvckNvcmUuY3JlYXRlTW9uaXRvcigpLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG9yaWdpbmFsIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMgd29ya2luZyBjb3B5Ci0JICogICAgd2FzIGp1c3QgY3JlYXRlZAotCSAqLwotCXB1YmxpYyBJTW9uaXRvciBnZXRPcmlnaW5hbCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgbG9jYWwgcG9ydCBudW1iZXIgb2YgdGhlIGNsaWVudCB0byBiZSBtb25pdG9yZWQuCi0JICogCi0JICogQHBhcmFtIHBvcnQgdGhlIGxvY2FsIChjbGllbnQpIHBvcnQgbnVtYmVyCi0JICogQHNlZSBJTW9uaXRvciNnZXRMb2NhbFBvcnQoKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldExvY2FsUG9ydChpbnQgcG9ydCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSByZW1vdGUgaG9zdCBuYW1lIG9mIHRoZSBzZXJ2ZXIgdG8gYmUgbW9uaXRvcmVkLgotCSAqIAotCSAqIEBwYXJhbSBob3N0IHRoZSBuZXcgcmVtb3RlIGhvc3QgbmFtZQotCSAqIEBzZWUgSU1vbml0b3IjZ2V0UmVtb3RlSG9zdCgpCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVtb3RlSG9zdChTdHJpbmcgaG9zdCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSByZW1vdGUgcG9ydCBudW1iZXIgb2YgdGhlIHNlcnZlciB0byBiZSBtb25pdG9yZWQuCi0JICogCi0JICogQHBhcmFtIHBvcnQgdGhlIG5ldyByZW1vdGUgcG9ydCBudW1iZXIKLQkgKiBAc2VlIElNb25pdG9yI2dldFJlbW90ZVBvcnQoKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlbW90ZVBvcnQoaW50IHBvcnQpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgcHJvdG9jb2wgdG8gYmUgdXNlZCB0byByZWFkIG5ldHdvcmsKLQkgKiB0cmFmZmljIGJldHdlZW4gdGhlIHNlcnZlciBhbmQgdGhlIGNsaWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvdG9jb2xJZCB0aGUgcHJvdG9jb2wgaWQKLQkgKiBAc2VlIElNb25pdG9yI2dldFByb3RvY29sKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm90b2NvbChTdHJpbmcgcHJvdG9jb2xJZCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBjb25uZWN0aW9uIHRpbWVvdXQuIFVzZSAwIHRvIGNsZWFyIHRoZSB0aW1lb3V0LgotCSAqIAotCSAqIEBwYXJhbSB0aW1lb3V0IHRoZSBjb25uZWN0aW9uIHRpbWVvdXQKLQkgKiBAc2VlIElNb25pdG9yI2dldFRpbWVvdXQoKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRpbWVvdXQoaW50IHRpbWVvdXQpOwotCi0JLyoqCi0JICogU2F2ZXMgdGhlIGNoYW5nZXMgbWFkZSB0byB0aGlzIHdvcmtpbmcgY29weS4KLQkgKiBGb3IgYSBicmFuZCBuZXcgd29ya2luZyBjb3B5IChjcmVhdGVkIGJ5Ci0JICoge0BsaW5rIE1vbml0b3JDb3JlI2NyZWF0ZU1vbml0b3IoKX0sIGFuZCBub3QgeWV0IHNhdmVkKSwgdGhpcyBtZXRob2QKLQkgKiBjcmVhdGVzIGEgbmV3IG1vbml0b3IgaW5zdGFuY2Ugd2l0aCBhdHRyaWJ1dGVzIG1hdGNoaW5nIHRoaXMgd29ya2luZyBjb3B5LgotCSAqIEZvciBhIHdvcmtpbmcgY29weSBjbG9uZWQgZnJvbSBhbiBleGlzdGluZyBtb25pdG9yIGluc3RhbmNlIChieQotCSAqIHtAbGluayBJTW9uaXRvciNjcmVhdGVXb3JraW5nQ29weSgpfSksIHRoaXMgbWV0aG9kIHN0b3BzIHRoZSBleGlzdGluZwotCSAqIG1vbml0b3IgKHVzaW5nIHtAbGluayBJTW9uaXRvciNzdG9wKCl9KSBpZiBuZWNlc3NhcnksCi0JICogYW5kIHRoZW4gc2V0cyB0aGUgYXR0cmlidXRlcyBvZiB0aGUgbW9uaXRvciBpbnN0YW5jZSB0byBtYXRjaCB0aGlzCi0JICogd29ya2luZyBjb3B5ICh0aGUgbW9uaXRvciBpbnN0YW5jZSBpcyByZXR1cm5lZCkuCi0JICogPHA+Ci0JICogU2F2aW5nIGEgd29ya2luZyBjb3B5IGZvciBhIG1vbml0b3IgdGhhdCB3YXMgYWxyZWFkeSBkZWxldGVkIHdpbGwgY2F1c2UKLQkgKiB0aGUgbW9uaXRvciB0byBnZXQgcmVjcmVhdGVkICh3aXRoIGFueSBjaGFuZ2VzIGluIHRoZSB3b3JraW5nIGNvcHkpLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCB0aHJvd3MgYSBDb3JlRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSBzYXZpbmcgdGhlCi0JICogbW9uaXRvci4gTm8gdmFsaWRhdGlvbiBjaGVja3Mgb2NjdXIgd2hlbiBzYXZpbmcgdGhlIG1vbml0b3IuIFRoaXMgY2FuIGJlCi0JICogZG9uZSBieSBjYWxsaW5nIElNb25pdG9yLnZhbGlkYXRlKCkgcHJpb3IgdG8gc2F2aW5nLgotCSAqIDwvcD4KLQkgKgotCSAqIEByZXR1cm4gdGhlIGFmZmVjdGVkIG1vbml0b3IKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gdGhyb3duIGlmIGEgcHJvYmxlbSBvY2N1cnMgd2hpbGUgc2F2aW5nIHRoZSBtb25pdG9yIAotCSAqLwotCXB1YmxpYyBJTW9uaXRvciBzYXZlKCkgdGhyb3dzIENvcmVFeGNlcHRpb247Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSVJlcXVlc3RMaXN0ZW5lci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSVJlcXVlc3RMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDk0OWZmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0lSZXF1ZXN0TGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotoCoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWw7Ci0vKioKLSAqIExpc3RlbmVyIGZvciBuZXcgb3IgbW9kaWZpZWQgcmVxdWVzdHMgY3JlYXRlZCBmcm9tIGEgc2luZ2xlIG1vbml0b3IuCi0gKiBFYWNoIHJlcXVlc3QgcmVwcmVzZW50cyBtZXNzYWdlIHRyYWZmaWMgYmV0d2VlbiBhIG1vbml0b3JlZCBjbGllbnQKLSAqIGFuZCBzZXJ2ZXIuCi0gKiA8cD4KLSAqIFJlcXVlc3RzIGFyZSBub3QgcGVyc2lzdGVkIC0gdGhleSBvbmx5IGV4aXN0IGluIHRoaXMgQVBJIHVudGlsIHRoZQotICogY29ubmVjdGlvbiBpcyBkb25lLiBBbiBpbml0aWFsIHJlcXVlc3RBZGRlZCgpIGV2ZW50IGlzIGZpcmVkIHdoZW4gdGhlCi0gKglyZXF1ZXN0IGlzIGNyZWF0ZWQgKGJ5IHRoZSBjbGllbnQgY3JlYXRpbmcgYSBjb25uZWN0aW9uKSwgYW5kIHRoZW4KLSAqIHJlcXVlc3RDaGFuZ2VkKCkgZXZlbnRzIG9jY3VyIGFzIGRhdGEgaXMgcGFzc2VkIHRocm91Z2ggdGhlIHJlcXVlc3QKLSAqIG9yIGNoYW5nZXMgYXJlIG1hZGUgdG8gdGhlIHJlcXVlc3QncyBwcm9wZXJ0aWVzLgotICogPC9wPgotICogCi0gKiBAc2VlIElNb25pdG9yI2FkZFJlcXVlc3RMaXN0ZW5lcihJUmVxdWVzdExpc3RlbmVyKQotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVJlcXVlc3RMaXN0ZW5lciB7Ci0JLyoqCi0JICogTm90aWZpY2F0aW9uIHRoYXQgdGhlIGdpdmVuIHJlcXVlc3Qgd2FzIGNyZWF0ZWQuCi0JICogPHA+Ci0JICogUmVxdWVzdHMgbWF5IGJlIGNyZWF0ZWQgd2l0aCBsaXR0bGUgdG8gbm8gZGF0YSBpbiB0aGVtLgotCSAqIEFzIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlLCB0aGUKLQkgKiA8Y29kZT5yZXF1ZXN0Q2hhbmdlZDwvY29kZT4gbWV0aG9kIGlzIGNhbGxlZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIG1vbml0b3IgdGhlIG1vbml0b3IgZnJvbSB3aGljaCB0aGUgcmVxdWVzdCB3YXMgaW5pdGlhdGVkCi0JICogQHBhcmFtIHJlcXVlc3QgdGhlIHJlcXVlc3QgdGhhdCBoYXMgYmVlbiBhZGRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHJlcXVlc3RBZGRlZChJTW9uaXRvciBtb25pdG9yLCBSZXF1ZXN0IHJlcXVlc3QpOwotCi0JLyoqCi0JICogTm90aWZpY2F0aW9uIHRoYXQgdGhlIGdpdmVuIHJlcXVlc3QgaGFzIGJlZW4gY2hhbmdlZC4KLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiBtb3JlIGRhdGEgaXMgYXZhaWxhYmxlIGluIHRoZQotCSAqIHJlcXVlc3QuCi0JICogPHA+Ci0JICogSW5kaXZpZHVhbCB2YWx1ZXMgd2l0aGluIHRoZSByZXF1ZXN0IGFyZSByYXJlbHkgbW9kaWZpZWQuCi0JICogVGhpcyBtZXRob2QgbWF5IGJlIGNhbGxlZCB3aGVuIHRoZXkgYXJlIGluaXRpYWxseSBzZXQgb3IKLQkgKiB3aGVuIG1vcmUgZGF0YSBpcyByZWNlaXZlZCBmcm9tIHRoZSBjbGllbnQgb3Igc2VydmVyLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbW9uaXRvciB0aGUgbW9uaXRvciBmcm9tIHdoaWNoIHRoZSByZXF1ZXN0IHdhcyBpbml0aWF0ZWQKLQkgKiBAcGFyYW0gcmVxdWVzdCB0aGUgcmVxdWVzdCB0aGF0IGhhcyBiZWVuIGNoYW5nZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXF1ZXN0Q2hhbmdlZChJTW9uaXRvciBtb25pdG9yLCBSZXF1ZXN0IHJlcXVlc3QpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL01vbml0b3JDb3JlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9Nb25pdG9yQ29yZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjI0NGZiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL01vbml0b3JDb3JlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi2gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5Nb25pdG9yTWFuYWdlcjsKLS8qKgotICogTWFpbiBjbGFzcyBmb3IgY3JlYXRpbmcgbmV3IG1vbml0b3JzIGFuZCBsb2NhdGluZyBleGlzdGluZyBvbmVzLiBUaGUgbWV0aG9kcyBvbgotICogdGhpcyBjbGFzcyBhcmUgdGhyZWFkIHNhZmUuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgYWxsIGZ1bmN0aW9uYWxpdHkgdGhyb3VnaCBzdGF0aWMgbWVtYmVycy4gSXQgaXMgbm90IGludGVuZGVkCi0gKiB0byBiZSBpbnN0YW50aWF0ZWQgb3Igc3ViY2xhc3NlZC4KLSAqIDwvcD4KLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBNb25pdG9yQ29yZSB7Ci0JcHJpdmF0ZSBzdGF0aWMgTW9uaXRvck1hbmFnZXIgbWFuYWdlcjsKLQkKLQkvKioKLQkgKiBDYW5ub3QgY3JlYXRlIE1vbml0b3JDb3JlIC0gdXNlIHN0YXRpYyBtZXRob2RzLgotCSAqLwotCXByaXZhdGUgTW9uaXRvckNvcmUoKSB7Ci0JCS8vIGNhbid0IGNyZWF0ZQotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgbW9uaXRvciBtYW5hZ2VyIGluc3RhbmNlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1vbml0b3IgbWFuYWdlcgotCSAqLwotCXByaXZhdGUgc3RhdGljIE1vbml0b3JNYW5hZ2VyIGdldE1hbmFnZXIoKSB7Ci0JCWlmIChtYW5hZ2VyID09IG51bGwpCi0JCQltYW5hZ2VyID0gTW9uaXRvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKTsKLQkJcmV0dXJuIG1hbmFnZXI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGxpc3Qgb2YgYWxsIGtub3duIG1vbml0b3IgaW5zdGFuY2VzLiBUaGUgbGlzdCB3aWxsIG5vdCBjb250YWluIGFueQotCSAqIHdvcmtpbmcgY29waWVzIGFuZCBpcyBwZXJzaXN0ZWQgYmV0d2VlbiB3b3JrYmVuY2ggc2Vzc2lvbnMuCi0JICogPHA+Ci0JICogQSBuZXcgYXJyYXkgaXMgcmV0dXJuZWQgb24gZWFjaCBjYWxsOyBjbGllbnRzIG1heSBzYWZlbHkgc3RvcmUgb3IgbW9kaWZ5IHRoZSByZXN1bHQuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gYSBwb3NzaWJseS1lbXB0eSBhcnJheSBvZiBtb25pdG9yIGluc3RhbmNlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgSU1vbml0b3JbXSBnZXRNb25pdG9ycygpIHsKLQkJTGlzdCBsaXN0ID0gZ2V0TWFuYWdlcigpLmdldE1vbml0b3JzKCk7Ci0JCUlNb25pdG9yW10gbSA9IG5ldyBJTW9uaXRvcltsaXN0LnNpemUoKV07Ci0JCWxpc3QudG9BcnJheShtKTsKLQkJcmV0dXJuIG07Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBtb25pdG9yIHdvcmtpbmcgY29weS4gQWZ0ZXIgY29uZmlndXJpbmcgcGFyYW1ldGVycyBvbgotCSAqIHRoZSB3b3JraW5nIGNvcHksIGNhbGxpbmcge0BsaW5rIElNb25pdG9yV29ya2luZ0NvcHkjc2F2ZSgpfSBicmluZ3MKLQkgKiB0aGUgbW9uaXRvciBpbnRvIGV4aXN0ZW5jZS4KLQkgKiA8cD4KLQkgKiBOb3RlIHRoYXQgdGhlIGNsaWVudCBpcyByZXNwb25zaWJsZSBmb3IgY2FsbGluZyB7QGxpbmsgSU1vbml0b3IjZGVsZXRlKCl9Ci0JICogdG8gZGVsZXRlIHRoZSBtb25pdG9yIG9uY2UgaXQgaXMgbm8gbG9uZ2VyIG5lZWRlZC4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogV2hlbiBtb25pdG9ycyBhcmUgY3JlYXRlZCwgdGhlIGxvY2FsIGFuZCByZW1vdGUgcG9ydCB2YWx1ZXMgZGVmYXVsdCB0bwotCSAqIDxjb2RlPjgwPC9jb2RlPiwgYnV0IHRoZXkgZG8gbm90IGhhdmUgYSBwcm90b2NvbCBvciByZW1vdGUgaG9zdCAodmFsdWVzCi0JICogYXJlIDxjb2RlPm51bGw8L2NvZGU+KS4KLQkgKiA8L3A+IAotCSAqIAotCSAqIEByZXR1cm4gYSBtb25pdG9yIHdvcmtpbmcgY29weQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSU1vbml0b3JXb3JraW5nQ29weSBjcmVhdGVNb25pdG9yKCkgewotCQlyZXR1cm4gZ2V0TWFuYWdlcigpLmNyZWF0ZU1vbml0b3IoKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgbW9uaXRvciBsaXN0ZW5lci4KLQkgKiBPbmNlIHJlZ2lzdGVyZWQsIGEgbGlzdGVuZXIgc3RhcnRzIHJlY2VpdmluZyBub3RpZmljYXRpb24gb2YgCi0JICogY2hhbmdlcyB0byB0aGUgbW9uaXRvcnMuIFRoZSBsaXN0ZW5lciBjb250aW51ZXMgdG8gcmVjZWl2ZQotCSAqIG5vdGlmaWNhdGlvbnMgdW50aWwgaXQgaXMgcmVtb3ZlZC4KLQkgKiBIYXMgbm8gZWZmZWN0IGlmIGFuIGlkZW50aWNhbCBsaXN0ZW5lciBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQuCi0JICoKLQkgKiBAcGFyYW0gbGlzdGVuZXIgdGhlIG1vbml0b3IgbGlzdGVuZXIKLQkgKiBAc2VlICNyZW1vdmVNb25pdG9yTGlzdGVuZXIoSU1vbml0b3JMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkTW9uaXRvckxpc3RlbmVyKElNb25pdG9yTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGxpc3RlbmVyID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCWdldE1hbmFnZXIoKS5hZGRNb25pdG9yTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIGdpdmVuIG1vbml0b3IgbGlzdGVuZXIuIEhhcyBubwotCSAqIGVmZmVjdCBpZiB0aGUgbGlzdGVuZXIgaXMgbm90IHJlZ2lzdGVyZWQuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyIHRoZSBsaXN0ZW5lcgotCSAqIEBzZWUgI2FkZE1vbml0b3JMaXN0ZW5lcihJTW9uaXRvckxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVNb25pdG9yTGlzdGVuZXIoSU1vbml0b3JMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAobGlzdGVuZXIgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJZ2V0TWFuYWdlcigpLnJlbW92ZU1vbml0b3JMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL1JlcXVlc3QuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9tb25pdG9yY29yZS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL1JlcXVlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjY2ZDkyZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9SZXF1ZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi2gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbDsKLQotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwuTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLlRyYWNlOwotLyoqCi0gKiBSZXByZXNlbnRzIGEgVENQL0lQIHJlcXVlc3QgbWFkZSBiZXR3ZWVuIHRoZSBjbGllbnQgYW5kIHRoZSBzZXJ2ZXIuCi0gKiBFYWNoIHJlcXVlc3QgcmVwcmVzZW50cyBhIHJlcXVlc3QtcmVzcG9uc2UgcGFpciwgd2hlcmUgdGhlIHJlcXVlc3QKLSAqIGlzIGZyb20gY2xpZW50IC0+IHNlcnZlciwgYW5kIHRoZSByZXNwb25zZSBpcyBmcm9tIHNlcnZlciAtPiBjbGllbnQuCi0gKiA8cD4KLSAqIFJlcXVlc3RzIGFyZSBjcmVhdGVkIGJ5IGEgcnVubmluZyBtb25pdG9yLiBUaGV5IGRvIG5vdCBoYXZlIGEgcmVmZXJlbmNlCi0gKiBiYWNrIHRvIHRoZSBtb25pdG9yIGJlY2F1c2UgdGhlIG1vbml0b3IgbWF5IGhhdmUgYmVlbiBkZWxldGVkIG9yIG1vZGlmaWVkCi0gKiBzaW5jZSB0aGUgcmVxdWVzdCB3YXMgY3JlYXRlZC4KLSAqIDwvcD4KLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgaXMgaW50ZW5kZWQgdG8gYmUgZXh0ZW5kZWQgb25seSBieSBjbGllbnRzCi0gKiB0byBleHRlbmQgdGhlIDxjb2RlPnByb3RvY29sQWRhcHRlcnM8L2NvZGU+IGV4dGVuc2lvbiBwb2ludC4gCi0gKiA8L3A+Ci0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUmVxdWVzdCBpbXBsZW1lbnRzIElBZGFwdGFibGUgewotCXByb3RlY3RlZCBNb25pdG9yIG1vbml0b3I7Ci0JcHJvdGVjdGVkIERhdGUgZGF0ZTsKLQlwcm90ZWN0ZWQgbG9uZyByZXNwb25zZVRpbWUgPSAtMTsKLQlwcm90ZWN0ZWQgaW50IGxvY2FsUG9ydDsKLQlwcm90ZWN0ZWQgU3RyaW5nIHJlbW90ZUhvc3Q7Ci0JcHJvdGVjdGVkIGludCByZW1vdGVQb3J0OwotCXByb3RlY3RlZCBieXRlW10gcmVxdWVzdDsKLQlwcm90ZWN0ZWQgYnl0ZVtdIHJlc3BvbnNlOwotCQotCXByb3RlY3RlZCBTdHJpbmcgbmFtZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIHByb3RvY29sSWQ7Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydGllcyBwcm9wZXJ0aWVzOwotCQotCS8qKgotCSAqIFJlcXVlc3QyIGNvbnRlbnQgdHlwZSAodmFsdWUgMSkgZm9yIHRoZSB0cmFuc3BvcnQgKGhlYWRlcikgb2YgYSByZXF1ZXN0Ci0JICogb3IgcmVzcG9uc2UuCi0JICogCi0JICogQHNlZSAjZ2V0UmVxdWVzdChpbnQpCi0JICogQHNlZSAjZ2V0UmVzcG9uc2UoaW50KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRSQU5TUE9SVCA9IDE7Ci0KLQkvKioKLQkgKiBSZXF1ZXN0MiBjb250ZW50IHR5cGUgKHZhbHVlIDIpIGZvciB0aGUgY29udGVudCAoYm9keSkgb2YgYSByZXF1ZXN0Ci0JICogb3IgcmVzcG9uc2UuCi0JICogCi0JICogQHNlZSAjZ2V0UmVxdWVzdChpbnQpCi0JICogQHNlZSAjZ2V0UmVzcG9uc2UoaW50KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTlRFTlQgPSAyOwotCi0JLyoqCi0JICogUmVxdWVzdDIgY29udGVudCB0eXBlICh2YWx1ZSAzKSBmb3IgdGhlIGVudGlyZSBjb250ZW50IG9mIGEgcmVxdWVzdAotCSAqIG9yIHJlc3BvbnNlLgotCSAqIAotCSAqIEBzZWUgI2dldFJlcXVlc3QoaW50KQotCSAqIEBzZWUgI2dldFJlc3BvbnNlKGludCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBTEwgPSAzOwotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IFJlcXVlc3QuCi0JICogCi0JICogQHBhcmFtIG1vbml0b3IgYSBtb25pdG9yCi0JICogQHBhcmFtIHByb3RvY29sSWQgdGhlIHByb3RvY29sIGlkCi0JICogQHBhcmFtIGxvY2FsUG9ydCBhIGxvY2FsIHBvcnQgbnVtYmVyCi0JICogQHBhcmFtIHJlbW90ZUhvc3QgYSByZW1vdGUgaG9zdG5hbWUKLQkgKiBAcGFyYW0gcmVtb3RlUG9ydCBhIHJlbW90ZSBwb3J0IG51bWJlcgotCSAqLwotCXB1YmxpYyBSZXF1ZXN0KE1vbml0b3IgbW9uaXRvciwgU3RyaW5nIHByb3RvY29sSWQsIGludCBsb2NhbFBvcnQsIFN0cmluZyByZW1vdGVIb3N0LCBpbnQgcmVtb3RlUG9ydCkgewotCQlzdXBlcigpOwotCQl0aGlzLm1vbml0b3IgPSBtb25pdG9yOwotCQl0aGlzLnByb3RvY29sSWQgPSBwcm90b2NvbElkOwotCQl0aGlzLmxvY2FsUG9ydCA9IGxvY2FsUG9ydDsKLQkJdGhpcy5yZW1vdGVIb3N0ID0gcmVtb3RlSG9zdDsKLQkJdGhpcy5yZW1vdGVQb3J0ID0gcmVtb3RlUG9ydDsKLQkJZGF0ZSA9IG5ldyBEYXRlKCk7Ci0JCXByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcygpOwotCQlpZiAobW9uaXRvciAhPSBudWxsKQotCQkJbW9uaXRvci5hZGRSZXF1ZXN0KHRoaXMpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHByb3RvY29sIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyB0aGlzIHJlcXVlc3QuCi0JICogCi0JICogQHJldHVybiB0aGUgcHJvdG9jb2wgaWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByb3RvY29sKCkgewotCQlyZXR1cm4gcHJvdG9jb2xJZDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0aW1lIHRoaXMgcmVxdWVzdCB3YXMgbWFkZS4KLQkgKgotCSAqIEByZXR1cm4gdGhlIHRpbWVzdGFtcAotCSAqLwotCXB1YmxpYyBEYXRlIGdldERhdGUoKSB7Ci0JCXJldHVybiBkYXRlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxvY2FsIChjbGllbnQpIHBvcnQuCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBsb2NhbCBwb3J0IG51bWJlcgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TG9jYWxQb3J0KCkgewotCQlyZXR1cm4gbG9jYWxQb3J0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlbW90ZSAoc2VydmVyKSBob3N0LgotCSAqCi0JICogQHJldHVybiB0aGUgcmVtb3RlIGhvc3QKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJlbW90ZUhvc3QoKSB7Ci0JCXJldHVybiByZW1vdGVIb3N0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlbW90ZSAoc2VydmVyKSBwb3J0LgotCSAqCi0JICogQHJldHVybiB0aGUgcmVtb3RlIHBvcnQgbnVtYmVyCi0JICovCi0JcHVibGljIGludCBnZXRSZW1vdGVQb3J0KCkgewotCQlyZXR1cm4gcmVtb3RlUG9ydDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZWxlY3RlZCBjb250ZW50IG9mIHRoZSByZXF1ZXN0IHBvcnRpb24gb2YgdGhpcyByZXF1ZXN0LgotCSAqIDxwPgotCSAqIFtpc3N1ZTogSSBkb24ndCBrbm93IGhvdyB0byBleHBsYWluIHRoaXMuIEZvciBiYXNpYyBUQ1AvSVAgcmVxdWVzdHMsCi0JICogZGlzdGluY3Rpb24gYmV0d2VlbiB0cmFuc3BvcnQgYW5kIGNvbnRlbnQgaXMgaWdub3JlZC4KLQkgKiBGb3IgSFRUUCByZXF1ZXN0cywgdGhpcyBUUkFOU1BPUlQgcmV0dXJucyBqdXN0IHRoZSBIVFRQIGhlYWRlciBhbmQgCi0JICogQ09OVEVOVCByZXR1cm5zIGp1c3QgdGhlIEhUVFAgYm9keSB3aXRob3V0IHRoZSBoZWFkZXJzLiBXaGF0IHdvdWxkCi0JICogaXQgbWVhbiBmb3Igb3RoZXIgcHJvdG9jb2xzPwotCSAqIDwvcD4KLQkgKgotCSAqIEBwYXJhbSB0eXBlIHRoZSBjb250ZW50IHR5cGU6IG9uZSBvZiB7QGxpbmsgI1RSQU5TUE9SVH0sCi0JICogICAge0BsaW5rICNDT05URU5UfSwgb3Ige0BsaW5rICNBTEx9Ci0JICogQHJldHVybiB0aGUgY29udGVudCBieXRlcwotCSAqLwotCXB1YmxpYyBieXRlW10gZ2V0UmVxdWVzdChpbnQgdHlwZSkgewotCQlyZXR1cm4gcmVxdWVzdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZWxlY3RlZCBjb250ZW50IG9mIHRoZSByZXNwb25zZSBwb3J0aW9uIG9mIHRoaXMgcmVxdWVzdC4KLQkgKiA8cD4KLQkgKiBbaXNzdWU6IEkgZG9uJ3Qga25vdyBob3cgdG8gZXhwbGFpbiB0aGlzLiBGb3IgYmFzaWMgVENQL0lQIHJlcXVlc3RzLAotCSAqIGRpc3RpbmN0aW9uIGJldHdlZW4gdHJhbnNwb3J0IGFuZCBjb250ZW50IGlzIGlnbm9yZWQuCi0JICogRm9yIEhUVFAgcmVxdWVzdHMsIHRoaXMgVFJBTlNQT1JUIHJldHVybnMganVzdCB0aGUgSFRUUCBoZWFkZXIgYW5kIAotCSAqIENPTlRFTlQgcmV0dXJucyBqdXN0IHRoZSBIVFRQIGJvZHkgd2l0aG91dCB0aGUgaGVhZGVycy4gV2hhdCB3b3VsZAotCSAqIGl0IG1lYW4gZm9yIG90aGVyIHByb3RvY29scz9dCi0JICogPC9wPgotCSAqCi0JICogQHBhcmFtIHR5cGUgdGhlIGNvbnRlbnQgdHlwZTogb25lIG9mIHtAbGluayAjVFJBTlNQT1JUfSwKLQkgKiAgICB7QGxpbmsgI0NPTlRFTlR9LCBvciB7QGxpbmsgI0FMTH0KLQkgKiBAcmV0dXJuIHRoZSBjb250ZW50IGJ5dGVzCi0JICovCi0JcHVibGljIGJ5dGVbXSBnZXRSZXNwb25zZShpbnQgdHlwZSkgewotCQlyZXR1cm4gcmVzcG9uc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2VydmVyJ3MgcmVzcG9uc2UgdGltZSBpbiBtaWxsaXNlY29uZHMuIElmIHRoZSByZXF1ZXN0Ci0JICogaGFzIG5vdCBiZWVuIGNvbXBsZXRlZCB5ZXQsIC0xIGlzIHJldHVybmVkLgotCSAqCi0JICogQHJldHVybiB0aGUgc2VydmVyJ3MgcmVzcG9uc2UgdGltZSwgb3IgLTEgaWYgdGhlcmUgaGFzIGJlZW4gbm8KLQkgKiAgICByZXNwb25zZSB5ZXQKLQkgKi8KLQlwdWJsaWMgbG9uZyBnZXRSZXNwb25zZVRpbWUoKSB7Ci0JCXJldHVybiByZXNwb25zZVRpbWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIG5hbWUgZm9yIHRoaXMgcmVxdWVzdC4KLQkgKgotCSAqIEByZXR1cm4gdGhlIG5hbWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCWlmIChuYW1lID09IG51bGwpCi0JCQlyZXR1cm4gZ2V0UmVtb3RlSG9zdCgpICsgIjoiICsgZ2V0UmVtb3RlUG9ydCgpOwotCQkKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIG5hbWUgb2YgdGhpcyByZXF1ZXN0LgotCSAqCi0JICogQHBhcmFtIG4gdGhlIG5hbWUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXROYW1lKFN0cmluZyBuKSB7Ci0JCW5hbWUgPSBuOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGdpdmVuIGtleS12YWx1ZSBwcm9wZXJ0eSBvbiB0aGlzIHJlcXVlc3QuIFRvIHJlbW92ZSBhIHByb3BlcnR5LAotCSAqIHNldCB0aGUgdmFsdWUgdG8gbnVsbC4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBpcyB0eXBpY2FsbHkgY2FsbGVkIGJ5IHByb3RvY29sIGFkYXB0ZXJzIHRvIGF0dGFjaCBwcm90b2NvbC0KLQkgKiBzcGVjaWZpYyBmaWVsZHMgdG8gdGhlIHJlcXVlc3QsIGJ1dCBpdCBtYXkgYmUgY2FsbGVkIGJ5IGFueSBjbGllbnQuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBrZXkgdGhlIGtleQotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUpIHsKLQkJdHJ5IHsKLQkJCWlmIChwcm9wZXJ0aWVzLmNvbnRhaW5zS2V5KGtleSkpCi0JCQkJcHJvcGVydGllcy5yZW1vdmUoa2V5KTsKLQkJCWlmICh2YWx1ZSAhPSBudWxsKQotCQkJCXByb3BlcnRpZXMucHV0KGtleSwgdmFsdWUpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IGFkZCBwcm9wZXJ0eSIsIGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5IHdpdGggdGhlIGdpdmVuIGtleSBmcm9tIHRoaXMgcmVxdWVzdC4KLQkgKiBJZiB0aGUga2V5IGRvZXMgbm90IGV4aXN0LCA8Y29kZT5udWxsPC9jb2RlPiBpcyByZXR1cm5lZC4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5IHRoZSBwcm9wZXJ0eSBrZXkgCi0JICogQHJldHVybiB0aGUgcHJvcGVydHkgdmFsdWUKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBrZXkpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBwcm9wZXJ0aWVzLmdldChrZXkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGQgdG8gdGhlIHJlcXVlc3QuCi0JICoKLQkgKiBAcGFyYW0gYWRkUmVxdWVzdCBieXRlW10KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRUb1JlcXVlc3QoYnl0ZVtdIGFkZFJlcXVlc3QpIHsKLQkJaWYgKGFkZFJlcXVlc3QgPT0gbnVsbCB8fCBhZGRSZXF1ZXN0Lmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuOwotCQotCQlpZiAocmVxdWVzdCA9PSBudWxsIHx8IHJlcXVlc3QubGVuZ3RoID09IDApIHsKLQkJCXNldFJlcXVlc3QoYWRkUmVxdWVzdCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkKLQkJaW50IHNpemUgPSByZXF1ZXN0Lmxlbmd0aCArIGFkZFJlcXVlc3QubGVuZ3RoOwotCQlieXRlW10gYiA9IG5ldyBieXRlW3NpemVdOwotCQlTeXN0ZW0uYXJyYXljb3B5KHJlcXVlc3QsIDAsIGIsIDAsIHJlcXVlc3QubGVuZ3RoKTsKLQkJU3lzdGVtLmFycmF5Y29weShhZGRSZXF1ZXN0LCAwLCBiLCByZXF1ZXN0Lmxlbmd0aCwgYWRkUmVxdWVzdC5sZW5ndGgpOwotCQlyZXF1ZXN0ID0gYjsKLQkJZmlyZUNoYW5nZWRFdmVudCgpOwotCX0KLQotCS8qKgotCSAqIEFkZCB0byB0aGUgcmVzcG9uc2UuCi0JICoKLQkgKiBAcGFyYW0gYWRkUmVzcG9uc2UgYnl0ZVtdCi0JICovCi0JcHVibGljIHZvaWQgYWRkVG9SZXNwb25zZShieXRlW10gYWRkUmVzcG9uc2UpIHsKLQkJaWYgKGFkZFJlc3BvbnNlID09IG51bGwgfHwgYWRkUmVzcG9uc2UubGVuZ3RoID09IDApCi0JCQlyZXR1cm47Ci0JCi0JCWlmIChyZXNwb25zZSA9PSBudWxsIHx8IHJlc3BvbnNlLmxlbmd0aCA9PSAwKSB7Ci0JCQlzZXRSZXNwb25zZShhZGRSZXNwb25zZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkKLQkJaW50IHNpemUgPSByZXNwb25zZS5sZW5ndGggKyBhZGRSZXNwb25zZS5sZW5ndGg7Ci0JCWJ5dGVbXSBiID0gbmV3IGJ5dGVbc2l6ZV07Ci0JCVN5c3RlbS5hcnJheWNvcHkocmVzcG9uc2UsIDAsIGIsIDAsIHJlc3BvbnNlLmxlbmd0aCk7Ci0JCVN5c3RlbS5hcnJheWNvcHkoYWRkUmVzcG9uc2UsIDAsIGIsIHJlc3BvbnNlLmxlbmd0aCwgYWRkUmVzcG9uc2UubGVuZ3RoKTsKLQkJcmVzcG9uc2UgPSBiOwotCQlmaXJlQ2hhbmdlZEV2ZW50KCk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSByZXF1ZXN0LgotCSAqCi0JICogQHBhcmFtIHJlcXVlc3QgYnl0ZVtdCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0UmVxdWVzdChieXRlW10gcmVxdWVzdCkgewotCQlpZiAocmVxdWVzdCA9PSBudWxsIHx8IHJlcXVlc3QubGVuZ3RoID09IDApCi0JCQlyZXR1cm47Ci0JCi0JCXRoaXMucmVxdWVzdCA9IHJlcXVlc3Q7Ci0JCW1vbml0b3IucmVxdWVzdENoYW5nZWQodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSByZXNwb25zZS4KLQkgKgotCSAqIEBwYXJhbSByZXNwb25zZSBieXRlW10KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRSZXNwb25zZShieXRlW10gcmVzcG9uc2UpIHsKLQkJaWYgKHJlc3BvbnNlID09IG51bGwgfHwgcmVzcG9uc2UubGVuZ3RoID09IDApCi0JCQlyZXR1cm47Ci0JCi0JCXRoaXMucmVzcG9uc2UgPSByZXNwb25zZTsKLQkJcmVzcG9uc2VUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBkYXRlLmdldFRpbWUoKTsKLQkJbW9uaXRvci5yZXF1ZXN0Q2hhbmdlZCh0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtb25pdG9yIHRoYXQgY3JlYXRlZCB0aGlzIHJlcXVlc3QuCi0JICogQ2hhbmdlIGV2ZW50cyB3aWxsIGJlIGZpcmVkIGZyb20gdGhpcyBtb25pdG9yLgotCSAqIDxwPgotCSAqIE5vdGUgdGhhdCB0aGUgbW9uaXRvciBtYXkgaGF2ZSBiZWVuIGVkaXR0ZWQgc2luY2UgdGhpcwotCSAqIHJlcXVlc3Qgd2FzIGNyZWF0ZWQsIHNvIHlvdSBjYW5ub3QgcmVseSBvbiB0aGUgbW9uaXRvcidzCi0JICogaG9zdG5hbWUgb3IgcG9ydCB2YWx1ZXMuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1vbml0b3IgdGhhdCBjcmVhdGVkIHRoaXMgcmVxdWVzdAotCSAqLwotCXB1YmxpYyBJTW9uaXRvciBnZXRNb25pdG9yKCkgewotCQlyZXR1cm4gbW9uaXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBGaXJlIGEgY2hhbmdlIGV2ZW50IHRvIG5vdGlmeSBtb25pdG9yIGxpc3RlbmVycyB0aGF0IHRoZSByZXF1ZXN0IGhhcyBjaGFuZ2VkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVDaGFuZ2VkRXZlbnQoKSB7Ci0JCWlmIChtb25pdG9yICE9IG51bGwpCi0JCQltb25pdG9yLnJlcXVlc3RDaGFuZ2VkKHRoaXMpOwotCX0KLQotCS8qKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZSNnZXRBZGFwdGVyKGphdmEubGFuZy5DbGFzcykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQlyZXR1cm4gUGxhdGZvcm0uZ2V0QWRhcHRlck1hbmFnZXIoKS5nZXRBZGFwdGVyKHRoaXMsIGFkYXB0ZXIpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwNWVkNTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPGh0bWw+Ci08aGVhZD4KLTxNRVRBIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi8uLi8uLi8uLi8uLi8vYXBpc3R5bGVzLmNzcyIgdHlwZT0idGV4dC9jc3MiPgotPHRpdGxlPldUUCBBUEkgb3ZlcnZpZXc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci08cD5UaGlzIHBhY2thZ2UgZ2l2ZXMgY29yZSAobm9uLVVJKSBhY2Nlc3MgdG8gdGhlIFRDUC9JUCBtb25pdG9yLiBDbGllbnRzIGNhbgotcXVlcnkgZm9yIGV4aXN0aW5nIG1vbml0b3JzLCBjcmVhdGUgbmV3IG1vbml0b3JzLCBzdGFydC9zdG9wIG1vbml0b3JzLCBhbmQKLWxpc3RlbiBmb3IgcmVxdWVzdHMgYmVpbmcgcmVjZWl2ZWQgYnkgYSBydW5uaW5nIG1vbml0b3IuPC9wPgotPHRhYmxlIHdpZHRoPSI1MDAiPgotPHRyPgotPHRkPgotPHA+VGhlIE1vbml0b3JDb3JlIGNsYXNzIGdpdmVzIGluaXRpYWwgYWNjZXNzIHRvIGFsbCBvZiB0aGUgQVBJLiBGcm9tIGhlcmUgeW91Ci1jYW4gcXVlcnkgdGhlIGV4aXN0aW5nIG1vbml0b3JzLCBjcmVhdGUgbmV3IG9uZXMsIGFuZCBhZGQvcmVtb3ZlIGEgbGlzdGVuZXIgZm9yCi1tb25pdG9yIGNoYW5nZXMuPC9wPgotPC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPHRhYmxlIHdpZHRoPSI1MDAiPgotPHRyPgotPHRkPgotPHA+VGhlIElNb25pdG9yIGludGVyZmFjZSBwcm92aWRlcyBpbmZvcm1hdGlvbiBhYm91dCBhIHBhcnRpY3VsYXIgbW9uaXRvciwKLWFsbG93aW5nIHlvdSB0byBjaGFuZ2UgaXQgdmlhIGEgd29ya2luZyBjb3B5LCBzdGFydC9zdG9wIGl0LCBvciBhZGQgYSBsaXN0ZW5lcgotZm9yIHJlcXVlc3QgYWN0aXZpdHkuPC9wPgotPC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL21vbml0b3Jjb3JlL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcGFja2FnZS54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9wYWNrYWdlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y0ZTA0YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvbW9uaXRvcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9wYWNrYWdlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08aHRtbD4KLTxoZWFkPgotCTwhLS0gIEVzY2FwZSB0byB0aGUgcm9vdCBvZiB5b3VyIHNvdXJjZSBmb2xkZXIgIC0tPgotCTxtZXRhCi0JCW5hbWU9InJvb3QiCi0JCWNvbnRlbnQ9Ii4uLy4uLy4uLy4uLy4uLy4uLyIgLz4KLQk8dGl0bGU+V1RQIEFQSSBvdmVydmlldzwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5PgotCi0KLTxhYnN0cmFjdD5UaGlzIHBhY2thZ2UgZ2l2ZXMgY29yZSAobm9uLVVJKSBhY2Nlc3MgdG8gdGhlIFRDUC9JUCBtb25pdG9yLiBDbGllbnRzIGNhbgotcXVlcnkgZm9yIGV4aXN0aW5nIG1vbml0b3JzLCBjcmVhdGUgbmV3IG1vbml0b3JzLCBzdGFydC9zdG9wIG1vbml0b3JzLCBhbmQKLWxpc3RlbiBmb3IgcmVxdWVzdHMgYmVpbmcgcmVjZWl2ZWQgYnkgYSBydW5uaW5nIG1vbml0b3IuPC9hYnN0cmFjdD4KLQotPHA+VGhlIE1vbml0b3JDb3JlIGNsYXNzIGdpdmVzIGluaXRpYWwgYWNjZXNzIHRvIGFsbCBvZiB0aGUgQVBJLiBGcm9tIGhlcmUgeW91Ci1jYW4gcXVlcnkgdGhlIGV4aXN0aW5nIG1vbml0b3JzLCBjcmVhdGUgbmV3IG9uZXMsIGFuZCBhZGQvcmVtb3ZlIGEgbGlzdGVuZXIgZm9yCi1tb25pdG9yIGNoYW5nZXMuPC9wPgotCi08cD5UaGUgSU1vbml0b3IgaW50ZXJmYWNlIHByb3ZpZGVzIGluZm9ybWF0aW9uIGFib3V0IGEgcGFydGljdWxhciBtb25pdG9yLAotYWxsb3dpbmcgeW91IHRvIGNoYW5nZSBpdCB2aWEgYSB3b3JraW5nIGNvcHksIHN0YXJ0L3N0b3AgaXQsIG9yIGFkZCBhIGxpc3RlbmVyCi1mb3IgcmVxdWVzdCBhY3Rpdml0eS48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9wbHVnaW4ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBlNTI0Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcGx1Z2luTmFtZT1Nb25pdG9yCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotZXh0ZW5zaW9uUG9pbnRQcm90b2NvbEFkYXB0ZXJzPVByb3RvY29sIEFkYXB0ZXJzCi1leHRlbnNpb25Qb2ludENvbnRlbnRGaWx0ZXJzPUNvbnRlbnQgRmlsdGVycwotZXh0ZW5zaW9uUG9pbnRTdGFydHVwPVN0YXJ0dXAKLQotSFRUUD1IVFRQCi1UQ1BJUD1UQ1AvSVAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvcGx1Z2luLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTgyNWZhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLQotPHBsdWdpbj4KLQotPGV4dGVuc2lvbi1wb2ludCBuYW1lPSIlZXh0ZW5zaW9uUG9pbnRQcm90b2NvbEFkYXB0ZXJzIiBpZD0iaW50ZXJuYWxQcm90b2NvbEFkYXB0ZXJzIiBzY2hlbWE9InNjaGVtYS9wcm90b2NvbEFkYXB0ZXJzLmV4c2QiLz4KLTxleHRlbnNpb24tcG9pbnQgbmFtZT0iJWV4dGVuc2lvblBvaW50Q29udGVudEZpbHRlcnMiIGlkPSJpbnRlcm5hbENvbnRlbnRGaWx0ZXJzIiBzY2hlbWE9InNjaGVtYS9pbnRlcm5hbENvbnRlbnRGaWx0ZXJzLmV4c2QiLz4KLTxleHRlbnNpb24tcG9pbnQgbmFtZT0iJWV4dGVuc2lvblBvaW50U3RhcnR1cCIgaWQ9ImludGVybmFsU3RhcnR1cCIgc2NoZW1hPSJzY2hlbWEvc3RhcnR1cC5leHNkIi8+Ci0KLTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWxQcm90b2NvbEFkYXB0ZXJzIj4KLSAgPHByb3RvY29sQWRhcHRlcgotICAgIGlkPSJUQ1AvSVAiCi0gICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwuVENQSVBQcm90b2NvbEFkYXB0ZXIiCi0gICAgbmFtZT0iJVRDUElQIi8+Ci0gIDxwcm90b2NvbEFkYXB0ZXIKLSAgICBpZD0iSFRUUCIKLSAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5odHRwLkhUVFBQcm90b2NvbEFkYXB0ZXIiCi0gICAgbmFtZT0iJUhUVFAiLz4KLTwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvc2NoZW1hL2ludGVybmFsQ29udGVudEZpbHRlcnMuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9zY2hlbWEvaW50ZXJuYWxDb250ZW50RmlsdGVycy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmM2ZGFmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS9zY2hlbWEvaW50ZXJuYWxDb250ZW50RmlsdGVycy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUiIGlkPSJjb250ZW50RmlsdGVycyIgbmFtZT0iQ29udGVudCBGaWx0ZXJzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHVzZWQgdG8gZmlsdGVyIGNvbnRlbnQgcmVjZWl2ZWQgaW4gYSBtb25pdG9yLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJmaWx0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJmaWx0ZXIiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgbGFiZWxBdHRyaWJ1dGU9Im5hbWUiLz4KLSAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIHNwZWNpZmllcyBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIGV4dGVuc2lvbiBwb2ludAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIHNwZWNpZmllcyB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBKYXZhIGNsYXNzIHRoYXQgZXh0ZW5kcyAmbHQ7c2FtcCZndDtvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkNvbnRlbnRGaWx0ZXJEZWxlZ2F0ZSZsdDsvc2FtcCZndDsuCi1Db250ZW50IGZpbHRlciBpbnN0YW5jZXMgb2YgdGhpcyB0eXBlIHdpbGwgZGVsZWdhdGUgdG8gaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkNvbnRlbnRGaWx0ZXJEZWxlZ2F0ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSB0cmFuc2xhdGFibGUgbmFtZSB1c2VkIHRvIGlkZW50aWZ5IHRoZSBmaWx0ZXIKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJvcmRlciIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBpbnRlZ2VyIHVzZWQgdG8gb3JkZXIgZmlsdGVycyByZWxhdGl2ZSB0byBlYWNoIG90aGVyLiBMb3dlciBvcmRlcnMgYXJlIHByb2Nlc3NlZCBmaXJzdAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAxLjAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGEgY29udGVudCBmaWx0ZXIgZXh0ZW5zaW9uIHBvaW50OgotCi0mbHQ7cHJlJmd0OwotICAgJmx0O2V4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5jb250ZW50RmlsdGVyJnF1b3Q7Jmd0OwotICAgICAgJmx0O2ZpbHRlcgotICAgICAgICAgICAgaWQ9JnF1b3Q7Y29tLmV4YW1wbGUuRXhhbXBsZUlkZW50aWZpZXImcXVvdDsKLSAgICAgICAgICAgIG5hbWU9JnF1b3Q7JWV4YW1wbGVOYW1lJnF1b3Q7Ci0gICAgICAgICAgICBjbGFzcz0mcXVvdDtjb20uZXhhbXBsZS5FeGFtcGxlQ29udGVudEZpbHRlciZxdW90Oy8mZ3Q7Ci0gICAmbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgJmx0O2ImZ3Q7Y2xhc3MmbHQ7L2ImZ3Q7IG11c3QgYmUgYSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhIEphdmEgY2xhc3MgdGhhdCBleHRlbmRzIHRoZSBhYnN0cmFjdCBjbGFzcyAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkNvbnRlbnRGaWx0ZXJEZWxlZ2F0ZSZsdDsvY29kZSZndDsuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0gICAKLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL3NjaGVtYS9wcm90b2NvbEFkYXB0ZXJzLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvc2NoZW1hL3Byb3RvY29sQWRhcHRlcnMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTMwODFkMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvc2NoZW1hL3Byb3RvY29sQWRhcHRlcnMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/Pg0KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+DQotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUiPg0KLTxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUiIGlkPSJpbnRlcm5hbFByb3RvY29sQWRhcHRlcnMiIG5hbWU9IlByb3RvY29sIEFkYXB0ZXJzIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHVzZWQgdG8gcHJvdmlkZSBhbiBhZGFwdGVyIGZvciBhIG5ldyBwcm90b2NvbCAoZS5nLiBIVFRQKS4gVGhpcyBhbGxvd3MgZGlmZmVyZW50IHR5cGVzIG9mIHByb3RvY29scyB0byBiZSBtb25pdG9yZWQgaW4gYSBzcGVjaWZpYyB3YXkuDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJwcm90b2NvbEFkYXB0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4NCi0gICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9InByb3RvY29sQWRhcHRlciI+DQotICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgPGFwcEluZm8+DQotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCBsYWJlbEF0dHJpYnV0ZT0ibmFtZSIvPg0KLSAgICAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8L2Fubm90YXRpb24+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgZXh0ZW5zaW9uIHBvaW50DQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIHNwZWNpZmllcyB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIEphdmEgY2xhc3MgdGhhdCBleHRlbmRzICZsdDtzYW1wJmd0O29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwuUHJvdG9jb2xBZGFwdGVyRGVsZWdhdGUmbHQ7L3NhbXAmZ3Q7DQotUHJvdG9jb2wgYWRhcHRlciBpbnN0YW5jZXMgb2YgdGhpcyB0eXBlIHdpbGwgZGVsZWdhdGUgdG8gaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MuDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLlByb3RvY29sQWRhcHRlckRlbGVnYXRlIi8+DQotICAgICAgICAgICAgICAgPC9hcHBJbmZvPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYSB0cmFuc2xhdGFibGUgbmFtZSB1c2VkIHRvIGlkZW50aWZ5IHRoZSBwcm90b2NvbCBhZGFwdGVyDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuJmx0Oy9iJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgYSBwcm90b2NvbCBhZGFwdGVyIGV4dGVuc2lvbiBwb2ludCB0byBkZWZpbmUgYSBwcm90b2NvbCBhZGFwdGVyIGZvciBUQ1AvSVA6DQotDQotJmx0O3ByZSZndDsNCi0gICAmbHQ7ZXh0ZW5zaW9uIA0KLSAgICAgICAgIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUucHJvdG9jb2xBZGFwdGVycyZxdW90OyZndDsNCi0gICAgICAmbHQ7cHJvdG9jb2xBZGFwdGVyDQotICAgICAgICAgICAgaWQ9JnF1b3Q7VENQSVAmcXVvdDsNCi0gICAgICAgICAgICBjbGFzcz0mcXVvdDtjb20uZXhhbXBsZS5UQ1BJUFByb3RvY29sQWRhcHRlciZxdW90Ow0KLSAgICAgICAgICAgIG5hbWU9JnF1b3Q7JVRDUElQJnF1b3Q7LyZndDsNCi0gICAmbHQ7L2V4dGVuc2lvbiZndDsNCi0mbHQ7L3ByZSZndDsNCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBWYWx1ZSBvZiB0aGUgYXR0cmlidXRlICZsdDtiJmd0O2NsYXNzJmx0Oy9iJmd0OyBtdXN0IGJlIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBKYXZhIGNsYXNzIHRoYXQgZXh0ZW5kcyB0aGUgYWJzdHJhY3QgY2xhc3MgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5Qcm90b2NvbEFkYXB0ZXJEZWxlZ2F0ZSZsdDsvY29kZSZndDsuDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0gICANCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsNCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIA0KLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyANCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCANCi0mbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotPC9zY2hlbWE+DQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlL3NjaGVtYS9zdGFydHVwLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvc2NoZW1hL3N0YXJ0dXAuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGUzZWYxNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUvc2NoZW1hL3N0YXJ0dXAuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlIiBpZD0iaW50ZXJuYWxTdGFydHVwIiBuYW1lPSJTdGFydHVwIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHVzZWQgdG8gbG9hZCBhIHNlY29uZGFyeSBwbHVnaW4uIFRoZSBleHRlbnNpb24gcG9pbnQgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgbW9uaXRvciBjb3JlIHBsdWdpbiBzdGFydHMgdXAuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InN0YXJ0dXAiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJzdGFydHVwIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IGxhYmVsQXR0cmlidXRlPSJuYW1lIi8+Ci0gICAgICAgICA8L2FwcEluZm8+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBleHRlbnNpb24gcG9pbnQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwuSVN0YXJ0dXAiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O2ImZ3Q7VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgaW50ZXJuYWwgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBieSBhbnkgb3RoZXIgcGx1Z2lucy4mbHQ7L2ImZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiBhIHN0YXJ0dXAgZXh0ZW5zaW9uIHBvaW50OgotCi0mbHQ7cHJlJmd0OwotICAgJmx0O2V4dGVuc2lvbiAKLSAgICAgICAgIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwuc3RhcnR1cHMmcXVvdDsmZ3Q7Ci0gICAgICAmbHQ7c3RhcnR1cAotICAgICAgICAgICAgaWQ9JnF1b3Q7Y29tLmV4YW1wbGUubXlwbHVnaW4mcXVvdDsKLSAgICAgICAgICAgIGNsYXNzPSZxdW90O2NvbS5leGFtcGxlLm15cGx1Z2luLlN0YXJ0dXAmcXVvdDsvJmd0OwotICAgJmx0Oy9leHRlbnNpb24mZ3Q7Ci0mbHQ7L3ByZSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBpbnRlcm5hbCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGJ5IGFueSBvdGhlciBwbHVnaW5zLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotICAgCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0mbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU5MGZiNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9Im1vbml0b3J1aS8iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWViOGJkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotYmluCi1tb25pdG9ydWkuamFyCi1idWlsZC54bWwKLXRlbXAuZm9sZGVyCi1vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aV8zLjAuMC5qYXIKLUBkb3QKLXNyYy56aXAKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvLm9wdGlvbnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLy5vcHRpb25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODQxMmVhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSMgRGVidWdnaW5nIG9wdGlvbnMgZm9yIHRoZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aSBwbHVnaW4KLQotIyBUdXJuIG9uIGdlbmVyYWwgZGVidWdnaW5nCi1vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9kZWJ1Zz10cnVlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjgxMTczZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0NjllYzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC5Nb25pdG9yVUlQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwsCi0gb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwudmlldzt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLnZpZXdlcnM7eC1pbnRlcm5hbDo9dHJ1ZQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS51aS5pZGUsCi0gb3JnLmVjbGlwc2UudWksCi0gb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZQotRWNsaXBzZS1BdXRvU3RhcnQ6IHRydWUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvYWJvdXQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY2Yjk2Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+RmVicnVhcnkgMjQsIDIwMDU8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ1NDcyOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbAotYmluLmV4Y2x1ZGVzID0gYmluLyoqLFwKLSAgICAgICAgICAgICAgIEBkb3QvKiosXAotICAgICAgICAgICAgICAgdGVtcC5mb2xkZXIvKioKLXNyYy5pbmNsdWRlcyA9IHNjaGVtYS8KLXNvdXJjZS4uID0gbW9uaXRvcnVpLwotb3V0cHV0Li4gPSBiaW4vClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9pY29ucy9jbGNsMTYvY2xlYXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9pY29ucy9jbGNsMTYvY2xlYXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODk5NTRmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvY2xjbDE2L2NsZWFyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvY2xjbDE2L2h0dHBIZWFkZXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9pY29ucy9jbGNsMTYvaHR0cEhlYWRlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiMjBjMzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9pY29ucy9jbGNsMTYvaHR0cEhlYWRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL2NsY2wxNi9zb3J0UmVzcG9uc2VUaW1lLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvY2xjbDE2L3NvcnRSZXNwb25zZVRpbWUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzM0ZTlmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvY2xjbDE2L3NvcnRSZXNwb25zZVRpbWUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9pY29ucy9jdmlldzE2L21vbml0b3JWaWV3LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvY3ZpZXcxNi9tb25pdG9yVmlldy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNzRmMTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9pY29ucy9jdmlldzE2L21vbml0b3JWaWV3LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvZGxjbDE2L2NsZWFyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvZGxjbDE2L2NsZWFyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JmOThjMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL2RsY2wxNi9jbGVhci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL2RsY2wxNi9odHRwSGVhZGVyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvZGxjbDE2L2h0dHBIZWFkZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDcxYThiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvZGxjbDE2L2h0dHBIZWFkZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9pY29ucy9kbGNsMTYvc29ydFJlc3BvbnNlVGltZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL2RsY2wxNi9zb3J0UmVzcG9uc2VUaW1lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDZlMGM3My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL2RsY2wxNi9zb3J0UmVzcG9uc2VUaW1lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvZWxjbDE2L2NsZWFyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvZWxjbDE2L2NsZWFyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg5OTU0Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL2VsY2wxNi9jbGVhci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL2VsY2wxNi9odHRwSGVhZGVyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvZWxjbDE2L2h0dHBIZWFkZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjIwYzM4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvZWxjbDE2L2h0dHBIZWFkZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9pY29ucy9lbGNsMTYvcmVzZW5kUmVxdWVzdC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL2VsY2wxNi9yZXNlbmRSZXF1ZXN0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y2MmI2My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL2VsY2wxNi9yZXNlbmRSZXF1ZXN0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvZWxjbDE2L3NvcnRSZXNwb25zZVRpbWUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9pY29ucy9lbGNsMTYvc29ydFJlc3BvbnNlVGltZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzMzRlOWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9pY29ucy9lbGNsMTYvc29ydFJlc3BvbnNlVGltZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL2V0b29sMTYvZWRpdFJlcXVlc3QuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9pY29ucy9ldG9vbDE2L2VkaXRSZXF1ZXN0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA0NGU1OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL2V0b29sMTYvZWRpdFJlcXVlc3QuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9pY29ucy9ldmlldzE2L21vbml0b3JWaWV3LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvZXZpZXcxNi9tb25pdG9yVmlldy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNzRmMTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9pY29ucy9ldmlldzE2L21vbml0b3JWaWV3LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvb2JqMTYvaG9zdC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL29iajE2L2hvc3QuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTFhZTM5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvb2JqMTYvaG9zdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL29iajE2L21vbml0b3JPZmYuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9pY29ucy9vYmoxNi9tb25pdG9yT2ZmLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJlNWYzMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL29iajE2L21vbml0b3JPZmYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9pY29ucy9vYmoxNi9tb25pdG9yT24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9pY29ucy9vYmoxNi9tb25pdG9yT24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmYzOTc0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvb2JqMTYvbW9uaXRvck9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvb2JqMTYvdGNwLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvaWNvbnMvb2JqMTYvdGNwLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE2ZTIxOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL2ljb25zL29iajE2L3RjcC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9Db250ZXh0SWRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9Db250ZXh0SWRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmMWQxYzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvQ29udGV4dElkcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbDsKLS8qKgotICogQ29uc3RhbnQgaWRzIGZvciBjb250ZXh0IGhlbHAuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29udGV4dElkcyB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklFVyA9IE1vbml0b3JVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLnRtdncwMDAwIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSUVXX1RSRUUgPSBNb25pdG9yVUlQbHVnaW4uUExVR0lOX0lEICsgIi50bXZ3MDAwMiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklFV19SRVFVRVNUID0gTW9uaXRvclVJUGx1Z2luLlBMVUdJTl9JRCArICIudG12dzAwMDQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZJRVdfUkVTUE9OU0UgPSBNb25pdG9yVUlQbHVnaW4uUExVR0lOX0lEICsgIi50bXZ3MDAwNiI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGID0gTW9uaXRvclVJUGx1Z2luLlBMVUdJTl9JRCArICIudG1wcjAwMDAiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfU0hPVyA9IE1vbml0b3JVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLnRtcHIwMDAyIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX01PTklUT1JTID0gTW9uaXRvclVJUGx1Z2luLlBMVUdJTl9JRCArICIudG1wcjAwMDQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfRElBTE9HID0gTW9uaXRvclVJUGx1Z2luLlBMVUdJTl9JRCArICIudG1wcjAwMDYiOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL01lc3NhZ2VzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjNkNWNhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLaAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0vKioKLSAqIFRyYW5zbGF0ZWQgbWVzc2FnZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWRpdE1vbml0b3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgbmV3TW9uaXRvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsb2NhbFBvcnQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVtb3RlSG9zdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZW1vdGVQb3J0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbW90ZUdyb3VwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbm5lY3Rpb25UaW1lb3V0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhcnNlVHlwZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckRpYWxvZ1RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByZWZlcmVuY2VEZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmVmU2hvd1ZpZXc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgbW9uaXRvckxpc3Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29sdW1uU3RhdHVzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbHVtblJlbW90ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb2x1bW5UeXBlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbHVtbkxvY2FsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFkZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlZGl0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbW92ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzdGFydDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzdG9wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0YXJ0ZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3RvcHBlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBoZWFkZXJMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbWFnZVZpZXdJbnZhbGlkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHhtbFZpZXdJbnZhbGlkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGh0bWxWaWV3SW52YWxpZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2aWV3RGF0ZUZvcm1hdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2aWV3VGltZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2aWV3UmVzcG9uc2VUaW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZpZXdUeXBlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZpZXdSZXNwb25zZVRpbWVGb3JtYXQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmlld1NpemU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmlld1Jlc3BvbnNlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZpZXdSZXF1ZXN0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGlvblNvcnRCeVJlc3BvbnNlVGltZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2aWV3U2l6ZUZvcm1hdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpb25DbGVhclRvb2xUaXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aW9uU2hvd0hlYWRlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpb25Qcm9wZXJ0aWVzOwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhNb25pdG9yVUlQbHVnaW4uUExVR0lOX0lEICsgIi5pbnRlcm5hbC5NZXNzYWdlcyIsIE1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvTWVzc2FnZXMucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL01lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2YjRkNzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvTWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgLS0tLS0tLS0tLS0tLS0tIFRDUC9JUCBNb25pdG9yIHZpZXcgLS0tLS0tLS0tLS0tLS0tCi0KLSMgTGFiZWxzCi12aWV3UmVxdWVzdD1SZXF1ZXN0OiB7MH0KLXZpZXdSZXNwb25zZT1SZXNwb25zZTogezB9Ci12aWV3VGltZT1UaW1lIG9mIHJlcXVlc3Q6IHswfQotdmlld1R5cGU9VHlwZTogezB9Ci12aWV3UmVzcG9uc2VUaW1lPVJlc3BvbnNlIFRpbWU6IHswfQotdmlld1NpemU9U2l6ZTogezB9Ci12aWV3UmVzcG9uc2VUaW1lRm9ybWF0PXswfSBtcwotdmlld1NpemVGb3JtYXQ9ezB9ICh7MX0pIGJ5dGVzCi0KLSMgVGhlIGZvbGxvd2luZyBzdHJpbmcgYWxsb3dzIHlvdSB0byBjaGFuZ2UgdGhlIHRpbWUgZm9ybWF0IG9mIHRoZSBUQ1AvSVAgbW9uaXRvcgotIyB2aWV3LiBJdCB1c2VzIHRoZSBmb3JtYXR0aW5nIG9wdGlvbnMgZm91bmQgaW4gamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ6Ci0jICAgayAtIGhvdXIgaW4gZGF5LCBoIC0gaG91ciBpbiBhbS9wbSwgbSAtIG1pbnV0ZSwgcyAtIHNlY29uZCwgUyAtIG1pbGxpc2Vjb25kLAotIyAgIGEgLSBhbS9wbSBtYXJrZXIuIHVzZSBkdXBsaWNhdGUgY2hhcnMgKGUuZy4gJ21tJykgdG8gZmlsbCB3aXRoIHplcm9zIChpLmUuIAotIyAgICcwMScgaW5zdGVhZCBvZiAnMScpCi12aWV3RGF0ZUZvcm1hdD1oOm1tLnMuUyBhCi0KLSMgQWN0aW9ucwotYWN0aW9uU29ydEJ5UmVzcG9uc2VUaW1lPVNvcnQgQnkgUmVzcG9uc2UgVGltZQotYWN0aW9uQ2xlYXJUb29sVGlwPUNsZWFyCi1hY3Rpb25TaG93SGVhZGVyPVNob3cgSGVhZGVyCi1hY3Rpb25Qcm9wZXJ0aWVzPVByb3BlcnRpZXMKLQotCi0jIC0tLS0tLS0tLS0tLS0tLSBSZXF1ZXN0UmVzcG9uc2UgVmlld2VycyAtLS0tLS0tLS0tLS0tLS0KLWhlYWRlckxhYmVsPUhlYWRlcjogezB9Ci1pbWFnZVZpZXdJbnZhbGlkPTxOb3QgYSB2YWxpZCBpbWFnZSBmaWxlPgoteG1sVmlld0ludmFsaWQ9PE5vdCBhIHZhbGlkIFhNTCBmaWxlPgotaHRtbFZpZXdJbnZhbGlkPTxOb3QgYSB2YWxpZCBIVE1MIGZpbGU+Ci0KLSMgLS0tLS0tLS0tLS0tLS0tIEVycm9ycyAtLS0tLS0tLS0tLS0tLS0KLWVycm9yRGlhbG9nVGl0bGU9RXJyb3IKLQotIyAtLS0tLS0tLS0tLS0tLS0gR2VuZXJhbCBVSSAtLS0tLS0tLS0tLS0tLS0KLW1vbml0b3JMaXN0PVRDUC9JUCAmTW9uaXRvcnM6Ci1jb2x1bW5Mb2NhbD1Mb2NhbCBQb3J0Ci1jb2x1bW5SZW1vdGU9SG9zdCBuYW1lCi1jb2x1bW5UeXBlPVR5cGUKLWNvbHVtblN0YXR1cz1TdGF0dXMKLWFkZD0mQWRkLi4uCi1lZGl0PSZFZGl0Li4uCi1yZW1vdmU9JlJlbW92ZQotc3RhcnQ9JlN0YXJ0Ci1zdG9wPVMmdG9wCi1zdGFydGVkPVN0YXJ0ZWQKLXN0b3BwZWQ9U3RvcHBlZAotCi1uZXdNb25pdG9yPU5ldyBNb25pdG9yCi1lZGl0TW9uaXRvcj1FZGl0IE1vbml0b3IKLQotbG9jYWxQb3J0PSZMb2NhbCBtb25pdG9yaW5nIHBvcnQ6Ci1yZW1vdGVHcm91cD1Nb25pdG9yCi1yZW1vdGVIb3N0PSZIb3N0IG5hbWU6Ci1yZW1vdGVQb3J0PSZQb3J0OgotcGFyc2VUeXBlPSZUeXBlOgotY29ubmVjdGlvblRpbWVvdXQ9VCZpbWVvdXQgKGluIG1pbGxpc2Vjb25kcyk6Ci0KLXByZWZlcmVuY2VEZXNjcmlwdGlvbj1Db25maWd1cmUgVENQL0lQIG1vbml0b3JzIG9uIGxvY2FsIGFuZCByZW1vdGUgcG9ydHMuCi1wcmVmU2hvd1ZpZXc9UyZob3cgdGhlIFRDUC9JUCBNb25pdG9yIHZpZXcgd2hlbiB0aGVyZSBpcyBhY3Rpdml0eQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL01vbml0b3JDb250ZW50UHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL01vbml0b3JDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg3YjNjYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9Nb25pdG9yQ29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLk1vbml0b3JDb3JlOwotLyoqCi0gKiBNb25pdG9yIGNvbnRlbnQgcHJvdmlkZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBNb25pdG9yQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgewotCS8qKgotCSAqIE1vbml0b3JDb250ZW50UHJvdmlkZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgTW9uaXRvckNvbnRlbnRQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKgotCSAqIERpc3Bvc2VzIG9mIHRoaXMgY29udGVudCBwcm92aWRlci4gIAotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKgotCSAqIFJldHVybnMgdGhlIGVsZW1lbnRzIHRvIGRpc3BsYXkgaW4gdGhlIHZpZXdlciAKLQkgKiB3aGVuIGl0cyBpbnB1dCBpcyBzZXQgdG8gdGhlIGdpdmVuIGVsZW1lbnQuIAotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCXJldHVybiBNb25pdG9yQ29yZS5nZXRNb25pdG9ycygpOwotCX0KLQotCS8qCi0JICogTm90aWZpZXMgdGhpcyBjb250ZW50IHByb3ZpZGVyIHRoYXQgdGhlIGdpdmVuIHZpZXdlcidzIGlucHV0Ci0JICogaGFzIGJlZW4gc3dpdGNoZWQgdG8gYSBkaWZmZXJlbnQgZWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9Nb25pdG9yRGlhbG9nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9Nb25pdG9yRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MWEzYjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvTW9uaXRvckRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU3Bpbm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5JUHJvdG9jb2xBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vbml0b3JXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLk1vbml0b3JDb3JlOwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIE1vbml0b3JEaWFsb2cgZXh0ZW5kcyBEaWFsb2cgewotCXByb3RlY3RlZCBJTW9uaXRvcldvcmtpbmdDb3B5IG1vbml0b3I7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFZGl0OwotCQotCXByaXZhdGUgQnV0dG9uIG9rQnV0dG9uOwotCXByaXZhdGUgU3Bpbm5lciBtb25pdG9yUG9ydDsKLQotCWludGVyZmFjZSBTdHJpbmdNb2RpZnlMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIHZhbHVlQ2hhbmdlZChTdHJpbmcgcyk7Ci0JfQotCi0JaW50ZXJmYWNlIEJvb2xlYW5Nb2RpZnlMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIHZhbHVlQ2hhbmdlZChib29sZWFuIGIpOwotCX0KLQotCWludGVyZmFjZSBUeXBlTW9kaWZ5TGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCB2YWx1ZUNoYW5nZWQoSVByb3RvY29sQWRhcHRlciB0eXBlKTsKLQl9Ci0KLQlpbnRlcmZhY2UgSW50TW9kaWZ5TGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCB2YWx1ZUNoYW5nZWQoaW50IGkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBtb25pdG9yIGRpYWxvZy4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50U2hlbGwKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqLwotCXB1YmxpYyBNb25pdG9yRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBJTW9uaXRvcldvcmtpbmdDb3B5IG1vbml0b3IpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwpOwotCQl0aGlzLm1vbml0b3IgPSBtb25pdG9yOwotCQlpc0VkaXQgPSB0cnVlOwotCX0KLQkKLQlwdWJsaWMgTW9uaXRvckRpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCkgewotCQlzdXBlcihwYXJlbnRTaGVsbCk7Ci0JCW1vbml0b3IgPSBNb25pdG9yQ29yZS5jcmVhdGVNb25pdG9yKCk7Ci0JCWlzRWRpdCA9IGZhbHNlOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBzaGVsbCkgewotCQlzdXBlci5jb25maWd1cmVTaGVsbChzaGVsbCk7Ci0JCWlmIChpc0VkaXQpCi0JCQlzaGVsbC5zZXRUZXh0KE1lc3NhZ2VzLmVkaXRNb25pdG9yKTsKLQkJZWxzZQotCQkJc2hlbGwuc2V0VGV4dChNZXNzYWdlcy5uZXdNb25pdG9yKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIExhYmVsIGNyZWF0ZUxhYmVsKENvbXBvc2l0ZSBjb21wLCBTdHJpbmcgdHh0KSB7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbXAsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dCh0eHQpOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORyB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0NFTlRFUikpOwotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCQotCXByb3RlY3RlZCBUZXh0IGNyZWF0ZVRleHQoQ29tcG9zaXRlIGNvbXAsIFN0cmluZyB0eHQsIGZpbmFsIFN0cmluZ01vZGlmeUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWZpbmFsIFRleHQgdGV4dCA9IG5ldyBUZXh0KGNvbXAsIFNXVC5CT1JERVIpOwotCQlpZiAodHh0ICE9IG51bGwpCi0JCQl0ZXh0LnNldFRleHQodHh0KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIpOwotCQlkYXRhLndpZHRoSGludCA9IDE1MDsKLQkJdGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlpZiAobGlzdGVuZXIgIT0gbnVsbCkKLQkJCXRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewkKLQkJCQkJbGlzdGVuZXIudmFsdWVDaGFuZ2VkKHRleHQuZ2V0VGV4dCgpKTsKLQkJCQl9Ci0JCQl9KTsKLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JcHJvdGVjdGVkIFNwaW5uZXIgY3JlYXRlU3Bpbm5lcihDb21wb3NpdGUgY29tcCwgaW50IHYsIGZpbmFsIEludE1vZGlmeUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWZpbmFsIFNwaW5uZXIgcyA9IG5ldyBTcGlubmVyKGNvbXAsIFNXVC5CT1JERVIpOwotCQlzLnNldE1pbmltdW0oMCk7Ci0JCXMuc2V0TWF4aW11bShJbnRlZ2VyLk1BWF9WQUxVRSk7Ci0JCWlmICh2ICE9IC0xKQotCQkJcy5zZXRTZWxlY3Rpb24odik7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSKTsKLQkJZGF0YS53aWR0aEhpbnQgPSAxNTA7Ci0JCXMuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJaWYgKGxpc3RlbmVyICE9IG51bGwpCi0JCQlzLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsJCi0JCQkJCWxpc3RlbmVyLnZhbHVlQ2hhbmdlZChzLmdldFNlbGVjdGlvbigpKTsKLQkJCQl9Ci0JCQl9KTsKLQkJcmV0dXJuIHM7Ci0JfQotCi0JcHJvdGVjdGVkIENvbWJvIGNyZWF0ZVR5cGVDb21ibyhDb21wb3NpdGUgY29tcCwgZmluYWwgU3RyaW5nW10gdHlwZXMsIFN0cmluZyBzZWwsIGZpbmFsIFN0cmluZ01vZGlmeUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWZpbmFsIENvbWJvIGNvbWJvID0gbmV3IENvbWJvKGNvbXAsIFNXVC5EUk9QX0RPV04gfCBTV1QuUkVBRF9PTkxZKTsKLQkJaW50IHNpemUgPSB0eXBlcy5sZW5ndGg7Ci0JCVN0cmluZ1tdIGl0ZW1zID0gbmV3IFN0cmluZ1tzaXplXTsKLQkJaW50IGluZGV4ID0gLTE7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlpdGVtc1tpXSA9IHR5cGVzW2ldOwotCQkJaWYgKHR5cGVzW2ldLmVxdWFscyhzZWwpKQotCQkJCWluZGV4ID0gaTsKLQkJfQotCQljb21iby5zZXRJdGVtcyhpdGVtcyk7Ci0JCWlmIChpbmRleCA+PSAwKQotCQkJY29tYm8uc2VsZWN0KGluZGV4KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIpOwotCQlkYXRhLndpZHRoSGludCA9IDE1MDsKLQkJY29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJaWYgKGxpc3RlbmVyICE9IG51bGwpCi0JCQljb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewkKLQkJCQkJbGlzdGVuZXIudmFsdWVDaGFuZ2VkKHR5cGVzW2NvbWJvLmdldFNlbGVjdGlvbkluZGV4KCldKTsKLQkJCQl9Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJd2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCQkJfQotCQkJfSk7Ci0JCXJldHVybiBjb21ibzsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZyNjcmVhdGVEaWFsb2dBcmVhKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQkJKChHcmlkTGF5b3V0KWNvbXBvc2l0ZS5nZXRMYXlvdXQoKSkubnVtQ29sdW1ucyA9IDI7Ci0JCQotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNvbXBvc2l0ZSwgQ29udGV4dElkcy5QUkVGX0RJQUxPRyk7Ci0JCQotCQljcmVhdGVMYWJlbChjb21wb3NpdGUsIE1lc3NhZ2VzLmxvY2FsUG9ydCk7CQkKLQkJbW9uaXRvclBvcnQgPSBjcmVhdGVTcGlubmVyKGNvbXBvc2l0ZSwgbW9uaXRvci5nZXRMb2NhbFBvcnQoKSwgbmV3IEludE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgdmFsdWVDaGFuZ2VkKGludCBpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJbW9uaXRvci5zZXRMb2NhbFBvcnQoaSk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gaWdub3JlCi0JCQkJfQotCQkJCXZhbGlkYXRlRmllbGRzKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotCQlncm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJZ3JvdXAuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJZ3JvdXAuc2V0VGV4dChNZXNzYWdlcy5yZW1vdGVHcm91cCk7Ci0JCQotCQljcmVhdGVMYWJlbChncm91cCwgTWVzc2FnZXMucmVtb3RlSG9zdCk7CQkKLQkJY3JlYXRlVGV4dChncm91cCwgbW9uaXRvci5nZXRSZW1vdGVIb3N0KCksIG5ldyBTdHJpbmdNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHZhbHVlQ2hhbmdlZChTdHJpbmcgcykgewotCQkJCW1vbml0b3Iuc2V0UmVtb3RlSG9zdChzKTsKLQkJCQl2YWxpZGF0ZUZpZWxkcygpOwotCQkJfQotCQl9KTsKLQkJCi0JCWNyZWF0ZUxhYmVsKGdyb3VwLCBNZXNzYWdlcy5yZW1vdGVQb3J0KTsJCQotCQljcmVhdGVTcGlubmVyKGdyb3VwLCBtb25pdG9yLmdldFJlbW90ZVBvcnQoKSwgbmV3IEludE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgdmFsdWVDaGFuZ2VkKGludCBpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJbW9uaXRvci5zZXRSZW1vdGVQb3J0KGkpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIGlnbm9yZQotCQkJCX0KLQkJCQl2YWxpZGF0ZUZpZWxkcygpOwotCQkJfQotCQl9KTsKLQkJCi0JCWNyZWF0ZUxhYmVsKGdyb3VwLCBNZXNzYWdlcy5wYXJzZVR5cGUpOwkJCi0JCWNyZWF0ZVR5cGVDb21ibyhncm91cCwgbmV3IFN0cmluZ1tdIHsiVENQL0lQIiwiSFRUUCJ9LCBtb25pdG9yLmdldFByb3RvY29sKCksIG5ldyBTdHJpbmdNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHZhbHVlQ2hhbmdlZChTdHJpbmcgcHJvdG9jb2xJZCkgewotCQkJCW1vbml0b3Iuc2V0UHJvdG9jb2wocHJvdG9jb2xJZCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJY3JlYXRlTGFiZWwoZ3JvdXAsIE1lc3NhZ2VzLmNvbm5lY3Rpb25UaW1lb3V0KTsKLQkJY3JlYXRlU3Bpbm5lcihncm91cCwgbW9uaXRvci5nZXRUaW1lb3V0KCksIG5ldyBJbnRNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHZhbHVlQ2hhbmdlZChpbnQgaSkgewotCQkJCXRyeSB7Ci0JCQkJCW1vbml0b3Iuc2V0VGltZW91dChpKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkvLyBpZ25vcmUKLQkJCQl9Ci0JCQkJdmFsaWRhdGVGaWVsZHMoKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nI29rUHJlc3NlZCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkgewotCQl0cnkgewotCQkJbW9uaXRvci5zYXZlKCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcihnZXRTaGVsbCgpLCBNZXNzYWdlcy5lcnJvckRpYWxvZ1RpdGxlLCBjZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCksIGNlLmdldFN0YXR1cygpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5va1ByZXNzZWQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb250cm9sIGJ1dHRvbkNvbnRyb2wgPSBzdXBlci5jcmVhdGVCdXR0b25CYXIocGFyZW50KTsKLQkJdmFsaWRhdGVGaWVsZHMoKTsKLQkJcmV0dXJuIGJ1dHRvbkNvbnRyb2w7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldE9LQnV0dG9uRW5hYmxlZChib29sZWFuIGN1cklzRW5hYmxlZCkgewotCQlpZiAob2tCdXR0b24gPT0gbnVsbCkKLQkJCW9rQnV0dG9uID0gZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuT0tfSUQpOwotCQkKLQkJaWYgKG9rQnV0dG9uICE9IG51bGwpCi0JCQlva0J1dHRvbi5zZXRFbmFibGVkKGN1cklzRW5hYmxlZCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVGaWVsZHMoKSB7Ci0JCWlmIChtb25pdG9yUG9ydCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkKLQkJYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotCQlJU3RhdHVzIHN0YXR1cyA9IG1vbml0b3IudmFsaWRhdGUoKTsKLQkJaWYgKCFzdGF0dXMuaXNPSygpKQotCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCQotCQlzZXRPS0J1dHRvbkVuYWJsZWQocmVzdWx0KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvTW9uaXRvclByZWZlcmVuY2VQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9Nb25pdG9yUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA4NzQ2OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9Nb25pdG9yUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtbldlaWdodERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9uaXRvcldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuTW9uaXRvckNvcmU7Ci0vKioKLSAqIFRoZSBwcmVmZXJlbmNlIHBhZ2UgdGhhdCBob2xkcyBtb25pdG9yIHByb3BlcnRpZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBNb25pdG9yUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBQcmVmZXJlbmNlUGFnZSBpbXBsZW1lbnRzIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSB7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBkaXNwbGF5QnV0dG9uOwotCQotCXByb3RlY3RlZCBUYWJsZSB0YWJsZTsKLQlwcm90ZWN0ZWQgVGFibGVWaWV3ZXIgdGFibGVWaWV3ZXI7Ci0JCi0JcHJvdGVjdGVkIEJ1dHRvbiBlZGl0OwotCXByb3RlY3RlZCBCdXR0b24gcmVtb3ZlOwotCXByb3RlY3RlZCBCdXR0b24gc3RhcnQ7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBzdG9wOwotCQotCXByb3RlY3RlZCBMaXN0IHNlbGVjdGlvbjI7Ci0KLQkvKioKLQkgKiBNb25pdG9yUHJlZmVyZW5jZVBhZ2UgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgTW9uaXRvclByZWZlcmVuY2VQYWdlKCkgewotCQlzdXBlcigpOwotCQlub0RlZmF1bHRBbmRBcHBseUJ1dHRvbigpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSB0aGUgcHJlZmVyZW5jZSBvcHRpb25zLgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2wKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWluaXRpYWxpemVEaWFsb2dVbml0cyhwYXJlbnQpOwotCQkKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyg0KTsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IGNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscygzKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoY29tcG9zaXRlLCBDb250ZXh0SWRzLlBSRUYpOwotCQkKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuV1JBUCk7Ci0JCWxhYmVsLnNldFRleHQoTWVzc2FnZXMucHJlZmVyZW5jZURlc2NyaXB0aW9uKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORyk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQotCQlkaXNwbGF5QnV0dG9uID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0JCWRpc3BsYXlCdXR0b24uc2V0VGV4dChNZXNzYWdlcy5wcmVmU2hvd1ZpZXcpOwotCQlkaXNwbGF5QnV0dG9uLnNldFNlbGVjdGlvbihNb25pdG9yVUlQbHVnaW4uZ2V0U2hvd09uQWN0aXZpdHlQcmVmZXJlbmNlKCkpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWRpc3BsYXlCdXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChkaXNwbGF5QnV0dG9uLCBDb250ZXh0SWRzLlBSRUZfU0hPVyk7Ci0JCQotCQlsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dCgiIik7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCi0JCWxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULldSQVApOwotCQlsYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLm1vbml0b3JMaXN0KTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCi0JCXRhYmxlID0gbmV3IFRhYmxlKGNvbXBvc2l0ZSwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5NVUxUSSB8IFNXVC5GVUxMX1NFTEVDVElPTik7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0YWJsZSwgQ29udGV4dElkcy5QUkVGX01PTklUT1JTKTsKLQkJCi0JCXRhYmxlLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JCXRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQkJCi0JCVRhYmxlTGF5b3V0IHRhYmxlTGF5b3V0ID0gbmV3IFRhYmxlTGF5b3V0KCk7Ci0JCQotCQlUYWJsZUNvbHVtbiBzdGF0dXNDb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQkJc3RhdHVzQ29sdW1uLnNldFRleHQoTWVzc2FnZXMuY29sdW1uU3RhdHVzKTsKLQkJQ29sdW1uV2VpZ2h0RGF0YSBjb2xEYXRhID0gbmV3IENvbHVtbldlaWdodERhdGEoNiwgNjAsIHRydWUpOwotCQl0YWJsZUxheW91dC5hZGRDb2x1bW5EYXRhKGNvbERhdGEpOwotCQkKLQkJVGFibGVDb2x1bW4gcmVtb3RlQ29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCXJlbW90ZUNvbHVtbi5zZXRUZXh0KE1lc3NhZ2VzLmNvbHVtblJlbW90ZSk7Ci0JCWNvbERhdGEgPSBuZXcgQ29sdW1uV2VpZ2h0RGF0YSgxMiwgMTIwLCB0cnVlKTsKLQkJdGFibGVMYXlvdXQuYWRkQ29sdW1uRGF0YShjb2xEYXRhKTsKLQkJCi0JCVRhYmxlQ29sdW1uIGh0dHBDb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQkJaHR0cENvbHVtbi5zZXRUZXh0KE1lc3NhZ2VzLmNvbHVtblR5cGUpOwotCQljb2xEYXRhID0gbmV3IENvbHVtbldlaWdodERhdGEoNSwgNTUsIHRydWUpOwotCQl0YWJsZUxheW91dC5hZGRDb2x1bW5EYXRhKGNvbERhdGEpOwotCQkKLQkJVGFibGVDb2x1bW4gbG9jYWxDb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQkJbG9jYWxDb2x1bW4uc2V0VGV4dChNZXNzYWdlcy5jb2x1bW5Mb2NhbCk7Ci0JCWNvbERhdGEgPSBuZXcgQ29sdW1uV2VpZ2h0RGF0YSg1LCA1MCwgdHJ1ZSk7Ci0JCXRhYmxlTGF5b3V0LmFkZENvbHVtbkRhdGEoY29sRGF0YSk7Ci0JCQotCQl0YWJsZS5zZXRMYXlvdXQodGFibGVMYXlvdXQpOwotCQkKLQkJdGFibGVWaWV3ZXIgPSBuZXcgVGFibGVWaWV3ZXIodGFibGUpOwotCQl0YWJsZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IE1vbml0b3JDb250ZW50UHJvdmlkZXIoKSk7Ci0JCXRhYmxlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IE1vbml0b3JUYWJsZUxhYmVsUHJvdmlkZXIoKSk7Ci0JCXRhYmxlVmlld2VyLnNldElucHV0KCJyb290Iik7Ci0JCQotCQl0YWJsZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCXNldFNlbGVjdGlvbihldmVudC5nZXRTZWxlY3Rpb24oKSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJQ29tcG9zaXRlIGJ1dHRvbkNvbXAgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSAwOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKDMpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotCQlidXR0b25Db21wLnNldExheW91dChsYXlvdXQpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCk7Ci0JCWJ1dHRvbkNvbXAuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCi0JCUJ1dHRvbiBhZGQgPSBTV1RVdGlsLmNyZWF0ZUJ1dHRvbihidXR0b25Db21wLCBNZXNzYWdlcy5hZGQpOwotCQlhZGQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJTW9uaXRvckRpYWxvZyBkaWFsb2cgPSBuZXcgTW9uaXRvckRpYWxvZyhnZXRTaGVsbCgpKTsKLQkJCQlpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuQ0FOQ0VMKQotCQkJCQlyZXR1cm47Ci0JCQkJdGFibGVWaWV3ZXIucmVmcmVzaCgpOwotCQkJCQotCQkJCUlNb25pdG9yW10gbW9uaXRvcnMgPSBNb25pdG9yQ29yZS5nZXRNb25pdG9ycygpOwotCQkJCU9iamVjdCBtb25pdG9yID0gbW9uaXRvcnNbbW9uaXRvcnMubGVuZ3RoIC0gMV07Ci0JCQkJdGFibGVWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG1vbml0b3IpKTsKLQkJCX0KLQkJfSk7CQkKLQkJCi0JCWVkaXQgPSBTV1RVdGlsLmNyZWF0ZUJ1dHRvbihidXR0b25Db21wLCBNZXNzYWdlcy5lZGl0KTsKLQkJZWRpdC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJTW9uaXRvciBtb25pdG9yID0gKElNb25pdG9yKSBnZXRTZWxlY3Rpb24oKS5nZXQoMCk7Ci0JCQkJSU1vbml0b3JXb3JraW5nQ29weSB3YyA9IG1vbml0b3IuY3JlYXRlV29ya2luZ0NvcHkoKTsKLQkJCQkKLQkJCQlNb25pdG9yRGlhbG9nIGRpYWxvZyA9IG5ldyBNb25pdG9yRGlhbG9nKGdldFNoZWxsKCksIHdjKTsKLQkJCQlpZiAoZGlhbG9nLm9wZW4oKSAhPSBXaW5kb3cuQ0FOQ0VMKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQl0YWJsZVZpZXdlci5yZWZyZXNoKHdjLnNhdmUoKSk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCQkJLy8gaWdub3JlCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQllZGl0LnNldEVuYWJsZWQoZmFsc2UpOwotCQkKLQkJcmVtb3ZlID0gU1dUVXRpbC5jcmVhdGVCdXR0b24oYnV0dG9uQ29tcCwgTWVzc2FnZXMucmVtb3ZlKTsKLQkJcmVtb3ZlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZ2V0U2VsZWN0aW9uKCkuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCUlNb25pdG9yIG1vbml0b3IgPSAoSU1vbml0b3IpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCW1vbml0b3IuZGVsZXRlKCk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCQkJLy8gaWdub3JlCi0JCQkJCX0KLQkJCQkJdGFibGVWaWV3ZXIucmVtb3ZlKG1vbml0b3IpOwotCQkJCQkKLQkJCQkJSU1vbml0b3JbXSBtb25pdG9ycyA9IE1vbml0b3JDb3JlLmdldE1vbml0b3JzKCk7Ci0JCQkJCWlmIChtb25pdG9ycy5sZW5ndGggPiAwKSB7Ci0JCQkJCQlPYmplY3QgbW9uaXRvcjIgPSBtb25pdG9yc1ttb25pdG9ycy5sZW5ndGggLSAxXTsKLQkJCQkJCXRhYmxlVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihtb25pdG9yMikpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJcmVtb3ZlLnNldEVuYWJsZWQoZmFsc2UpOwotCQkKLQkJc3RhcnQgPSBTV1RVdGlsLmNyZWF0ZUJ1dHRvbihidXR0b25Db21wLCBNZXNzYWdlcy5zdGFydCk7Ci0JCWRhdGEgPSAoR3JpZERhdGEpIHN0YXJ0LmdldExheW91dERhdGEoKTsKLQkJZGF0YS52ZXJ0aWNhbEluZGVudCA9IDk7Ci0JCXN0YXJ0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZ2V0U2VsZWN0aW9uKCkuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCUlNb25pdG9yIG1vbml0b3IgPSAoSU1vbml0b3IpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCW1vbml0b3Iuc3RhcnQoKTsKLQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJCQlNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihnZXRTaGVsbCgpLCBNZXNzYWdlcy5lcnJvckRpYWxvZ1RpdGxlLCBjZS5nZXRTdGF0dXMoKS5nZXRNZXNzYWdlKCkpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gY2UpIHsKLQkJCQkJCU1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKGdldFNoZWxsKCksIE1lc3NhZ2VzLmVycm9yRGlhbG9nVGl0bGUsIGNlLmdldE1lc3NhZ2UoKSk7Ci0JCQkJCX0KLQkJCQkJdGFibGVWaWV3ZXIucmVmcmVzaChtb25pdG9yLCB0cnVlKTsKLQkJCQl9Ci0JCQkJdGFibGVWaWV3ZXIuc2V0U2VsZWN0aW9uKHRhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpKTsKLQkJCX0KLQkJfSk7Ci0JCXN0YXJ0LnNldEVuYWJsZWQoZmFsc2UpOwotCQkKLQkJc3RvcCA9IFNXVFV0aWwuY3JlYXRlQnV0dG9uKGJ1dHRvbkNvbXAsIE1lc3NhZ2VzLnN0b3ApOwotCQlzdG9wLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZ2V0U2VsZWN0aW9uKCkuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCUlNb25pdG9yIG1vbml0b3IgPSAoSU1vbml0b3IpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCW1vbml0b3Iuc3RvcCgpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkJCS8vIGlnbm9yZQotCQkJCQl9Ci0JCQkJCXRhYmxlVmlld2VyLnJlZnJlc2gobW9uaXRvciwgdHJ1ZSk7Ci0JCQkJfQotCQkJCXRhYmxlVmlld2VyLnNldFNlbGVjdGlvbih0YWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKSk7Ci0JCQl9Ci0JCX0pOwotCQlzdG9wLnNldEVuYWJsZWQoZmFsc2UpOwotCQkKLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChjb21wb3NpdGUpOwotCQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoaXMgcHJlZmVyZW5jZSBwYWdlIHVzaW5nIHRoZSBwYXNzZWQgd29ya2JlbmNoLgotCSAqCi0JICogQHBhcmFtIHdvcmtiZW5jaCB0aGUgY3VycmVudCB3b3JrYmVuY2gKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyBzcGVjaWFsIHByb2Nlc3Npbmcgd2hlbiB0aGlzIHBhZ2UncyBEZWZhdWx0cyBidXR0b24gaGFzIGJlZW4gcHJlc3NlZC4KLQkgKiA8cD4KLQkgKiBUaGlzIGlzIGEgZnJhbWV3b3JrIGhvb2sgbWV0aG9kIGZvciBzdWJsY2Fzc2VzIHRvIGRvIHNwZWNpYWwgdGhpbmdzIHdoZW4KLQkgKiB0aGUgRGVmYXVsdHMgYnV0dG9uIGhhcyBiZWVuIHByZXNzZWQuCi0JICogU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUsIGJ1dCBzaG91bGQgY2FsbCA8Y29kZT5zdXBlci5wZXJmb3JtRGVmYXVsdHM8L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCWRpc3BsYXlCdXR0b24uc2V0U2VsZWN0aW9uKE1vbml0b3JVSVBsdWdpbi5nZXREZWZhdWx0U2hvd09uQWN0aXZpdHlQcmVmZXJlbmNlKCkpOwotCQlzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLQl9Ci0KLQkvKiogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlUGFnZSNwZXJmb3JtT2soKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJTW9uaXRvclVJUGx1Z2luLnNldFNob3dPbkFjdGl2aXR5UHJlZmVyZW5jZShkaXNwbGF5QnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQkJTW9uaXRvclVJUGx1Z2luLmdldEluc3RhbmNlKCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwcm90ZWN0ZWQgTGlzdCBnZXRTZWxlY3Rpb24oKSB7Ci0JCXJldHVybiBzZWxlY3Rpb24yOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbDIpIHsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWwyOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IHNlbC5pdGVyYXRvcigpOwotCQlzZWxlY3Rpb24yID0gbmV3IEFycmF5TGlzdCgpOwotCQkKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJT2JqZWN0IG9iaiA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBJTW9uaXRvcikKLQkJCQlzZWxlY3Rpb24yLmFkZChvYmopOwotCQl9Ci0JCQotCQlpZiAoIXNlbGVjdGlvbjIuaXNFbXB0eSgpKSB7Ci0JCQlyZW1vdmUuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQotCQkJYm9vbGVhbiBhbGxTdG9wcGVkID0gdHJ1ZTsKLQkJCWJvb2xlYW4gYWxsU3RhcnRlZCA9IHRydWU7Ci0JCQkKLQkJCWl0ZXJhdG9yID0gc2VsZWN0aW9uMi5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCUlNb25pdG9yIG1vbml0b3IgPSAoSU1vbml0b3IpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZiAobW9uaXRvci5pc1J1bm5pbmcoKSkKLQkJCQkJYWxsU3RvcHBlZCA9IGZhbHNlOwotCQkJCWVsc2UKLQkJCQkJYWxsU3RhcnRlZCA9IGZhbHNlOwotCQkJfQotCQkJc3RhcnQuc2V0RW5hYmxlZChhbGxTdG9wcGVkKTsKLQkJCXN0b3Auc2V0RW5hYmxlZChhbGxTdGFydGVkKTsKLQkJCWVkaXQuc2V0RW5hYmxlZChzZWxlY3Rpb24yLnNpemUoKSA9PSAxICYmIGFsbFN0b3BwZWQpOwotCQl9IGVsc2UgewotCQkJZWRpdC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCXJlbW92ZS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCXN0YXJ0LnNldEVuYWJsZWQoZmFsc2UpOwotCQkJc3RvcC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXN1cGVyLmNyZWF0ZUNvbnRyb2wocGFyZW50KTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChnZXRDb250cm9sKCksIENvbnRleHRJZHMuUFJFRik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL01vbml0b3JUYWJsZUxhYmVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL01vbml0b3JUYWJsZUxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMwY2JiMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9Nb25pdG9yVGFibGVMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotLyoqCi0gKiBNb25pdG9yIHRhYmxlIGxhYmVsIHByb3ZpZGVyLgotICovCi1wdWJsaWMgY2xhc3MgTW9uaXRvclRhYmxlTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIgewotCS8qKgotCSAqIE1vbml0b3JUYWJsZUxhYmVsUHJvdmlkZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgTW9uaXRvclRhYmxlTGFiZWxQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI2FkZExpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElUYWJsZUxhYmVsUHJvdmlkZXIjZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0LCBpbnQpCi0JICovCi0JcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJaWYgKGNvbHVtbkluZGV4ID09IDApIHsKLQkJCUlNb25pdG9yIG1vbml0b3IgPSAoSU1vbml0b3IpIGVsZW1lbnQ7Ci0JCQlpZiAobW9uaXRvci5pc1J1bm5pbmcoKSkKLQkJCQlyZXR1cm4gTW9uaXRvclVJUGx1Z2luLmdldEltYWdlKE1vbml0b3JVSVBsdWdpbi5JTUdfTU9OSVRPUl9PTik7Ci0JCQlyZXR1cm4gTW9uaXRvclVJUGx1Z2luLmdldEltYWdlKE1vbml0b3JVSVBsdWdpbi5JTUdfTU9OSVRPUl9PRkYpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVRhYmxlTGFiZWxQcm92aWRlciNnZXRDb2x1bW5UZXh0KE9iamVjdCwgaW50KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCUlNb25pdG9yIG1vbml0b3IgPSAoSU1vbml0b3IpIGVsZW1lbnQ7Ci0JCWlmIChjb2x1bW5JbmRleCA9PSAwKSB7Ci0JCQlpZiAobW9uaXRvci5pc1J1bm5pbmcoKSkKLQkJCQlyZXR1cm4gTWVzc2FnZXMuc3RhcnRlZDsKLQkJCXJldHVybiBNZXNzYWdlcy5zdG9wcGVkOwotCQl9IGVsc2UgaWYgKGNvbHVtbkluZGV4ID09IDEpCi0JCQlyZXR1cm4gbW9uaXRvci5nZXRSZW1vdGVIb3N0KCkgKyAiOiIgKyBtb25pdG9yLmdldFJlbW90ZVBvcnQoKTsKLQkJZWxzZSBpZiAoY29sdW1uSW5kZXggPT0gMikKLQkJCXJldHVybiBtb25pdG9yLmdldFByb3RvY29sKCk7Ci0JCWVsc2UgaWYgKGNvbHVtbkluZGV4ID09IDMpCi0JCQlyZXR1cm4gbW9uaXRvci5nZXRMb2NhbFBvcnQoKSArICIiOwotCQllbHNlCi0JCQlyZXR1cm4gIlgiOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIG5vdE51bGwoU3RyaW5nIHMpIHsKLQkJaWYgKHMgPT0gbnVsbCkKLQkJCXJldHVybiAiIjsKLQkJCi0JCXJldHVybiBzOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjaXNMYWJlbFByb3BlcnR5KE9iamVjdCwgU3RyaW5nKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI3JlbW92ZUxpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvTW9uaXRvclVJUGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9Nb25pdG9yVUlQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFlMjM0MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9Nb25pdG9yVUlQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSCgKgotICogQ29udHJpYnV0b3JzOgotICogICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5UcmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwudmlldy5Nb25pdG9yVmlldzsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLS8qKgotICogVGhlIFRDUC9JUCBtb25pdG9yIFVJIHBsdWdpbi4KLSAqLwotcHVibGljIGNsYXNzIE1vbml0b3JVSVBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aSI7Ci0KLQlwcml2YXRlIHN0YXRpYyBNb25pdG9yVUlQbHVnaW4gc2luZ2xldG9uOwotCi0JcHJvdGVjdGVkIE1hcCBpbWFnZURlc2NyaXB0b3JzID0gbmV3IEhhc2hNYXAoKTsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgbGluZVNlcGFyYXRvciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKLQotCXByaXZhdGUgc3RhdGljIFVSTCBJQ09OX0JBU0VfVVJMOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVUkxfQ0xDTCA9ICJjbGNsMTYvIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMX0VMQ0wgPSAiZWxjbDE2LyI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTF9ETENMID0gImRsY2wxNi8iOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVUkxfT0JKID0gIm9iajE2LyI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRUxDTF9TT1JUX1JFU1BPTlNFX1RJTUUgPSAiSU1HX0VMQ0xfU09SVF9SRVNQT05TRV9USU1FIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRUxDTF9DTEVBUiA9ICJJTUdfRUxDTF9DTEVBUiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0VMQ0xfSFRUUF9IRUFERVIgPSAiSU1HX0VMQ0xfSFRUUF9IRUFERVIiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19DTENMX1NPUlRfUkVTUE9OU0VfVElNRSA9ICJJTUdfQ0xDTF9TT1JUX1JFU1BPTlNFX1RJTUUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19DTENMX0NMRUFSID0gIklNR19DTENMX0NMRUFSIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfQ0xDTF9IVFRQX0hFQURFUiA9ICJJTUdfQ0xDTF9IVFRQX0hFQURFUiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0RMQ0xfU09SVF9SRVNQT05TRV9USU1FID0gIklNR19ETENMX1NPUlRfUkVTUE9OU0VfVElNRSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0RMQ0xfQ0xFQVIgPSAiSU1HX0RMQ0xfQ0xFQVIiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19ETENMX0hUVFBfSEVBREVSID0gIklNR19ETENMX0hUVFBfSEVBREVSIjsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUkVRVUVTVF9SRVNQT05TRSA9ICJyZXF1ZXN0UmVzcG9uc2UiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19SRVNFTkRfUkVRVUVTVF9SRVNQT05TRSA9ICJyZXNlbmRSZXF1ZXN0UmVzcG9uc2UiOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19IT1NUID0gImhvc3QiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19NT05JVE9SX09OID0gIm1vbml0b3JPbiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX01PTklUT1JfT0ZGID0gIm1vbml0b3JPZmYiOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNIT1dfVklFV19PTl9BQ1RJVklUWSA9ICJzaG93LXZpZXciOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTSE9XX0hFQURFUiA9ICJzaG93LWhlYWRlciI7Ci0JCi0JcHJvdGVjdGVkIExpc3QgcmVxdWVzdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCi0JcHJvdGVjdGVkIElNb25pdG9yTGlzdGVuZXIgbW9uaXRvckxpc3RlbmVyID0gbmV3IElNb25pdG9yTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIG1vbml0b3JBZGRlZChJTW9uaXRvciBtb25pdG9yKSB7Ci0JCQltb25pdG9yLmFkZFJlcXVlc3RMaXN0ZW5lcihyZXF1ZXN0TGlzdGVuZXIpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgbW9uaXRvckNoYW5nZWQoSU1vbml0b3IgbW9uaXRvcikgewotCQkJLy8gaWdub3JlCi0JCX0KLQotCQlwdWJsaWMgdm9pZCBtb25pdG9yUmVtb3ZlZChJTW9uaXRvciBtb25pdG9yKSB7Ci0JCQltb25pdG9yLnJlbW92ZVJlcXVlc3RMaXN0ZW5lcihyZXF1ZXN0TGlzdGVuZXIpOwotCQl9Ci0JfTsKLQotCXByb3RlY3RlZCBJUmVxdWVzdExpc3RlbmVyIHJlcXVlc3RMaXN0ZW5lciA9IG5ldyBJUmVxdWVzdExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCByZXF1ZXN0QWRkZWQoSU1vbml0b3IgbW9uaXRvciwgUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQlhZGRSZXF1ZXN0KHJlcXVlc3QpOwotCQkJCi0JCQlpZiAoTW9uaXRvclZpZXcudmlldyAhPSBudWxsKQotCQkJCU1vbml0b3JWaWV3LnZpZXcuZG9SZXF1ZXN0QWRkZWQocmVxdWVzdCk7Ci0JCQllbHNlIGlmIChNb25pdG9yVUlQbHVnaW4uZ2V0U2hvd09uQWN0aXZpdHlQcmVmZXJlbmNlKCkpCi0JCQkJTW9uaXRvclZpZXcub3BlbihyZXF1ZXN0KTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlcXVlc3RDaGFuZ2VkKElNb25pdG9yIG1vbml0b3IsIFJlcXVlc3QgcmVxdWVzdCkgewotCQkJaWYgKE1vbml0b3JWaWV3LnZpZXcgIT0gbnVsbCkKLQkJCQlNb25pdG9yVmlldy52aWV3LmRvUmVxdWVzdENoYW5nZWQocmVxdWVzdCk7Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogTW9uaXRvclVJUGx1Z2luIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIE1vbml0b3JVSVBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJc2luZ2xldG9uID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuZCBwcmUtbG9hZHMgdGhlIGltYWdlIHJlZ2lzdHJ5LgotCSAqIAotCSAqIEByZXR1cm4gSW1hZ2VSZWdpc3RyeQotCSAqLwotCXByb3RlY3RlZCBJbWFnZVJlZ2lzdHJ5IGNyZWF0ZUltYWdlUmVnaXN0cnkoKSB7Ci0JCUltYWdlUmVnaXN0cnkgcmVnaXN0cnkgPSBzdXBlci5jcmVhdGVJbWFnZVJlZ2lzdHJ5KCk7Ci0KLQkJcmVnaXN0ZXJJbWFnZShyZWdpc3RyeSwgSU1HX1JFUVVFU1RfUkVTUE9OU0UsIFVSTF9PQkogKyAidGNwLmdpZiIpOwotCQlyZWdpc3RlckltYWdlKHJlZ2lzdHJ5LCBJTUdfUkVTRU5EX1JFUVVFU1RfUkVTUE9OU0UsIFVSTF9FTENMICsgInJlc2VuZFJlcXVlc3QuZ2lmIik7Ci0JCQotCQlyZWdpc3RlckltYWdlKHJlZ2lzdHJ5LCBJTUdfSE9TVCwgVVJMX09CSiArICJob3N0LmdpZiIpOwotCQlyZWdpc3RlckltYWdlKHJlZ2lzdHJ5LCBJTUdfTU9OSVRPUl9PTiwgVVJMX09CSiArICJtb25pdG9yT24uZ2lmIik7Ci0JCXJlZ2lzdGVySW1hZ2UocmVnaXN0cnksIElNR19NT05JVE9SX09GRiwgVVJMX09CSiArICJtb25pdG9yT2ZmLmdpZiIpOwotCi0JCXJlZ2lzdGVySW1hZ2UocmVnaXN0cnksIElNR19DTENMX0NMRUFSLCBVUkxfQ0xDTCArICJjbGVhci5naWYiKTsKLQkJcmVnaXN0ZXJJbWFnZShyZWdpc3RyeSwgSU1HX0NMQ0xfU09SVF9SRVNQT05TRV9USU1FLCBVUkxfQ0xDTCArICJzb3J0UmVzcG9uc2VUaW1lLmdpZiIpOwotCQlyZWdpc3RlckltYWdlKHJlZ2lzdHJ5LCBJTUdfQ0xDTF9IVFRQX0hFQURFUiwgVVJMX0NMQ0wgKyAiaHR0cEhlYWRlci5naWYiKTsKLQotCQlyZWdpc3RlckltYWdlKHJlZ2lzdHJ5LCBJTUdfRUxDTF9DTEVBUiwgVVJMX0VMQ0wgKyAiY2xlYXIuZ2lmIik7Ci0JCXJlZ2lzdGVySW1hZ2UocmVnaXN0cnksIElNR19FTENMX1NPUlRfUkVTUE9OU0VfVElNRSwgVVJMX0VMQ0wgKyAic29ydFJlc3BvbnNlVGltZS5naWYiKTsKLQkJcmVnaXN0ZXJJbWFnZShyZWdpc3RyeSwgSU1HX0VMQ0xfSFRUUF9IRUFERVIsIFVSTF9FTENMICsgImh0dHBIZWFkZXIuZ2lmIik7Ci0KLQkJcmVnaXN0ZXJJbWFnZShyZWdpc3RyeSwgSU1HX0RMQ0xfQ0xFQVIsIFVSTF9ETENMICsgImNsZWFyLmdpZiIpOwotCQlyZWdpc3RlckltYWdlKHJlZ2lzdHJ5LCBJTUdfRExDTF9TT1JUX1JFU1BPTlNFX1RJTUUsIFVSTF9ETENMICsgInNvcnRSZXNwb25zZVRpbWUuZ2lmIik7Ci0JCXJlZ2lzdGVySW1hZ2UocmVnaXN0cnksIElNR19ETENMX0hUVFBfSEVBREVSLCBVUkxfRExDTCArICJodHRwSGVhZGVyLmdpZiIpOwotCi0JCXJldHVybiByZWdpc3RyeTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGltYWdlIHdpdGggdGhlIGdpdmVuIGtleSBmcm9tIHRoZSBpbWFnZSByZWdpc3RyeS4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5IHRoZSBrZXkKLQkgKiBAcmV0dXJuIHRoZSBpbWFnZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW1hZ2UgZ2V0SW1hZ2UoU3RyaW5nIGtleSkgewotCQlyZXR1cm4gZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZVJlZ2lzdHJ5KCkuZ2V0KGtleSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbWFnZSB3aXRoIHRoZSBnaXZlbiBrZXkgZnJvbSB0aGUgaW1hZ2UgcmVnaXN0cnkuCi0JICogCi0JICogQHBhcmFtIGtleSB0aGUga2V5Ci0JICogQHJldHVybiBhbiBpbWFnZSBkZXNjcmlwdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBrZXkpIHsKLQkJdHJ5IHsKLQkJCWdldEluc3RhbmNlKCkuZ2V0SW1hZ2VSZWdpc3RyeSgpOwotCQkJcmV0dXJuIChJbWFnZURlc2NyaXB0b3IpIGdldEluc3RhbmNlKCkuaW1hZ2VEZXNjcmlwdG9ycy5nZXQoa2V5KTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoaXMgcGx1Z2luLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHBsdWdpbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTW9uaXRvclVJUGx1Z2luIGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gc2luZ2xldG9uOwotCX0KLQotCS8qKgotCSAqIFJlZ2lzdGVyIGFuIGltYWdlIHdpdGggdGhlIHJlZ2lzdHJ5LgotCSAqIAotCSAqIEBwYXJhbSBrZXkgdGhlIGtleQotCSAqIEBwYXJhbSBwYXJ0aWFsVVJMCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlZ2lzdGVySW1hZ2UoSW1hZ2VSZWdpc3RyeSByZWdpc3RyeSwgU3RyaW5nIGtleSwgU3RyaW5nIHBhcnRpYWxVUkwpIHsKLQkJaWYgKElDT05fQkFTRV9VUkwgPT0gbnVsbCkgewotCQkJU3RyaW5nIHBhdGhTdWZmaXggPSAiaWNvbnMvIjsKLQkJCUlDT05fQkFTRV9VUkwgPSBzaW5nbGV0b24uZ2V0QnVuZGxlKCkuZ2V0RW50cnkocGF0aFN1ZmZpeCk7Ci0JCX0KLQotCQl0cnkgewotCQkJSW1hZ2VEZXNjcmlwdG9yIGlkID0gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwobmV3IFVSTChJQ09OX0JBU0VfVVJMLCBwYXJ0aWFsVVJMKSk7Ci0JCQlyZWdpc3RyeS5wdXQoa2V5LCBpZCk7Ci0JCQlpbWFnZURlc2NyaXB0b3JzLnB1dChrZXksIGlkKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIHJlZ2lzdGVyaW5nIGltYWdlIiwgZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEFic3RyYWN0VUlQbHVnaW4jc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0KLQkJZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0RGVmYXVsdChNb25pdG9yVUlQbHVnaW4uU0hPV19WSUVXX09OX0FDVElWSVRZLCB0cnVlKTsKLQkJCi0JCU1vbml0b3JDb3JlLmFkZE1vbml0b3JMaXN0ZW5lcihtb25pdG9yTGlzdGVuZXIpOwotCQkKLQkJSU1vbml0b3JbXSBtb25pdG9ycyA9IE1vbml0b3JDb3JlLmdldE1vbml0b3JzKCk7Ci0JCWlmIChtb25pdG9ycyAhPSBudWxsKSB7Ci0JCQlpbnQgc2l6ZSA9IG1vbml0b3JzLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJbW9uaXRvcnNbaV0uYWRkUmVxdWVzdExpc3RlbmVyKHJlcXVlc3RMaXN0ZW5lcik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEFic3RyYWN0VUlQbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCQotCQlJTW9uaXRvcltdIG1vbml0b3JzID0gTW9uaXRvckNvcmUuZ2V0TW9uaXRvcnMoKTsKLQkJaWYgKG1vbml0b3JzICE9IG51bGwpIHsKLQkJCWludCBzaXplID0gbW9uaXRvcnMubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQltb25pdG9yc1tpXS5yZW1vdmVSZXF1ZXN0TGlzdGVuZXIocmVxdWVzdExpc3RlbmVyKTsKLQkJCX0KLQkJfQotCQkKLQkJTW9uaXRvckNvcmUucmVtb3ZlTW9uaXRvckxpc3RlbmVyKG1vbml0b3JMaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldERlZmF1bHRTaG93T25BY3Rpdml0eVByZWZlcmVuY2UoKSB7Ci0JCXJldHVybiBnZXRJbnN0YW5jZSgpLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldERlZmF1bHRCb29sZWFuKFNIT1dfVklFV19PTl9BQ1RJVklUWSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldFNob3dPbkFjdGl2aXR5UHJlZmVyZW5jZSgpIHsKLQkJcmV0dXJuIGdldEluc3RhbmNlKCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0Qm9vbGVhbihTSE9XX1ZJRVdfT05fQUNUSVZJVFkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRTaG93T25BY3Rpdml0eVByZWZlcmVuY2UoYm9vbGVhbiBiKSB7Ci0JCWdldEluc3RhbmNlKCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUoU0hPV19WSUVXX09OX0FDVElWSVRZLCBiKTsKLQkJZ2V0SW5zdGFuY2UoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0U2hvd0hlYWRlclByZWZlcmVuY2UoKSB7Ci0JCXJldHVybiBnZXRJbnN0YW5jZSgpLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldEJvb2xlYW4oU0hPV19IRUFERVIpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRTaG93SGVhZGVyUHJlZmVyZW5jZShib29sZWFuIGIpIHsKLQkJZ2V0SW5zdGFuY2UoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZShTSE9XX0hFQURFUiwgYik7Ci0JCWdldEluc3RhbmNlKCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBwYXJzZSB0aGUgZ2l2ZW4gYnl0ZXMgaW50byBTdHJpbmcgZm9ybS4gVGhlIGJ5dGVzCi0JICogYXJlIHBhcnNlZCBpbnRvIGEgbGluZSBkZWxpbWl0ZWQgc3RyaW5nLiBUaGUgYnl0ZSBhcnJheSBtdXN0IG5vdCBiZSBudWxsLgotCSAqIAotCSAqIEBwYXJhbSBiIGEgYnl0ZSBhcnJheQotCSAqIEByZXR1cm4gdGhlIHN0cmluZyBhZnRlciB0aGUgY29udmVyc2lvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhcnNlKGJ5dGVbXSBiKSB7Ci0JCWlmIChiID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0KLQkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmluID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGIpOwotCQlCdWZmZXJlZFJlYWRlciBiciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoYmluKSk7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJdHJ5IHsKLQkJCVN0cmluZyBzID0gYnIucmVhZExpbmUoKTsKLQkJCQotCQkJd2hpbGUgKHMgIT0gbnVsbCkgewotCQkJCXNiLmFwcGVuZChzKTsKLQkJCQlzID0gYnIucmVhZExpbmUoKTsKLQkJCQlpZiAocyAhPSBudWxsKQotCQkJCQlzYi5hcHBlbmQobGluZVNlcGFyYXRvcik7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBwYXJzaW5nIGlucHV0IiwgZSk7Ci0JCX0KLQkJCi0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgewotCQlpZiAoIXJlcXVlc3RzLmNvbnRhaW5zKHJlcXVlc3QpKQotCQkJcmVxdWVzdHMuYWRkKHJlcXVlc3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIHRoZSBjdXJyZW50IHJlcXVlc3RzLgotCSAqCi0JICogQHJldHVybiBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXB1YmxpYyBSZXF1ZXN0W10gZ2V0UmVxdWVzdHMoKSB7Ci0JCVJlcXVlc3RbXSByID0gbmV3IFJlcXVlc3RbcmVxdWVzdHMuc2l6ZSgpXTsKLQkJcmVxdWVzdHMudG9BcnJheShyKTsKLQkJcmV0dXJuIHI7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGNsZWFyUmVxdWVzdHMoKSB7Ci0JCXJlcXVlc3RzID0gbmV3IEFycmF5TGlzdCgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9SZXF1ZXN0QWN0aW9uRmlsdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9SZXF1ZXN0QWN0aW9uRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyYTkyN2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvUmVxdWVzdEFjdGlvbkZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5SZXF1ZXN0OwotLyoqCi0gKiBBbiBhY3Rpb24gZmlsdGVyIGZvciByZXF1ZXN0cy4KLSAqLwotcHVibGljIGNsYXNzIFJlcXVlc3RBY3Rpb25GaWx0ZXIgaW1wbGVtZW50cyBJQWN0aW9uRmlsdGVyewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUVVFU1RfU0VOVCA9ICJyZXF1ZXN0c2VudCI7Ci0KLQkvKioKLQkgKiBAc2VlIElBY3Rpb25GaWx0ZXIjdGVzdEF0dHJpYnV0ZShPYmplY3QsIFN0cmluZywgU3RyaW5nKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHRlc3RBdHRyaWJ1dGUoT2JqZWN0IHRhcmdldCwgU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgewotCQlSZXF1ZXN0IHJlcXVlc3QgPSAoUmVxdWVzdCkgdGFyZ2V0OwotCQlpZiAobmFtZS5lcXVhbHMoUkVRVUVTVF9TRU5UKSkgewotCQkJaWYgKHZhbHVlLmVxdWFscygidHJ1ZSIpKQotCQkJCXJldHVybiByZXF1ZXN0LmdldFJlc3BvbnNlVGltZSgpICE9IC0xOwotCQkJCi0JCQlyZXR1cm4gcmVxdWVzdC5nZXRSZXNwb25zZVRpbWUoKSA9PSAtMTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL1JlcXVlc3RBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvUmVxdWVzdEFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjN2Q2ODUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvUmVxdWVzdEFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRmlsdGVyOwotLyoqCi0gKiBBZGFwdGVyIGZhY3RvcnkgdG8gYWRhcHQgUmVxdWVzdHMgdG8gSUFjdGlvbkZpbHRlci4KLSAqLwotcHVibGljIGNsYXNzIFJlcXVlc3RBZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzIElBZGFwdGVyRmFjdG9yeSB7Ci0JcHJpdmF0ZSBSZXF1ZXN0QWN0aW9uRmlsdGVyIHJlcUFjdGlvbkZpbHRlciA9IG51bGw7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5I2dldEFkYXB0ZXIoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLkNsYXNzKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihPYmplY3QgYWRhcHRhYmxlT2JqZWN0LCBDbGFzcyBhZGFwdGVyVHlwZSkgewotCQlpZiAoYWRhcHRlclR5cGUgPT0gSUFjdGlvbkZpbHRlci5jbGFzcykgewotCQkJaWYgKHJlcUFjdGlvbkZpbHRlciA9PSBudWxsKSB7Ci0JCQkJcmVxQWN0aW9uRmlsdGVyID0gbmV3IFJlcXVlc3RBY3Rpb25GaWx0ZXIoKTsKLQkJCX0KLQkJCXJldHVybiByZXFBY3Rpb25GaWx0ZXI7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeSNnZXRBZGFwdGVyTGlzdCgpCi0JICovCi0JcHVibGljIENsYXNzW10gZ2V0QWRhcHRlckxpc3QoKSB7Ci0JCXJldHVybiBuZXcgQ2xhc3NbXSB7IElBY3Rpb25GaWx0ZXIuY2xhc3MgfTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvU1dUVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvU1dUVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzYyMmIzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL1NXVFV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udE1ldHJpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLS8qKgotICogU1dUIFV0aWxpdHkgY2xhc3MuCi0gKi8KLXB1YmxpYyBjbGFzcyBTV1RVdGlsIHsKLQlwcml2YXRlIHN0YXRpYyBGb250TWV0cmljcyBmb250TWV0cmljczsKLQotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBpbml0aWFsaXplRGlhbG9nVW5pdHMoQ29udHJvbCB0ZXN0Q29udHJvbCkgewotCQkvLyBDb21wdXRlIGFuZCBzdG9yZSBhIGZvbnQgbWV0cmljCi0JCUdDIGdjID0gbmV3IEdDKHRlc3RDb250cm9sKTsKLQkJZ2Muc2V0Rm9udChKRmFjZVJlc291cmNlcy5nZXREaWFsb2dGb250KCkpOwotCQlmb250TWV0cmljcyA9IGdjLmdldEZvbnRNZXRyaWNzKCk7Ci0JCWdjLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgd2lkdGggaGludCBmb3IgYSBidXR0b24gY29udHJvbC4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGludCBnZXRCdXR0b25XaWR0aEhpbnQoQnV0dG9uIGJ1dHRvbikgewotCQlpbnQgd2lkdGhIaW50ID0gRGlhbG9nLmNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKGZvbnRNZXRyaWNzLCBJRGlhbG9nQ29uc3RhbnRzLkJVVFRPTl9XSURUSCk7Ci0JCXJldHVybiBNYXRoLm1heCh3aWR0aEhpbnQsIGJ1dHRvbi5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIHRydWUpLngpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgYnV0dG9uIHdpdGggdGhlIHN0YW5kYXJkIHNpemUuCi0JICogCi0JICogQHBhcmFtIGNvbXAgdGhlIGNvbXBvbmVudCB0byBhZGQgdGhlIGJ1dHRvbiB0bwotCSAqIEBwYXJhbSBsYWJlbCB0aGUgYnV0dG9uIGxhYmVsCi0JICogQHJldHVybiBhIGJ1dHRvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQnV0dG9uIGNyZWF0ZUJ1dHRvbihDb21wb3NpdGUgY29tcCwgU3RyaW5nIGxhYmVsKSB7Ci0JCUJ1dHRvbiBiID0gbmV3IEJ1dHRvbihjb21wLCBTV1QuUFVTSCk7Ci0JCWIuc2V0VGV4dChsYWJlbCk7Ci0JCWlmIChmb250TWV0cmljcyA9PSBudWxsKQotCQkJaW5pdGlhbGl6ZURpYWxvZ1VuaXRzKGNvbXApOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyk7Ci0JCWRhdGEud2lkdGhIaW50ID0gZ2V0QnV0dG9uV2lkdGhIaW50KGIpOwotCQliLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXJldHVybiBiOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIEJ1dHRvbiBjcmVhdGVDaGVja2JveChDb21wb3NpdGUgY29tcCwgU3RyaW5nIHR4dCwgYm9vbGVhbiBpc1NlbGVjdGVkKXsKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcCwgU1dULkNIRUNLKTsKLQkJYnV0dG9uLnNldFRleHQodHh0KTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQljb21wLnNldExheW91dChsYXlvdXQpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyk7Ci0JCWRhdGEuaG9yaXpvbnRhbEluZGVudCA9IDEwOwotCQlidXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJYnV0dG9uLnNldFNlbGVjdGlvbihpc1NlbGVjdGVkKTsKLQkJcmV0dXJuIGJ1dHRvbjsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBMYWJlbCBjcmVhdGVMYWJlbChDb21wb3NpdGUgY29tcCwgU3RyaW5nIHR4dCkgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQodHh0KTsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpKTsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9TdGFydHVwLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9TdGFydHVwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiODNlMDAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvU3RhcnR1cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi2gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5JU3RhcnR1cDsKLS8qKgotICogU3RhcnR1cCBob29rLgotICovCi1wdWJsaWMgY2xhc3MgU3RhcnR1cCBpbXBsZW1lbnRzIElTdGFydHVwIHsKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLklTdGFydHVwI3N0YXJ0dXAoKQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0dXAoKSB7Ci0JCS8vIGRvIG5vdGhpbmcgLSBwbHVnaW4gbG9hZGluZyBpcyBlbm91Z2gKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9UcmFjZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvVHJhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRkMjMwYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC9UcmFjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbDsKLS8qKgotICogSGVscGVyIGNsYXNzIHRvIHJvdXRlIHRyYWNlIG91dHB1dC4KLSAqLwotcHVibGljIGNsYXNzIFRyYWNlIHsKLQlwdWJsaWMgc3RhdGljIGJ5dGUgQ09ORklHID0gMDsKLQlwdWJsaWMgc3RhdGljIGJ5dGUgV0FSTklORyA9IDE7Ci0JcHVibGljIHN0YXRpYyBieXRlIFNFVkVSRSA9IDI7Ci0JcHVibGljIHN0YXRpYyBieXRlIEZJTkVTVCA9IDM7Ci0KLQkvKioKLQkgKiBUcmFjZSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXByaXZhdGUgVHJhY2UoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCS8qKgotCSAqIFRyYWNlIHRoZSBnaXZlbiB0ZXh0LgotCSAqCi0JICogQHBhcmFtIGxldmVsIHRoZSB0cmFjZSBsZXZlbAotCSAqIEBwYXJhbSBzIGEgbWVzc2FnZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZShieXRlIGxldmVsLCBTdHJpbmcgcykgewotCQl0cmFjZShsZXZlbCwgcywgbnVsbCk7Ci0JfQotCQotCS8qKgotCSAqIFRyYWNlIHRoZSBnaXZlbiBtZXNzYWdlIGFuZCBleGNlcHRpb24uCi0JICoKLQkgKiBAcGFyYW0gbGV2ZWwgdGhlIHRyYWNlIGxldmVsCi0JICogQHBhcmFtIHMgYSBtZXNzYWdlCi0JICogQHBhcmFtIHQgYSB0aHJvd2FibGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2UoYnl0ZSBsZXZlbCwgU3RyaW5nIHMsIFRocm93YWJsZSB0KSB7Ci0JCWlmICghTW9uaXRvclVJUGx1Z2luLmdldEluc3RhbmNlKCkuaXNEZWJ1Z2dpbmcoKSkKLQkJCXJldHVybjsKLQotCQlTeXN0ZW0ub3V0LnByaW50bG4oTW9uaXRvclVJUGx1Z2luLlBMVUdJTl9JRCArICIgIiArIHMpOwotCQlpZiAodCAhPSBudWxsKQotCQkJdC5wcmludFN0YWNrVHJhY2UoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvQ29udGVudFZpZXdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvQ29udGVudFZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzQzNzhiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL0NvbnRlbnRWaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLaAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC5wcm92aXNpb25hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLS8qKgotICogRWRpdGFibGUgdmlld2VyIGZvciBkaXNwbGF5aW5nIGFuZCBlZGl0aW5nIHJlcXVlc3RzIGFuZCByZXNwb25zZXMuCi0gKiA8cD4KLSAqIFRoaXMgYWJzdHJhY3QgY2xhc3MgaXMgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZCBvbmx5IGJ5IGNsaWVudHMKLSAqIHRvIGV4dGVuZCB0aGUgPGNvZGU+Y29udGVudFZpZXdlcnM8L2NvZGU+IGV4dGVuc2lvbiBwb2ludC4KLSAqIFRoZSBzdWJjbGFzcyBtdXN0IGhhdmUgYSBwdWJsaWMgMC1hcmd1bWVudCBjb25zdHJ1Y3Rvciwgd2hpY2ggd2lsbCBiZSB1c2VkCi0gKiBhdXRvbWF0aWNhbGx5IHRvIGluc3RhbnRpYXRlIHRoZSB2aWV3ZXIgd2hlbiByZXF1aXJlZC4KLSAqIE9uY2UgaW5zdGFudGlhdGVkLCB7QGxpbmsgI2luaXQoQ29tcG9zaXRlKX0gaXMgY2FsbGVkIHRvIGNyZWF0ZQotICogdGhlIHZpZXdlcidzIGNvbnRyb2xzLiBUaGVuIHtAbGluayAjc2V0Q29udGVudChieXRlW10pfSBpcyBjYWxsZWQsCi0gKiBvbmUgb3IgbW9yZSB0aW1lcywgdG8gY2F1c2UgdGhlIHZpZXdlciB0byBkaXNwbGF5IHBhcnRpY3VsYXIKLSAqIGNvbnRlbnQuIEZpbmFsbHksIHdoZW4gdGhlIHZpZXdlciBpcyBubyBsb25nZXIgbmVlZGVkLCB7QGxpbmsgI2Rpc3Bvc2UoKX0KLSAqIGlzIGNhbGxlZCB0byBmcmVlIHVwIGFueSByZXNvdXJjZXMgdGllZCB1cCBieSB0aGUgdmlld2VyLgotICogPC9wPgotICogPHA+Ci0gKiBbaXNzdWU6IEl0J3MgdW5jbGVhciBob3cgdGhlc2UgY29udGVudCB2aWV3ZXJzIGFyZSB1c2VkLgotICogSXMgaXQganVzdCB0aGF0IHRoZSBVSSBwcm92aWRlcyBhIGxpc3Qgb2YgYXZhaWxhYmxlCi0gKiB2aWV3cyBmb3IgdGhlIHVzZXIgdG8gbWFrZSBhIG1hbnVhbCBzZWxlY3Rpb24gZnJvbSwgcmVnYXJkbGVzcwotICogb2YgdGhlIGFjdHVhbCBjb250ZW50IG9mIHRoZSBtZXNzYWdlIHRyYWZmaWM/XQotICogPC9wPgotICogW2lzc3VlOiBDUyAtIElmIGEgQ29udGVudFZpZXdlciBpcyBlZGl0YWJsZSwgZG9lcyB0aGF0IG1lYW4gd2UgY2FuIGVkaXQgdGhlIAotICogYnl0ZXMgb2YgdGhlIG1lc3NhZ2UgYW5kIHJlc2VuZCBpdCBhY3Jvc3MgdGhlIHdpcmU/ICBIb3cgaXMgYW4gZWRpdGFibGUgQ29udGVudFZpZXdlcgotICogaGFuZGxlZCBkaWZmZXJlbnRseSBieSB0aGUgZnJhbWV3b3JrPyBQZXJoYXBzIGFuIGV4YW1wbGUgb2Ygd2hhdCBhbiBlZGl0ZWFibGUgdmlld2VyIHdvdWxkIGRvLiBdCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIENvbnRlbnRWaWV3ZXIgewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29udGVudCB2aWV3ZXIgaW5zdGFuY2UuCi0JICovCi0JcHJvdGVjdGVkIENvbnRlbnRWaWV3ZXIoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBjb250cm9scyBmb3IgdGhpcyB2aWV3ZXIgYXMgY2hpbGRyZW4gb2YgdGhlIGdpdmVuIGNvbXBvc2l0ZS4KLQkgKiA8cD4KLQkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdGhpbmcuCi0JICogU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBpbml0KENvbXBvc2l0ZSBwYXJlbnQpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgY29udGVudCB0aGF0IHRoZSB2aWV3ZXIgc2hvdWxkIGRpc3BsYXkuCi0JICogVGhlIHBhcmFtZXRlciBtYXkgYmUgbnVsbCBpZiBubyBjb250ZW50IHNob3VsZCBiZSBkaXNwbGF5ZWQuCi0JICogPHA+Ci0JICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgZG9lcyBub3RoaW5nLgotCSAqIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBbaXNzdWU6IFNpbmNlIHRoaXMgaXMgZm9yIGRpc3BsYXlpbmcgcmVxdWVzdC1yZXBvbnNlIG1lc3NhZ2VzLAotCSAqIHdoeSBub3QgcGFzcyBhbiBSZXF1ZXN0PyBUaGUgcHJvYmxlbSBhcyBpdCBzdGFuZHMgbm93IGlzIHRoYXQKLQkgKiBpdCBpcyB1bmNsZWFyIGZyb20gc3BlY3MgaG93IGNvbnRlbnQgdmlld2VycyByZWxhdGUgdG8gYW55dGhpbmcKLQkgKiBlbHNlIGhhdmluZyB0byBkbyB3aXRoIHRoZSBtb25pdG9yLl0KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGIgdGhlIGNvbnRlbnQgdG8gZGlzcGxheSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8KLQkgKiBkaXNwbGF5IG5vdGhpbmcKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRDb250ZW50KGJ5dGVbXSBiKTsKLQotCS8qKgotCSAqIEdldCB0aGUgY29udGVudCBmcm9tIHRoZSB2aWV3ZXIuIFRoaXMgaXMgdXN1YWxseSBvbmx5IGludGVyZXN0aW5nIGlmIHRoZQotCSAqIGNvbnRlbnQgaGFzIGNoYW5nZWQuCi0JICogPHA+Ci0JICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgZG9lcyBub3RoaW5nIGFuZAotCSAqIHJldHVybnMgbnVsbC4gU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGNvbnRlbnQgZnJvbSB0aGUgdmlld2VyLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICovCi0JcHVibGljIGFic3RyYWN0IGJ5dGVbXSBnZXRDb250ZW50KCk7Ci0KLQkvKioKLQkgKiBEaXNwb3NlcyB0aGlzIHZpZXdlciBhbmQgYW55IHVuZGVybHlpbmcgcmVzb3VyY2VzIHN1Y2ggYXMgYSBjb21wb3NpdGUuCi0JICogVGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgd2hlbmV2ZXIgdGhlIHVzZXIgc3dpdGNoZXMgdG8gdXNlIGFub3RoZXIKLQkgKiB2aWV3ZXIgb3IgdGhlIG1vbml0b3IgdmlldyBpcyBjbG9zZWQuIFRoZSBwYXJlbnQgY29tcG9zaXRlIHNob3VsZCBub3QKLQkgKiBiZSBkaXNwb3NlZCBzaW5jZSBpdCBtYXkgYmUgdXNlZCB0byBkaXNwbGF5IGFub3RoZXIgdmlld2VyLiAKLQkgKiA8cD4KLQkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdGhpbmcuCi0JICogU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gcHJvdmlkZSBzcGVjaWFsaXplZCBjbGVhbnVwLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogU2V0IHdoZXRoZXIgdGhlIGN1cnJlbnQgdmlld2VyIGlzIGVkaXRhYmxlLCB0aGF0IGlzLCB0aGUgdXNlciBpcyBhYmxlIHRvCi0JICogZWRpdCB0aGUgY29udGVudC4KLQkgKiA8cD4KLQkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdGhpbmcuCi0JICogU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gYWxsb3dzIGluc3RhbmNlcwotCSAqIHRvIGJlIG1hZGUgZWRpdGFibGUuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBlZGl0YWJsZSA8Y29kZT50cnVlPC9jb2RlPiBpZiB0cnVlIHRoZSBjb250ZW50IGNhbiBiZSBlZGl0ZWQsCi0JICogICAgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFZGl0YWJsZShib29sZWFuIGVkaXRhYmxlKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGN1cnJlbnQgdmlld2VyIGlzIGVkaXRhYmxlLCB0aGF0IGlzLCB0aGUgdXNlciBpcyBhYmxlIHRvCi0JICogZWRpdCB0aGUgY29udGVudC4KLQkgKiA8cD4KLQkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdGhpbmcuCi0JICogU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gYWxsb3dzIGluc3RhbmNlcwotCSAqIHRvIGJlIG1hZGUgZWRpdGFibGUuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdHJ1ZSB0aGUgY29udGVudCBjYW4gYmUgZWRpdGVkLAotCSAqICAgIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0RWRpdGFibGUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvTW9uaXRvclVJQ29yZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvTW9uaXRvclVJQ29yZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZmI0MzUxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL01vbml0b3JVSUNvcmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotoCoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLnByb3Zpc2lvbmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLk1vbml0b3JVSVBsdWdpbjsKLS8qKgotICogTWFpbiBjbGFzcyBmb3IgYWNjZXNzIHRvIHRoZSBtb25pdG9yIFVJLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGFsbCBmdW5jdGlvbmFsaXR5IHRocm91Z2ggc3RhdGljIG1lbWJlcnMuIEl0IGlzIG5vdCBpbnRlbmRlZAotICogdG8gYmUgaW5zdGFudGlhdGVkIG9yIHN1YmNsYXNzZWQuCi0gKiA8L3A+Ci0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTW9uaXRvclVJQ29yZSB7Ci0JLyoqCi0JICogQ2Fubm90IGNyZWF0ZSBNb25pdG9yVUlDb3JlIC0gdXNlIHN0YXRpYyBtZXRob2RzLgotCSAqLwotCXByaXZhdGUgTW9uaXRvclVJQ29yZSgpIHsKLQkJLy8gY2FuJ3QgY3JlYXRlCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBhcnJheSBvZiB0aGUgcmVxdWVzdHMgY3VycmVudGx5IGJlaW5nIGRpc3BsYXllZCBpbiB0aGUgVENQL0lQCi0JICogbW9uaXRvciB2aWV3LgotCSAqCi0JICogQHJldHVybiBhbiBhcnJheSBvZiByZXF1ZXN0cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVxdWVzdFtdIGdldFJlcXVlc3RzKCkgewotCQlyZXR1cm4gTW9uaXRvclVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0UmVxdWVzdHMoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjhiNmMyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLTxodG1sPgotPGhlYWQ+Ci08TUVUQSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vLi4vLi4vLi4vLi4vL2FwaXN0eWxlcy5jc3MiIHR5cGU9InRleHQvY3NzIj4KLTx0aXRsZT5XVFAgQVBJIG92ZXJ2aWV3PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotPHA+VENQL0lQIG1vbml0b3IgVUk8L3A+Ci08dGFibGUgd2lkdGg9IjUwMCI+Ci08dHI+Ci08dGQ+Ci08cD5UaGUgQ29udGVudFZpZXdlciBjbGFzcyBpcyBwcm92aWRlZCB0bwotaW1wbGVtZW50IHRoZSB2aWV3ZXJzIGV4dGVuc2lvbiBwb2ludCB0aGF0IGFsbG93cyBleHRlcm5hbCBwbHVnaW5zIHRvIHByb3ZpZGUKLWEgdmlldyBmb3Igdmlld2luZyByZXF1ZXN0IGFuZCByZXNwb25zZSBkYXRhIGNvbnRlbnQgaW4gdGhlIG1vbml0b3Igdmlldy4KLTwvcD4KLTwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL3BhY2thZ2UueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcGFja2FnZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNDFhMjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcGFja2FnZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGh0bWw+Ci08aGVhZD4KLQk8IS0tICBFc2NhcGUgdG8gdGhlIHJvb3Qgb2YgeW91ciBzb3VyY2UgZm9sZGVyICAtLT4KLQk8bWV0YQotCQluYW1lPSJyb290IgotCQljb250ZW50PSIuLi8uLi8uLi8uLi8uLi8uLi8iIC8+Ci0JPHRpdGxlPldUUCBBUEkgb3ZlcnZpZXc8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keT4KLTxhYnN0cmFjdD5UQ1AvSVAgbW9uaXRvciBVSTwvYWJzdHJhY3Q+Ci0KLTxwPlRoZSBDb250ZW50Vmlld2VyIGNsYXNzIGlzIHByb3ZpZGVkIHRvCi1pbXBsZW1lbnQgdGhlIHZpZXdlcnMgZXh0ZW5zaW9uIHBvaW50IHRoYXQgYWxsb3dzIGV4dGVybmFsIHBsdWdpbnMgdG8gcHJvdmlkZQotYSB2aWV3IGZvciB2aWV3aW5nIHJlcXVlc3QgYW5kIHJlc3BvbnNlIGRhdGEgY29udGVudCBpbiB0aGUgbW9uaXRvciB2aWV3LgotPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvdmlldy9GaWx0ZXJBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL3ZpZXcvRmlsdGVyQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjNGQ4M2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvdmlldy9GaWx0ZXJBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwudmlldzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5JQ29udGVudEZpbHRlcjsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWx0ZXJBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotCXByb3RlY3RlZCBWaWV3ZXJNYW5hZ2VyIHZtOwotCXByb3RlY3RlZCBJQ29udGVudEZpbHRlciBmaWx0ZXI7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gZW5hYmxlZDsKLQotCXB1YmxpYyBGaWx0ZXJBY3Rpb24oVmlld2VyTWFuYWdlciB2bSwgSUNvbnRlbnRGaWx0ZXIgZmlsdGVyKSB7Ci0JCXN1cGVyKGZpbHRlci5nZXROYW1lKCksIElBY3Rpb24uQVNfQ0hFQ0tfQk9YKTsKLQkJdGhpcy52bSA9IHZtOwotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlpZiAoIWlzQ2hlY2tlZCgpKQotCQkJdm0ucmVtb3ZlRmlsdGVyKGZpbHRlcik7Ci0JCWVsc2UKLQkJCXZtLmFkZEZpbHRlcihmaWx0ZXIpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC92aWV3L01vZGlmeU1lc3NhZ2VBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL3ZpZXcvTW9kaWZ5TWVzc2FnZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWYwZjU4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL3ZpZXcvTW9kaWZ5TWVzc2FnZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC52aWV3OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5Nb25pdG9yTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLmh0dHAuUmVzZW5kSFRUUFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5SZXF1ZXN0OwotLyoqCi0gKiBNb2RpZnkgdGhlIHNlbGVjdGVkIG1lc3NhZ2UuIENyZWF0ZXMgYSBuZXcgcmVzZW5kcmVxdWVzdCBhbmQgYWRkcyBpdAotICogdG8gdGhlIHRyZWUuCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2RpZnlNZXNzYWdlQWN0aW9uIGltcGxlbWVudHMgSVZpZXdBY3Rpb25EZWxlZ2F0ZXsKLQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IG51bGw7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JVmlld0FjdGlvbkRlbGVnYXRlI2luaXQob3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVZpZXdQYXJ0IHZpZXcpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNydW4ob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCWlmIChzZWxlY3Rpb24gIT0gbnVsbCkgewotCQkJT2JqZWN0IGVsZW1lbnQgPSAoKFN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQlpZiAoZWxlbWVudCAhPSBudWxsICYmIGVsZW1lbnQgaW5zdGFuY2VvZiBSZXF1ZXN0KSB7Ci0JCQkJUmVxdWVzdCByZXEgPSAoUmVxdWVzdCkgZWxlbWVudDsKLQkJCQlSZXNlbmRIVFRQUmVxdWVzdCBuZXdSZXEgPSBNb25pdG9yTWFuYWdlci5jcmVhdGVSZXNlbmRSZXF1ZXN0KHJlcSk7Ci0JCQkJTW9uaXRvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5hZGRSZXNlbmRSZXF1ZXN0KHJlcSwgbmV3UmVxKTsKLQkJCQlUcmVlVmlld2VyIHRyZWVWaWV3ZXIgPSBNb25pdG9yVmlldy52aWV3LnRyZWVWaWV3ZXI7Ci0JCQkJdHJlZVZpZXdlci5hZGQocmVxLCBuZXdSZXEpOwotCQkJCXRyZWVWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG5ld1JlcSksIGZhbHNlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uLCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24yKSB7Ci0JCXRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uMjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvdmlldy9Nb25pdG9yVHJlZUNvbnRlbnRQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvdmlldy9Nb25pdG9yVHJlZUNvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YThkMzkyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL3ZpZXcvTW9uaXRvclRyZWVDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLnZpZXc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5Nb25pdG9yTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLmh0dHAuUmVzZW5kSFRUUFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLk1vbml0b3JVSVBsdWdpbjsKLS8qKgotICogQ29udGVudCBwcm92aWRlciBmb3IgdGhlIG1vbml0b3Igc2VydmVyIHZpZXcuCi0gKi8KLXB1YmxpYyBjbGFzcyBNb25pdG9yVHJlZUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElUcmVlQ29udGVudFByb3ZpZGVyewotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJPT1QgPSAicm9vdCI7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzb3J0QnlSZXNwb25zZVRpbWU7Ci0KLQkvKioKLQkgKiBQcm94eVRyZWVDb250ZW50UHJvdmlkZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgTW9uaXRvclRyZWVDb250ZW50UHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogRGlzcG9zZXMgb2YgdGhpcyBjb250ZW50IHByb3ZpZGVyLgotCSAqIDxwPgotCSAqIFtJc3N1ZTogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNoYW5nZWQgdG8gdGFrZSBhIFZpZXdlciwKLQkgKiByZW5hbWVkIGFuZCByZXB1cnBvc2VkIHRvIGRpc2Nvbm5lY3QgYSBjb250ZW50IHByb3ZpZGVyIGZyb20KLQkgKiBhIHZpZXdlci4gVGhpcyBpcyBvdmVyIGFuZCBhYm92ZSB3aGF0IGlucHV0Q2hhbmdlZCBkb2VzLAotCSAqIHdoaWNoIGlzIGRpc2Nvbm5lY3RpbmcgYSBjb250ZW50IHByb3ZpZGVyIGZyb20gdGhlIHZpZXdlcidzCi0JICogaW5wdXQgKGJ1dCBub3QgdGhlIHZpZXdlciBpdHNlbGYpLgotCSAqIF0KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gaXRlcmF0b3Igb3ZlciB0aGUgY2hpbGQgZWxlbWVudHMgb2YgdGhlIGdpdmVuIGVsZW1lbnQuCi0JICogPHA+Ci0JICogTm90ZTogVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGlzIG1ldGhvZCBhbmQgCi0JICogPGNvZGU+SVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIuZ2V0RWxlbWVudHM8L2NvZGU+IGlzCi0JICogdGhhdCA8Y29kZT5nZXRFbGVtZW50czwvY29kZT4gaXMgY2FsbGVkIHRvIG9idGFpbiB0aGUgCi0JICogdHJlZSB2aWV3ZXIncyByb290IGVsZW1lbnRzLCB3aGVyZWFzIDxjb2RlPmdldENoaWxkcmVuPC9jb2RlPiBpcyB1c2VkCi0JICogdG8gb2J0YWluIHRoZSBjaGlsZHJlbiBvZiBhIGdpdmVuIG5vZGUgaW4gdGhlIHRyZWUKLQkgKiAoaW5jbHVkaW5nIGEgcm9vdCkuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFtJc3N1ZTogRG9uJ3Qga25vdyB3aGF0IGFib3ZlIGlzIHRyeWluZyB0byBzYXkuCi0JICogIFNlZSBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlci5nZXRFbGVtZW50cy4KLQkgKiBdCi0JICogPC9wPgotCSAqCi0JICogQHBhcmFtIGVsZW1lbnQgdGhlIGVsZW1lbnQKLQkgKiBAcmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIGNoaWxkIGVsZW1lbnRzIAotCSAqICAgIChlbGVtZW50IHR5cGU6IDxjb2RlPk9iamVjdDwvY29kZT4pCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSW50ZWdlcikgewotCQkJSW50ZWdlciBpbiA9IChJbnRlZ2VyKSBlbGVtZW50OwotCQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJUmVxdWVzdFtdIHJlcXVlc3RzID0gTW9uaXRvclVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0UmVxdWVzdHMoKTsKLQkJCWlmIChyZXF1ZXN0cyAhPSBudWxsKSB7Ci0JCQkJaW50IHNpemUgPSByZXF1ZXN0cy5sZW5ndGg7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQkJUmVxdWVzdCByZXEgPSByZXF1ZXN0c1tpXTsKLQkJCQkJaWYgKChyZXEuZ2V0TG9jYWxQb3J0KCkgPT0gaW4uaW50VmFsdWUoKSkKLQkJCQkJCQkmJiAhKHJlcSBpbnN0YW5jZW9mIFJlc2VuZEhUVFBSZXF1ZXN0KSkKLQkJCQkJCWxpc3QuYWRkKHJlcSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHNvcnRCeVJlc3BvbnNlVGltZSkKLQkJCQlzb3J0QnlSZXNwb25zZVRpbWUobGlzdCk7Ci0JCQlyZXR1cm4gbGlzdC50b0FycmF5KCk7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFJlcXVlc3QpIHsKLQkJCVJlcXVlc3QgcmVxID0gKFJlcXVlc3QpIGVsZW1lbnQ7Ci0JCQlSZXNlbmRIVFRQUmVxdWVzdFtdIHJyID0gTW9uaXRvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRSZXNlbmRSZXF1ZXN0cyhyZXEpOwotCQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJaWYgKHJyICE9IG51bGwpIHsKLQkJCQlpbnQgc2l6ZSA9IHJyLmxlbmd0aDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCQlsaXN0LmFkZChycltpXSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHNvcnRCeVJlc3BvbnNlVGltZSkKLQkJCQlzb3J0QnlSZXNwb25zZVRpbWUobGlzdCk7Ci0JCQlyZXR1cm4gbGlzdC50b0FycmF5KCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiBSZXR1cm5zIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIGVsZW1lbnRzIGJlbG9uZ2luZyB0byB0aGUKLQkgKiBnaXZlbiBlbGVtZW50LiBUaGVzZSBlbGVtZW50cyBjYW4gYmUgcHJlc2VudGVkIGFzIHJvd3MgaW4gYSB0YWJsZSwKLQkgKiBpdGVtcyBpbiBhIGxpc3QsIGV0Yy4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKFJPT1QuZXF1YWxzKGVsZW1lbnQpKSB7Ci0JCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlSZXF1ZXN0W10gcmVxdWVzdHMgPSBNb25pdG9yVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRSZXF1ZXN0cygpOwotCQkJaWYgKHJlcXVlc3RzICE9IG51bGwpIHsKLQkJCQlpbnQgc2l6ZSA9IHJlcXVlc3RzLmxlbmd0aDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCQlSZXF1ZXN0IHJlcSA9IHJlcXVlc3RzW2ldOwotCQkJCQlJbnRlZ2VyIGluID0gbmV3IEludGVnZXIocmVxLmdldExvY2FsUG9ydCgpKTsKLQkJCQkJaWYgKCFsaXN0LmNvbnRhaW5zKGluKSkKLQkJCQkJCWxpc3QuYWRkKGluKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoc29ydEJ5UmVzcG9uc2VUaW1lKQotCQkJCXNvcnRCeVJlc3BvbnNlVGltZShsaXN0KTsKLQkJCXJldHVybiBsaXN0LnRvQXJyYXkoKTsKLQkJfQotCQlyZXR1cm4gZ2V0Q2hpbGRyZW4oZWxlbWVudCk7Ci0JfQotCi0JLyoKLQkgKiBSZXR1cm5zIHRoZSBwYXJlbnQgZm9yIHRoZSBnaXZlbiBlbGVtZW50LCBvciA8Y29kZT5udWxsPC9jb2RlPiAKLQkgKiBpbmRpY2F0aW5nIHRoYXQgdGhlIHBhcmVudCBjYW4ndCBiZSBjb21wdXRlZC4gCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgIT0gbnVsbCkgewotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJbnRlZ2VyKQotCQkJCXJldHVybiBST09UOwotCQkJUmVxdWVzdCBjYWxsID0gKFJlcXVlc3QpIGVsZW1lbnQ7Ci0JCQlpZiAoY2FsbCBpbnN0YW5jZW9mIFJlc2VuZEhUVFBSZXF1ZXN0KSB7Ci0JCQkJUmVzZW5kSFRUUFJlcXVlc3QgY2FsbFJlc2VuZCA9IChSZXNlbmRIVFRQUmVxdWVzdCkgY2FsbDsKLQkJCQlSZXF1ZXN0IHBhcmVudCA9IGNhbGxSZXNlbmQuZ2V0T3JpZ2luYWxSZXF1ZXN0KCk7Ci0JCQkJaWYgKHBhcmVudCAhPSBudWxsKQotCQkJCQlyZXR1cm4gcGFyZW50OwotCQkJfQotCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKGNhbGwuZ2V0TG9jYWxQb3J0KCkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBlbGVtZW50cyBhcmUgY3VycmVudGx5IGJlaW5nIHNvcnRlZCBieSByZXNwb25zZSB0aW1lLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldFNvcnRCeVJlc3BvbnNlVGltZSgpIHsKLQkJcmV0dXJuIHNvcnRCeVJlc3BvbnNlVGltZTsKLQl9Ci0KLQkvKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gZWxlbWVudCBoYXMgY2hpbGRyZW4uCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJbnRlZ2VyKQotCQkJcmV0dXJuIHRydWU7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUmVxdWVzdCkKLQkJCXJldHVybiBNb25pdG9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldFJlc2VuZFJlcXVlc3RzKChSZXF1ZXN0KSBlbGVtZW50KS5sZW5ndGggPiAwOyAKLQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIE5vdGlmaWVzIHRoaXMgY29udGVudCBwcm92aWRlciB0aGF0IHRoZSBnaXZlbiB2aWV3ZXIncyBpbnB1dAotCSAqIGhhcyBiZWVuIHN3aXRjaGVkIHRvIGEgZGlmZmVyZW50IGVsZW1lbnQuCi0JICovCi0JcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBzb3J0IGJ5IHJlc3BvbnNlIHRpbWUgb3B0aW9uLgotCSAqIEBwYXJhbSBiIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTb3J0QnlSZXNwb25zZVRpbWUoYm9vbGVhbiBiKSB7Ci0JCXNvcnRCeVJlc3BvbnNlVGltZSA9IGI7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc29ydEJ5UmVzcG9uc2VUaW1lKExpc3QgbGlzdCkgewotCQlpbnQgc2l6ZSA9IGxpc3Quc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemUgLSAxOyBpKyspIHsKLQkJCWZvciAoaW50IGogPSBpICsgMTsgaiA8IHNpemU7IGorKykgewotCQkJCVJlcXVlc3QgYzEgPSAoUmVxdWVzdCkgbGlzdC5nZXQoaSk7Ci0JCQkJUmVxdWVzdCBjMiA9IChSZXF1ZXN0KSBsaXN0LmdldChqKTsKLQkJCQlpZiAoYzEuZ2V0UmVzcG9uc2VUaW1lKCkgPCBjMi5nZXRSZXNwb25zZVRpbWUoKSkgewotCQkJCQlsaXN0LnNldChpLCBjMik7Ci0JCQkJCWxpc3Quc2V0KGosIGMxKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvdmlldy9Nb25pdG9yVmlldy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvdmlldy9Nb25pdG9yVmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzhlNjk5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL3ZpZXcvTW9uaXRvclZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLnZpZXc7Ci0KLWltcG9ydCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CdXN5SW5kaWNhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU2FzaEZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5JQ29udGVudEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLk1vbml0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5odHRwLlJlc2VuZEhUVFBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVJlcXVlc3RMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwuKjsKLS8qKgotICogVmlldyBvZiBUQ1AvSVAgYWN0aXZpdHkuCi0gKi8KLXB1YmxpYyBjbGFzcyBNb25pdG9yVmlldyBleHRlbmRzIFZpZXdQYXJ0IHsKLQlwcm90ZWN0ZWQgVHJlZSB0cmVlOwotCXByb3RlY3RlZCBUcmVlVmlld2VyIHRyZWVWaWV3ZXI7Ci0JcHJvdGVjdGVkIE1vbml0b3JUcmVlQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlcjsKLQotCXByb3RlY3RlZCBJUmVxdWVzdExpc3RlbmVyIGxpc3RlbmVyOwotCXByb3RlY3RlZCBWaWV3ZXJNYW5hZ2VyIHZtOwotCXByb3RlY3RlZCBMaXN0IHJlcXVlc3RWaWV3ZXJzOwotCXByb3RlY3RlZCBMaXN0IHJlc3BvbnNlVmlld2VyczsKLQotCXByb3RlY3RlZCBzdGF0aWMgU2ltcGxlRGF0ZUZvcm1hdCBmb3JtYXQ7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklFV19JRCA9ICJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci52aWV3IjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1ZJRVdFUiA9ICJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci52aWV3ZXJzLmJ5dGUiOwotCi0JcHJvdGVjdGVkIElBY3Rpb24gaHR0cEhlYWRlckFjdGlvbjsKLQlwcm90ZWN0ZWQgSUFjdGlvbiBwcmVmZXJlbmNlQWN0aW9uOwotCQotCXB1YmxpYyBzdGF0aWMgTW9uaXRvclZpZXcgdmlldzsKLQkKLQlwcm90ZWN0ZWQgUmVxdWVzdCBjdXJyZW50UmVxdWVzdCA9IG51bGw7Ci0JcHJvdGVjdGVkIFN0cnVjdHVyZWRTZWxlY3Rpb24gY3VycmVudFNlbGVjdGlvbiA9IG51bGw7Ci0KLQkvKioKLQkgKiBNb25pdG9yVmlldyBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBNb25pdG9yVmlldygpIHsKLQkJc3VwZXIoKTsKLQkJdmlldyA9IHRoaXM7Ci0JCQotCQkvLyB0cnkgc3BlY2lmaWVkIGZvcm1hdCwgYW5kIGZhbGwgYmFjayB0byBzdGFuZGFyZCBmb3JtYXQKLQkJdHJ5IHsKLQkJCWZvcm1hdCA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KE1lc3NhZ2VzLnZpZXdEYXRlRm9ybWF0KTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWZvcm1hdCA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJoOm1tLnMuUyBhIik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBkb1JlcXVlc3RBZGRlZChmaW5hbCBSZXF1ZXN0IHJyKSB7Ci0JCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJaWYgKCEocnIgaW5zdGFuY2VvZiBSZXNlbmRIVFRQUmVxdWVzdCkpIHsKLQkJCQkgIEludGVnZXIgaW4gPSBuZXcgSW50ZWdlcihyci5nZXRMb2NhbFBvcnQoKSk7Ci0JCQkJICB0cmVlVmlld2VyLmFkZChNb25pdG9yVHJlZUNvbnRlbnRQcm92aWRlci5ST09ULCBpbik7Ci0JCQkJICB0cmVlVmlld2VyLmFkZChpbiwgcnIpOyAKLQkJCQkgIHRyZWVWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHJyKSwgdHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkb1JlcXVlc3RDaGFuZ2VkKGZpbmFsIFJlcXVlc3QgcnIpIHsKLQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlpZiAodHJlZVZpZXdlciA9PSBudWxsKQotCQkJCQlyZXR1cm47Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0cmVlVmlld2VyLmdldFNlbGVjdGlvbigpOwotCQkJCQotCQkJCXRyZWVWaWV3ZXIucmVmcmVzaChycik7Ci0JCQkJaWYgKCFzZWwuaXNFbXB0eSgpKQotCQkJCQl0cmVlVmlld2VyLnNldFNlbGVjdGlvbihzZWwpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBDbGVhciB0aGUgdmlldy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjbGVhcigpIHsKLQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl0cmVlVmlld2VyLnNldFNlbGVjdGlvbihudWxsKTsKLQkJCQl0cmVlVmlld2VyLnNldElucHV0KE1vbml0b3JUcmVlQ29udGVudFByb3ZpZGVyLlJPT1QpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0U2VsZWN0aW9uKFJlcXVlc3QgcmVxdWVzdCkgewotCQlpZiAodHJlZVZpZXdlciAhPSBudWxsKQotCQkJdHJlZVZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24ocmVxdWVzdCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5Xb3JrYmVuY2hQYXJ0I2NyZWF0ZVBhcnRDb250cm9sKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVNhc2hGb3JtIHNhc2hGcGFyZW50ID0gbmV3IFNhc2hGb3JtKHBhcmVudCwgU1dULlZFUlRJQ0FMKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IDQ7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSA0OwotCQlzYXNoRnBhcmVudC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJc2FzaEZwYXJlbnQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoc2FzaEZwYXJlbnQsIENvbnRleHRJZHMuVklFVyk7Ci0JCQotCQkvLyBjcmVhdGUgdHJlZSBwYW5lbAotCQlDb21wb3NpdGUgdHJlZVBhbmVsID0gbmV3IENvbXBvc2l0ZShzYXNoRnBhcmVudCwgU1dULk5PTkUpOwotCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQl0cmVlUGFuZWwuc2V0TGF5b3V0KGxheW91dCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKTsKLQkJZGF0YS5oZWlnaHRIaW50ID0gMTEwOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJdHJlZVBhbmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCi0JCXRyZWUgPSBuZXcgVHJlZSh0cmVlUGFuZWwsIFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuU0lOR0xFKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQkvL2RhdGEud2lkdGhIaW50ID0gMTIwOwotCQl0cmVlLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXRyZWVWaWV3ZXIgPSBuZXcgVHJlZVZpZXdlcih0cmVlKTsKLQkJY29udGVudFByb3ZpZGVyID0gbmV3IE1vbml0b3JUcmVlQ29udGVudFByb3ZpZGVyKCk7Ci0JCXRyZWVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7Ci0JCXRyZWVWaWV3ZXIuc2V0SW5wdXQoTW9uaXRvclRyZWVDb250ZW50UHJvdmlkZXIuUk9PVCk7Ci0JCXRyZWVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgVHJlZUxhYmVsUHJvdmlkZXIoKSk7Ci0KLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0cmVlLCBDb250ZXh0SWRzLlZJRVdfVFJFRSk7Ci0JCi0JCUNvbXBvc2l0ZSBkZXRhaWxzUGFuZWwgPSBuZXcgQ29tcG9zaXRlKHRyZWVQYW5lbCwgU1dULk5PTkUpOwotCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAyOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlkZXRhaWxzUGFuZWwuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCk7Ci0JCWRhdGEud2lkdGhIaW50ID0gMjAwOwotCQlkZXRhaWxzUGFuZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlmaW5hbCBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChkZXRhaWxzUGFuZWwsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChOTFMuYmluZChNZXNzYWdlcy52aWV3VGltZSwgIiIpKTsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKSk7Ci0KLQkJZmluYWwgTGFiZWwgbGFiZWwyID0gbmV3IExhYmVsKGRldGFpbHNQYW5lbCwgU1dULk5PTkUpOwotCQlsYWJlbDIuc2V0VGV4dChOTFMuYmluZChNZXNzYWdlcy52aWV3UmVzcG9uc2VUaW1lLCAiIikpOwotCQlsYWJlbDIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKSk7Ci0KLQkJZmluYWwgTGFiZWwgbGFiZWwzID0gbmV3IExhYmVsKGRldGFpbHNQYW5lbCwgU1dULk5PTkUpOwotCQlsYWJlbDMuc2V0VGV4dChOTFMuYmluZChNZXNzYWdlcy52aWV3VHlwZSwgIiIpKTsKLQkJbGFiZWwzLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORykpOwotCi0JCS8vIGNyZWF0ZSBjZW50ZXIgYW5kIHJpZ2h0IHBhbmVscwotCQlTYXNoRm9ybSBzYXNoRmNoaWxkID0gbmV3IFNhc2hGb3JtKHNhc2hGcGFyZW50LCBTV1QuTk9ORSk7Ci0JCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gMjsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDQ7Ci0JCXNhc2hGY2hpbGQuc2V0TGF5b3V0KGxheW91dCk7Ci0JCXNhc2hGcGFyZW50LnNldFdlaWdodHMobmV3IGludFtdIHsgMzAsIDcwIH0pOwotCQotCQkvLyByZXF1ZXN0IHBhbmVsCi0JCUNvbXBvc2l0ZSByZXF1ZXN0ID0gbmV3IENvbXBvc2l0ZShzYXNoRmNoaWxkLCBTV1QuTk9ORSk7Ci0JCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAzOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMjsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJcmVxdWVzdC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJcmVxdWVzdC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotCQlDb21wb3NpdGUgcmVxdWVzdEhlYWRlciA9IG5ldyBDb21wb3NpdGUocmVxdWVzdCwgU1dULk5PTkUpOwotCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gMTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMjsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpOwotCQlyZXF1ZXN0SGVhZGVyLnNldExheW91dChsYXlvdXQpOwotCQlyZXF1ZXN0SGVhZGVyLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJZmluYWwgTGFiZWwgcmVxdWVzdExhYmVsID0gbmV3IExhYmVsKHJlcXVlc3RIZWFkZXIsIFNXVC5OT05FKTsKLQkJcmVxdWVzdExhYmVsLnNldFRleHQoTkxTLmJpbmQoTWVzc2FnZXMudmlld1JlcXVlc3QsICIiKSk7Ci0JCXJlcXVlc3RMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJCi0JCWZpbmFsIENvbWJvIHJlcXVlc3RWaWV3ZXJDb21ibyA9IG5ldyBDb21ibyhyZXF1ZXN0SGVhZGVyLCBTV1QuRFJPUF9ET1dOIHwgU1dULlJFQURfT05MWSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQpOwotCQlkYXRhLnZlcnRpY2FsU3BhbiA9IDI7Ci0JCXJlcXVlc3RWaWV3ZXJDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCWZpbmFsIExhYmVsIHJlcXVlc3RTaXplTGFiZWwgPSBuZXcgTGFiZWwocmVxdWVzdEhlYWRlciwgU1dULk5PTkUpOwotCQlyZXF1ZXN0U2l6ZUxhYmVsLnNldFRleHQoTkxTLmJpbmQoTWVzc2FnZXMudmlld1NpemUsICIiKSk7Ci0JCXJlcXVlc3RTaXplTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJLy8gcmVzcG9uc2UgcGFuZWwKLQkJQ29tcG9zaXRlIHJlc3BvbnNlID0gbmV3IENvbXBvc2l0ZShzYXNoRmNoaWxkLCBTV1QuTk9ORSk7Ci0JCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAzOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMjsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJcmVzcG9uc2Uuc2V0TGF5b3V0KGxheW91dCk7Ci0JCXJlc3BvbnNlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCUNvbXBvc2l0ZSByZXNwb25zZUhlYWRlciA9IG5ldyBDb21wb3NpdGUocmVzcG9uc2UsIFNXVC5OT05FKTsKLQkJbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDE7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDI7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKTsKLQkJcmVzcG9uc2VIZWFkZXIuc2V0TGF5b3V0KGxheW91dCk7Ci0JCXJlc3BvbnNlSGVhZGVyLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJZmluYWwgTGFiZWwgcmVzcG9uc2VMYWJlbCA9IG5ldyBMYWJlbChyZXNwb25zZUhlYWRlciwgU1dULk5PTkUpOwotCQlyZXNwb25zZUxhYmVsLnNldFRleHQoTkxTLmJpbmQoTWVzc2FnZXMudmlld1Jlc3BvbnNlLCAiIikpOwotCQlyZXNwb25zZUxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkKLQkJZmluYWwgQ29tYm8gcmVzcG9uc2VWaWV3ZXJDb21ibyA9IG5ldyBDb21ibyhyZXNwb25zZUhlYWRlciwgU1dULkRST1BfRE9XTiB8IFNXVC5SRUFEX09OTFkpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EKTsKLQkJZGF0YS52ZXJ0aWNhbFNwYW4gPSAyOwotCQlyZXNwb25zZVZpZXdlckNvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0JCi0JCWZpbmFsIExhYmVsIHJlc3BvbnNlU2l6ZUxhYmVsID0gbmV3IExhYmVsKHJlc3BvbnNlSGVhZGVyLCBTV1QuTk9ORSk7Ci0JCXJlc3BvbnNlU2l6ZUxhYmVsLnNldFRleHQoTkxTLmJpbmQoTWVzc2FnZXMudmlld1NpemUsICIiKSk7Ci0JCXJlc3BvbnNlU2l6ZUxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQotCQkvLyB2aWV3ZXIgbWFuYWdlcgotCQl2bSA9IG5ldyBWaWV3ZXJNYW5hZ2VyKHJlcXVlc3QsIHJlcXVlc3QsIHJlc3BvbnNlLCByZXNwb25zZSk7Ci0JCXJlcXVlc3RWaWV3ZXJzID0gdm0uZ2V0UmVxdWVzdFZpZXdlcnMoKTsKLQkJcmVzcG9uc2VWaWV3ZXJzID0gdm0uZ2V0UmVzcG9uc2VWaWV3ZXJzKCk7Ci0KLQkJLy8gc2V0IHVwIHRoZSB2aWV3ZXIgY29tYm8gYm94ZXMKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSByZXF1ZXN0Vmlld2Vycy5pdGVyYXRvcigpOwotCQlpbnQgY3RyID0gMDsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJVmlld2VyIHZpZXdlciA9IChWaWV3ZXIpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCXJlcXVlc3RWaWV3ZXJDb21iby5hZGQodmlld2VyLmdldExhYmVsKCksIGN0cik7Ci0JCQlpZiAodmlld2VyLmdldElkKCkuZXF1YWxzKERFRkFVTFRfVklFV0VSKSkgewotCQkJCXJlcXVlc3RWaWV3ZXJDb21iby5zZWxlY3QoY3RyKTsgCi0JCQkJdm0uc2V0UmVxdWVzdFZpZXdlcih2aWV3ZXIpOwotCQkJfQotCQkJY3RyKys7Ci0JCX0KLQkJcmVxdWVzdFZpZXdlckNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlWaWV3ZXIgdmlld2VyID0gKFZpZXdlcikgcmVxdWVzdFZpZXdlcnMuZ2V0KHJlcXVlc3RWaWV3ZXJDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLQkJCQlpZiAoY3VycmVudFJlcXVlc3QgIT0gbnVsbCAmJiB2aWV3ZXIgIT0gbnVsbCkKLQkJCQkJY3VycmVudFJlcXVlc3Quc2V0UHJvcGVydHkoInJlcXVlc3Qtdmlld2VyIiwgdmlld2VyLmdldElkKCkpOwotCQkJCXZtLnNldFJlcXVlc3RWaWV3ZXIodmlld2VyKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkvLyBpZ25vcmUKLQkJCX0KLQkJfSk7Ci0JCXJlcXVlc3RIZWFkZXIubGF5b3V0KHRydWUpOwotCQkKLQkJaXRlcmF0b3IgPSByZXNwb25zZVZpZXdlcnMuaXRlcmF0b3IoKTsKLQkJY3RyID0gMDsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJVmlld2VyIHZpZXdlciA9IChWaWV3ZXIpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCXJlc3BvbnNlVmlld2VyQ29tYm8uYWRkKHZpZXdlci5nZXRMYWJlbCgpLCBjdHIpOwotCQkJaWYgKHZpZXdlci5nZXRJZCgpLmVxdWFscyhERUZBVUxUX1ZJRVdFUikpIHsKLQkJCQlyZXNwb25zZVZpZXdlckNvbWJvLnNlbGVjdChjdHIpOyAKLQkJCQl2bS5zZXRSZXNwb25zZVZpZXdlcih2aWV3ZXIpOwotCQkJfQotCQkJY3RyKys7Ci0JCX0KLQkJcmVzcG9uc2VWaWV3ZXJDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJVmlld2VyIHZpZXdlciA9IChWaWV3ZXIpIHJlc3BvbnNlVmlld2Vycy5nZXQocmVzcG9uc2VWaWV3ZXJDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLQkJCQlpZiAoY3VycmVudFJlcXVlc3QgIT0gbnVsbCAmJiB2aWV3ZXIgIT0gbnVsbCkKLQkJCQkJY3VycmVudFJlcXVlc3Quc2V0UHJvcGVydHkoInJlc3BvbnNlLXZpZXdlciIsIHZpZXdlci5nZXRJZCgpKTsKLQkJCQl2bS5zZXRSZXNwb25zZVZpZXdlcih2aWV3ZXIpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCS8vIGlnbm9yZQotCQkJfQotCQl9KTsKLQkJcmVzcG9uc2VIZWFkZXIubGF5b3V0KHRydWUpOwotCi0JCS8vIHNlbGVjdGlvbiBsaXN0ZW5lcgotCQl0cmVlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBldmVudC5nZXRTZWxlY3Rpb24oKTsKLQotCQkJCWN1cnJlbnRSZXF1ZXN0ID0gbnVsbDsKLQkJCQlpZiAoc2VsZWN0aW9uICE9IG51bGwgJiYgIXNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCQkJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQkJCQljdXJyZW50U2VsZWN0aW9uID0gc2VsOwotCQkJCQlPYmplY3Qgb2JqID0gc2VsLml0ZXJhdG9yKCkubmV4dCgpOwotCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgUmVxdWVzdCkKLQkJCQkJCWN1cnJlbnRSZXF1ZXN0ID0gKFJlcXVlc3QpIG9iajsKLQkJCQl9Ci0JCi0JCQkJaWYgKGN1cnJlbnRSZXF1ZXN0ICE9IG51bGwpIHsKLQkJCQkJbGFiZWwuc2V0VGV4dChOTFMuYmluZChNZXNzYWdlcy52aWV3VGltZSwgZm9ybWF0LmZvcm1hdChjdXJyZW50UmVxdWVzdC5nZXREYXRlKCkpKSk7Ci0JCi0JCQkJCWlmIChjdXJyZW50UmVxdWVzdC5nZXRSZXNwb25zZVRpbWUoKSA9PSAtMSkKLQkJCQkJCWxhYmVsMi5zZXRUZXh0KE5MUy5iaW5kKE1lc3NhZ2VzLnZpZXdSZXNwb25zZVRpbWUsICIiKSk7Ci0JCQkJCWVsc2UgewotCQkJCQkJU3RyaW5nIHRpbWUgPSBOTFMuYmluZChNZXNzYWdlcy52aWV3UmVzcG9uc2VUaW1lRm9ybWF0LCBjdXJyZW50UmVxdWVzdC5nZXRSZXNwb25zZVRpbWUoKSArICIiKTsKLQkJCQkJCWxhYmVsMi5zZXRUZXh0KE5MUy5iaW5kKE1lc3NhZ2VzLnZpZXdSZXNwb25zZVRpbWUsIHRpbWUpKTsKLQkJCQkJfQotCQkJCQlsYWJlbDMuc2V0VGV4dChOTFMuYmluZChNZXNzYWdlcy52aWV3VHlwZSwgY3VycmVudFJlcXVlc3QuZ2V0UHJvdG9jb2woKSkpOwotCQotCQkJCQkvLyByZXF1ZXN0IGluZm9ybWF0aW9uCi0JCQkJCXJlcXVlc3RMYWJlbC5zZXRUZXh0KE5MUy5iaW5kKE1lc3NhZ2VzLnZpZXdSZXF1ZXN0LCAibG9jYWxob3N0OiIgKyBjdXJyZW50UmVxdWVzdC5nZXRMb2NhbFBvcnQoKSkpOwotCQkJCQlyZXF1ZXN0U2l6ZUxhYmVsLnNldFRleHQoZ2V0U2l6ZVN0cmluZyhjdXJyZW50UmVxdWVzdC5nZXRSZXF1ZXN0KFJlcXVlc3QuQ09OVEVOVCksIGN1cnJlbnRSZXF1ZXN0LmdldFJlcXVlc3QoUmVxdWVzdC5BTEwpKSk7Ci0JCi0JCQkJCS8vIHJlc3BvbnNlIGluZm9ybWF0aW9uCi0JCQkJCXJlc3BvbnNlTGFiZWwuc2V0VGV4dChOTFMuYmluZChNZXNzYWdlcy52aWV3UmVzcG9uc2UsIGN1cnJlbnRSZXF1ZXN0LmdldFJlbW90ZUhvc3QoKSArICI6IiArIGN1cnJlbnRSZXF1ZXN0LmdldFJlbW90ZVBvcnQoKSkpOwotCQkJCQlyZXNwb25zZVNpemVMYWJlbC5zZXRUZXh0KGdldFNpemVTdHJpbmcoY3VycmVudFJlcXVlc3QuZ2V0UmVzcG9uc2UoUmVxdWVzdC5DT05URU5UKSwgY3VycmVudFJlcXVlc3QuZ2V0UmVzcG9uc2UoUmVxdWVzdC5BTEwpKSk7Ci0JCQkJCQotCQkJCQl2bS5zZXRSZXF1ZXN0KGN1cnJlbnRSZXF1ZXN0KTsKLQkJCQkJCi0JCQkJCVZpZXdlciB2aWV3ZXIgPSB2bS5maW5kVmlld2VyKChTdHJpbmcpIGN1cnJlbnRSZXF1ZXN0LmdldFByb3BlcnR5KCJyZXF1ZXN0LXZpZXdlciIpKTsKLQkJCQkJaWYgKHZpZXdlciA9PSBudWxsKQotCQkJCQkJdmlld2VyID0gdm0uZmluZFZpZXdlcihERUZBVUxUX1ZJRVdFUik7Ci0JCQkJCWlmICh2aWV3ZXIgIT0gbnVsbCkgewotCQkJCQkJdm0uc2V0UmVxdWVzdFZpZXdlcih2aWV3ZXIpOwotCQkJCQkJcmVxdWVzdFZpZXdlckNvbWJvLnNlbGVjdChyZXF1ZXN0Vmlld2Vycy5pbmRleE9mKHZpZXdlcikpOwotCQkJCQl9Ci0JCQkJCQotCQkJCQl2aWV3ZXIgPSB2bS5maW5kVmlld2VyKChTdHJpbmcpIGN1cnJlbnRSZXF1ZXN0LmdldFByb3BlcnR5KCJyZXNwb25zZS12aWV3ZXIiKSk7Ci0JCQkJCWlmICh2aWV3ZXIgPT0gbnVsbCAmJiBjdXJyZW50UmVxdWVzdC5nZXROYW1lKCkgIT0gbnVsbCkKLQkJCQkJCXZpZXdlciA9IHZtLmdldERlZmF1bHRWaWV3ZXIoY3VycmVudFJlcXVlc3QuZ2V0TmFtZSgpKTsKLQkJCQkJaWYgKHZpZXdlciAhPSBudWxsKSB7Ci0JCQkJCQl2bS5zZXRSZXNwb25zZVZpZXdlcih2aWV3ZXIpOwotCQkJCQkJcmVzcG9uc2VWaWV3ZXJDb21iby5zZWxlY3QocmVzcG9uc2VWaWV3ZXJzLmluZGV4T2Yodmlld2VyKSk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlsYWJlbC5zZXRUZXh0KE5MUy5iaW5kKE1lc3NhZ2VzLnZpZXdUaW1lLCAiIikpOwotCQkJCQlsYWJlbDIuc2V0VGV4dChOTFMuYmluZChNZXNzYWdlcy52aWV3UmVzcG9uc2VUaW1lLCAiIikpOwotCQkJCQlyZXF1ZXN0TGFiZWwuc2V0VGV4dChOTFMuYmluZChNZXNzYWdlcy52aWV3UmVxdWVzdCwgIiIpKTsKLQkJCQkJcmVxdWVzdFNpemVMYWJlbC5zZXRUZXh0KE5MUy5iaW5kKE1lc3NhZ2VzLnZpZXdTaXplLCAiIikpOwotCQkJCQlyZXNwb25zZUxhYmVsLnNldFRleHQoTkxTLmJpbmQoTWVzc2FnZXMudmlld1Jlc3BvbnNlLCAiIikpOwotCQkJCQlyZXNwb25zZVNpemVMYWJlbC5zZXRUZXh0KE5MUy5iaW5kKE1lc3NhZ2VzLnZpZXdTaXplLCAiIikpOwotCQkJCQl2bS5zZXRSZXF1ZXN0KGN1cnJlbnRSZXF1ZXN0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQl0cmVlVmlld2VyLmV4cGFuZFRvTGV2ZWwoMik7Ci0JCQotCQkvLyBjcmVhdGUgYSBtZW51IG1hbmFnZXIgZm9yIGEgY29udGV4dCBtZW51Ci0JCU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKCk7Ci0JCW1lbnVNYW5hZ2VyLnNldFJlbW92ZUFsbFdoZW5TaG93bih0cnVlKTsKLQkJbWVudU1hbmFnZXIuYWRkTWVudUxpc3RlbmVyKG5ldyBJTWVudUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtZW51KSB7Ci0JCQkJbWVudS5hZGQobmV3IEdyb3VwTWFya2VyKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TKSk7Ci0JCQkJbWVudS5hZGQocHJlZmVyZW5jZUFjdGlvbik7Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIGNyZWF0ZSB0aGUgbWVudQotCQlNZW51IG1lbnUgPSBtZW51TWFuYWdlci5jcmVhdGVDb250ZXh0TWVudSh0cmVlVmlld2VyLmdldENvbnRyb2woKSk7Ci0JCXRyZWVWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldE1lbnUobWVudSk7Ci0JCQotCQkvLyByZWdpc3RlciB0aGUgbWVudSB3aXRoIHRoZSBwbGF0Zm9ybQotCQlnZXRTaXRlKCkucmVnaXN0ZXJDb250ZXh0TWVudShtZW51TWFuYWdlciwgdHJlZVZpZXdlcik7Ci0gICAgICAgIAotCQlpbml0aWFsaXplQWN0aW9ucygpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNpemVTdHJpbmcoYnl0ZVtdIGEsIGJ5dGVbXSBiKSB7Ci0JCVN0cmluZyBhYSA9ICIwIjsKLQkJU3RyaW5nIGJiID0gIjAiOwotCQlpZiAoYSAhPSBudWxsKQotCQkJYWEgPSBhLmxlbmd0aCArICIiOwotCQlpZiAoYiAhPSBudWxsKQotCQkJYmIgPSBiLmxlbmd0aCArICIiOwotCQlTdHJpbmcgc2l6ZSA9IE5MUy5iaW5kKE1lc3NhZ2VzLnZpZXdTaXplRm9ybWF0LCBuZXcgT2JqZWN0W10geyBhYSwgYmJ9KTsKLQkJcmV0dXJuIE5MUy5iaW5kKE1lc3NhZ2VzLnZpZXdTaXplLCBzaXplKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JCXRyZWVWaWV3ZXIgPSBudWxsOwotCQl2aWV3ID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplQWN0aW9ucygpIHsKLQkJZmluYWwgSUFjdGlvbiBzb3J0QnlSZXNwb25zZVRpbWVBY3Rpb24gPSBuZXcgQWN0aW9uKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWJvb2xlYW4gYiA9IGNvbnRlbnRQcm92aWRlci5nZXRTb3J0QnlSZXNwb25zZVRpbWUoKTsKLQkJCQkJCWNvbnRlbnRQcm92aWRlci5zZXRTb3J0QnlSZXNwb25zZVRpbWUoIWIpOwotCQkJCQkJdHJlZVZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJCQlzZXRDaGVja2VkKCFiKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQl9OwotCQlzb3J0QnlSZXNwb25zZVRpbWVBY3Rpb24uc2V0Q2hlY2tlZChmYWxzZSk7Ci0JCXNvcnRCeVJlc3BvbnNlVGltZUFjdGlvbi5zZXRUb29sVGlwVGV4dChNZXNzYWdlcy5hY3Rpb25Tb3J0QnlSZXNwb25zZVRpbWUpOwotCQlzb3J0QnlSZXNwb25zZVRpbWVBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKE1vbml0b3JVSVBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoTW9uaXRvclVJUGx1Z2luLklNR19FTENMX1NPUlRfUkVTUE9OU0VfVElNRSkpOwotCQlzb3J0QnlSZXNwb25zZVRpbWVBY3Rpb24uc2V0SG92ZXJJbWFnZURlc2NyaXB0b3IoTW9uaXRvclVJUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcihNb25pdG9yVUlQbHVnaW4uSU1HX0NMQ0xfU09SVF9SRVNQT05TRV9USU1FKSk7Ci0JCXNvcnRCeVJlc3BvbnNlVGltZUFjdGlvbi5zZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihNb25pdG9yVUlQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKE1vbml0b3JVSVBsdWdpbi5JTUdfRExDTF9TT1JUX1JFU1BPTlNFX1RJTUUpKTsKLQkKLQkJSUFjdGlvbiBjbGVhckFjdGlvbiA9IG5ldyBBY3Rpb24oKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJTW9uaXRvclVJUGx1Z2luLmdldEluc3RhbmNlKCkuY2xlYXJSZXF1ZXN0cygpOwotCQkJCWNsZWFyKCk7Ci0JCQl9Ci0JCX07Ci0JCWNsZWFyQWN0aW9uLnNldFRvb2xUaXBUZXh0KE1lc3NhZ2VzLmFjdGlvbkNsZWFyVG9vbFRpcCk7Ci0JCWNsZWFyQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihNb25pdG9yVUlQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKE1vbml0b3JVSVBsdWdpbi5JTUdfRUxDTF9DTEVBUikpOwotCQljbGVhckFjdGlvbi5zZXRIb3ZlckltYWdlRGVzY3JpcHRvcihNb25pdG9yVUlQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKE1vbml0b3JVSVBsdWdpbi5JTUdfQ0xDTF9DTEVBUikpOwotCQljbGVhckFjdGlvbi5zZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihNb25pdG9yVUlQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKE1vbml0b3JVSVBsdWdpbi5JTUdfRExDTF9DTEVBUikpOwotCi0JCWh0dHBIZWFkZXJBY3Rpb24gPSBuZXcgQWN0aW9uKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWJvb2xlYW4gYiA9IHZtLmdldERpc3BsYXlIZWFkZXJJbmZvKCk7Ci0JCQkJCQl2bS5zZXREaXNwbGF5SGVhZGVySW5mbyghYik7Ci0JCQkJCQlzZXRDaGVja2VkKCFiKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQl9OwotCQlodHRwSGVhZGVyQWN0aW9uLnNldENoZWNrZWQodm0uZ2V0RGlzcGxheUhlYWRlckluZm8oKSk7Ci0JCWh0dHBIZWFkZXJBY3Rpb24uc2V0VGV4dChNZXNzYWdlcy5hY3Rpb25TaG93SGVhZGVyKTsKLQotCQlwcmVmZXJlbmNlQWN0aW9uID0gbmV3IEFjdGlvbigpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlzaG93UHJlZmVyZW5jZVBhZ2UoKTsKLQkJCX0KLQkJfTsKLQkJcHJlZmVyZW5jZUFjdGlvbi5zZXRUZXh0KE1lc3NhZ2VzLmFjdGlvblByb3BlcnRpZXMpOwotCQkKLQkJCi0JCUlUb29sQmFyTWFuYWdlciB0Ym0gPSBnZXRWaWV3U2l0ZSgpLmdldEFjdGlvbkJhcnMoKS5nZXRUb29sQmFyTWFuYWdlcigpOwotCQl0Ym0uYWRkKHNvcnRCeVJlc3BvbnNlVGltZUFjdGlvbik7Ci0JCXRibS5hZGQoY2xlYXJBY3Rpb24pOwotCQkKLQkJSUNvbnRlbnRGaWx0ZXJbXSBmaWx0ZXJzID0gTW9uaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldENvbnRlbnRGaWx0ZXJzKCk7Ci0JCUlNZW51TWFuYWdlciBtZW51TWFuYWdlciA9IGdldFZpZXdTaXRlKCkuZ2V0QWN0aW9uQmFycygpLmdldE1lbnVNYW5hZ2VyKCk7Ci0JCW1lbnVNYW5hZ2VyLmFkZChodHRwSGVhZGVyQWN0aW9uKTsKLQkJaW50IHNpemUgPSBmaWx0ZXJzLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCUZpbHRlckFjdGlvbiBhY3Rpb24gPSBuZXcgRmlsdGVyQWN0aW9uKHZtLCBmaWx0ZXJzW2ldKTsKLQkJCW1lbnVNYW5hZ2VyLmFkZChhY3Rpb24pOwotCQl9Ci0JCW1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCQltZW51TWFuYWdlci5hZGQocHJlZmVyZW5jZUFjdGlvbik7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvd1ByZWZlcmVuY2VQYWdlKCkgewotCQlQcmVmZXJlbmNlTWFuYWdlciBtYW5hZ2VyID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRQcmVmZXJlbmNlTWFuYWdlcigpOwotCQlJUHJlZmVyZW5jZU5vZGUgbm9kZSA9IG1hbmFnZXIuZmluZCgib3JnLmVjbGlwc2UuZGVidWcudWkuRGVidWdQcmVmZXJlbmNlUGFnZSIpLmZpbmRTdWJOb2RlKCJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5wcmVmZXJlbmNlUGFnZSIpOwotCQlQcmVmZXJlbmNlTWFuYWdlciBtYW5hZ2VyMiA9IG5ldyBQcmVmZXJlbmNlTWFuYWdlcigpOwotCQltYW5hZ2VyMi5hZGRUb1Jvb3Qobm9kZSk7Ci0JCQotCQlmaW5hbCBQcmVmZXJlbmNlRGlhbG9nIGRpYWxvZyA9IG5ldyBQcmVmZXJlbmNlRGlhbG9nKGdldFNpdGUoKS5nZXRTaGVsbCgpLCBtYW5hZ2VyMik7Ci0JCWZpbmFsIGJvb2xlYW5bXSByZXN1bHQgPSBuZXcgYm9vbGVhbltdIHsgZmFsc2UgfTsKLQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoZ2V0U2l0ZSgpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJZGlhbG9nLmNyZWF0ZSgpOwotCQkJCWlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykKLQkJCQkJcmVzdWx0WzBdID0gdHJ1ZTsKLQkJCX0KLQkJfSk7Ci0JCXJldHVybiByZXN1bHRbMF07Ci0JfQotCi0JLyoqCi0JICogT3BlbiBhIHJlcXVlc3QuCi0JICogCi0JICogQHBhcmFtIHJlcXVlc3QgdGhlIHJlcXVlc3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgb3BlbihmaW5hbCBSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl0cnkgewotCQkJCQlJV29ya2JlbmNoIHdvcmtiZW5jaCA9IE1vbml0b3JVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdvcmtiZW5jaCgpOwotCQkJCQlJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbmRvdyA9IHdvcmtiZW5jaC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkKLQkJCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IHdvcmtiZW5jaFdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0JCi0JCQkJCUlWaWV3UGFydCB2aWV3MiA9IHBhZ2UuZmluZFZpZXcoVklFV19JRCk7Ci0JCQkJCQotCQkJCQlpZiAodmlldzIgIT0gbnVsbCkKLQkJCQkJCXBhZ2UuYnJpbmdUb1RvcCh2aWV3Mik7Ci0JCQkJCWVsc2UKLQkJCQkJCXBhZ2Uuc2hvd1ZpZXcoVklFV19JRCk7Ci0KLQkJCQkJaWYgKHZpZXcgIT0gbnVsbCkKLQkJCQkJCXZpZXcuc2V0U2VsZWN0aW9uKHJlcXVlc3QpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIG9wZW5pbmcgVENQL0lQIHZpZXciLCBlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotCQlpZiAodHJlZSAhPSBudWxsKQotCQkJdHJlZS5zZXRGb2N1cygpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC92aWV3L1Jlc2VuZE1lc3NhZ2VBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL3ZpZXcvUmVzZW5kTWVzc2FnZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGYwNGRlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL3ZpZXcvUmVzZW5kTWVzc2FnZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC52aWV3OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5Nb25pdG9yTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLmh0dHAuUmVzZW5kSFRUUFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5SZXF1ZXN0OwotLyoqCi0gKiBSZXNlbmRzIHRoZSBzZWxlY3RlZCByZXF1ZXN0IGFuZCBhZGRzIHRoZSByZXN1bHQgdG8gdGhlIHJlcXVlc3QvcmVzcG9uc2UgdHJlZS4KLSAqLwotcHVibGljIGNsYXNzIFJlc2VuZE1lc3NhZ2VBY3Rpb24gaW1wbGVtZW50cyBJVmlld0FjdGlvbkRlbGVnYXRlewotCXByb3RlY3RlZCBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IG51bGw7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JVmlld0FjdGlvbkRlbGVnYXRlI2luaXQob3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVZpZXdQYXJ0IHZpZXcpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNydW4ob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCWlmIChzZWxlY3Rpb24gIT0gbnVsbCkgewotCQkJT2JqZWN0IGVsZW1lbnQgPSAoKFN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQlpZiAoZWxlbWVudCAhPSBudWxsICYmIGVsZW1lbnQgaW5zdGFuY2VvZiBSZXF1ZXN0KSB7Ci0JCQkJUmVxdWVzdCByZXEgPSAoUmVxdWVzdCkgZWxlbWVudDsKLQkJCQlSZXNlbmRIVFRQUmVxdWVzdCBuZXdSZXEgPSBNb25pdG9yTWFuYWdlci5jcmVhdGVSZXNlbmRSZXF1ZXN0KHJlcSk7Ci0JCQkJTW9uaXRvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5hZGRSZXNlbmRSZXF1ZXN0KHJlcSwgbmV3UmVxKTsKLQkJCQlUcmVlVmlld2VyIHRyZWVWaWV3ZXIgPSBNb25pdG9yVmlldy52aWV3LnRyZWVWaWV3ZXI7Ci0JCQkJdHJlZVZpZXdlci5hZGQocmVxLCBuZXdSZXEpOwotCQkJCXRyZWVWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG5ld1JlcSksIGZhbHNlKTsKLQkJCQluZXdSZXEuc2VuZFJlcXVlc3QoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uLCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24yKSB7Ci0JCXRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uMjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvdmlldy9TZW5kTW9kaWZpZWRNZXNzYWdlQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC92aWV3L1NlbmRNb2RpZmllZE1lc3NhZ2VBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODMwYjQzMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC92aWV3L1NlbmRNb2RpZmllZE1lc3NhZ2VBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwudmlldzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5odHRwLlJlc2VuZEhUVFBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5Db250ZW50Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLnZpZXdlcnMuSGVhZGVyVmlld2VyOwotLyoqCi0gKiBTZW5kIGEgbW9kaWZpZWQgbWVzc2FnZS4KLSAqLwotcHVibGljIGNsYXNzIFNlbmRNb2RpZmllZE1lc3NhZ2VBY3Rpb24gaW1wbGVtZW50cyBJVmlld0FjdGlvbkRlbGVnYXRlewotCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gbnVsbDsKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklWaWV3QWN0aW9uRGVsZWdhdGUjaW5pdChvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJVmlld1BhcnQgdmlldykgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3J1bihvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJaWYgKHNlbGVjdGlvbiAhPSBudWxsKSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9ICgoU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCWlmIChlbGVtZW50ICE9IG51bGwgJiYgZWxlbWVudCBpbnN0YW5jZW9mIFJlc2VuZEhUVFBSZXF1ZXN0KSB7Ci0JCQkJUmVzZW5kSFRUUFJlcXVlc3QgcmVxID0gKFJlc2VuZEhUVFBSZXF1ZXN0KSBlbGVtZW50OwotCQkJCUNvbnRlbnRWaWV3ZXIgY3VyVmlld2VyID0gTW9uaXRvclZpZXcudmlldy52bS5nZXRDdXJyZW50UmVxdWVzdFZpZXdlcigpOwotCQkJCUhlYWRlclZpZXdlciBjdXJIZWFkZXJWaWV3ZXIgPSBNb25pdG9yVmlldy52aWV3LnZtLmdldEN1cnJlbnRSZXF1ZXN0SGVhZGVyVmlld2VyKCk7Ci0JCQkJcmVxLnNldFJlcXVlc3QoY3VyVmlld2VyLmdldENvbnRlbnQoKSwgUmVxdWVzdC5DT05URU5UKTsKLQkJCQkKLQkJCQlpZiAoY3VySGVhZGVyVmlld2VyICE9IG51bGwpCi0JCQkJCXJlcS5zZXRSZXF1ZXN0KGN1ckhlYWRlclZpZXdlci5nZXRDb250ZW50KCksIFJlcXVlc3QuVFJBTlNQT1JUKTsKLQotCQkJCXJlcS5zZW5kUmVxdWVzdCgpOwotCQkJfQotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24sIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbjIpIHsKLQkJdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb24yOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC92aWV3L1RyZWVMYWJlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC92aWV3L1RyZWVMYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5YzFkZjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvdmlldy9UcmVlTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC52aWV3OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwuaHR0cC5SZXNlbmRIVFRQUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwuTW9uaXRvclVJUGx1Z2luOwotLyoqCi0gKiBBIGxhYmVsIHByb3ZpZGVyIGZvciB0aGUgbW9uaXRvciBzZXJ2ZXIgdmlldy4KLSAqLwotcHVibGljIGNsYXNzIFRyZWVMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSUxhYmVsUHJvdmlkZXIgewotCS8qKgotCSAqIFRyZWVMYWJlbFByb3ZpZGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFRyZWVMYWJlbFByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qCi0JICogQWRkcyBhIGxpc3RlbmVyIHRvIHRoaXMgbGFiZWwgcHJvdmlkZXIuCi0JICovCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoKLQkgKiBEaXNwb3NlcyBvZiB0aGlzIGxhYmVsIHByb3ZpZGVyLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKgotCSAqIFJldHVybnMgdGhlIGltYWdlIGZvciB0aGUgbGFiZWwgb2YgdGhlIGdpdmVuIGVsZW1lbnQgZm9yIHVzZQotCSAqIGluIHRoZSBnaXZlbiB2aWV3ZXIuCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUmVxdWVzdCkgewotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBSZXNlbmRIVFRQUmVxdWVzdCkgewotCQkJCWlmICghKChSZXNlbmRIVFRQUmVxdWVzdCkgZWxlbWVudCkuaGFzQmVlblNlbnQoKSkKLQkJCQkJcmV0dXJuIE1vbml0b3JVSVBsdWdpbi5nZXRJbWFnZShNb25pdG9yVUlQbHVnaW4uSU1HX1JFU0VORF9SRVFVRVNUX1JFU1BPTlNFKTsKLQkJCX0KLQkJCXJldHVybiBNb25pdG9yVUlQbHVnaW4uZ2V0SW1hZ2UoTW9uaXRvclVJUGx1Z2luLklNR19SRVFVRVNUX1JFU1BPTlNFKTsKLQkJfQotCQlyZXR1cm4gTW9uaXRvclVJUGx1Z2luLmdldEltYWdlKE1vbml0b3JVSVBsdWdpbi5JTUdfSE9TVCk7Ci0JfQotCi0JLyoKLQkgKiBSZXR1cm5zIHRoZSB0ZXh0IGZvciB0aGUgbGFiZWwgb2YgdGhlIGdpdmVuIGVsZW1lbnQgZm9yIHVzZQotCSAqIGluIHRoZSBnaXZlbiB2aWV3ZXIuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUmVxdWVzdCkgewotCQkJUmVxdWVzdCBjYWxsID0gKFJlcXVlc3QpIGVsZW1lbnQ7Ci0JCQlyZXR1cm4gY2FsbC5nZXROYW1lKCk7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEludGVnZXIpIHsKLQkJCUludGVnZXIgaW4gPSAoSW50ZWdlcikgZWxlbWVudDsKLQkJCXJldHVybiAibG9jYWxob3N0OiIgKyBpbi5pbnRWYWx1ZSgpOwotCQl9IGVsc2UKLQkJCXJldHVybiBlbGVtZW50LnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGxhYmVsIHdvdWxkIGJlIGFmZmVjdGVkIAotCSAqIGJ5IGEgY2hhbmdlIHRvIHRoZSBnaXZlbiBwcm9wZXJ0eSBvZiB0aGUgZ2l2ZW4gZWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qCi0JICogUmVtb3ZlcyBhIGxpc3RlbmVyIHRvIHRoaXMgbGFiZWwgcHJvdmlkZXIuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkvLyBkbyBub3RoaW5nCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL3ZpZXcvVmlld2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC92aWV3L1ZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWNjZTM5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL3ZpZXcvVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLaAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLnZpZXc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLlRyYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLkNvbnRlbnRWaWV3ZXI7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgVmlld2VyIHsKLQlwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50OwotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IGNvbnRlbnQgdmlld2VyLgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IGEgY29uZmlndXJhdGlvbiBlbGVtZW50Ci0JICovCi0JcHVibGljIFZpZXdlcihJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcigpOwotCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZSgiaWQiKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlTdHJpbmcgbGFiZWwgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgibGFiZWwiKTsKLQkJaWYgKGxhYmVsID09IG51bGwpCi0JCQlyZXR1cm4gIm4vYSI7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIHZpZXdlci4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2aWV3ZXIsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIGl0IGNvdWxkbid0IGJlIGxvYWRlZAotCSAqLwotCXB1YmxpYyBDb250ZW50Vmlld2VyIGNyZWF0ZVZpZXdlcigpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiAoQ29udGVudFZpZXdlcikgZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJjbGFzcyIpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IGNyZWF0ZSB2aWV3ZXIiICsgdG9TdHJpbmcoKSArICI6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUmVxdWVzdFZpZXdlcigpIHsKLQkJcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ0eXBlIikudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJyZXF1ZXN0IikgPj0gMDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1Jlc3BvbnNlVmlld2VyKCkgewotCQlyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoInR5cGUiKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoInJlc3BvbnNlIikgPj0gMDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuCi0JICogCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIkNvbnRlbnRWaWV3ZXJbIiArIGdldElkKCkgKyAiXSI7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL3ZpZXcvVmlld2VyTWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvdmlldy9WaWV3ZXJNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3NDg2YzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvdmlldy9WaWV3ZXJNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC52aWV3OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwuSUNvbnRlbnRGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5odHRwLlJlc2VuZEhUVFBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC5Nb25pdG9yVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwuVHJhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuQ29udGVudFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC52aWV3ZXJzLkJ5dGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwudmlld2Vycy5IZWFkZXJWaWV3ZXI7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgVmlld2VyTWFuYWdlciB7Ci0JcHJpdmF0ZSBib29sZWFuIGRpc3BsYXlIZWFkZXJJbmY7Ci0KLQlwcm90ZWN0ZWQgQ29udGVudFZpZXdlciByZXFWaWV3ZXI7Ci0JcHJvdGVjdGVkIENvbnRlbnRWaWV3ZXIgcmVzcFZpZXdlcjsKLQlwcm90ZWN0ZWQgVmlld2VyIHJlcXVlc3RWaWV3ZXI7Ci0JcHJvdGVjdGVkIFZpZXdlciByZXNwb25zZVZpZXdlcjsKLQotCXByb3RlY3RlZCBIZWFkZXJWaWV3ZXIgcmVxSGVhZGVyOwotCXByb3RlY3RlZCBIZWFkZXJWaWV3ZXIgcmVzcEhlYWRlcjsKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgcmVxSENvbXA7Ci0JcHJvdGVjdGVkIENvbXBvc2l0ZSByZXFWQ29tcDsKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgcmVzcEhDb21wOwotCXByb3RlY3RlZCBDb21wb3NpdGUgcmVzcFZDb21wOwotCi0JcHJvdGVjdGVkIExpc3Qgdmlld2VyczsKLQotCXByb3RlY3RlZCBSZXF1ZXN0IHJlcXVlc3Q7Ci0KLQlwcm90ZWN0ZWQgTGlzdCBmaWx0ZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHVibGljIFZpZXdlck1hbmFnZXIoQ29tcG9zaXRlIHJlcUhlYWRQYXJlbnQsIENvbXBvc2l0ZSByZXFWaWV3UGFyZW50LCBDb21wb3NpdGUgcmVzcEhlYWRQYXJlbnQsIENvbXBvc2l0ZSByZXNwVmlld1BhcmVudCkgewotCQlyZXFIQ29tcCA9IHJlcUhlYWRQYXJlbnQ7Ci0JCXJlc3BIQ29tcCA9IHJlc3BIZWFkUGFyZW50OwotCQlyZXFWQ29tcCA9IHJlcVZpZXdQYXJlbnQ7Ci0JCXJlc3BWQ29tcCA9IHJlc3BWaWV3UGFyZW50OwotCQlyZXFIZWFkZXIgPSBuZXcgSGVhZGVyVmlld2VyKHJlcUhDb21wLCBIZWFkZXJWaWV3ZXIuUkVRVUVTVF9IRUFERVIpOwotCQlyZXNwSGVhZGVyID0gbmV3IEhlYWRlclZpZXdlcihyZXNwSENvbXAsIEhlYWRlclZpZXdlci5SRVNQT05TRV9IRUFERVIpOwotCQlyZXFWaWV3ZXIgPSBuZXcgQnl0ZVZpZXdlcigpOwotCQlyZXFWaWV3ZXIuaW5pdChyZXFWQ29tcCk7Ci0JCXJlc3BWaWV3ZXIgPSBuZXcgQnl0ZVZpZXdlcigpOwotCQlyZXNwVmlld2VyLmluaXQocmVzcFZDb21wKTsKLQkJc2V0RGlzcGxheUhlYWRlckluZm8oTW9uaXRvclVJUGx1Z2luLmdldFNob3dIZWFkZXJQcmVmZXJlbmNlKCkpOwotCQlsb2FkQXZhaWxhYmxlVmlld2VycygpOwotCX0KLQkKLQlwcm90ZWN0ZWQgVmlld2VyIGdldERlZmF1bHRWaWV3ZXIoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkKLQkJU3RyaW5nIG5hbWUyID0gbmFtZS50b0xvd2VyQ2FzZSgpOyAKLQkJaWYgKG5hbWUyLmVuZHNXaXRoKCIueG1sIikpCi0JCQlyZXR1cm4gZmluZFZpZXdlcigib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3Iudmlld2Vycy54bWwiKTsKLQkJZWxzZSBpZiAobmFtZTIuZW5kc1dpdGgoIi5odG1sIikpCi0JCQlyZXR1cm4gZmluZFZpZXdlcigib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3Iudmlld2Vycy5icm93c2VyIik7Ci0JCWVsc2UgaWYgKG5hbWUyLmVuZHNXaXRoKCIuZ2lmIikgfHwgbmFtZTIuZW5kc1dpdGgoIi5qcGciKSB8fAotCQkJCW5hbWUyLmVuZHNXaXRoKCIuanBlZyIpIHx8IG5hbWUyLmVuZHNXaXRoKCIucG5nIikpCi0JCQlyZXR1cm4gZmluZFZpZXdlcigib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3Iudmlld2Vycy5pbWFnZSIpOwotCQllbHNlCi0JCQlyZXR1cm4gZmluZFZpZXdlcigib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3Iudmlld2Vycy5ieXRlIik7Ci0JfQotCi0JcHJvdGVjdGVkIFZpZXdlciBmaW5kVmlld2VyKFN0cmluZyBpZCkgewotCQlpZiAoaWQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSB2aWV3ZXJzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVZpZXdlciB2aWV3ZXIgPSAoVmlld2VyKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoaWQuZXF1YWxzKHZpZXdlci5nZXRJZCgpKSkKLQkJCQlyZXR1cm4gdmlld2VyOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgdm9pZCBsb2FkQXZhaWxhYmxlVmlld2VycygpIHsKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2YgPSByZWdpc3RyeS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoTW9uaXRvclVJUGx1Z2luLlBMVUdJTl9JRCwgInZpZXdlcnMiKTsKLQkJaW50IHNpemUgPSBjZi5sZW5ndGg7Ci0JCXZpZXdlcnMgPSBuZXcgQXJyYXlMaXN0KHNpemUpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJdmlld2Vycy5hZGQobmV3IFZpZXdlcihjZltpXSkpOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuaW50ZXJuYWwudmlldy5JVmlld2VyTWFuYWdlciNzZXREaXNwbGF5SGVhZGVySW5mbyhib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERpc3BsYXlIZWFkZXJJbmZvKGJvb2xlYW4gYikgewotCQlkaXNwbGF5SGVhZGVySW5mID0gYjsKLQkJcmVxSGVhZGVyLnNldERpc3BsYXlIZWFkZXIoYik7Ci0JCXJlc3BIZWFkZXIuc2V0RGlzcGxheUhlYWRlcihiKTsKLQkJTW9uaXRvclVJUGx1Z2luLnNldFNob3dIZWFkZXJQcmVmZXJlbmNlKGIpOwotCQlpZiAoYikgewotCQkJcmVxSGVhZGVyLnNldEVkaXRhYmxlKGZhbHNlKTsKLQkJCWlmIChyZXF1ZXN0IGluc3RhbmNlb2YgUmVzZW5kSFRUUFJlcXVlc3QgJiYgcmVxdWVzdC5nZXRSZXNwb25zZShSZXF1ZXN0LlRSQU5TUE9SVCkgPT0gbnVsbCkgewotCQkJCXJlcUhlYWRlci5zZXRFZGl0YWJsZSh0cnVlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmludGVybmFsLnZpZXcuSVZpZXdlck1hbmFnZXIjZ2V0RGlzcGxheUhlYWRlckluZm8oKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldERpc3BsYXlIZWFkZXJJbmZvKCkgewotCQlyZXR1cm4gZGlzcGxheUhlYWRlckluZjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZXF1ZXN0KFJlcXVlc3QgcnIpIHsKLQkJLy8gbWFpbnRhaW4gdGhlIHN0YXRlIG9mIHRoZSByZXF1ZXN0IGFuZCByZXF1ZXN0IGhlYWRlciBpZiB0aGV5J3ZlIGJlZW4gbW9kaWZpZWQuCi0JCWlmIChyZXF1ZXN0IGluc3RhbmNlb2YgUmVzZW5kSFRUUFJlcXVlc3QgJiYgcmVxdWVzdC5nZXRSZXNwb25zZShSZXF1ZXN0LkFMTCkgPT0gbnVsbCkgewotCQkJUmVzZW5kSFRUUFJlcXVlc3QgcmVzUmVxdWVzdCA9IChSZXNlbmRIVFRQUmVxdWVzdCkgcmVxdWVzdDsKLQkJCS8vRWRpdGFibGVDb250ZW50Vmlld2VyIGVkaXRWaWV3ZXIgPSAoQ29udGVudFZpZXdlcikgcmVxVmlld2VyOwotCQkJYnl0ZVtdIGNvbnRlbnQgPSByZXFWaWV3ZXIuZ2V0Q29udGVudCgpOwotCQkJYnl0ZVtdIGIgPSByZXNSZXF1ZXN0LmdldFJlcXVlc3QoUmVxdWVzdC5DT05URU5UKTsKLQkJCWlmIChjb250ZW50ICE9IG51bGwgJiYgYiAhPSBudWxsICYmICFNb25pdG9yVUlQbHVnaW4ucGFyc2UoYikuZXF1YWxzKE1vbml0b3JVSVBsdWdpbi5wYXJzZShjb250ZW50KSkpIHsKLQkJCQlyZXNSZXF1ZXN0LnNldFJlcXVlc3QoY29udGVudCwgUmVxdWVzdC5DT05URU5UKTsKLQkJCX0KLQkJCWJ5dGVbXSBoZWFkZXIgPSByZXFIZWFkZXIuZ2V0Q29udGVudCgpOwotCQkJYiA9IHJlc1JlcXVlc3QuZ2V0UmVxdWVzdChSZXF1ZXN0LlRSQU5TUE9SVCk7Ci0JCQlpZiAoaGVhZGVyICE9IG51bGwgJiYgYiAhPSBudWxsICYmICFNb25pdG9yVUlQbHVnaW4ucGFyc2UoYikuZXF1YWxzKE1vbml0b3JVSVBsdWdpbi5wYXJzZShoZWFkZXIpKSkgewotCQkJCXJlc1JlcXVlc3Quc2V0UmVxdWVzdChoZWFkZXIsIFJlcXVlc3QuVFJBTlNQT1JUKTsKLQkJCX0KLQkJfQotCQlyZXFIZWFkZXIuc2V0UmVxdWVzdFJlc3BvbnNlKHJyKTsKLQkJcmVzcEhlYWRlci5zZXRSZXF1ZXN0UmVzcG9uc2UocnIpOwotCQlieXRlW10gYiA9IG51bGw7Ci0JCWlmIChyciAhPSBudWxsKQotCQkJYiA9IGZpbHRlcihyci5nZXRSZXF1ZXN0KFJlcXVlc3QuQ09OVEVOVCkpOwotCQlyZXFWaWV3ZXIuc2V0Q29udGVudChiKTsKLQkJYiA9IG51bGw7Ci0JCWlmIChyciAhPSBudWxsKQotCQkJYiA9IGZpbHRlcihyci5nZXRSZXNwb25zZShSZXF1ZXN0LkNPTlRFTlQpKTsKLQkJcmVzcFZpZXdlci5zZXRDb250ZW50KGIpOwotCQlyZXF1ZXN0ID0gcnI7Ci0JCQotCQkvLyBzZXQgdGhlIGVkaXRvciB0byBlZGl0YWJsZSBpZiB0aGUgcmVxdWVzdCBoYXNuJ3QgYmVlbiBzZW50IGFuZCB0aGUKLQkJLy8gZWRpdG9yIGNhbiBiZSBzZXQgYXMgZWRpdGFibGUKLQkJaWYgKHJlcXVlc3QgaW5zdGFuY2VvZiBSZXNlbmRIVFRQUmVxdWVzdCAmJiByZXF1ZXN0LmdldFJlc3BvbnNlKFJlcXVlc3QuQUxMKSA9PSBudWxsKSB7Ci0JCQlpZiAoZGlzcGxheUhlYWRlckluZikgewotCQkJCXJlcUhlYWRlci5zZXRFZGl0YWJsZSh0cnVlKTsKLQkJCX0KLQkJCXJlcVZpZXdlci5zZXRFZGl0YWJsZSh0cnVlKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChkaXNwbGF5SGVhZGVySW5mKSB7Ci0JCQkJcmVxSGVhZGVyLnNldEVkaXRhYmxlKGZhbHNlKTsKLQkJCX0KLQkJCXJlcVZpZXdlci5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRGaWx0ZXIoSUNvbnRlbnRGaWx0ZXIgZmlsdGVyKSB7Ci0JCWZpbHRlcnMuYWRkKGZpbHRlcik7Ci0JCXNldFJlcXVlc3QocmVxdWVzdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlRmlsdGVyKElDb250ZW50RmlsdGVyIGZpbHRlcikgewotCQlmaWx0ZXJzLnJlbW92ZShmaWx0ZXIpOwotCQlzZXRSZXF1ZXN0KHJlcXVlc3QpOwotCX0KLQotCXByb3RlY3RlZCBieXRlW10gZmlsdGVyKGJ5dGVbXSBiKSB7Ci0JCWlmIChiID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBmaWx0ZXJzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCUlDb250ZW50RmlsdGVyIGZpbHRlciA9IChJQ29udGVudEZpbHRlcikgaXRlcmF0b3IubmV4dCgpOwotCQkJdHJ5IHsKLQkJCQliID0gZmlsdGVyLmZpbHRlcihyZXF1ZXN0LCBmYWxzZSwgYik7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIHdoaWxlIGZpbHRlcmluZyB3aXRoICIgKyBmaWx0ZXIuZ2V0SWQoKSwgZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGI7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudGNwaXAubW9uaXRvci5pbnRlcm5hbC52aWV3LklWaWV3ZXJNYW5hZ2VyI2dldFJlcXVlc3RWaWV3ZXJzKCkKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRSZXF1ZXN0Vmlld2VycygpIHsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSB2aWV3ZXJzLml0ZXJhdG9yKCk7Ci0JCUxpc3QgdGVtcCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJVmlld2VyIHZpZXdlciA9IChWaWV3ZXIpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmICh2aWV3ZXIuaXNSZXF1ZXN0Vmlld2VyKCkpCi0JCQkJdGVtcC5hZGQodmlld2VyKTsKLQkJfQotCQlyZXR1cm4gdGVtcDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS50Y3BpcC5tb25pdG9yLmludGVybmFsLnZpZXcuSVZpZXdlck1hbmFnZXIjZ2V0UmVzcG9uc2VWaWV3ZXJzKCkKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRSZXNwb25zZVZpZXdlcnMoKSB7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gdmlld2Vycy5pdGVyYXRvcigpOwotCQlMaXN0IHRlbXAgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVZpZXdlciB2aWV3ZXIgPSAoVmlld2VyKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAodmlld2VyLmlzUmVzcG9uc2VWaWV3ZXIoKSkKLQkJCQl0ZW1wLmFkZCh2aWV3ZXIpOwotCQl9Ci0JCXJldHVybiB0ZW1wOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnRjcGlwLm1vbml0b3IuaW50ZXJuYWwudmlldy5JVmlld2VyTWFuYWdlciNzZXRSZXF1ZXN0Vmlld2VyKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVxdWVzdFZpZXdlcihWaWV3ZXIgdmlld2VyKSB7Ci0JCWlmICh2aWV3ZXIgIT0gbnVsbCAmJiB2aWV3ZXIuZXF1YWxzKHJlcXVlc3RWaWV3ZXIpKQotCQkJcmV0dXJuOwotCi0JCS8vIGNhbGwgc2V0IHJlcXVlc3QgdG8gc2F2ZSBhbmQgcmVzZXQgdGhlIHJlcXVlc3QKLQkJc2V0UmVxdWVzdChyZXF1ZXN0KTsKLQkJcmVxVmlld2VyLmRpc3Bvc2UoKTsKLQkJCi0JCXJlcXVlc3RWaWV3ZXIgPSB2aWV3ZXI7Ci0JCXJlcVZpZXdlciA9IHZpZXdlci5jcmVhdGVWaWV3ZXIoKTsKLQkJaWYgKHJlcVZpZXdlciA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkKLQkJcmVxVmlld2VyLmluaXQocmVxVkNvbXApOwotCQkvL3JlcVZpZXdlci5zZXRSZXF1ZXN0UmVzcG9uc2UocnIpOwotCQlieXRlW10gYiA9IG51bGw7Ci0JCWlmIChyZXF1ZXN0ICE9IG51bGwpIHsKLQkJCWIgPSBmaWx0ZXIocmVxdWVzdC5nZXRSZXF1ZXN0KFJlcXVlc3QuQ09OVEVOVCkpOwotCQkJLy8gc2V0IHRoZSBlZGl0b3IgdG8gZWRpdGFibGUgaWYgdGhlIHJlcXVlc3QgaGFzbid0IGJlZW4gc2VudCBhbmQgdGhlCi0JCQkvLyBlZGl0b3IgY2FuIGJlIHNldCBhcyBlZGl0YWJsZQotCQkJaWYgKHJlcXVlc3QgaW5zdGFuY2VvZiBSZXNlbmRIVFRQUmVxdWVzdCAmJiByZXF1ZXN0LmdldFJlc3BvbnNlKFJlcXVlc3QuVFJBTlNQT1JUKSA9PSBudWxsKSB7Ci0JCQkJcmVxVmlld2VyLnNldEVkaXRhYmxlKHRydWUpOwotCQkJfSBlbHNlIHsKLQkJCQlyZXFWaWV3ZXIuc2V0RWRpdGFibGUoZmFsc2UpOwotCQkJfQotCQl9Ci0JCXJlcVZpZXdlci5zZXRDb250ZW50KGIpOwotCQlyZXFWQ29tcC5sYXlvdXQodHJ1ZSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudGNwaXAubW9uaXRvci5pbnRlcm5hbC52aWV3LklWaWV3ZXJNYW5hZ2VyI3NldFJlc3BvbnNlVmlld2VyKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVzcG9uc2VWaWV3ZXIoVmlld2VyIHZpZXdlcikgewotCQlpZiAodmlld2VyICE9IG51bGwgJiYgdmlld2VyLmVxdWFscyhyZXNwb25zZVZpZXdlcikpCi0JCQlyZXR1cm47Ci0JCXJlc3BWaWV3ZXIuZGlzcG9zZSgpOwotCQkKLQkJcmVzcG9uc2VWaWV3ZXIgPSB2aWV3ZXI7Ci0JCXJlc3BWaWV3ZXIgPSB2aWV3ZXIuY3JlYXRlVmlld2VyKCk7Ci0JCWlmIChyZXNwVmlld2VyID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCXJlc3BWaWV3ZXIuaW5pdChyZXNwVkNvbXApOwotCQkvL3Jlc3BWaWV3ZXIuc2V0UmVxdWVzdFJlc3BvbnNlKHJyKTsKLQkJYnl0ZVtdIGIgPSBudWxsOwotCQlpZiAocmVxdWVzdCAhPSBudWxsKQotCQkJYiA9IGZpbHRlcihyZXF1ZXN0LmdldFJlc3BvbnNlKFJlcXVlc3QuQ09OVEVOVCkpOwotCQlyZXNwVmlld2VyLnNldENvbnRlbnQoYik7Ci0JCXJlc3BWQ29tcC5sYXlvdXQodHJ1ZSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwudmlldy5JVmlld2VyTWFuYWdlciNnZXRDdXJyZW50UmVxdWVzdFZpZXdlcigpCi0JICovCi0JcHVibGljIENvbnRlbnRWaWV3ZXIgZ2V0Q3VycmVudFJlcXVlc3RWaWV3ZXIoKSB7Ci0JCXJldHVybiByZXFWaWV3ZXI7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwudmlldy5JVmlld2VyTWFuYWdlciNnZXRDdXJyZW50UmVxdWVzdEhlYWRlclZpZXdlcigpCi0JICovCi0JcHVibGljIEhlYWRlclZpZXdlciBnZXRDdXJyZW50UmVxdWVzdEhlYWRlclZpZXdlcigpIHsKLQkJcmV0dXJuIHJlcUhlYWRlcjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvdmlld2Vycy9Ccm93c2VyVmlld2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC92aWV3ZXJzL0Jyb3dzZXJWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNkZmQ4NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC92aWV3ZXJzL0Jyb3dzZXJWaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwudmlld2VyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuQnJvd3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5Db250ZW50Vmlld2VyOwotLyoqCi0gKiBBIGJyb3dzZXIgdmlld2VyLgotICovCi1wdWJsaWMgY2xhc3MgQnJvd3NlclZpZXdlciBleHRlbmRzIENvbnRlbnRWaWV3ZXIgewotCXByb3RlY3RlZCBCcm93c2VyIGJyb3dzZXI7Ci0KLQlwcm90ZWN0ZWQgYnl0ZVtdIGNvbnRlbnQ7Ci0KLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgQ29udGVudFZpZXdlciNpbml0KENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJYnJvd3NlciA9IG5ldyBCcm93c2VyKHBhcmVudCwgU1dULkJPUkRFUik7Ci0JCWJyb3dzZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JfQotCi0JLyoqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIENvbnRlbnRWaWV3ZXIjc2V0Q29udGVudChieXRlW10pCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29udGVudChieXRlW10gYikgewotCQljb250ZW50ID0gYjsKLQkJaWYgKGIgPT0gbnVsbCB8fCBiLmxlbmd0aCA9PSAwKSB7Ci0JCQlicm93c2VyLnNldFRleHQoTWVzc2FnZXMuaHRtbFZpZXdJbnZhbGlkKTsKLQkJfSBlbHNlIHsKLQkJCWJ5dGUgY3IgPSAnXHInOwotCQkJYnl0ZSBsZiA9ICdcbic7Ci0JCQlpbnQgdHJpbUZyb250ID0gMDsKLQkJCWludCB0cmltQmFjayA9IDA7Ci0JCQlpbnQgbGVuID0gYi5sZW5ndGggLSAxOwotCQkJd2hpbGUgKGJbdHJpbUZyb250XSA9PSBjciB8fCBiW3RyaW1Gcm9udF0gPT0gbGYpCi0JCQkJdHJpbUZyb250Kys7Ci0JCQl3aGlsZSAoYltsZW4gLSB0cmltQmFja10gPT0gY3IgfHwgYltsZW4gLSB0cmltQmFja10gPT0gbGYpCi0JCQkJdHJpbUJhY2srKzsKLQkJCQkKLQkJCWlmICh0cmltRnJvbnQgKyB0cmltQmFjayA+IDApIHsKLQkJCQlieXRlW10gdGVtcCA9IGI7Ci0JCQkJYiA9IG5ldyBieXRlW3RlbXAubGVuZ3RoIC0gdHJpbUJhY2sgLSB0cmltRnJvbnRdOwotCQkJCWZvciAoaW50IGkgPSB0cmltRnJvbnQ7IGkgPCB0ZW1wLmxlbmd0aCAtIHRyaW1CYWNrOyBpKyspIHsKLQkJCQkJYltpIC0gdHJpbUZyb250XSA9IHRlbXBbaV07Ci0JCQkJfQotCQkJfQotCQkJYnJvd3Nlci5zZXRUZXh0KG5ldyBTdHJpbmcoYikpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDb250ZW50Vmlld2VyI2dldENvbnRlbnQoKQotCSAqLwotCXB1YmxpYyBieXRlW10gZ2V0Q29udGVudCgpIHsKLQkJcmV0dXJuIGNvbnRlbnQ7Ci0JfQotCi0JLyoqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIENvbnRlbnRWaWV3ZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJYnJvd3Nlci5kaXNwb3NlKCk7Ci0JCWJyb3dzZXIgPSBudWxsOwotCQljb250ZW50ID0gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvdmlld2Vycy9CeXRlVmlld2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC92aWV3ZXJzL0J5dGVWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAzNzdkZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC92aWV3ZXJzL0J5dGVWaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwudmlld2VyczsKLSAKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLkNvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwuTW9uaXRvclVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLkNvbnRlbnRWaWV3ZXI7Ci0vKioKLSAqIEEgYmFzaWMgYnl0ZSB2aWV3ZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBCeXRlVmlld2VyIGV4dGVuZHMgQ29udGVudFZpZXdlciB7Ci0JcHJvdGVjdGVkIFRleHQgdGV4dDsKLQotCS8qKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBDb250ZW50Vmlld2VyI2luaXQoQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoQ29tcG9zaXRlIHBhcmVudCkgewotCQl0ZXh0ID0gbmV3IFRleHQocGFyZW50LCBTV1QuQk9SREVSIHwgU1dULk1VTFRJIHwgU1dULlJFQURfT05MWSB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0JCURpc3BsYXkgZGlzcGxheSA9IHBhcmVudC5nZXREaXNwbGF5KCk7Ci0JCXRleHQuc2V0QmFja2dyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9MSVNUX0JBQ0tHUk9VTkQpKTsKLQkJdGV4dC5zZXRGb3JlZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0xJU1RfRk9SRUdST1VORCkpOwotCQl0ZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQl0ZXh0LnNldEZvbnQoSkZhY2VSZXNvdXJjZXMuZ2V0VGV4dEZvbnQoKSk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodGV4dCwgQ29udGV4dElkcy5WSUVXX1JFU1BPTlNFKTsKLQl9Ci0JCi0JLyoqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIENvbnRlbnRWaWV3ZXIjc2V0RWRpdGFibGUoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFZGl0YWJsZShib29sZWFuIGVkaXRhYmxlKSB7Ci0JCXRleHQuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCX0KLQotCS8qKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBDb250ZW50Vmlld2VyI2dldENvbnRlbnQoKQotCSAqLwotCXB1YmxpYyBieXRlW10gZ2V0Q29udGVudCgpIHsKLQkJaWYgKHRleHQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG5ldyBieXRlWzBdOwotCQl9Ci0JCVN0cmluZyBjb250ZW50ID0gdGV4dC5nZXRUZXh0KCkudHJpbSgpOwotCQlpZiAoY29udGVudC5lcXVhbHMoIiIpKSB7Ci0JCQlyZXR1cm4gbmV3IGJ5dGVbMF07Ci0JCX0KLQkJLy8gTmVlZCB0byBlbnN1cmUgdGhhdCB0aGVyZSBpcyBhIG5ld2xpbmUgYXQgdGhlIGVuZCBvZiB0aGUgY29udGVudC4KLQkJLy8gZ2V0Qnl0ZXMoKSByZW1vdmVzIHRoZSBuZXdsaW5lLgotCQlieXRlW10gdHdvTmV3bGluZXMgPSBuZXcgYnl0ZVtdIHsgJ1wwMTUnLCAnXDAxMicgfTsKLQkJYnl0ZVtdIGNvbnRlbnRCeXRlcyA9IGNvbnRlbnQuZ2V0Qnl0ZXMoKTsKLQkJYnl0ZVtdIHJldEJ5dGVzID0gbmV3IGJ5dGVbY29udGVudEJ5dGVzLmxlbmd0aCArIDJdOwotCQlTeXN0ZW0uYXJyYXljb3B5KGNvbnRlbnRCeXRlcywgMCwgcmV0Qnl0ZXMsIDAsIGNvbnRlbnRCeXRlcy5sZW5ndGgpOwotCQlTeXN0ZW0uYXJyYXljb3B5KHR3b05ld2xpbmVzLCAwLCByZXRCeXRlcywgY29udGVudEJ5dGVzLmxlbmd0aCwgMik7Ci0JCXJldHVybiByZXRCeXRlczsKLQl9Ci0KLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgQ29udGVudFZpZXdlciNzZXRDb250ZW50KGJ5dGVbXSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb250ZW50KGJ5dGVbXSBiKSB7Ci0JCVN0cmluZyBvdXQgPSAiIjsKLQkJaWYgKGIgIT0gbnVsbCkKLQkJCW91dCA9IE1vbml0b3JVSVBsdWdpbi5wYXJzZShiKTsKLQotCQlTdHJpbmcgbGluZVNlcGFyYXRvciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKLQkJaW50IGxzID0gbGluZVNlcGFyYXRvci5sZW5ndGgoKTsKLQkJaWYgKG91dC5sZW5ndGgoKSA+IGxzKSB7Ci0JCQl3aGlsZSAob3V0LnN1YnN0cmluZygwLCBscykuaW5kZXhPZihsaW5lU2VwYXJhdG9yKSA+PSAwKQotCQkJCW91dCA9IG91dC5zdWJzdHJpbmcobHMsIG91dC5sZW5ndGgoKSk7IAotCQl9Ci0JCQotCQl0ZXh0LnNldFRleHQob3V0KTsKLQl9Ci0KLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgQ29udGVudFZpZXdlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQl0ZXh0LmRpc3Bvc2UoKTsKLQkJdGV4dCA9IG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL3ZpZXdlcnMvSGVhZGVyVmlld2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC92aWV3ZXJzL0hlYWRlclZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWRmYmMxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL3ZpZXdlcnMvSGVhZGVyVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC52aWV3ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwuQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC5Nb25pdG9yVUlQbHVnaW47Ci0vKioKLSAqIEFuIHRyYW5zcG9ydCAoaGVhZGVyKSB2aWV3ZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBIZWFkZXJWaWV3ZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBIRUFERVJfVEVYVF9TSVpFID0gMTEwOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZGlzcGxheUhlYWRlcjsKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgaGVhZGVyQ29tcDsKLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGlubmVyQ29tcDsKLQotCXByb3RlY3RlZCBMYWJlbCBoZWFkZXJMYWJlbDsKLQlwcm90ZWN0ZWQgVGV4dCBoZWFkZXJUZXh0OwotCXByb3RlY3RlZCBSZXF1ZXN0IHJyOwotCXByb3RlY3RlZCBieXRlIG1zZzsKLQlwcm90ZWN0ZWQgR3JpZExheW91dCBsYXlvdXQ7Ci0JcHJvdGVjdGVkIEdyaWREYXRhIGRhdGE7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoaWRkZW47Ci0JCi0JLyoqCi0JICogUmVxdWVzdCBoZWFkZXIgY29uc3RhbnQuCi0JICovCi0JcHVibGljIHN0YXRpYyBieXRlIFJFUVVFU1RfSEVBREVSID0gMDsKLQkKLQkvKioKLQkgKiBSZXNwb25zZSBoZWFkZXIgY29uc3RhbnQuCi0JICovCi0JcHVibGljIHN0YXRpYyBieXRlIFJFU1BPTlNFX0hFQURFUiA9IDE7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgaGVhZGVyIHZpZXdlci4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKi8KLQlwdWJsaWMgSGVhZGVyVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIGJ5dGUgbWVzc2FnZSkgewotCQlkaXNwbGF5SGVhZGVyID0gdHJ1ZTsKLQkJaGlkZGVuID0gZmFsc2U7Ci0JCQotCQloZWFkZXJDb21wID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJaGVhZGVyQ29tcC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpOwotCQloZWFkZXJDb21wLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJaW5uZXJDb21wID0gbmV3IENvbXBvc2l0ZShoZWFkZXJDb21wLCBTV1QuTk9ORSk7Ci0JCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDI7Ci0JCWlubmVyQ29tcC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlpbm5lckNvbXAuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlyciA9IG51bGw7Ci0JCW1zZyA9IG1lc3NhZ2U7Ci0KLQkJc2V0RGlzcGxheUhlYWRlcihmYWxzZSk7Ci0JfQotCQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSByZXF1ZXN0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0UmVxdWVzdFJlc3BvbnNlKFJlcXVlc3QgcmVxdWVzdCkgewotCQlyciA9IHJlcXVlc3Q7Ci0JCWlmICghaGlkZGVuKQotCQkJZ2V0VmlldygpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBiCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGlzcGxheUhlYWRlcihib29sZWFuIGIpIHsKLQkJaWYgKGRpc3BsYXlIZWFkZXIgIT0gYikgewotCQkJZGlzcGxheUhlYWRlciA9IGI7Ci0JCQlpZiAoZGlzcGxheUhlYWRlcikgewotCQkJCWlubmVyQ29tcC5kaXNwb3NlKCk7Ci0KLQkJCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyk7Ci0JCQkJZGF0YS5oZWlnaHRIaW50ID0gSEVBREVSX1RFWFRfU0laRTsKLQkJCQloZWFkZXJDb21wLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQkJCQkJCQotCQkJCWlubmVyQ29tcCA9IG5ldyBDb21wb3NpdGUoaGVhZGVyQ29tcCwgU1dULk5PTkUpOwotCQkJCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotCQkJCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQkJCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCQkJaW5uZXJDb21wLnNldExheW91dChsYXlvdXQpOwotCQkJCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJCQlkYXRhLmhlaWdodEhpbnQgPSBIRUFERVJfVEVYVF9TSVpFOwotCQkJCWlubmVyQ29tcC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkJCQkJCQkKLQkJCQloZWFkZXJUZXh0ID0gbmV3IFRleHQoaW5uZXJDb21wLCBTV1QuQk9SREVSIHwgU1dULk1VTFRJIHwgU1dULlJFQURfT05MWSB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0JCQkJRGlzcGxheSBkaXNwbGF5ID0gaW5uZXJDb21wLmdldERpc3BsYXkoKTsKLQkJCQloZWFkZXJUZXh0LnNldEJhY2tncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTElTVF9CQUNLR1JPVU5EKSk7Ci0JCQkJaGVhZGVyVGV4dC5zZXRGb3JlZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0xJU1RfRk9SRUdST1VORCkpOwotCQkJCWhlYWRlclRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuRklMTF9WRVJUSUNBTCkpOwotCQkJCWhlYWRlclRleHQuc2V0Rm9udChKRmFjZVJlc291cmNlcy5nZXRUZXh0Rm9udCgpKTsKLQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGhlYWRlclRleHQsIENvbnRleHRJZHMuVklFV19SRVNQT05TRSk7Ci0KLQkJCQloZWFkZXJDb21wLmdldFBhcmVudCgpLmxheW91dCh0cnVlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaW5uZXJDb21wLmRpc3Bvc2UoKTsKLQotCQkJCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKTsKLQkJCQloZWFkZXJDb21wLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQkJCi0JCQkJaW5uZXJDb21wID0gbmV3IENvbXBvc2l0ZShoZWFkZXJDb21wLCBTV1QuTk9ORSk7Ci0JCQkJbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJCQlsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0JCQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMjsKLQkJCQlpbm5lckNvbXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQkJCWlubmVyQ29tcC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCQkJaGVhZGVyTGFiZWwgPSBuZXcgTGFiZWwoaW5uZXJDb21wLCBTV1QuTk9ORSk7Ci0JCQkJaGVhZGVyTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKSk7Ci0JCQkJCi0JCQkJaGVhZGVyQ29tcC5nZXRQYXJlbnQoKS5sYXlvdXQodHJ1ZSk7Ci0JCQl9Ci0JCX0KLQkJZ2V0VmlldygpOwotCX0KLQotCXByaXZhdGUgdm9pZCBnZXRWaWV3KCkgewotCQlTdHJpbmcgb3V0ID0gIiI7Ci0JCWlmIChyciAhPSBudWxsKSB7Ci0JCQlpZiAobXNnID09IFJFUVVFU1RfSEVBREVSKSB7Ci0JCQkJYnl0ZVtdIGIgPSByci5nZXRSZXF1ZXN0KFJlcXVlc3QuVFJBTlNQT1JUKTsKLQkJCQlpZiAoYiAhPSBudWxsKQotCQkJCQlvdXQgPSBNb25pdG9yVUlQbHVnaW4ucGFyc2UoYik7Ci0JCQl9IGVsc2UgaWYgKG1zZyA9PSBSRVNQT05TRV9IRUFERVIpIHsKLQkJCQlieXRlW10gYiA9IHJyLmdldFJlc3BvbnNlKFJlcXVlc3QuVFJBTlNQT1JUKTsKLQkJCQlpZiAoYiAhPSBudWxsKQotCQkJCQlvdXQgPSBNb25pdG9yVUlQbHVnaW4ucGFyc2UoYik7Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmIChkaXNwbGF5SGVhZGVyKQotCQkJaGVhZGVyVGV4dC5zZXRUZXh0KG91dCk7Ci0JCWVsc2UgewotCQkJU3RyaW5nIGxpbmVTZXBhcmF0b3IgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7Ci0JCQlpbnQgaW5kZXggPSBvdXQuaW5kZXhPZihsaW5lU2VwYXJhdG9yKTsKLQkJCWlmIChpbmRleCA+IDApCi0JCQkJaGVhZGVyTGFiZWwuc2V0VGV4dChOTFMuYmluZChNZXNzYWdlcy5oZWFkZXJMYWJlbCwgb3V0LnN1YnN0cmluZygwLCBpbmRleCkpKTsKLQkJCWVsc2UgCi0JCQkJaGVhZGVyTGFiZWwuc2V0VGV4dChOTFMuYmluZChNZXNzYWdlcy5oZWFkZXJMYWJlbCwgb3V0KSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEaXNwb3NlIHRoZSBoZWFkZXIuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaGVhZGVyQ29tcC5kaXNwb3NlKCk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHdoZXRoZXIgdGhlIGhlYWRlciBjYW4gYmUgZWRpdGVkLgotCSAqIAotCSAqIEBwYXJhbSBlZGl0YWJsZSBJZiB0cnVlIHRoZSBoZWFkZXIgY2FuIGJlIGVkaXRlZCwgb3RoZXJ3aXNlIHRoZSBoZWFkZXIgY2Fubm90IGJlIGVkaXRlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFZGl0YWJsZShib29sZWFuIGVkaXRhYmxlKSB7Ci0JCWhlYWRlclRleHQuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgY29udGVudCBmcm9tIHRoZSBoZWFkZXIuCi0JICogCi0JICogQHJldHVybiBUaGUgY29udGVudCBmcm9tIHRoZSBoZWFkZXIuCi0JICovCi0JcHVibGljIGJ5dGVbXSBnZXRDb250ZW50KCkgewotCQlpZiAoaGVhZGVyVGV4dCA9PSBudWxsIHx8IGhlYWRlclRleHQuaXNEaXNwb3NlZCgpKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlTdHJpbmcgaGVhZGVyID0gaGVhZGVyVGV4dC5nZXRUZXh0KCkudHJpbSgpOwotCQkvLyBOZWVkIHRvIGVuc3VyZSB0aGF0IHRoZSBmb2xsb3dpbmcgNCBieXRlcyBlbmQgdGhlIGhlYWRlci4gVGhlIGdldEJ5dGVzKCkKLQkJLy8gbWV0aG9kIHJlbW92ZXMgc3BhY2VzIGF0IHRoZSBlbmQgb2YgdGhlIHN0cmluZy4KLQkJYnl0ZVtdIHR3b05ld2xpbmVzID0gbmV3IGJ5dGVbXSB7ICdcMDE1JywgJ1wwMTInLCAnXDAxNScsICdcMDEyJyB9OwotCQlieXRlW10gaGVhZGVyQnl0ZXMgPSBoZWFkZXIuZ2V0Qnl0ZXMoKTsKLQkJYnl0ZVtdIHJldEJ5dGVzID0gbmV3IGJ5dGVbaGVhZGVyQnl0ZXMubGVuZ3RoICsgNF07Ci0JCVN5c3RlbS5hcnJheWNvcHkoaGVhZGVyQnl0ZXMsIDAsIHJldEJ5dGVzLCAwLCBoZWFkZXJCeXRlcy5sZW5ndGgpOwotCQlTeXN0ZW0uYXJyYXljb3B5KHR3b05ld2xpbmVzLCAwLCByZXRCeXRlcywgaGVhZGVyQnl0ZXMubGVuZ3RoLCA0KTsKLQkJcmV0dXJuIHJldEJ5dGVzOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC92aWV3ZXJzL0ltYWdlVmlld2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC92aWV3ZXJzL0ltYWdlVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4NjE4ZWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9tb25pdG9ydWkvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L21vbml0b3IvdWkvaW50ZXJuYWwvdmlld2Vycy9JbWFnZVZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC52aWV3ZXJzOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuQ29udGVudFZpZXdlcjsKLS8qKgotICogQW4gaW1hZ2Ugdmlld2VyLgotICovCi1wdWJsaWMgY2xhc3MgSW1hZ2VWaWV3ZXIgZXh0ZW5kcyBDb250ZW50Vmlld2VyIHsKLQlwcm90ZWN0ZWQgTGFiZWwgbWVzc2FnZUxhYmVsOwotCQotCXByb3RlY3RlZCBieXRlW10gY29udGVudDsKLQotCS8qKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBDb250ZW50Vmlld2VyI2luaXQoQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoQ29tcG9zaXRlIHBhcmVudCkgewotCQltZXNzYWdlTGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JCW1lc3NhZ2VMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORyB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORykpOwotCQltZXNzYWdlTGFiZWwuc2V0VGV4dChNZXNzYWdlcy5pbWFnZVZpZXdJbnZhbGlkKTsKLQl9Ci0JCi0JLyoqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIENvbnRlbnRWaWV3ZXIjc2V0Q29udGVudChieXRlW10pCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29udGVudChieXRlW10gYikgewotCQljb250ZW50ID0gYjsKLQkJaWYgKGIgPT0gbnVsbCB8fCBiLmxlbmd0aCA9PSAwKSB7Ci0JCQltZXNzYWdlTGFiZWwuc2V0SW1hZ2UobnVsbCk7Ci0JCX0gZWxzZSB7Ci0JCQlieXRlIGNyID0gJ1xyJzsKLQkJCWJ5dGUgbGYgPSAnXG4nOwotCQkJaW50IHRyaW1Gcm9udCA9IDA7Ci0JCQlpbnQgdHJpbUJhY2sgPSAwOwotCQkJaW50IGxlbiA9IGIubGVuZ3RoIC0gMTsKLQkJCXdoaWxlIChiW3RyaW1Gcm9udF0gPT0gY3IgfHwgYlt0cmltRnJvbnRdID09IGxmKQotCQkJCXRyaW1Gcm9udCsrOwotCQkJd2hpbGUgKGJbbGVuIC0gdHJpbUJhY2tdID09IGNyIHx8IGJbbGVuIC0gdHJpbUJhY2tdID09IGxmKQotCQkJCXRyaW1CYWNrKys7Ci0JCQkJCi0JCQlpZiAodHJpbUZyb250ICsgdHJpbUJhY2sgPiAwKSB7Ci0JCQkJYnl0ZVtdIHRlbXAgPSBiOwotCQkJCWIgPSBuZXcgYnl0ZVt0ZW1wLmxlbmd0aCAtIHRyaW1CYWNrIC0gdHJpbUZyb250XTsKLQkJCQlmb3IgKGludCBpID0gdHJpbUZyb250OyBpIDwgdGVtcC5sZW5ndGggLSB0cmltQmFjazsgaSsrKSB7Ci0JCQkJCWJbaSAtIHRyaW1Gcm9udF0gPSB0ZW1wW2ldOwotCQkJCX0KLQkJCX0KLQkJCXRyeSB7Ci0JCQkJSW1hZ2VEYXRhIGltZ0QgPSBuZXcgSW1hZ2VEYXRhKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiKSk7Ci0JCQkJSW1hZ2UgaW1nID0gbmV3IEltYWdlKG51bGwsIGltZ0QpOwotCQkJCW1lc3NhZ2VMYWJlbC5zZXRJbWFnZShpbWcpOwotCQkJfSBjYXRjaChFeGNlcHRpb24gZSkgewotCQkJCW1lc3NhZ2VMYWJlbC5zZXRJbWFnZShudWxsKTsKLQkJCX0KLQkJfQotCQkKLQkJQ29tcG9zaXRlIHBhcmVudCA9IG1lc3NhZ2VMYWJlbC5nZXRQYXJlbnQoKTsKLQkJbWVzc2FnZUxhYmVsLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0JCXBhcmVudC5sYXlvdXQodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDb250ZW50Vmlld2VyI2dldENvbnRlbnQoKQotCSAqLwotCXB1YmxpYyBieXRlW10gZ2V0Q29udGVudCgpIHsKLQkJcmV0dXJuIGNvbnRlbnQ7Ci0JfQotCi0JLyoqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIENvbnRlbnRWaWV3ZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJbWVzc2FnZUxhYmVsLmRpc3Bvc2UoKTsKLQkJbWVzc2FnZUxhYmVsID0gbnVsbDsKLQkJY29udGVudCA9IG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL3ZpZXdlcnMvWE1MVmlld2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL21vbml0b3J1aS9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvbW9uaXRvci91aS9pbnRlcm5hbC92aWV3ZXJzL1hNTFZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTEzZDFjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvbW9uaXRvcnVpL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9tb25pdG9yL3VpL2ludGVybmFsL3ZpZXdlcnMvWE1MVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqICAgICAyMDA1LTExLTI1IEFydGh1ciBSeW1hbiwgcnltYW5AY2EuaWJtLmNvbQotICogICAgIC0gZml4ZWQgYnVnIDExODEwMjogc2V0IHhtbFRhZ01pc3NpbmcgY29ycmVjdGx5IGVhY2ggdGltZSBzZXRDb250ZW50KCkgaXMgY2FsbGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwudmlld2VyczsKLSAKLWltcG9ydCBqYXZhLmlvLio7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLio7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5kb20uRE9NU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0YWNrTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLkNvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwuTW9uaXRvclVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLkNvbnRlbnRWaWV3ZXI7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS4qOwotaW1wb3J0IG9yZy54bWwuc2F4Lio7Ci0vKioKLSAqIFhNTCBWaWV3ZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxWaWV3ZXIgZXh0ZW5kcyBDb250ZW50Vmlld2VyIHsKLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIHZpZXdlckNvbXA7Ci0JcHJvdGVjdGVkIFN0YWNrTGF5b3V0IGxheW91dDsKLQlwcm90ZWN0ZWQgVGV4dCBtZXNzYWdlVGV4dDsKLQlwcm90ZWN0ZWQgTGFiZWwgbWVzc2FnZUxhYmVsOwotCQotCXByb3RlY3RlZCBib29sZWFuIHhtbFRhZ01pc3NpbmcgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBzZXRFbmNvZGluZyA9IGZhbHNlOwotCXByb3RlY3RlZCBib29sZWFuIG1pc3NpbmdFbmNvZGluZyA9IGZhbHNlOwotCXByb3RlY3RlZCBTdHJpbmcgb3JpZ2luYWxFbmNvZGluZzsKLQkKLQlwcm90ZWN0ZWQgYnl0ZVtdIGNvbnRlbnQ7Ci0JCi0JLyoqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIENvbnRlbnRWaWV3ZXIjc2V0Q29udGVudChieXRlW10pCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29udGVudChieXRlW10gYikgewotCQljb250ZW50ID0gYjsKLQkJU3RyaW5nIG91dCA9ICIiOwkJCi0JCWlmIChiICE9IG51bGwpCi0JCQlvdXQgPSBNb25pdG9yVUlQbHVnaW4ucGFyc2UoYik7Ci0JCQkJCi0JCVN0cmluZyBsaW5lU2VwYXJhdG9yID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOwotCQlpbnQgbHMgPSBsaW5lU2VwYXJhdG9yLmxlbmd0aCgpOwotCQlpZiAob3V0Lmxlbmd0aCgpID4gbHMpIHsKLQkJCXdoaWxlIChvdXQuc3Vic3RyaW5nKDAsIGxzKS5pbmRleE9mKGxpbmVTZXBhcmF0b3IpID49IDApCi0JCQlvdXQgPSBvdXQuc3Vic3RyaW5nKGxzLCBvdXQubGVuZ3RoKCkpOyAKLQkJfQotCQkKLQkJU3RyaW5nIG91dF90ZW1wID0gb3V0LnRvTG93ZXJDYXNlKCk7Ci0JCXhtbFRhZ01pc3NpbmcgPSAhb3V0X3RlbXAuc3RhcnRzV2l0aCgiPD94bWwiKTsKLQkJCi0JCWlmIChvdXQubGVuZ3RoKCkgPiAwKSB7Ci0JCQlieXRlW10gYjEgPSBjcmVhdGVEb2N1bWVudChvdXQpOwotCQkJU3RyaW5nIGZpbmFsTXNnID0gbmV3IFN0cmluZyAoYjEpOwotCQkJaWYgKGZpbmFsTXNnLnN0YXJ0c1dpdGgoIkludmFsaWQgWE1MIikpIHsKLQkJCQkvL2Nhc2U6IGVycm9yIHBhcnNpbmcKLQkJCQltZXNzYWdlVGV4dC5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCQlsYXlvdXQudG9wQ29udHJvbCA9IG1lc3NhZ2VMYWJlbDsKLQkJCQltZXNzYWdlTGFiZWwuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCQltZXNzYWdlTGFiZWwuc2V0VGV4dChNZXNzYWdlcy54bWxWaWV3SW52YWxpZCk7Ci0JCQl9IGVsc2UgaWYgKHhtbFRhZ01pc3NpbmcgJiYgZmluYWxNc2cuc3RhcnRzV2l0aCgiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+IikpIHsKLQkJCQlpbnQgeCA9IGZpbmFsTXNnLmluZGV4T2YoIlxuIikgKyAxOwotCQkJCVN0cmluZyBNc2cgPSBmaW5hbE1zZy5zdWJzdHJpbmcoeCk7Ci0JCQkJZmluYWxNc2cgPSBNc2c7Ci0JCQkJCi0JCQkJbWVzc2FnZVRleHQuc2V0VGV4dChmaW5hbE1zZyk7Ci0JCQl9IGVsc2UgaWYgKHNldEVuY29kaW5nKSB7Ci0JCQkJLy9jaGFuZ2UgYmFjayB0byBvcmlnaW5hbCBFbmNvZGluZwotCQkJCWludCBiZWdpbiA9IGZpbmFsTXNnLmluZGV4T2YoIlVURi04Iik7IC8vbG9jYXRpb24gb2Ygb3BlbmluZyAiCi0JCQkJaW50IGxhc3QgPSBiZWdpbiArIDU7ICAvL2xvY2F0aW9uIG9mIGNsb3NpbmcgIgotCQkJCVN0cmluZyBmaXJzdF9oYWxmID0gZmluYWxNc2cuc3Vic3RyaW5nKDAsYmVnaW4pOwotCQkJCVN0cmluZyBzZWNvbmRfaGFsZiA9IGZpbmFsTXNnLnN1YnN0cmluZyhsYXN0KTsKLQkJCQlmaW5hbE1zZyA9IGZpcnN0X2hhbGYgKyBvcmlnaW5hbEVuY29kaW5nICsgc2Vjb25kX2hhbGY7CQotCQkJCQotCQkJCW1lc3NhZ2VUZXh0LnNldFRleHQoZmluYWxNc2cpOwotCQkJfSBlbHNlIGlmIChtaXNzaW5nRW5jb2RpbmcpIHsKLQkJCQkvL3JlbW92ZSBlbmNvZGluZyBjb21wbGV0ZWx5Ci0JCQkJaW50IGJlZ2luID0gZmluYWxNc2cuaW5kZXhPZigiZW5jb2Rpbmc9XCJVVEYtOFwiIik7IC8vbG9jYXRpb24gb2Ygb3BlbmluZyAiCi0JCQkJaW50IGxhc3QgPSBiZWdpbiArIDE2OyAgLy9sb2NhdGlvbiBvZiBjbG9zaW5nICIKLQkJCQlTdHJpbmcgZmlyc3RfaGFsZiA9IGZpbmFsTXNnLnN1YnN0cmluZygwLGJlZ2luKTsKLQkJCQlTdHJpbmcgc2Vjb25kX2hhbGYgPSBmaW5hbE1zZy5zdWJzdHJpbmcobGFzdCk7Ci0JCQkJZmluYWxNc2cgPSBmaXJzdF9oYWxmICsgc2Vjb25kX2hhbGY7Ci0JCQkJCi0JCQkJbWVzc2FnZVRleHQuc2V0VGV4dChmaW5hbE1zZyk7CQotCQkJfQkJCQotCQl9IGVsc2UKLQkJCW1lc3NhZ2VUZXh0LnNldFRleHQob3V0KTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBDb250ZW50Vmlld2VyI2dldENvbnRlbnQoKQotCSAqLwotCXB1YmxpYyBieXRlW10gZ2V0Q29udGVudCgpIHsKLQkJcmV0dXJuIGNvbnRlbnQ7Ci0JfQotCQotCS8qKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBDb250ZW50Vmlld2VyI2luaXQoQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoQ29tcG9zaXRlIHBhcmVudCkgewotCQl2aWV3ZXJDb21wID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJbGF5b3V0ID0gbmV3IFN0YWNrTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQl2aWV3ZXJDb21wLnNldExheW91dChsYXlvdXQpOwotCQl2aWV3ZXJDb21wLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQotCQltZXNzYWdlVGV4dCA9IG5ldyBUZXh0KHZpZXdlckNvbXAsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkgfCBTV1QuUkVBRF9PTkxZIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLQkJRGlzcGxheSBkaXNwbGF5ID0gdmlld2VyQ29tcC5nZXREaXNwbGF5KCk7Ci0JCW1lc3NhZ2VUZXh0LnNldEJhY2tncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTElTVF9CQUNLR1JPVU5EKSk7Ci0JCW1lc3NhZ2VUZXh0LnNldEZvcmVncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTElTVF9GT1JFR1JPVU5EKSk7Ci0JCW1lc3NhZ2VUZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkZJTExfVkVSVElDQUwpKTsKLQkJbWVzc2FnZVRleHQuc2V0Rm9udChKRmFjZVJlc291cmNlcy5nZXRUZXh0Rm9udCgpKTsKLQkJbWVzc2FnZVRleHQuc2V0VmlzaWJsZSh0cnVlKTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChtZXNzYWdlVGV4dCwgQ29udGV4dElkcy5WSUVXX1JFU1BPTlNFKTsKLQkJCi0JCW1lc3NhZ2VMYWJlbCA9IG5ldyBMYWJlbCh2aWV3ZXJDb21wLCBTV1QuTk9ORSk7Ci0JCW1lc3NhZ2VMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORyB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORykpOwotCQltZXNzYWdlTGFiZWwuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQotCQlsYXlvdXQudG9wQ29udHJvbCA9IG1lc3NhZ2VUZXh0OwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQCNjcmVhdGVEb2N1bWVudChTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIGJ5dGVbXSBjcmVhdGVEb2N1bWVudChTdHJpbmcgc3RyKSB7Ci0JCWJ5dGVbXSBwYXJzZUFycmF5ID0gbnVsbDsKLQkJRG9jdW1lbnQgZG9jdW1lbnQgPSBudWxsOwotCQlieXRlW10gcmVzdWx0ID0gbnVsbDsJCi0JCQotCQl0cnkgewkKLQkJCURvY3VtZW50QnVpbGRlckZhY3RvcnkgZmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLQkJCXRyeSB7Ci0JCQkJZmFjdG9yeS5zZXRBdHRyaWJ1dGUoImh0dHA6Ly9hcGFjaGUub3JnL3htbC9mZWF0dXJlcy9hbGxvdy1qYXZhLWVuY29kaW5ncyIsIG5ldyBCb29sZWFuKHRydWUpKTsKLQkJCQlmYWN0b3J5LnNldEF0dHJpYnV0ZSgiaHR0cDovL2FwYWNoZS5vcmcveG1sL2ZlYXR1cmVzL2NvbnRpbnVlLWFmdGVyLWZhdGFsLWVycm9yIiwgbmV3IEJvb2xlYW4odHJ1ZSkpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBpZ25vcmUKLQkJCX0KLQkJCURvY3VtZW50QnVpbGRlciBwYXJzZXIgPSBmYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOwotCQkJCi0JCQlpZiAoeG1sVGFnTWlzc2luZykgewotCQkJCXN0ciA9ICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz4iICsgc3RyOwotCQkJfSBlbHNlIHsKLQkJCQlTdHJpbmcgc3RyX3RlbXAgPSBzdHIudG9Mb3dlckNhc2UoKTsKLQkJCQkKLQkJCQkvL2lmIGVuY29kaW5nIHByZXNlbnQsdGhlbiBzYXZlIG9yaWdpbmFsIEVuY29kaW5nLCBjaGFuZ2UgdG8gVVRGLTgKLQkJCQlpZiAoc3RyX3RlbXAuaW5kZXhPZigiZW5jb2Rpbmc9IikgPj0gMCkgewotCQkJCQlzZXRFbmNvZGluZyA9IHRydWU7Ci0JCQkJCVN0cmluZyB0ZW1wMSA9IHN0ci5zdWJzdHJpbmcoc3RyX3RlbXAuaW5kZXhPZigiZW5jb2Rpbmc9IikpOwotCQkJCQlpbnQgYmVnaW5JbmRleCA9IHRlbXAxLmluZGV4T2YoIlwiIikgKyAxOwotCQkJCQlTdHJpbmcgdGVtcDIgPSB0ZW1wMS5zdWJzdHJpbmcoYmVnaW5JbmRleCk7Ci0JCQkJCWludCBlbmRJbmRleCA9IHRlbXAyLmluZGV4T2YoIlwiIik7Ci0JCQkJCW9yaWdpbmFsRW5jb2RpbmcgPSB0ZW1wMi5zdWJzdHJpbmcoMCwgZW5kSW5kZXgpOwotCQkJCX0JCi0JCQkJCi0JCQkJLy9pZiBubyBlbmNvZGluZyBhdCBhbGwsdGhlbiBubyBjaGFuZ2VzIHRvIGJlIG1hZGUKLQkJCQllbHNlIGlmIChzdHJfdGVtcC5pbmRleE9mKCJlbmNvZGluZyIpIDwgMCkgewotCQkJCQlzZXRFbmNvZGluZyA9IGZhbHNlOwkKLQkJCQkJbWlzc2luZ0VuY29kaW5nID0gdHJ1ZTsJCQotCQkJCX0JCi0JCQl9Ci0JCQlwYXJzZUFycmF5ID0gc3RyLmdldEJ5dGVzKCk7Ci0JCQlkb2N1bWVudCA9IHBhcnNlci5wYXJzZShuZXcgSW5wdXRTb3VyY2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHBhcnNlQXJyYXkpKSk7ICAKLQkJCXJlc3VsdCA9IGdldENvbnRlbnRzKGRvY3VtZW50KTsKLQkJCQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmVzdWx0ID0gIkludmFsaWQgWE1MIi5nZXRCeXRlcygpOwotCQl9IAotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBieXRlW10gZ2V0Q29udGVudHMoRG9jdW1lbnQgZG9jdW1lbnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCVJlc3VsdCByZXN1bHQgPSBuZXcgU3RyZWFtUmVzdWx0KG91dCk7Ci0JCVNvdXJjZSBzb3VyY2UgPSBuZXcgRE9NU291cmNlKGRvY3VtZW50KTsKLQkJdHJ5IHsKLQkJCVRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3VHJhbnNmb3JtZXIoKTsKLQkJCXRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuSU5ERU5ULCAieWVzIik7IC8vJE5PTi1OTFMtMSQKLQkJCXRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuTUVUSE9ELCAieG1sIik7IC8vJE5PTi1OTFMtMSQKLQkJCXRyYW5zZm9ybWVyLnRyYW5zZm9ybShzb3VyY2UsIHJlc3VsdCk7ICAgICAgICAgICAgCi0JCX0gY2F0Y2ggKFRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyAoSU9FeGNlcHRpb24pIChuZXcgSU9FeGNlcHRpb24oKS5pbml0Q2F1c2UoZSkpOwotCQl9IGNhdGNoIChUcmFuc2Zvcm1lckV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyAoSU9FeGNlcHRpb24pIChuZXcgSU9FeGNlcHRpb24oKS5pbml0Q2F1c2UoZSkpOwotCQl9Ci0JCXJldHVybiBvdXQudG9CeXRlQXJyYXkoKTsKLQl9Ci0KLQkvKiogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgQ29udGVudFZpZXdlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQl2aWV3ZXJDb21wLmRpc3Bvc2UoKTsKLQkJdmlld2VyQ29tcCA9IG51bGw7Ci0JCWNvbnRlbnQgPSBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE0ODU3Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBsdWdpbk5hbWU9VENQL0lQIE1vbml0b3IKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi1leHRlbnNpb25Qb2ludFZpZXdlcnM9Vmlld2VycwotCi12aWV3VGl0bGU9VENQL0lQIE1vbml0b3IKLWFjdGlvblJlc2VuZD1SZXNlbmQgcmVxdWVzdAotYWN0aW9uTW9kaWZ5PU1vZGlmeSByZXF1ZXN0Ci1hY3Rpb25Nb2RpZnlSZXNlbmQ9U2VuZCBNb2RpZmllZCBSZXF1ZXN0Ci0KLWJ5dGVWaWV3PUJ5dGUKLWltYWdlVmlldz1JbWFnZQoteG1sVmlldz1YTUwKLWJyb3dzZXJWaWV3PVdlYiBCcm93c2VyCi0KLXByZWZlcmVuY2VUaXRsZT1UQ1AvSVAgTW9uaXRvcgotcHJlZmVyZW5jZUtleXdvcmRzPWRlYnVnClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9wbHVnaW4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODM2MTBlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotCi08cGx1Z2luPgotCi08ZXh0ZW5zaW9uLXBvaW50IG5hbWU9IiVleHRlbnNpb25Qb2ludFZpZXdlcnMiIGlkPSJ2aWV3ZXJzIiBzY2hlbWE9InNjaGVtYS92aWV3ZXJzLmV4c2QiLz4KLQotPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbFN0YXJ0dXAiPgotICA8c3RhcnR1cAotICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aSIKLSAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwuU3RhcnR1cCIvPgotPC9leHRlbnNpb24+Ci0KLTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzIj4gCi0gIDx2aWV3Ci0gICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnZpZXciCi0gICAgbmFtZT0iJXZpZXdUaXRsZSIKLSAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuZGVidWcudWkiCi0gICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLnZpZXcuTW9uaXRvclZpZXciCi0gICAgaWNvbj0iaWNvbnMvY3ZpZXcxNi9tb25pdG9yVmlldy5naWYiPgotICA8L3ZpZXc+Ci08L2V4dGVuc2lvbj4KLQotPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzIj4KLSAgPHBhZ2UKLSAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IucHJlZmVyZW5jZVBhZ2UiCi0gICAgbmFtZT0iJXByZWZlcmVuY2VUaXRsZSIKLSAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuZGVidWcudWkuRGVidWdQcmVmZXJlbmNlUGFnZSIKLSAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwuTW9uaXRvclByZWZlcmVuY2VQYWdlIj4KLSAgICAgIDxrZXl3b3JkUmVmZXJlbmNlIGlkPSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5wcmVmZXJlbmNlS2V5d29yZHMiLz4KLSAgPC9wYWdlPgotPC9leHRlbnNpb24+Ci0KLTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmtleXdvcmRzIj4KLSAgPGtleXdvcmQKLSAgICBsYWJlbD0iJXByZWZlcmVuY2VLZXl3b3JkcyIKLSAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IucHJlZmVyZW5jZUtleXdvcmRzIi8+Ci08L2V4dGVuc2lvbj4KLQotPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkudmlld2VycyI+Ci0gIDx2aWV3ZXIKLSAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3Iudmlld2Vycy5ieXRlIgotICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC52aWV3ZXJzLkJ5dGVWaWV3ZXIiCi0gICAgdHlwZT0icmVxdWVzdHJlc3BvbnNlIgotICAgIGxhYmVsPSIlYnl0ZVZpZXciLz4KLSAgPHZpZXdlcgotICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci52aWV3ZXJzLmltYWdlIgotICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC52aWV3ZXJzLkltYWdlVmlld2VyIgotICAgIHR5cGU9InJlcXVlc3RyZXNwb25zZSIKLSAgICBsYWJlbD0iJWltYWdlVmlldyIvPgotICA8dmlld2VyCi0gICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnZpZXdlcnMueG1sIgotICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC52aWV3ZXJzLlhNTFZpZXdlciIKLSAgICB0eXBlPSJyZXF1ZXN0cmVzcG9uc2UiCi0gICAgbGFiZWw9IiV4bWxWaWV3Ii8+Ci0gIDx2aWV3ZXIKLSAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3Iudmlld2Vycy5icm93c2VyIgotICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC52aWV3ZXJzLkJyb3dzZXJWaWV3ZXIiCi0gICAgdHlwZT0icmVxdWVzdHJlc3BvbnNlIgotICAgIGxhYmVsPSIlYnJvd3NlclZpZXciLz4KLTwvZXh0ZW5zaW9uPgotCi08ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuYWRhcHRlcnMiPgotICA8ZmFjdG9yeQotICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC5SZXF1ZXN0QWRhcHRlckZhY3RvcnkiCi0gICAgYWRhcHRhYmxlVHlwZT0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5SZXF1ZXN0Ij4KLSAgICA8YWRhcHRlciB0eXBlPSJvcmcuZWNsaXBzZS51aS5JQWN0aW9uRmlsdGVyIi8+Ci0gIDwvZmFjdG9yeT4KLTwvZXh0ZW5zaW9uPgotCi08ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wb3B1cE1lbnVzIj4KLSAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuUmVxdWVzdCIKLSAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkubW9kaWZ5YWN0aW9uIj4KLSAgICAgICA8ZmlsdGVyIG5hbWU9InJlcXVlc3RzZW50IiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICBsYWJlbD0iJWFjdGlvblJlc2VuZCIKLSAgICAgICAgICAgICBtZW51YmFyUGF0aD0iYWRkaXRpb25zIgotICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC52aWV3LlJlc2VuZE1lc3NhZ2VBY3Rpb24iCi0gICAgICAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwudmlldy5SZXNlbmRNZXNzYWdlQWN0aW9uIgotICAgICAgICAgICAgIGljb249Imljb25zL2VsY2wxNi9yZXNlbmRSZXF1ZXN0LmdpZiI+Ci0gICAgICAgPC9hY3Rpb24+Ci0gICAgICAgPGFjdGlvbgotICAgICAgICAgICAgIGxhYmVsPSIlYWN0aW9uTW9kaWZ5IgotICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0gICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLnZpZXcuTW9kaWZ5TWVzc2FnZUFjdGlvbiIKLSAgICAgICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC52aWV3Lk1vZGlmeU1lc3NhZ2VBY3Rpb24iCi0gICAgICAgICAgICAgaWNvbj0iaWNvbnMvZXRvb2wxNi9lZGl0UmVxdWVzdC5naWYiPgotICAgICAgIDwvYWN0aW9uPgotICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPgotICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5SZXF1ZXN0IgotICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5zZW5kbW9kaWZ5YWN0aW9uIj4KLSAgICAgICA8ZmlsdGVyIG5hbWU9InJlcXVlc3RzZW50IiB2YWx1ZT0iZmFsc2UiLz4gICAgCi0gICAgICAgPGFjdGlvbgotICAgICAgICAgICAgIGxhYmVsPSIlYWN0aW9uTW9kaWZ5UmVzZW5kIgotICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0gICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLnZpZXcuU2VuZE1vZGlmaWVkTWVzc2FnZUFjdGlvbiIKLSAgICAgICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC52aWV3LlNlbmRNb2RpZmllZE1lc3NhZ2VBY3Rpb24iCi0gICAgICAgICAgICAgaWNvbj0iaWNvbnMvZWxjbDE2L3Jlc2VuZFJlcXVlc3QuZ2lmIj4KLSAgICAgICA8L2FjdGlvbj4KLSAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4KLTwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL3NjaGVtYS92aWV3ZXJzLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpL3NjaGVtYS92aWV3ZXJzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2NGNlMTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS9zY2hlbWEvdmlld2Vycy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+DQotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4NCi08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkiPg0KLTxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpIiBpZD0idmlld2VycyIgbmFtZT0iQ29udGVudCBWaWV3ZXJzIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHVzZWQgdG8gcHJvdmlkZSBhIHZpZXdlciBmb3IgYSBzcGVjaWZpYyB0eXBlIG9mIGNvbnRlbnQuIChlLmcuIGEgdmlld2VyIGZvciBhIHBhcnRpY3VsYXIgaW1hZ2UgZm9ybWF0KQ0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0idmlld2VyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+DQotICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJ2aWV3ZXIiPg0KLSAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgbGFiZWxBdHRyaWJ1dGU9Im5hbWUiLz4NCi0gICAgICAgICA8L2FwcEluZm8+DQotICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIHNwZWNpZmllcyBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIGV4dGVuc2lvbiBwb2ludA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBKYXZhIGNsYXNzIHRoYXQgZXh0ZW5kcyAmbHQ7c2FtcCZndDtvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5Db250ZW50Vmlld2VyJmx0Oy9zYW1wJmd0Oy4gVmlld2VycyBpbnN0YW5jZXMgb2YgdGhpcyB0eXBlIHdpbGwgZGVsZWdhdGUgdG8gaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MuDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5Db250ZW50Vmlld2VyIi8+DQotICAgICAgICAgICAgICAgPC9hcHBJbmZvPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImxhYmVsIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGEgdHJhbnNsYXRhYmxlIG5hbWUgdXNlZCB0byBpZGVudGlmeSB0aGUgY29udGVudCB2aWV3ZXINCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBbaXNzdWU6IHdoYXQgaXMgdGhpcyB1c2VkIGZvcj9dDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIDEuMA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgYSBjb250ZW50IHZpZXdlciBleHRlbnNpb24gcG9pbnQ6DQotDQotJmx0O3ByZSZndDsNCi0gICAmbHQ7ZXh0ZW5zaW9uIA0KLSAgICAgICAgIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLnZpZXdlcnMmcXVvdDsmZ3Q7DQotICAgICAgJmx0O3ZpZXdlcg0KLSAgICAgICAgICAgIGlkPSZxdW90O2NvbS5leGFtcGxlLmJ5dGV2aWV3ZXImcXVvdDsNCi0gICAgICAgICAgICBjbGFzcz0mcXVvdDtjb20uZXhhbXBsZS5CeXRlQ29udGVudFZpZXdlciZxdW90Ow0KLSAgICAgICAgICAgIHR5cGU9JnF1b3Q7cmVxdWVzdHJlc3BvbnNlJnF1b3Q7DQotICAgICAgICAgICAgbGFiZWw9JnF1b3Q7JWJ5dGVWaWV3JnF1b3Q7LyZndDsNCi0gICAmbHQ7L2V4dGVuc2lvbiZndDsNCi0mbHQ7L3ByZSZndDsNCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBWYWx1ZSBvZiB0aGUgYXR0cmlidXRlICZsdDtiJmd0O2NsYXNzJmx0Oy9iJmd0OyBtdXN0IGJlIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBKYXZhIGNsYXNzIHRoYXQgZXh0ZW5kcyB0aGUgYWJzdHJhY3QgY2xhc3MgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuQ29udGVudFZpZXdlciZsdDsvY29kZSZndDsuDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotICAgDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsNCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIA0KLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyANCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCANCi0mbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotPC9zY2hlbWE+DQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyOWFlMDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic2VydmVyY29yZS8iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvLmN2c2lnbm9yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjODE5YTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotYmluCi10ZW1wLmZvbGRlcgotYnVpbGQueG1sCi1zZXJ2ZXJjb3JlLmphcgotb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlXzMuMC4wLmphcgotQGRvdAotc3JjLnppcApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvLm9wdGlvbnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI3MzY1OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotIyBEZWJ1Z2dpbmcgb3B0aW9ucyBmb3IgdGhlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZSBwbHVnaW4KLQotIyBUdXJuIG9uIGdlbmVyYWwgZGVidWdnaW5nCi1vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvZGVidWc9dHJ1ZQotCi0jIFByaW50cyBvdXQgdmFsdWVzCi1vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvcmVzb3VyY2VzPWZhbHNlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjFlN2VmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhYTMzMjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5TZXJ2ZXJQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZSwKLSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLAotIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbCwKLSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudXRpbAotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcywKLSBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLAotIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUsCi0gb3JnLmVjbGlwc2UudXBkYXRlLmNvcmU7cmVzb2x1dGlvbjo9b3B0aW9uYWwKLUVjbGlwc2UtQXV0b1N0YXJ0OiB0cnVlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9hYm91dC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY2Yjk2Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkZlYnJ1YXJ5IDI0LCAyMDA1PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDlhN2UwMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICAub3B0aW9ucyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbAotYmluLmV4Y2x1ZGVzID0gYmluLyoqLFwKLSAgICAgICAgICAgICAgIEBkb3QvKiosXAotICAgICAgICAgICAgICAgdGVtcC5mb2xkZXIvKioKLXNyYy5pbmNsdWRlcyA9IHNjaGVtYS8sXAotICAgICAgICAgICAgICAgY29tcG9uZW50LnhtbAotc291cmNlLi4gPSBzZXJ2ZXJjb3JlLwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvY29tcG9uZW50LnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL2NvbXBvbmVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmNDM5NzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvY29tcG9uZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y29tcG9uZW50IHhtbG5zPSJodHRwOi8vZWNsaXBzZS5vcmcvd3RwL3JlbGVuZy90b29scy9jb21wb25lbnQtbW9kZWwiIG5hbWU9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIiPgotICA8Y29tcG9uZW50LWRlcGVuZHMgdW5yZXN0cmljdGVkPSJ0cnVlIi8+Ci0gIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZSIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci0gIDxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZSI+Ci0gICAgPHR5cGUgbmFtZT0iSU1vZHVsZSIgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLSAgICA8dHlwZSBuYW1lPSJJTW9kdWxlQXJ0aWZhY3QiIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+Ci0gICAgPHR5cGUgbmFtZT0iSU1vZHVsZVR5cGUiIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+Ci08IS0tICAgIDx0eXBlIG5hbWU9IklQcm9qZWN0UHJvcGVydGllcyIgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4tLT4KLSAgICA8dHlwZSBuYW1lPSJJUHVibGlzaExpc3RlbmVyIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotICAgIDx0eXBlIG5hbWU9IklSdW50aW1lIiBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotICAgIDx0eXBlIG5hbWU9IklSdW50aW1lTGlmZWN5Y2xlTGlzdGVuZXIiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+Ci08IS0tICAgIDx0eXBlIG5hbWU9IklSdW50aW1lVGFyZ2V0SGFuZGxlciIgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4tLT4KLSAgICA8dHlwZSBuYW1lPSJJUnVudGltZVR5cGUiIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+Ci0gICAgPHR5cGUgbmFtZT0iSVJ1bnRpbWVXb3JraW5nQ29weSIgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLSAgICA8dHlwZSBuYW1lPSJJU2VydmVyIiBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotICAgIDx0eXBlIG5hbWU9IklTZXJ2ZXJBdHRyaWJ1dGVzIiBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotICAgIDx0eXBlIG5hbWU9IklTZXJ2ZXJMaWZlY3ljbGVMaXN0ZW5lciIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLSAgICA8dHlwZSBuYW1lPSJJU2VydmVyTGlzdGVuZXIiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+Ci0gICAgPHR5cGUgbmFtZT0iSVNlcnZlclR5cGUiIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+Ci0gICAgPHR5cGUgbmFtZT0iSVNlcnZlcldvcmtpbmdDb3B5IiBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIvPgotICAgIDx0eXBlIG5hbWU9IlNlcnZlckNvcmUiIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+Ci0gICAgPHR5cGUgbmFtZT0iU2VydmVyRXZlbnQiIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+Ci0gICAgPHR5cGUgbmFtZT0iU2VydmVyUG9ydCIvPgotICAgIDx0eXBlIG5hbWU9IlNlcnZlclV0aWwiIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+Ci0gICAgPHR5cGUgbmFtZT0iVGFza01vZGVsIiBpbXBsZW1lbnQ9ImZhbHNlIi8+Ci0gIDwvcGFja2FnZT4KLSAgPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsIj4KLSAgICA8dHlwZSBuYW1lPSJJVVJMUHJvdmlkZXIiIHN1YmNsYXNzPSJmYWxzZSIvPgotICAgIDx0eXBlIG5hbWU9Ik1vZHVsZUZhY3RvcnlEZWxlZ2F0ZSIvPgotICAgIDx0eXBlIG5hbWU9IlJ1bnRpbWVEZWxlZ2F0ZSIvPgotICAgIDx0eXBlIG5hbWU9IlJ1bnRpbWVMb2NhdG9yRGVsZWdhdGUiLz4KLTwhLS0gICAgPHR5cGUgbmFtZT0iUnVudGltZVRhcmdldEhhbmRsZXJEZWxlZ2F0ZSIvPiAtLT4KLSAgICA8dHlwZSBuYW1lPSJJTW9kdWxlRmlsZSIvPgotICAgIDx0eXBlIG5hbWU9IklNb2R1bGVGb2xkZXIiLz4KLSAgICA8dHlwZSBuYW1lPSJJTW9kdWxlUmVzb3VyY2UiLz4KLSAgICA8dHlwZSBuYW1lPSJJTW9kdWxlUmVzb3VyY2VEZWx0YSIvPgotICAgIDx0eXBlIG5hbWU9Ik1vZHVsZUFydGlmYWN0QWRhcHRlckRlbGVnYXRlIi8+Ci0gICAgPHR5cGUgbmFtZT0iTGF1bmNoYWJsZUFkYXB0ZXJEZWxlZ2F0ZSIvPgotICAgIDx0eXBlIG5hbWU9IkNsaWVudERlbGVnYXRlIi8+Ci0gICAgPHR5cGUgbmFtZT0iTW9kdWxlRGVsZWdhdGUiLz4KLSAgICA8dHlwZSBuYW1lPSJQdWJsaXNoVGFza0RlbGVnYXRlIi8+Ci0gICAgPHR5cGUgbmFtZT0iUHVibGlzaE9wZXJhdGlvbiIvPgotICAgIDx0eXBlIG5hbWU9IlNlcnZlckJlaGF2aW91ckRlbGVnYXRlIi8+Ci0gICAgPHR5cGUgbmFtZT0iU2VydmVyRGVsZWdhdGUiLz4KLSAgICA8dHlwZSBuYW1lPSJJbnRlcm5hbEluaXRpYWxpemVyIiBpbXBsZW1lbnQ9ImZhbHNlIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIgcmVmZXJlbmNlPSJmYWxzZSIvPgotICA8L3BhY2thZ2U+Ci0gIDxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsIj4KLSAgICA8dHlwZSBuYW1lPSJIdHRwTGF1bmNoYWJsZSIvPgotICAgIDx0eXBlIG5hbWU9IklTdGF0aWNXZWIiLz4KLSAgICA8dHlwZSBuYW1lPSJOdWxsTW9kdWxlQXJ0aWZhY3QiLz4KLSAgICA8dHlwZSBuYW1lPSJQdWJsaXNoQWRhcHRlciIvPgotICAgIDx0eXBlIG5hbWU9IlByb2plY3RNb2R1bGUiLz4KLSAgICA8dHlwZSBuYW1lPSJQcm9qZWN0TW9kdWxlRmFjdG9yeURlbGVnYXRlIi8+Ci0gICAgPHR5cGUgbmFtZT0iUnVudGltZUxpZmVjeWNsZUFkYXB0ZXIiLz4KLSAgICA8dHlwZSBuYW1lPSJTZXJ2ZXJMaWZlY3ljbGVBZGFwdGVyIi8+Ci0gICAgPHR5cGUgbmFtZT0iU29ja2V0VXRpbCIvPgotICAgIDx0eXBlIG5hbWU9IldlYlJlc291cmNlIi8+Ci0gIDwvcGFja2FnZT4KLQotICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpIiBmcmFnbWVudD0iZmFsc2UiLz4KLSAgPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aSI+Ci0gICAgPHR5cGUgbmFtZT0iU2VydmVyTGF1bmNoQ29uZmlndXJhdGlvblRhYiIvPgotICAgIDx0eXBlIG5hbWU9IlNlcnZlclVJVXRpbCIgaW1wbGVtZW50PSJmYWxzZSIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiLz4KLSAgICA8dHlwZSBuYW1lPSJTZXJ2ZXJVSUNvcmUiIGltcGxlbWVudD0iZmFsc2UiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIi8+Ci0gIDwvcGFja2FnZT4KLSAgPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5lZGl0b3IiPgotICAgIDx0eXBlIG5hbWU9IlNlcnZlckVkaXRvclBhcnQiLz4KLSAgICA8dHlwZSBuYW1lPSJTZXJ2ZXJFZGl0b3JTZWN0aW9uIi8+Ci0gICAgPHR5cGUgbmFtZT0iSVNlcnZlckVkaXRvclBhcnRJbnB1dCIvPgotICA8L3BhY2thZ2U+Ci0gIDxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkud2l6YXJkIj4KLSAgICA8dHlwZSBuYW1lPSJJV2l6YXJkSGFuZGxlIi8+Ci0gICAgPHR5cGUgbmFtZT0iV2l6YXJkRnJhZ21lbnQiLz4KLSAgPC9wYWNrYWdlPgotPC9jb21wb25lbnQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWMwNTliOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wbHVnaW5OYW1lPVNlcnZlciBDb3JlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotZXh0ZW5zaW9uUG9pbnRTZXJ2ZXJTdGFydHVwPVNlcnZlciBTdGFydHVwCi1leHRlbnNpb25Qb2ludE1vZHVsZVR5cGVzPU1vZHVsZSBUeXBlcwotZXh0ZW5zaW9uUG9pbnRSdW50aW1lVHlwZXM9UnVudGltZSBUeXBlcwotZXh0ZW5zaW9uUG9pbnRSdW50aW1lVGFyZ2V0SGFuZGxlcnM9UnVudGltZSBUYXJnZXQgSGFuZGxlcnMKLWV4dGVuc2lvblBvaW50UnVudGltZUxvY2F0b3JzPVJ1bnRpbWUgTG9jYXRvcnMKLWV4dGVuc2lvblBvaW50U2VydmVyVHlwZXM9U2VydmVyIFR5cGVzCi1leHRlbnNpb25Qb2ludFNlcnZlckxvY2F0b3JzPVNlcnZlciBMb2NhdG9ycwotZXh0ZW5zaW9uUG9pbnRNb2R1bGVGYWN0b3JpZXM9TW9kdWxlIEZhY3RvcmllcwotZXh0ZW5zaW9uUG9pbnRNb2R1bGVBcnRpZmFjdEFkYXB0ZXJzPU1vZHVsZSBBcnRpZmFjdCBBZGFwdGVycwotZXh0ZW5zaW9uUG9pbnRMYXVuY2hhYmxlQWRhcHRlcnM9TGF1bmNoYWJsZSBBZGFwdGVycwotZXh0ZW5zaW9uUG9pbnRDbGllbnRzPUNsaWVudHMKLWV4dGVuc2lvblBvaW50UHVibGlzaFRhc2tzPVB1Ymxpc2ggVGFza3MKLWV4dGVuc2lvblBvaW50U2VydmVyTW9uaXRvcnM9U2VydmVyIE1vbml0b3JzCi1leHRlbnNpb25Qb2ludEluc3RhbGxhYmxlU2VydmVycz1JbnN0YWxsYWJsZSBTZXJ2ZXJzCi1leHRlbnNpb25Qb2ludEluc3RhbGxhYmxlUnVudGltZXM9SW5zdGFsbGFibGUgUnVudGltZXMKLQotbW9kdWxlVHlwZVVua25vd249VW5rbm93biBtb2R1bGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3BsdWdpbi54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODQzYzA5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotCi08cGx1Z2luPgotICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJtb2R1bGVUeXBlcyIgbmFtZT0iJWV4dGVuc2lvblBvaW50TW9kdWxlVHlwZXMiIHNjaGVtYT0ic2NoZW1hL21vZHVsZVR5cGVzLmV4c2QiLz4KLSAgPGV4dGVuc2lvbi1wb2ludCBpZD0icnVudGltZVR5cGVzIiBuYW1lPSIlZXh0ZW5zaW9uUG9pbnRSdW50aW1lVHlwZXMiIHNjaGVtYT0ic2NoZW1hL3J1bnRpbWVUeXBlcy5leHNkIi8+Ci0gIDxleHRlbnNpb24tcG9pbnQgaWQ9InJ1bnRpbWVUYXJnZXRIYW5kbGVycyIgbmFtZT0iJWV4dGVuc2lvblBvaW50UnVudGltZVRhcmdldEhhbmRsZXJzIiBzY2hlbWE9InNjaGVtYS9ydW50aW1lVGFyZ2V0SGFuZGxlcnMuZXhzZCIvPgotICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJydW50aW1lTG9jYXRvcnMiIG5hbWU9IiVleHRlbnNpb25Qb2ludFJ1bnRpbWVMb2NhdG9ycyIgc2NoZW1hPSJzY2hlbWEvcnVudGltZUxvY2F0b3JzLmV4c2QiLz4KLSAgPGV4dGVuc2lvbi1wb2ludCBpZD0ic2VydmVyVHlwZXMiIG5hbWU9IiVleHRlbnNpb25Qb2ludFNlcnZlclR5cGVzIiBzY2hlbWE9InNjaGVtYS9zZXJ2ZXJUeXBlcy5leHNkIi8+Ci0gIDxleHRlbnNpb24tcG9pbnQgaWQ9InNlcnZlckxvY2F0b3JzIiBuYW1lPSIlZXh0ZW5zaW9uUG9pbnRTZXJ2ZXJMb2NhdG9ycyIgc2NoZW1hPSJzY2hlbWEvaW50ZXJuYWxTZXJ2ZXJMb2NhdG9ycy5leHNkIi8+Ci0gIDxleHRlbnNpb24tcG9pbnQgaWQ9Im1vZHVsZUZhY3RvcmllcyIgbmFtZT0iJWV4dGVuc2lvblBvaW50TW9kdWxlRmFjdG9yaWVzIiBzY2hlbWE9InNjaGVtYS9tb2R1bGVGYWN0b3JpZXMuZXhzZCIvPgotICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJtb2R1bGVBcnRpZmFjdEFkYXB0ZXJzIiBuYW1lPSIlZXh0ZW5zaW9uUG9pbnRNb2R1bGVBcnRpZmFjdEFkYXB0ZXJzIiBzY2hlbWE9InNjaGVtYS9tb2R1bGVBcnRpZmFjdEFkYXB0ZXJzLmV4c2QiLz4KLSAgPGV4dGVuc2lvbi1wb2ludCBpZD0ibGF1bmNoYWJsZUFkYXB0ZXJzIiBuYW1lPSIlZXh0ZW5zaW9uUG9pbnRMYXVuY2hhYmxlQWRhcHRlcnMiIHNjaGVtYT0ic2NoZW1hL2xhdW5jaGFibGVBZGFwdGVycy5leHNkIi8+Ci0gIDxleHRlbnNpb24tcG9pbnQgaWQ9ImNsaWVudHMiIG5hbWU9IiVleHRlbnNpb25Qb2ludENsaWVudHMiIHNjaGVtYT0ic2NoZW1hL2NsaWVudHMuZXhzZCIvPgotICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJwdWJsaXNoVGFza3MiIG5hbWU9IiVleHRlbnNpb25Qb2ludFB1Ymxpc2hUYXNrcyIgc2NoZW1hPSJzY2hlbWEvcHVibGlzaFRhc2tzLmV4c2QiLz4KLSAgPGV4dGVuc2lvbi1wb2ludCBpZD0iaW50ZXJuYWxTZXJ2ZXJNb25pdG9ycyIgbmFtZT0iJWV4dGVuc2lvblBvaW50U2VydmVyTW9uaXRvcnMiIHNjaGVtYT0ic2NoZW1hL3NlcnZlck1vbml0b3JzLmV4c2QiLz4KLSAgPGV4dGVuc2lvbi1wb2ludCBpZD0iaW50ZXJuYWxTdGFydHVwIiBuYW1lPSIlZXh0ZW5zaW9uUG9pbnRTZXJ2ZXJTdGFydHVwIiBzY2hlbWE9InNjaGVtYS9zdGFydHVwLmV4c2QiLz4KLSAgPGV4dGVuc2lvbi1wb2ludCBpZD0iaW5zdGFsbGFibGVTZXJ2ZXJzIiBuYW1lPSIlZXh0ZW5zaW9uUG9pbnRJbnN0YWxsYWJsZVNlcnZlcnMiIHNjaGVtYT0ic2NoZW1hL2luc3RhbGxhYmxlU2VydmVycy5leHNkIi8+Ci0gIDxleHRlbnNpb24tcG9pbnQgaWQ9Imluc3RhbGxhYmxlUnVudGltZXMiIG5hbWU9IiVleHRlbnNpb25Qb2ludEluc3RhbGxhYmxlUnVudGltZXMiIHNjaGVtYT0ic2NoZW1hL2luc3RhbGxhYmxlUnVudGltZXMuZXhzZCIvPgotICAKLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZHVsZVR5cGVzIj4KLSAgICA8bW9kdWxlVHlwZQotICAgICAgIGlkPSIqIgotICAgICAgIG5hbWU9IiVtb2R1bGVUeXBlVW5rbm93biIvPgotICAgIDxtb2R1bGVUeXBlCi0gICAgICAgaWQ9IndzdC53ZWIiCi0gICAgICAgbmFtZT0iJW1vZHVsZVR5cGVKMkVFVXRpbGl0eU5hbWUiLz4KLSAgPC9leHRlbnNpb24+Ci08L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zY2hlbWEvY2xpZW50cy5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2NoZW1hL2NsaWVudHMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk1MTdmYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zY2hlbWEvY2xpZW50cy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+DQotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4NCi08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlIj4NCi08YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUiIGlkPSJjbGllbnRzIiBuYW1lPSJDbGllbnRzIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IHByb3ZpZGVzIGEgd2F5IHRvIGxhdW5jaCBhIGNsaWVudCBmb3IgYSBzcGVjaWZpYyB0eXBlIG9mIHJlc291cmNlIHRoYXQgaXMgYmVpbmcgcnVuIG9uIGEgc2VydmVyLg0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGluY2x1ZGUgc2NoZW1hTG9jYXRpb249InNjaGVtYTovL29yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMvc2NoZW1hL2V4cHJlc3Npb25MYW5ndWFnZS5leHNkIi8+DQotDQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iY2xpZW50IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+DQotICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJjbGllbnQiPg0KLSAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgbGFiZWxBdHRyaWJ1dGU9Im5hbWUiLz4NCi0gICAgICAgICA8L2FwcEluZm8+DQotICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJlbmFibGVtZW50Ii8+DQotICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIHNwZWNpZmllcyBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIGV4dGVuc2lvbiBwb2ludA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBKYXZhIGNsYXNzIHRoYXQgZXh0ZW5kICZsdDtzYW1wJmd0O0NsaWVudERlbGVnYXRlJmx0Oy9zYW1wJmd0Oy4NCi1DbGllaW50IGluc3RhbmNlcyBvZiB0aGlzIHR5cGUgd2lsbCBkZWxlZ2F0ZSB0byBpbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyB0byBsYXVuY2guDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuQ2xpZW50RGVsZWdhdGUiLz4NCi0gICAgICAgICAgICAgICA8L2FwcEluZm8+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhIHRyYW5zbGF0YWJsZSBuYW1lIHVzZWQgdG8gaWRlbnRpZnkgdGhlIGNsaWVudA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhIHRyYW5zbGF0YWJsZSBkZXNjcmlwdGlvbiBvZiB0aGlzIGNsaWVudA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJsYXVuY2hhYmxlIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3NuYW1lIG9mIHRoZSBsYXVuY2hhYmxlIG9iamVjdCB0aGF0IHRoaXMgY2xpZW50IHN1cHBvcnRzDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InByaW9yaXR5IiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIHByaW9yaXR5IGF0cnJpYnV0ZSB3aGljaCBzcGVjaWZpZXMgYSByZWxhdGl2ZSBvcmRlcmluZyBvZiBhcnRpZmFjdCBhZGFwdGVycy4gQWRhcHRlcnMgd2l0aCBhIGhpZ2hlciBudW1iZXIgYXJlIGFsd2F5cyB1c2VkIGZpcnN0LiBUbyBvdmVycmlkZSBhbm90aGVyIGFkYXB0ZXIsIHNpbXBseSBwcm92aWRlIGEgaGlnaGVyIHByaW9yaXR5IHZhbHVlIHRoYXQgdGhlIG90aGVyIGFkYXB0ZXIuIFRoZSBwcmlvcml0eSBpcyAwIGlmIG5vIHByaW9yaXR5IGlzIHNwZWNpZmllZA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAxLjANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGEgY2xpZW50IGV4dGVuc2lvbiBwb2ludDoNCi0NCi0mbHQ7cHJlJmd0Ow0KLSAgICZsdDtleHRlbnNpb24gDQotICAgICAgICAgcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmNsaWVudHMmcXVvdDsmZ3Q7DQotICAgICAgJmx0O2NsaWVudA0KLSAgICAgICAgICAgIGlkPSZxdW90O2NvbS5leGFtcGxlLmNsaWVudHMmcXVvdDsNCi0gICAgICAgICAgICBuYW1lPSZxdW90OyVjbGllbnROYW1lJnF1b3Q7DQotICAgICAgICAgICAgZGVzY3JpcHRpb249JnF1b3Q7JWNsaWVudERlc2NyaXB0aW9uJnF1b3Q7DQotICAgICAgICAgICAgY2xhc3M9JnF1b3Q7Y29tLmV4YW1wbGUuRXhhbXBsZUNsaWVudCZxdW90Oy8mZ3Q7DQotICAgJmx0Oy9leHRlbnNpb24mZ3Q7DQotJmx0Oy9wcmUmZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgVmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSAmbHQ7YiZndDtjbGFzcyZsdDsvYiZndDsgbXVzdCBiZSBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGEgSmF2YSBjbGFzcyB0aGF0IGV4dGVuZHMgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLkNsaWVudERlbGVnYXRlJmx0Oy9jb2RlJmd0OyBhbmQgY29udGFpbnMgYSBwdWJsaWMgMC1hcmcgY29uc3RydWN0b3IuDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0gICANCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsNCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIA0KLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyANCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCANCi0mbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotPC9zY2hlbWE+DQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2NoZW1hL2luc3RhbGxhYmxlUnVudGltZXMuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NjaGVtYS9pbnN0YWxsYWJsZVJ1bnRpbWVzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjYWE4ODEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2NoZW1hL2luc3RhbGxhYmxlUnVudGltZXMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZSIgaWQ9Imluc3RhbGxhYmxlUnVudGltZXMiIG5hbWU9Ikluc3RhbGxhYmxlIFJ1bnRpbWVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHVzZWQgdG8gaW5zdGFsbCBuZXcgcnVudGltZXMgZnJvbSByZW1vdGUgdXBkYXRlIG1hbmFnZXIgc2l0ZXMuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Imluc3RhbGxhYmxlUnVudGltZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9Imluc3RhbGxhYmxlUnVudGltZSI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCBsYWJlbEF0dHJpYnV0ZT0ibmFtZSIvPgotICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJpbnN0YWxsYWJsZVJ1bnRpbWUiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIHNwZWNpZmllcyBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIGV4dGVuc2lvbiBwb2ludAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImZlYXR1cmVJZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICB0aGUgaWQgb2YgdGhlIGZlYXR1cmUgY29udGFpbmluZyB0aGUgcnVudGltZSBidW5kbGUKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmZWF0dXJlVmVyc2lvbiIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICB0aGUgdmVyc2lvbiBvZiB0aGUgZmVhdHVyZSBjb250YWluaW5nIHRoZSBydW50aW1lIGJ1bmRsZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImZlYXR1cmVTaXRlIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIHRoZSBmZWF0dXJlICh1cGRhdGUgbWFuYWdlcikgc2l0ZSBVUkwKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJidW5kbGVJZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICB0aGUgaWQgb2YgdGhlIGJ1bmRsZSBpbiB3aGljaCB0aGUgcnVudGltZSB6aXAgaXMgaW4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwYXRoIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIHRoZSByZWxhdGl2ZSBwYXRoIG9mIHRoZSBydW50aW1lIHppcCBpbnNpZGUgdGhlIGJ1bmRsZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLiZsdDsvYiZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGFuIGluc3RhbGxhYmxlIHJ1bnRpbWUgZXh0ZW5zaW9uIHBvaW50OgotCi0mbHQ7cHJlJmd0OwotICAgJmx0O2V4dGVuc2lvbiAKLSAgICAgICAgIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnN0YWxsYWJsZVJ1bnRpbWVzJnF1b3Q7Jmd0OwotICAgICAgJmx0O2luc3RhbGxhYmxlUnVudGltZQotICAgICAgICAgICAgaWQ9JnF1b3Q7Y29tLm15cnVudGltZS5pZCZxdW90OwotICAgICAgICAgICAgZmVhdHVyZVZlcnNpb249JnF1b3Q7MS4wLjAmcXVvdDsKLSAgICAgICAgICAgIGZlYXR1cmVJZD0mcXVvdDtjb20ubXlmZWF0dXJlJnF1b3Q7Ci0gICAgICAgICAgICBmZWF0dXJlU2l0ZT0mcXVvdDt4eXomcXVvdDsKLSAgICAgICAgICAgIGJ1bmRsZUlkPSZxdW90O2NvbS5pYm0ubXlidW5kbGUmcXVvdDsKLSAgICAgICAgICAgIHBhdGg9JnF1b3Q7L3ppcHMvbXlSdW50aW1lLnppcCZxdW90Oy8mZ3Q7Ci0gICAmbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0mbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NjaGVtYS9pbnN0YWxsYWJsZVNlcnZlcnMuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NjaGVtYS9pbnN0YWxsYWJsZVNlcnZlcnMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE0OGIyZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zY2hlbWEvaW5zdGFsbGFibGVTZXJ2ZXJzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUiIGlkPSJpbnN0YWxsYWJsZVNlcnZlcnMiIG5hbWU9Ikluc3RhbGxhYmxlIFNlcnZlcnMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgaXMgdXNlZCB0byBpbnN0YWxsIG5ldyBzZXJ2ZXIgYWRhcHRlcnMgZnJvbSByZW1vdGUgdXBkYXRlIG1hbmFnZXIgc2l0ZXMuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Imluc3RhbGxhYmxlU2VydmVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iaW5zdGFsbGFibGVTZXJ2ZXIiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgbGFiZWxBdHRyaWJ1dGU9Im5hbWUiLz4KLSAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iaW5zdGFsbGFibGVTZXJ2ZXIiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIHNwZWNpZmllcyBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIGV4dGVuc2lvbiBwb2ludAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSB0cmFuc2xhdGFibGUgbmFtZSB1c2VkIHRvIGlkZW50aWZ5IHRoZSBydW50aW1lIHR5cGUKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgdHJhbnNsYXRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoZSBydW50aW1lIHR5cGUKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InZlbmRvciIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIHRyYW5zbGF0YWJsZSB2ZW5kb3IgbmFtZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InZlcnNpb24iIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSB0cmFuc2xhdGFibGUgdmVyc2lvbiBudW1iZXIKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmZWF0dXJlSWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgdGhlIGlkIG9mIHRoZSBmZWF0dXJlIGNvbnRhaW5pbmcgdGhlIHNlcnZlciBhZGFwdGVyIGJ1bmRsZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImZlYXR1cmVWZXJzaW9uIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIHRoZSB2ZXJzaW9uIG9mIHRoZSBmZWF0dXJlIGNvbnRhaW5pbmcgdGhlIHNlcnZlciBhZGFwdGVyIGJ1bmRsZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImZlYXR1cmVTaXRlIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIHRoZSBmZWF0dXJlICh1cGRhdGUgbWFuYWdlcikgc2l0ZSBVUkwKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O2ImZ3Q7VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4mbHQ7L2ImZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiBhbiBpbnN0YWxsYWJsZSBzZXJ2ZXIgZXh0ZW5zaW9uIHBvaW50OgotCi0mbHQ7cHJlJmd0OwotICAgJmx0O2V4dGVuc2lvbiAKLSAgICAgICAgIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnN0YWxsYWJsZVNlcnZlcnMmcXVvdDsmZ3Q7Ci0gICAgICAmbHQ7aW5zdGFsbGFibGVTZXJ2ZXIKLSAgICAgICAgICAgIGlkPSZxdW90O2NvbS5teXNlcnZlci5pZCZxdW90OwotICAgICAgICAgICAgbmFtZT0mcXVvdDtNeSBydW50aW1lIG5hbWUmcXVvdDsKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSZxdW90O015IHJ1bnRpbWUgZGVzY3JpcHRpb24mcXVvdDsKLSAgICAgICAgICAgIHZlbmRvcj0mcXVvdDt4eXomcXVvdDsKLSAgICAgICAgICAgIHZlcnNpb249JnF1b3Q7MS4wJnF1b3Q7Ci0gICAgICAgICAgICBmZWF0dXJlVmVyc2lvbj0mcXVvdDsxLjAuMCZxdW90OwotICAgICAgICAgICAgZmVhdHVyZUlkPSZxdW90O2NvbS5teWZlYXR1cmUmcXVvdDsKLSAgICAgICAgICAgIGZlYXR1cmVTaXRlPSZxdW90O3h5eiZxdW90Oy8mZ3Q7Ci0gICAmbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0mbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NjaGVtYS9pbnRlcm5hbFNlcnZlckxvY2F0b3JzLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zY2hlbWEvaW50ZXJuYWxTZXJ2ZXJMb2NhdG9ycy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjllOGNhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NjaGVtYS9pbnRlcm5hbFNlcnZlckxvY2F0b3JzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUiIGlkPSJzZXJ2ZXJMb2NhdG9ycyIgbmFtZT0iU2VydmVyIExvY2F0b3JzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHVzZWQgdG8gbG9jYXRlIG5ldyBzZXJ2ZXJzIG9uIHRoZSBsb2NhbCBvciByZW1vdGUgbWFjaGluZXMuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InNlcnZlckxvY2F0b3IiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJzZXJ2ZXJMb2NhdG9yIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IGxhYmVsQXR0cmlidXRlPSJuYW1lIi8+Ci0gICAgICAgICA8L2FwcEluZm8+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIHNwZWNpZmllcyBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIGV4dGVuc2lvbiBwb2ludAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIHNwZWNpZmllcyB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIEphdmEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzICZsdDtzYW1wJmd0O1NlcnZlckxvY2F0b3JEZWxlZ2F0ZSZsdDsvc2FtcCZndDsuCi1TZXJ2ZXIgbG9jYXRvciBpbnN0YW5jZXMgb2YgdGhpcyB0eXBlIHdpbGwgZGVsZWdhdGUgdG8gaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3VwcG9ydHNSZW1vdGVIb3N0cyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBsb2NhbCBhbmQvb3IgcmVtb3RlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idHlwZUlkcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgMS4wCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiBhIHNlcnZlciBsb2NhdG9yIGV4dGVuc2lvbiBwb2ludDoKLQotJmx0O3ByZSZndDsKLSAgICZsdDtleHRlbnNpb24gCi0gICAgICAgICBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuc2VydmVyTG9jYXRvcnMmcXVvdDsmZ3Q7Ci0gICAgICAmbHQ7c2VydmVyTG9jYXRvcgotICAgICAgICAgICAgaWQ9JnF1b3Q7Y29tLmV4YW1wbGUubG9jYXRvciZxdW90OwotICAgICAgICAgICAgbmFtZT0mcXVvdDslc2VydmVyTG9jYXRvck5hbWUmcXVvdDsKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSZxdW90OyVzZXJ2ZXJMb2NhdG9yRGVzY3JpcHRpb24mcXVvdDsKLSAgICAgICAgICAgIGNsYXNzPSZxdW90O2NvbS5leGFtcGxlLkV4YW1wbGVTZXJ2ZXJMb2NhdG9yJnF1b3Q7LyZndDsKLSAgICZsdDsvZXh0ZW5zaW9uJmd0OwotJmx0Oy9wcmUmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSAmbHQ7YiZndDtjbGFzcyZsdDsvYiZndDsgbXVzdCBiZSBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGEgSmF2YSBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlIGludGVyZmFjZSAmbHQ7YiZndDtvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuU2VydmVyTG9jYXRvckRlbGVnYXRlJmx0Oy9iJmd0Oy4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0mbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NjaGVtYS9sYXVuY2hhYmxlQWRhcHRlcnMuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NjaGVtYS9sYXVuY2hhYmxlQWRhcHRlcnMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJmOTcwMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zY2hlbWEvbGF1bmNoYWJsZUFkYXB0ZXJzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCi08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPg0KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUiPg0KLTxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZSIgaWQ9ImxhdW5jaGFibGVBZGFwdGVycyIgbmFtZT0iTGF1bmNoYWJsZSBBZGFwdGVycyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBwcm92aWRlcyBhIHdheSBmb3IgYSBzZXJ2ZXIgdG8gc3VwcG9ydCB0aGUgUnVuIG9uIFNlcnZlciBzY2VuYXJpby4NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImxhdW5jaGFibGVBZGFwdGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+DQotICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJsYXVuY2hhYmxlQWRhcHRlciI+DQotICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgPGFwcEluZm8+DQotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCBsYWJlbEF0dHJpYnV0ZT0ibmFtZSIvPg0KLSAgICAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8L2Fubm90YXRpb24+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgZXh0ZW5zaW9uIHBvaW50DQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIHNwZWNpZmllcyB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIEphdmEgY2xhc3MgdGhhdCBleHRlbmRzICZsdDtzYW1wJmd0O0xhdW5jaGFibGVBZGFwdGVyRGVsZWdhdGUmbHQ7L3NhbXAmZ3Q7Lg0KLUxhdW5jaGFibGUgYWRhcHRlciBpbnN0YW5jZXMgb2YgdGhpcyB0eXBlIHdpbGwgZGVsZWdhdGUgdG8gaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MuDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuTGF1bmNoYWJsZUFkYXB0ZXJEZWxlZ2F0ZSIvPg0KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0eXBlSWRzIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAxLjANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGEgbGF1bmNoYWJsZSBhZGFwdGVyIGV4dGVuc2lvbiBwb2ludDoNCi0NCi0mbHQ7cHJlJmd0Ow0KLSAgICZsdDtleHRlbnNpb24gDQotICAgICAgICAgcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmxhdW5jaGFibGVBZGFwdGVycyZxdW90OyZndDsNCi0gICAgICAmbHQ7bGF1bmNoYWJsZUFkYXB0ZXINCi0gICAgICAgICAgICAgIGlkPSZxdW90O2NvbS5leGFtcGxlLmxhdW5jaGFibGVBZGFwdGVyJnF1b3Q7DQotICAgICAgICAgICAgICBjbGFzcz0mcXVvdDtjb20uZXhhbXBsZS5FeGFtcGxlTGF1bmNoYWJsZUFkYXB0ZXJEZWxlZ2F0ZSZxdW90Oy8mZ3Q7DQotICAgJmx0Oy9leHRlbnNpb24mZ3Q7DQotJmx0Oy9wcmUmZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgVmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSAmbHQ7YiZndDtjbGFzcyZsdDsvYiZndDsgbXVzdCBiZSBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGEgSmF2YSBjbGFzcyB0aGF0IGV4dGVuZHMgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLkxhdW5jaGFibGVBZGFwdGVyRGVsZWdhdGUmbHQ7L2NvZGUmZ3Q7IGFuZCBjb250YWlucyBhIHB1YmxpYyAwLWFyZyBjb25zdHJ1Y3Rvci4NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLSAgIA0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0Ow0KLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgDQotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIA0KLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IA0KLSZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi08L3NjaGVtYT4NCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zY2hlbWEvbW9kdWxlQXJ0aWZhY3RBZGFwdGVycy5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2NoZW1hL21vZHVsZUFydGlmYWN0QWRhcHRlcnMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE2M2YxZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zY2hlbWEvbW9kdWxlQXJ0aWZhY3RBZGFwdGVycy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+DQotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4NCi08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aSI+DQotPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aSIgaWQ9Im1vZHVsZUFydGlmYWN0QWRhcHRlcnMiIG5hbWU9Ik1vZHVsZSBBcnRpZmFjdCBBZGFwdGVycyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxpbmNsdWRlIHNjaGVtYUxvY2F0aW9uPSJzY2hlbWE6Ly9vcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zL3NjaGVtYS9leHByZXNzaW9uTGFuZ3VhZ2UuZXhzZCIvPg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Im1vZHVsZUFydGlmYWN0QWRhcHRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPg0KLSAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50DQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGVsZW1lbnQgbmFtZT0ibW9kdWxlQXJ0aWZhY3RBZGFwdGVyIj4NCi0gICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICA8YXBwSW5mbz4NCi0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IGxhYmVsQXR0cmlidXRlPSJuYW1lIi8+DQotICAgICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZW5hYmxlbWVudCIvPg0KLSAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBleHRlbnNpb24gcG9pbnQNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgSmF2YSBjbGFzcyB0aGF0IGltcGxlbWVudHMgJmx0O3NhbXAmZ3Q7b3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLk1vZHVsZUFydGlmYWN0QWRhcHRlckRlbGVnYXRlJmx0Oy9zYW1wJmd0Oy4NCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgPGFwcEluZm8+DQotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5Nb2R1bGVBcnRpZmFjdEFkYXB0ZXJEZWxlZ2F0ZSIvPg0KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwcmlvcml0eSIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBwcmlvcml0eSBhdHJyaWJ1dGUgd2hpY2ggc3BlY2lmaWVzIGEgcmVsYXRpdmUgb3JkZXJpbmcgb2YgYXJ0aWZhY3QgYWRhcHRlcnMuIEFkYXB0ZXJzIHdpdGggYSBoaWdoZXIgbnVtYmVyIGFyZSBhbHdheXMgdXNlZCBmaXJzdC4gVG8gb3ZlcnJpZGUgYW5vdGhlciBhZGFwdGVyLCBzaW1wbHkgcHJvdmlkZSBhIGhpZ2hlciBwcmlvcml0eSB2YWx1ZSB0aGF0IHRoZSBvdGhlciBhZGFwdGVyLiBUaGUgcHJpb3JpdHkgaXMgMCBpZiBubyBwcmlvcml0eSBpcyBzcGVjaWZpZWQNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgJmx0O2ImZ3Q7VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4mbHQ7L2ImZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiBhIG1vZHVsZSBvYmplY3QgYWRhcHRlciBleHRlbnNpb24gcG9pbnQ6DQotDQotJmx0O3ByZSZndDsNCi0NCi0mbHQ7L3ByZSZndDsNCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBWYWx1ZSBvZiB0aGUgYXR0cmlidXRlICZsdDtiJmd0O2NsYXNzJmx0Oy9iJmd0OyBtdXN0IGJlIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBKYXZhIGNsYXNzIHRoYXQgZXh0ZW5kcyAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuTW9kdWxlQXJ0aWZhY3RBZGFwdGVyRGVsZWdhdGUmbHQ7L2NvZGUmZ3Q7IGFuZCBjb250YWlucyBhIHB1YmxpYyAwLWFyZyBjb25zdHJ1Y3Rvci4NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0Ow0KLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgDQotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIA0KLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IA0KLSZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi08L3NjaGVtYT4NCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zY2hlbWEvbW9kdWxlRmFjdG9yaWVzLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zY2hlbWEvbW9kdWxlRmFjdG9yaWVzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxODE1NzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2NoZW1hL21vZHVsZUZhY3Rvcmllcy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+DQotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4NCi08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlIj4NCi08YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUiIGlkPSJtb2R1bGVGYWN0b3JpZXMiIG5hbWU9Ik1vZHVsZSBGYWN0b3JpZXMiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgaXMgdXNlZCB0byBwcm92aWRlIGEgZmFjdG9yeSBmb3IgbW9kdWxlcyB0aGF0IGNhbiBiZSB1c2VkIGJ5IHNlcnZlcnMuDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJtb2R1bGVGYWN0b3J5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+DQotICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJtb2R1bGVGYWN0b3J5Ij4NCi0gICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICA8YXBwSW5mbz4NCi0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IGxhYmVsQXR0cmlidXRlPSJuYW1lIi8+DQotICAgICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ibW9kdWxlVHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPg0KLSAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBleHRlbnNpb24gcG9pbnQNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgSmF2YSBjbGFzcyB0aGF0IGV4dGVuZHMgJmx0O3NhbXAmZ3Q7TW9kdWxlRmFjdG9yeURlbGVnYXRlJmx0Oy9zYW1wJmd0Oy4NCi1Nb2R1bGUgZmFjdG9yeSBpbnN0YW5jZXMgb2YgdGhpcyB0eXBlIHdpbGwgZGVsZWdhdGUgdG8gaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MuDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuTW9kdWxlRmFjdG9yeURlbGVnYXRlIi8+DQotICAgICAgICAgICAgICAgPC9hcHBJbmZvPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InByb2plY3RzIiB0eXBlPSJib29sZWFuIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ib3JkZXIiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJtb2R1bGVUeXBlIj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0eXBlcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmVyc2lvbnMiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIDEuMA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgYSBtb2R1bGUgZmFjdG9yeSBleHRlbnNpb24gcG9pbnQ6DQotDQotJmx0O3ByZSZndDsNCi0NCi0mbHQ7L3ByZSZndDsNCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBWYWx1ZSBvZiB0aGUgYXR0cmlidXRlICZsdDtiJmd0O2NsYXNzJmx0Oy9iJmd0OyBtdXN0IGJlIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBKYXZhIGNsYXNzIHRoYXQgZXh0ZW5kcyAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuTW9kdWxlRmFjdG9yeURlbGVnYXRlJmx0Oy9jb2RlJmd0OyBhbmQgY29udGFpbnMgYSBwdWJsaWMgMC1hcmcgY29uc3RydWN0b3IuDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsNCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIA0KLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyANCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCANCi0mbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotPC9zY2hlbWE+DQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2NoZW1hL21vZHVsZVR5cGVzLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zY2hlbWEvbW9kdWxlVHlwZXMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE2NTlkZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zY2hlbWEvbW9kdWxlVHlwZXMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/Pg0KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+DQotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZSI+DQotPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlIiBpZD0ibW9kdWxlVHlwZXMiIG5hbWU9Ik1vZHVsZSBUeXBlcyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyB1c2VkIHRvIHByb3ZpZGUgYSBuZXcgbW9kdWxlIHR5cGUuDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJtb2R1bGVUeXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+DQotICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJtb2R1bGVUeXBlIj4NCi0gICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICA8YXBwSW5mbz4NCi0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IGxhYmVsQXR0cmlidXRlPSJuYW1lIi8+DQotICAgICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBleHRlbnNpb24gcG9pbnQNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhIHRyYW5zbGF0YWJsZSBuYW1lIHVzZWQgdG8gaWRlbnRpZnkgdGhlIG1vZHVsZSB0eXBlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4NCi0gICAgICAgICAgICAgICA8L2FwcEluZm8+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgMS4wDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiBhIG1vZHVsZSB0eXBlIGV4dGVuc2lvbiBwb2ludDoNCi0NCi0mbHQ7cHJlJmd0Ow0KLSAgICZsdDtleHRlbnNpb24gDQotICAgICAgICAgcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZHVsZVR5cGVzJnF1b3Q7Jmd0Ow0KLSAgICAgICZsdDttb2R1bGVUeXBlDQotICAgICAgICAgICAgaWQ9JnF1b3Q7Y29tLmV4YW1wbGUmcXVvdDsNCi0gICAgICAgICAgICBuYW1lPSZxdW90OyVtb2R1bGVUeXBlTmFtZSZxdW90Ow0KLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSZxdW90OyVtb2R1bGVUeXBlRGVzY3JpcHRpb24mcXVvdDsvJmd0Ow0KLSAgICZsdDsvZXh0ZW5zaW9uJmd0Ow0KLSZsdDsvcHJlJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotICAgDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7DQotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSANCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgDQotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgDQotJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsNCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLTwvc2NoZW1hPg0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NjaGVtYS9wdWJsaXNoVGFza3MuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NjaGVtYS9wdWJsaXNoVGFza3MuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTczMDk1OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zY2hlbWEvcHVibGlzaFRhc2tzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUiIGlkPSJwdWJsaXNoVGFza3MiIG5hbWU9IlB1Ymxpc2ggVGFza3MiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgaXMgdXNlZCB0byBwcm92aWRlIGEgdGFzayB0aGF0IGlzIHJ1biB3aGlsZSBwdWJsaXNoaW5nIHRvIGEgc2VydmVyLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJwdWJsaXNoVGFzayIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InB1Ymxpc2hUYXNrIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IGxhYmVsQXR0cmlidXRlPSJuYW1lIi8+Ci0gICAgICAgICA8L2FwcEluZm8+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBleHRlbnNpb24gcG9pbnQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBKYXZhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyAmbHQ7c2FtcCZndDtvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuUHVibGlzaFRhc2tEZWxlZ2F0ZSZsdDsvc2FtcCZndDsuCi1QdWJsaXNoIHRhc2sgaW5zdGFuY2VzIG9mIHRoaXMgdHlwZSB3aWxsIGRlbGVnYXRlIHRvIGluc3RhbmNlcyBvZiB0aGlzIGNsYXNzLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLlB1Ymxpc2hUYXNrRGVsZWdhdGUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0eXBlSWRzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2Ygc2VydmVyIHR5cGUgaWRzIHRoYXQgdGhpcyB0YXNrIG1heSBhcHBseSB0by4gVXNlZCBmb3IgbWVtb3J5ICZhbXA7IHBlcmZvcm1hbmNlIHJlYXNvbnMKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgMS4wCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiBhIHB1Ymxpc2ggdGFzayBleHRlbnNpb24gcG9pbnQ6Ci0KLSZsdDtwcmUmZ3Q7Ci0KLSZsdDsvcHJlJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgJmx0O2ImZ3Q7Y2xhc3MmbHQ7L2ImZ3Q7IG11c3QgYmUgYSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhIEphdmEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSBpbnRlcmZhY2UgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLlB1Ymxpc2hUYXNrRGVsZWdhdGUmbHQ7L2NvZGUmZ3Q7LgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0mbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NjaGVtYS9ydW50aW1lTG9jYXRvcnMuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NjaGVtYS9ydW50aW1lTG9jYXRvcnMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY0NTYxYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zY2hlbWEvcnVudGltZUxvY2F0b3JzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCi08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPg0KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUiPg0KLTxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZSIgaWQ9InJ1bnRpbWVMb2NhdG9ycyIgbmFtZT0iUnVudGltZSBMb2NhdG9ycyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyB1c2VkIHRvIGxvY2F0ZSBuZXcgcnVudGltZXMgb24gdGhlIGxvY2FsIG1hY2hpbmUuDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJydW50aW1lTG9jYXRvciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPg0KLSAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50DQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGVsZW1lbnQgbmFtZT0icnVudGltZUxvY2F0b3IiPg0KLSAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgbGFiZWxBdHRyaWJ1dGU9Im5hbWUiLz4NCi0gICAgICAgICA8L2FwcEluZm8+DQotICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIHNwZWNpZmllcyBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIGV4dGVuc2lvbiBwb2ludA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBKYXZhIGNsYXNzIHRoYXQgZXh0ZW5kcyAmbHQ7c2FtcCZndDtSdW50aW1lTG9jYXRvckRlbGVnYXRlJmx0Oy9zYW1wJmd0Oy4NCi1SdW50aW1lIGxvY2F0b3IgaW5zdGFuY2VzIG9mIHRoaXMgdHlwZSB3aWxsIGRlbGVnYXRlIHRvIGluc3RhbmNlcyBvZiB0aGlzIGNsYXNzLg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICA8YXBwSW5mbz4NCi0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLlJ1bnRpbWVMb2NhdG9yRGVsZWdhdGUiLz4NCi0gICAgICAgICAgICAgICA8L2FwcEluZm8+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idHlwZUlkcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgMS4wDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiBhIHJ1bnRpbWUgbG9jYXRvciBleHRlbnNpb24gcG9pbnQ6DQotDQotJmx0O3ByZSZndDsNCi0gICAmbHQ7ZXh0ZW5zaW9uIA0KLSAgICAgICAgIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5ydW50aW1lTG9jYXRvcnMmcXVvdDsmZ3Q7DQotICAgICAgJmx0O3J1bnRpbWVMb2NhdG9yDQotICAgICAgICAgICAgaWQ9JnF1b3Q7Y29tLmV4YW1wbGUubG9jYXRvciZxdW90Ow0KLSAgICAgICAgICAgIG5hbWU9JnF1b3Q7JXJ1bnRpbWVMb2NhdG9yTmFtZSZxdW90Ow0KLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSZxdW90OyVydW50aW1lTG9jYXRvckRlc2NyaXB0aW9uJnF1b3Q7DQotICAgICAgICAgICAgY2xhc3M9JnF1b3Q7Y29tLmV4YW1wbGUuRXhhbXBsZVJ1bnRpbWVMb2NhdG9yJnF1b3Q7LyZndDsNCi0gICAmbHQ7L2V4dGVuc2lvbiZndDsNCi0mbHQ7L3ByZSZndDsNCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBWYWx1ZSBvZiB0aGUgYXR0cmlidXRlICZsdDtiJmd0O2NsYXNzJmx0Oy9iJmd0OyBtdXN0IGJlIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBKYXZhIGNsYXNzIHRoYXQgZXh0ZW5kcyAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuUnVudGltZUxvY2F0b3JEZWxlZ2F0ZSZsdDsvY29kZSZndDsgYW5kIGNvbnRhaW5zIGEgcHVibGljIDAtYXJnIGNvbnN0cnVjdG9yLg0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotICAgDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7DQotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSANCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgDQotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgDQotJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsNCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLTwvc2NoZW1hPg0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NjaGVtYS9ydW50aW1lVGFyZ2V0SGFuZGxlcnMuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NjaGVtYS9ydW50aW1lVGFyZ2V0SGFuZGxlcnMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjkxMDM5Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zY2hlbWEvcnVudGltZVRhcmdldEhhbmRsZXJzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCi08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPg0KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUiPg0KLTxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZSIgaWQ9InJ1bnRpbWVUeXBlcyIgbmFtZT0iUnVudGltZSBUeXBlcyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyB1c2VkIHRvIHByb3ZpZGUgYSBuZXcgcnVudGltZSB0YXJnZXQgaGFuZGxlci4gUnVudGltZSB0YXJnZXQgaGFuZGxlcnMgYXJlIGNhbGxlZCB3aGVuZXZlciBhIHJ1bnRpbWUgdGFyZ2V0IGlzIGFkZGVkIG9yIHJlbW92ZWQgZnJvbSBhIHByb2plY3QuIFRoZXkgY2FuIGJlIHVzZWQgdG8gc3dpdGNoIEphdmEgY2xhc3NwYXRocywgc2V0dXAgZGVmYXVsdCByZXNvdXJjZXMsIGV0Yy4NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InJ1bnRpbWVUYXJnZXRIYW5kbGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+DQotICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJydW50aW1lVGFyZ2V0SGFuZGxlciI+DQotICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgPGFwcEluZm8+DQotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCBsYWJlbEF0dHJpYnV0ZT0ibmFtZSIvPg0KLSAgICAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8L2Fubm90YXRpb24+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgZXh0ZW5zaW9uIHBvaW50DQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InJ1bnRpbWVUeXBlSWRzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgcnVudGltZSB0eXBlIGlkcyB0aGF0IHRoaXMgaGFuZGxlciBtYXkgc3VwcG9ydC4gVXNlZCBmb3IgbWVtb3J5ICZhbXA7IHBlcmZvcm1hbmNlIHJlYXNvbnMNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgSmF2YSBjbGFzcyB0aGF0IGV4dGVuZHMgJmx0O3NhbXAmZ3Q7UnVudGltZVRhcmdldEhhbmRsZXJEZWxlZ2F0ZSZsdDsvc2FtcCZndDsuDQotUnVudGltZSB0YXJnZXQgaGFuZGxlciBpbnN0YW5jZXMgb2YgdGhpcyB0eXBlIHdpbGwgZGVsZWdhdGUgdG8gaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MuDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuUnVudGltZVRhcmdldEhhbmRsZXJEZWxlZ2F0ZSIvPg0KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJvcmRlciIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBpbnRlZ2VyIG9yZGVyIHVzZWQgdG8gc29ydCBoYW5kbGVycyByZWxhdGl2ZSB0byBlYWNoIG90aGVyDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIDEuMA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgYSBydW50aW1lIHRhcmdldCBoYW5kbGVyIGV4dGVuc2lvbiBwb2ludDoNCi0NCi0mbHQ7cHJlJmd0Ow0KLSAgICZsdDtleHRlbnNpb24gDQotICAgICAgICAgcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnJ1bnRpbWVUYXJnZXRIYW5kbGVycyZxdW90OyZndDsNCi0gICAgICAmbHQ7cnVudGltZVRhcmdldEhhbmRsZXINCi0gICAgICAgICAgICBpZD0mcXVvdDtjb20uZXhhbXBsZS5ydW50aW1lVGFyZ2V0SGFuZGxlciZxdW90Ow0KLSAgICAgICAgICAgIHJ1bnRpbWVUeXBlSWRzPSZxdW90O2NvbS5leGFtcGxlLnJ1bnRpbWUsIGNvbS5leGFtcGxlMi4qJnF1b3Q7DQotICAgICAgICAgICAgY2xhc3M9JnF1b3Q7Y29tLmV4YW1wbGUuRXhhbXBsZVJ1bnRpbWVUYXJnZXRIYW5kbGVyJnF1b3Q7LyZndDsNCi0gICAgJmx0Oy9leHRlbnNpb24mZ3Q7DQotJmx0Oy9wcmUmZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgVmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSAmbHQ7YiZndDtjbGFzcyZsdDsvYiZndDsgbXVzdCBiZSBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGEgSmF2YSBjbGFzcyB0aGF0IGV4dGVuZHMgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLlJ1bnRpbWVUYXJnZXRIYW5kbGVyRGVsZWdhdGUmbHQ7L2NvZGUmZ3Q7IGFuZCBjb250YWlucyBhIHB1YmxpYyAwLWFyZyBjb25zdHJ1Y3Rvci4NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLSAgIA0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0Ow0KLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgDQotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIA0KLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IA0KLSZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi08L3NjaGVtYT4NCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zY2hlbWEvcnVudGltZVR5cGVzLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zY2hlbWEvcnVudGltZVR5cGVzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxMGVkMDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2NoZW1hL3J1bnRpbWVUeXBlcy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTk5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+DQotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4NCi08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlIj4NCi08YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUiIGlkPSJydW50aW1lVHlwZXMiIG5hbWU9IlJ1bnRpbWUgVHlwZXMiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgaXMgdXNlZCB0byBwcm92aWRlIGEgbmV3IHJ1bnRpbWUgdHlwZS4NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InJ1bnRpbWVUeXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+DQotICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJydW50aW1lVHlwZSI+DQotICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgPGFwcEluZm8+DQotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCBsYWJlbEF0dHJpYnV0ZT0ibmFtZSIvPg0KLSAgICAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8L2Fubm90YXRpb24+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Im1vZHVsZVR5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4NCi0gICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgZXh0ZW5zaW9uIHBvaW50DQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYSB0cmFuc2xhdGFibGUgbmFtZSB1c2VkIHRvIGlkZW50aWZ5IHRoZSBydW50aW1lIHR5cGUNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgPGFwcEluZm8+DQotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhIHRyYW5zbGF0YWJsZSBkZXNjcmlwdGlvbiBvZiB0aGUgcnVudGltZSB0eXBlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4NCi0gICAgICAgICAgICAgICA8L2FwcEluZm8+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmVuZG9yIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGEgdHJhbnNsYXRhYmxlIHZlbmRvciBuYW1lDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InZlcnNpb24iIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYSB0cmFuc2xhdGFibGUgdmVyc2lvbiBudW1iZXINCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmVuZG9ySWQiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gaWQgdXNlZCB0byBpZGVudGlmeSB0aGUgdmVuZG9yDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIHNwZWNpZmllcyB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIEphdmEgY2xhc3MgdGhhdCBleHRlbmRzICZsdDtzYW1wJmd0O1J1bnRpbWVEZWxlZ2F0ZSZsdDsvc2FtcCZndDsuDQotUnVudGltZSBpbnN0YW5jZXMgb2YgdGhpcyB0eXBlIHdpbGwgZGVsZWdhdGUgdG8gaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MuIERlbGVnYXRlcyBtdXN0IGFsc28gaGF2ZSBhIHB1YmxpYyAwLWFyZyBjb25zdHJ1Y3Rvci4NCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgPGFwcEluZm8+DQotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiLz4NCi0gICAgICAgICAgICAgICA8L2FwcEluZm8+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9Im1vZHVsZVR5cGUiPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InR5cGVzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgdGhlIG1vZHVsZSB0eXBlcyB0aGF0IHRoaXMgcnVudGltZSBzdXBwb3J0cw0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9ucyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIHRoZSBtb2R1bGUgdmVyc2lvbnMgdGhhdCB0aGlzIHJ1bnRpbWUgc3VwcG9ydHMNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgMS4wDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiBhIHJ1bnRpbWUgdHlwZSBleHRlbnNpb24gcG9pbnQ6DQotDQotJmx0O3ByZSZndDsNCi0gICAmbHQ7ZXh0ZW5zaW9uIA0KLSAgICAgICAgIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5ydW50aW1lVHlwZXMmcXVvdDsmZ3Q7DQotICAgICAgJmx0O3J1bnRpbWVUeXBlDQotICAgICAgICAgICAgaWQ9JnF1b3Q7Y29tLmV4YW1wbGUucnVudGltZSZxdW90Ow0KLSAgICAgICAgICAgIG5hbWU9JnF1b3Q7JXJ1bnRpbWVUeXBlTmFtZSZxdW90Ow0KLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSZxdW90OyVydW50aW1lVHlwZURlc2NyaXB0aW9uJnF1b3Q7DQotICAgICAgICAgICAgdmVuZG9yPSZxdW90OyVydW50aW1lVHlwZVZlbmRvciZxdW90Ow0KLSAgICAgICAgICAgIHZlcnNpb249JnF1b3Q7MS4wJnF1b3Q7DQotICAgICAgICAgICAgY2xhc3M9JnF1b3Q7Y29tLmV4YW1wbGUuRXhhbXBsZVJ1bnRpbWVEZWxlZ2F0ZSZxdW90OyZndDsNCi0gICAgICAgICAmbHQ7bW9kdWxlVHlwZQ0KLSAgICAgICAgICAgICAgIHR5cGVzPSZxdW90O2oyZWUud2ViJnF1b3Q7DQotICAgICAgICAgICAgICAgdmVyc2lvbnM9JnF1b3Q7MS4yLCAxLjMsIDEuNCZxdW90Oy8mZ3Q7DQotICAgICAgJmx0Oy9ydW50aW1lVHlwZSZndDsNCi0gICAmbHQ7L2V4dGVuc2lvbiZndDsNCi0mbHQ7L3ByZSZndDsNCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBWYWx1ZSBvZiB0aGUgYXR0cmlidXRlICZsdDtiJmd0O2NsYXNzJmx0Oy9iJmd0OyBtdXN0IGJlIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBKYXZhIGNsYXNzIHRoYXQgZXh0ZW5kcyAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuUnVudGltZURlbGVnYXRlJmx0Oy9jb2RlJmd0OyBhbmQgY29udGFpbnMgYSBwdWJsaWMgMC1hcmcgY29uc3RydWN0b3IuDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0gICANCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsNCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIA0KLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyANCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCANCi0mbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotPC9zY2hlbWE+DQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2NoZW1hL3NlcnZlck1vbml0b3JzLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zY2hlbWEvc2VydmVyTW9uaXRvcnMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBmNDliNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zY2hlbWEvc2VydmVyTW9uaXRvcnMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/Pg0KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+DQotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZSI+DQotPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlIiBpZD0iaW50ZXJuYWxTZXJ2ZXJNb25pdG9yIiBuYW1lPSJTZXJ2ZXIgTW9uaXRvciIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyB1c2VkIHRvIHByb3ZpZGUgYSBuZXcgbW9uaXRvciBmb3Igc2VydmVycy4NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Im1vbml0b3IiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4NCi0gICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9Im1vbml0b3IiPg0KLSAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgbGFiZWxBdHRyaWJ1dGU9Im5hbWUiLz4NCi0gICAgICAgICA8L2FwcEluZm8+DQotICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIHNwZWNpZmllcyBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIGV4dGVuc2lvbiBwb2ludA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGEgdHJhbnNsYXRhYmxlIG5hbWUgdXNlZCB0byBpZGVudGlmeSB0aGlzIG1vbml0b3INCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgPGFwcEluZm8+DQotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhIHRyYW5zbGF0YWJsZSBkZXNjcmlwdGlvbiBvZiB0aGlzIG1vbml0b3INCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgPGFwcEluZm8+DQotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBKYXZhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyAmbHQ7c2FtcCZndDtvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuU2VydmVyTW9uaXRvckRlbGVnYXRlJmx0Oy9zYW1wJmd0Ow0KLQ0KLVRoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIGludGVybmFsIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgYnkgYW55IG90aGVyIHBsdWdpbnMuDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuU2VydmVyTW9uaXRvckRlbGVnYXRlIi8+DQotICAgICAgICAgICAgICAgPC9hcHBJbmZvPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIDEuMA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgYSBzZXJ2ZXIgbW9uaXRvciBleHRlbnNpb24gcG9pbnQ6DQotDQotJmx0O3ByZSZndDsNCi0NCi0mbHQ7L3ByZSZndDsNCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBWYWx1ZSBvZiB0aGUgYXR0cmlidXRlICZsdDtiJmd0O2NsYXNzJmx0Oy9iJmd0OyBtdXN0IGJlIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBKYXZhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgaW50ZXJmYWNlICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5TZXJ2ZXJNb25pdG9yRGVsZWdhdGUmbHQ7L2NvZGUmZ3Q7Lg0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7DQotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSANCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgDQotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgDQotJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsNCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLTwvc2NoZW1hPg0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NjaGVtYS9zZXJ2ZXJUeXBlcy5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2NoZW1hL3NlcnZlclR5cGVzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkMTRiOGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2NoZW1hL3NlcnZlclR5cGVzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwyMzcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCi08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPg0KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUiPg0KLTxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZSIgaWQ9InNlcnZlclR5cGVzIiBuYW1lPSJTZXJ2ZXIgVHlwZXMiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgaXMgdXNlZCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIGEgbmV3IHNlcnZlciB0eXBlLg0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ic2VydmVyVHlwZSIvPg0KLSAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50DQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGVsZW1lbnQgbmFtZT0ic2VydmVyVHlwZSI+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBzZXJ2ZXIgdHlwZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGEgdHJhbnNsYXRhYmxlIG5hbWUgdXNlZCB0byBpZGVudGlmeSB0aGlzIHNlcnZlciB0eXBlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4NCi0gICAgICAgICAgICAgICA8L2FwcEluZm8+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYSB0cmFuc2xhdGFibGUgZGVzY3JpcHRpb24gb2YgdGhpcyBzZXJ2ZXIgdHlwZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICA8YXBwSW5mbz4NCi0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+DQotICAgICAgICAgICAgICAgPC9hcHBJbmZvPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIHNwZWNpZmllcyB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIEphdmEgY2xhc3MgdGhhdCBleHRlbmRzICZsdDtzYW1wJmd0O29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5TZXJ2ZXJEZWxlZ2F0ZSZsdDsvc2FtcCZndDsuDQotU2VydmVyIGluc3RhbmNlcyBvZiB0aGlzIHR5cGUgd2lsbCBkZWxlZ2F0ZSB0byBpbnN0YW5jZXMgb2YgdGhpcyBjbGFzcy4gRGVsZWdhdGVzIG11c3QgYWxzbyBoYXZlIGEgcHVibGljIDAtYXJnIGNvbnN0cnVjdG9yLg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICA8YXBwSW5mbz4NCi0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLlNlcnZlckRlbGVnYXRlIi8+DQotICAgICAgICAgICAgICAgPC9hcHBJbmZvPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImJlaGF2aW91ckNsYXNzIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIHNwZWNpZmllcyB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIEphdmEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzICZsdDtzYW1wJmd0O29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5TZXJ2ZXJCZWhhdmlvdXJEZWxlZ2F0ZSZsdDsvc2FtcCZndDsuDQotU2VydmVyIGluc3RhbmNlcyBvZiB0aGlzIHR5cGUgd2lsbCBkZWxlZ2F0ZSB0byBpbnN0YW5jZXMgb2YgdGhpcyBjbGFzcy4gRGVsZWdhdGVzIG11c3QgYWxzbyBoYXZlIGEgcHVibGljIDAtYXJnIGNvbnN0cnVjdG9yLg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICA8YXBwSW5mbz4NCi0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLlNlcnZlckJlaGF2aW91ckRlbGVnYXRlIi8+DQotICAgICAgICAgICAgICAgPC9hcHBJbmZvPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Imhhc0NvbmZpZ3VyYXRpb24iIHR5cGU9ImJvb2xlYW4iPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIHRydWUgaWYgdGhpcyBzZXJ2ZXIgaGFzIHNlcnZlciBjb25maWd1cmF0aW9uIGZpbGVzDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InJ1bnRpbWVUeXBlSWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImxhdW5jaENvbmZpZ0lkIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIHRoZSBsYXVuY2ggY29uZmlndXJhdGlvbiBpZCBmb3IgdGhlIGxhdW5jaCBjb25maWd1cmF0aW9uIHRoYXQgaXMgYWJsZSB0byBzdGFydCB0aGlzIHNlcnZlcg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzdXBwb3J0c1JlbW90ZUhvc3RzIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIHRydWUgaWYgdGhpcyBzZXJ2ZXIgdHlwZSBjYW4gd29yayB3aXRoIHJlbW90ZSBob3N0IG5hbWVzLCBmYWxzZSBpZiB0aGlzIHNlcnZlciB0eXBlIGNhbiBvbmx5IHdvcmsgb24gbG9jYWxob3N0LiBpZiB1bnNwZWNpZmllZCwgZmFsc2UgaXMgYXNzdW1lZA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJydW50aW1lIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgICZxdW90O3RydWUmcXVvdDsgaWYgdGhpcyBzZXJ2ZXIgcmVxdWlyZXMgYSBydW50aW1lLCAmcXVvdDtmYWxzZSZxdW90OyBvdGhlcndpc2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibGF1bmNoTW9kZXMiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgdGhlIGxhdW5jaCBtb2RlcyB0aGF0IHRoaXMgc2VydmVyIHN1cHBvcnRzDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImluaXRpYWxTdGF0ZSIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICB0aGUgaW50aWFsIHN0YXRlIG9mIHRoZSBzZXJ2ZXIsIGVpdGhlciAmcXVvdDtzdGFydGVkJnF1b3Q7LCBvciAmcXVvdDtzdG9wcGVkJnF1b3Q7LiBpZiB0aGlzIGF0dHJpYnV0ZSBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgc2VydmVyIHN0YXRlIHdpbGwgYmUgJnF1b3Q7dW5rbm93biZxdW90Ow0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzdGFydFRpbWVvdXQiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgdGhlIHRpbWVvdXQgdmFsdWUgdGhhdCB0aGUgdG9vbCB3aWxsIHdhaXQgZm9yIHRoZSBzZXJ2ZXIgdG8gYmUgc3RhcnRlZC4gVGhlIGRlZmF1bHQgaXMgMiBtaW51dGVzDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InN0b3BUaW1lb3V0IiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIHRoZSB0aW1lb3V0IHZhbHVlIHRoYXQgdGhlIHRvb2wgd2lsbCB3YWl0IGZvciB0aGUgc2VydmVyIHRvIGJlIHN0b3BwZWQuIFRoZSBkZWZhdWx0IGlzIDIgbWludXRlcw0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzdGFydEJlZm9yZVB1Ymxpc2giIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYm9vbGVhbiB2YWx1ZSAmcXVvdDt0cnVlJnF1b3Q7IG9yICZxdW90O2ZhbHNlJnF1b3Q7IHRvIHNwZWNpZnkgd2hldGhlciB0aGUgc2VydmVyIG5lZWRzIHRvIGJlIHN0YXJ0ZWQgZm9yIHB1Ymxpc2hpbmcgdG8gb2NjdXIuIElmICZxdW90O3RydWUmcXVvdDssIHRoZSBzZXJ2ZXIgd2lsbCBiZSBzdGFydGVkIG9uIGV2ZXJ5IGNhbGwgdG8gcHVibGlzaCgpIGJlZm9yZSBleGVjdXRpbmcgdGhlIHB1Ymxpc2ggY29kZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAxLjANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGEgc2VydmVyIHR5cGUgZXh0ZW5zaW9uIHBvaW50Og0KLQ0KLSZsdDtwcmUmZ3Q7DQotICAgJmx0O2V4dGVuc2lvbiANCi0gICAgICAgICBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuc2VydmVyVHlwZXMmcXVvdDsmZ3Q7DQotICAgICAgJmx0O3NlcnZlclR5cGUNCi0gICAgICAgICAgICBpZD0mcXVvdDtjb20uZXhhbXBsZS5zZXJ2ZXJUeXBlJnF1b3Q7DQotICAgICAgICAgICAgbmFtZT0mcXVvdDslc2VydmVyVHlwZU5hbWUmcXVvdDsNCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0mcXVvdDslc2VydmVyVHlwZURlc2NyaXB0aW9uJnF1b3Q7DQotICAgICAgICAgICAgc3VwcG9ydHNSZW1vdGVIb3N0cz0mcXVvdDt0cnVlJnF1b3Q7DQotICAgICAgICAgICAgcnVudGltZT0mcXVvdDt0cnVlJnF1b3Q7DQotICAgICAgICAgICAgaW5pdGlhbFN0YXRlPSZxdW90O3N0b3BwZWQmcXVvdDsNCi0gICAgICAgICAgICBoYXNDb25maWd1cmF0aW9uPSZxdW90O3RydWUmcXVvdDsNCi0gICAgICAgICAgICBsYXVuY2hDb25maWdJZD0mcXVvdDtjb20uZXhhbXBsZS5sYXVuY2hDb25maWd1cmF0aW9uVHlwZSZxdW90Ow0KLSAgICAgICAgICAgIHJ1bnRpbWVUeXBlSWQ9JnF1b3Q7Y29tLmV4YW1wbGUucnVudGltZSZxdW90Ow0KLSAgICAgICAgICAgIGNsYXNzPSZxdW90O2NvbS5leGFtcGxlLkV4YW1wbGVTZXJ2ZXJEZWxlZ2F0ZSZxdW90Ow0KLSAgICAgICAgICAgIGJlaGF2aW91ckNsYXNzPSZxdW90O2NvbS5leGFtcGxlLkV4YW1wbGVTZXJ2ZXJCZWhhdmlvdXJEZWxlZ2F0ZSZxdW90Oy8mZ3Q7DQotICAgJmx0Oy9leHRlbnNpb24mZ3Q7DQotJmx0Oy9wcmUmZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgVmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSAmbHQ7YiZndDtjbGFzcyZsdDsvYiZndDsgbXVzdCBiZSBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGEgSmF2YSBjbGFzcyB0aGF0IGV4dGVuZHMgdGhlIGFic3RyYWN0IGNsYXNzICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5TZXJ2ZXJEZWxlZ2F0ZSZsdDsvY29kZSZndDsgYW5kIGhhcyBhIHB1YmxpYyAwLWFyZyBjb25zdHJ1Y3Rvci4NCi0NCi1WYWx1ZSBvZiB0aGUgYXR0cmlidXRlICZsdDtiJmd0O2JlaGF2aW91ckNsYXNzJmx0Oy9iJmd0OyBtdXN0IGJlIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBKYXZhIGNsYXNzIHRoYXQgZXh0ZW5kcyB0aGUgYWJzdHJhY3QgY2xhc3MgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLlNlcnZlckJlaGF2aW91ckRlbGVnYXRlJmx0Oy9jb2RlJmd0OyBhbmQgaGFzIGEgcHVibGljIDAtYXJnIGNvbnN0cnVjdG9yLg0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotICAgDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7DQotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSANCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgDQotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgDQotJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsNCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLTwvc2NoZW1hPg0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NjaGVtYS9zdGFydHVwLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zY2hlbWEvc3RhcnR1cC5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWJiZDNjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NjaGVtYS9zdGFydHVwLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCi08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPg0KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUiPg0KLTxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZSIgaWQ9ImludGVybmFsU3RhcnR1cCIgbmFtZT0iU3RhcnR1cCIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBwcm92aWRlcyBhIHdheSB0byBpbnZva2UgY29kZSBkdXJpbmcgdGhlIHNlcnZlciBjb3JlIHBsdWdpbiBzdGFydHVwLiBVc2Ugc3BhcmluZ2x5Lg0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ic3RhcnR1cCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPg0KLSAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50DQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGVsZW1lbnQgbmFtZT0ic3RhcnR1cCI+DQotICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgPGFwcEluZm8+DQotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCBsYWJlbEF0dHJpYnV0ZT0ibmFtZSIvPg0KLSAgICAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8L2Fubm90YXRpb24+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgZXh0ZW5zaW9uIHBvaW50DQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIHNwZWNpZmllcyB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIEphdmEgY2xhc3MgdGhhdCBleHRlbmRzICZsdDtzYW1wJmd0O29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5JU3RhcnR1cCZsdDsvc2FtcCZndDsuDQotDQotVGhpcyBleHRlbnNpb24gcG9pbnQgaXMgaW50ZXJuYWwgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBieSBhbnkgb3RoZXIgcGx1Z2lucy4NCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgPGFwcEluZm8+DQotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5JU3RhcnR1cCIvPg0KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBpbnRlcm5hbCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGJ5IGFueSBvdGhlciBwbHVnaW5zLiZsdDsvYiZndDsNCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGEgc3RhcnR1cCBleHRlbnNpb24gcG9pbnQ6DQotDQotJmx0O3ByZSZndDsNCi0gICAmbHQ7ZXh0ZW5zaW9uIA0KLSAgICAgICAgIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5zdGFydHVwJnF1b3Q7Jmd0Ow0KLSAgICAgICZsdDtzdGFydHVwDQotICAgICAgICAgICAgaWQ9JnF1b3Q7Y29tLmV4YW1wbGUuc3RhcnR1cCZxdW90Ow0KLSAgICAgICAgICAgIGNsYXNzPSZxdW90O2NvbS5leGFtcGxlLkV4YW1wbGVTdGFydHVwJnF1b3Q7LyZndDsNCi0gICAmbHQ7L2V4dGVuc2lvbiZndDsNCi0mbHQ7L3ByZSZndDsNCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBWYWx1ZSBvZiB0aGUgYXR0cmlidXRlICZsdDtiJmd0O2NsYXNzJmx0Oy9iJmd0OyBtdXN0IGJlIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBKYXZhIGNsYXNzIHRoYXQgZXh0ZW5kcyAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSVN0YXJ0dXAmbHQ7L2NvZGUmZ3Q7IGFuZCBjb250YWlucyBhIHB1YmxpYyAwLWFyZyBjb25zdHJ1Y3Rvci4NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLSAgIA0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0Ow0KLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgDQotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIA0KLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IA0KLSZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi08L3NjaGVtYT4NCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9JTW9kdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9JTW9kdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxZmMyNjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvSU1vZHVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci0vKioKLSAqIEEgbW9kdWxlIGlzIGEgdW5pdCBvZiAiY29udGVudCIgdGhhdCBjYW4gYmUgcHVibGlzaGVkIHRvIGEKLSAqIHNlcnZlci4KLSAqIDxwPgotICogQWxsIG1vZHVsZXMgaGF2ZSBhIG1vZHVsZSB0eXBlLCB3aGljaCBpcyBmaXhlZCBmb3IgdGhlCi0gKiBsaWZldGltZSBvZiB0aGUgbW9kdWxlLiBUaGUgc2V0IG9mIG1vZHVsZSB0eXBlcyAob3IKLSAqICJraW5kcyIpIGlzIG9wZW4tZW5kZWQuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIEFsbCBtb2R1bGVzIGFyZSBjcmVhdGVkIGJ5IG1vZHVsZSBmYWN0b3JpZXMgdXNpbmcgdGhlIG1vZHVsZUZhY3RvcmllcwotICogZXh0ZW5zaW9uIHBvaW50LgotICogPC9wPgotICogPHA+Ci0gKiBUaGUgY29udGVudCBvZiBhIG1vZHVsZSBpcyBhIGNvbGxlY3Rpb24gb2YgZmlsZSBhbmQgZm9sZGVyCi0gKiByZXNvdXJjZXMgaW4gdGhlIHdvcmtzcGFjZS4KLSAqIDwvcD4KLSAqIDxwPgotICogSW4gcHJpbmNpcGxlLCBhIG1vZHVsZSBleGlzdHMgaW5kZXBlbmRlbnQgb2YgYW55Ci0gKiBwYXJ0aWN1bGFyIHNlcnZlci4gVGhlIHNhbWUgbW9kdWxlIGluc3RhbmNlIGNhbiBiZSBhc3NvY2lhdGVkCi0gKiB3aXRoIG11bHRpcGxlIHNlcnZlciBpbnN0YW5jZXMgYXQgdGhlIHNhbWUgdGltZS4gVGhhdCBpcwotICogd2h5IHlvdSBjYW5ub3QgYXNrIHRoZSBtb2R1bGUgd2hpY2ggc2VydmVyIGl0J3MgYXNzb2NpYXRlZAotICogd2l0aC4KLSAqIDwvcD4KLSAqIDxwPgotICogW2lzc3VlOiBFcXVhbGl0eS9pZGVudGlmeSBmb3IgbW9kdWxlcz9dCi0gKiA8L3A+Ci0gKiA8cD5UaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy48L3A+Ci0gKiA8cD4KLSAqIDxiPlByb3Zpc2lvbmFsIEFQSTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAKLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJTW9kdWxlIGV4dGVuZHMgSUFkYXB0YWJsZSB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgaWQgb2YgdGhpcyBtb2R1bGUuCi0JICogRWFjaCBtb2R1bGUgaGFzIGEgZGlzdGluY3QgaWQsIHVzZWQgdG8gZGlzdGluZ3Vpc2ggdGhpcwotCSAqIG1vZHVsZSBmcm9tIGFsbCBvdGhlciBtb2R1bGVzIGluIHRoZSB3b3Jrc3BhY2UgKGFuZAotCSAqIHdpdGhpbiBhIHNlcnZlcikuIElkcyBhcmUgaW50ZW5kZWQgdG8gYmUgdXNlZCBpbnRlcm5hbGx5Ci0JICogYXMga2V5czsgdGhleSBhcmUgbm90IGludGVuZGVkIHRvIGJlIHNob3duIHRvIGVuZCB1c2Vycy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtb2R1bGUgaWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkaXNwbGF5YWJsZSBuYW1lIGZvciB0aGlzIG1vZHVsZS4KLQkgKiA8cD4KLQkgKiBOb3RlIHRoYXQgdGhpcyBuYW1lIGlzIGFwcHJvcHJpYXRlIGZvciB0aGUgY3VycmVudCBsb2NhbGUuCi0JICogPC9wPgotCSAqCi0JICogQHJldHVybiBhIGRpc3BsYXlhYmxlIG5hbWUgZm9yIHRoaXMgbW9kdWxlCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0eXBlIG9mIHRoaXMgbW9kdWxlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1vZHVsZSB0eXBlCi0JICovCi0JcHVibGljIElNb2R1bGVUeXBlIGdldE1vZHVsZVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHdvcmtiZW5jaCBwcm9qZWN0IHRoYXQgdGhpcyBtb2R1bGUgaXMgY29udGFpbmVkIGluLAotCSAqIG9yIG51bGwgaWYgdGhlIG1vZHVsZSBpcyBvdXRzaWRlIG9mIHRoZSB3b3Jrc3BhY2UuCi0JICogCi0JICogQHJldHVybiBhIHByb2plY3QKLQkgKi8KLQlwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhbiBvYmplY3Qgd2hpY2ggaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGdpdmVuIGNsYXNzCi0JICogYXNzb2NpYXRlZCB3aXRoIHRoaXMgb2JqZWN0LiBSZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IGlmCi0JICogbm8gc3VjaCBvYmplY3QgY2FuIGJlIGZvdW5kLCBvciBpZiB0aGUgZGVsZWdhdGUgaXMgbm90Ci0JICogbG9hZGVkLgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgbm90IGNoZWNrIHRoZSBkZWxlZ2F0ZSBjbGFzc2VzIGZvciBhZGFwdGluZwotCSAqIHVubGVzcyB0aGV5IGFyZSBhbHJlYWR5IGxvYWRlZC4gTm8gcGx1Z2luIGxvYWRpbmcgd2lsbCBvY2N1cgotCSAqIHdoZW4gY2FsbGluZyB0aGlzIG1ldGhvZC4gSXQgaXMgc3VpdGFibGUgZm9yIHBvcHVwIG1lbnVzIGFuZAotCSAqIG90aGVyIFVJIGFydGlmYWN0cyB3aGVyZSBwZXJmb3JtYW5jZSBpcyBhIGNvbmNlcm4uCi0JICogPC9wPgotCSAqCi0JICogQHBhcmFtIGFkYXB0ZXIgdGhlIGFkYXB0ZXIgY2xhc3MgdG8gbG9vayB1cAotCSAqIEByZXR1cm4gYSBvYmplY3QgY2FzdGFibGUgdG8gdGhlIGdpdmVuIGNsYXNzLCAKLQkgKiAgICBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIG9iamVjdCBkb2VzIG5vdAotCSAqICAgIGhhdmUgYW4gYWRhcHRlciBmb3IgdGhlIGdpdmVuIGNsYXNzCi0JICogQHNlZSBJQWRhcHRhYmxlI2dldEFkYXB0ZXIoQ2xhc3MpCi0JICogQHNlZSAjbG9hZEFkYXB0ZXIoQ2xhc3MsIElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpOwotCi0JLyoqCi0JICogUmV0dXJucyBhbiBvYmplY3Qgd2hpY2ggaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGdpdmVuIGNsYXNzCi0JICogYXNzb2NpYXRlZCB3aXRoIHRoaXMgb2JqZWN0LiBSZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IG9ubHkgaWYKLQkgKiBubyBzdWNoIG9iamVjdCBjYW4gYmUgZm91bmQgYWZ0ZXIgbG9hZGluZyBhbmQgaW5pdGlhbGl6aW5nCi0JICogZGVsZWdhdGVzLgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgZm9yY2UgYSBsb2FkIGFuZCBpbml0aWFsaXphdGlvbiBvZiBhbGwgZGVsZWdhdGUKLQkgKiBjbGFzc2VzIGFuZCBjaGVjayB0aGVtIGZvciBhZGFwdGluZy4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcGFyYW0gYWRhcHRlciB0aGUgYWRhcHRlciBjbGFzcyB0byBsb29rIHVwCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqIEByZXR1cm4gYSBvYmplY3QgY2FzdGFibGUgdG8gdGhlIGdpdmVuIGNsYXNzLCAKLQkgKiAgICBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIG9iamVjdCBkb2VzIG5vdAotCSAqICAgIGhhdmUgYW4gYWRhcHRlciBmb3IgdGhlIGdpdmVuIGNsYXNzCi0JICogQHNlZSAjZ2V0QWRhcHRlcihDbGFzcykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGxvYWRBZGFwdGVyKENsYXNzIGFkYXB0ZXIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcik7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvSU1vZHVsZUFydGlmYWN0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9JTW9kdWxlQXJ0aWZhY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM5MTM5OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9JTW9kdWxlQXJ0aWZhY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlOwotLyoqCi0gKiBBIG1vZHVsZSBhcnRpZmFjdCBpcyBhIHJlc291cmNlIHdpdGhpbiBhIG1vZHVsZSwgd2hpY2ggY2FuIGJlIGxhdW5jaGVkCi0gKiBvbiB0aGUgc2VydmVyLiBFeGFtcGxlcyBvZiBtb2R1bGUgYXJ0aWZhY3RzIGFyZSBzZXJ2bGV0cywgSFRNTCBwYWdlcywKLSAqIG9yIEVKQiBiZWFucy4KLSAqIDxwPgotICogT2JqZWN0cyB0aGF0IHByb3ZpZGUgYW4gYWRhcHRlciBvZiB0aGlzIHR5cGUgd2lsbCBiZSBjb25zaWRlcmVkIGJ5IHRoZQotICogY29udGV4dHVhbCBSdW4gb24gU2VydmVyIGxhdW5jaCBzdXBwb3J0LiAKLSAqIDwvcD4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuTW9kdWxlQXJ0aWZhY3RBZGFwdGVyRGVsZWdhdGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJTW9kdWxlQXJ0aWZhY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIG1vZHVsZSB0aGF0IHRoaXMgYXJ0aWZhY3QgaXMgYSBwYXJ0IG9mLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1vZHVsZSB0aGF0IHRoaXMgYXJ0aWZhY3QgaXMgY29udGFpbmVkIGluCi0JICovCi0JcHVibGljIElNb2R1bGUgZ2V0TW9kdWxlKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvSU1vZHVsZVR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL0lNb2R1bGVUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4ODAwYjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvSU1vZHVsZVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlOwotLyoqCi0gKiBSZXByZXNlbnRzIHRoZSB0eXBlIG9mIGEgbW9kdWxlLgotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqIDxwPgotICogPGI+UHJvdmlzaW9uYWwgQVBJOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byAKLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayAKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIAotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNb2R1bGVUeXBlIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtb2R1bGUgdHlwZSBpZC4KLQkgKiA8cD4KLQkgKiBUaGUgbW9kdWxlIHR5cGUgaWQgaXMgYSAiLiIgc2VwYXJhdGVkIHN0cmluZyB1bmlxdWVseSBpZGVudGlmeWluZyB0aGUKLQkgKiB0eXBlIG9mIG1vZHVsZS4gTGlrZSBhIGphdmEgcGFja2FnZSBuYW1lLCBpdCBzaG91bGQgc2NvcGUgdGhlIHR5cGUgZnJvbQotCSAqIG1vc3QgZ2VuZXJhbCB0byBzcGVjaWZpYy4gRm9yIGluc3RhbmNlLCAianN0LndlYiIuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1vZHVsZSB0eXBlIGlkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGlzcGxheWFibGUgbmFtZSBmb3IgdGhpcyBtb2R1bGUgdHlwZS4KLQkgKiA8cD4KLQkgKiBOb3RlIHRoYXQgdGhpcyBuYW1lIGlzIGFwcHJvcHJpYXRlIGZvciB0aGUgY3VycmVudCBsb2NhbGUuCi0JICogPC9wPgotCSAqCi0JICogQHJldHVybiBhIGRpc3BsYXlhYmxlIG5hbWUgZm9yIHRoaXMgbW9kdWxlIHR5cGUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZlcnNpb24gKHNwZWNpZmljYXRpb24gbGV2ZWwpIG9mIHRoaXMgbW9kdWxlIHR5cGUsCi0JICogZS5nLiAiMS4wIiBvciAiMS4zLjJhIi4KLQkgKiA8cD4KLQkgKiBUaGUgdmVyc2lvbiB3aWxsIG5vcm1hbGx5IGJlIGEgc2VyaWVzIG9mIG51bWJlcnMgc2VwYXJhdGVkIGJ5Ci0JICogIi4iLCBidXQgaXQgY291bGQgYmUgZGlmZmVyZW50IGRlcGVuZGluZyBvbiB0aGUgdHlwZSBvZiBtb2R1bGUuCi0JICogRm9yIG1vZHVsZSB0eXBlcyB3aGVyZSBhIHZlcnNpb24gZG9lcyBub3QgbWFrZSBzZW5zZSAoZS5nLgotCSAqIGEgc3RhdGljIFdlYiBtb2R1bGUpLCA8Y29kZT5udWxsPC9jb2RlPiBpcyByZXR1cm5lZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiB0aGUgc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIG9mIHRoaXMgbW9kdWxlIHR5cGUsIG9yCi0JICogICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm8gdmVyc2lvbiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZlcnNpb24oKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9JUHJvamVjdFByb3BlcnRpZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL0lQcm9qZWN0UHJvcGVydGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGRiZWVkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL0lQcm9qZWN0UHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmU7Ci0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGhvbGRzIGluZm9ybWF0aW9uIG9uIHRoZSBwcm9wZXJ0aWVzIG9mIGEgZ2l2ZW4gcHJvamVjdC4KLSAqCi0gKiA8cD5UaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy48L3A+Ci0gKiA8cD4KLSAqIDxiPlByb3Zpc2lvbmFsIEFQSTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAKLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKiAKLSAqIEBkZXByZWNhdGVkIFByb2plY3QgZmFjZXQgc3VwcG9ydCBzaG91bGQgbm93IGJlIHVzZWQgaW5zdGVhZCBvZiB0aGlzIEFQSS4gQHNlZQotICogICAgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0I2dldFJ1bnRpbWUoKQotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQcm9qZWN0UHJvcGVydGllcyB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgY3VycmVudCBydW50aW1lIHRhcmdldCBmb3IgdGhpcyBwcm9qZWN0LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGN1cnJlbnQgcnVudGltZSB0YXJnZXQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBwcm9qZWN0IGhhcwotCSAqICAgIG5vIHJ1bnRpbWUgdGFyZ2V0Ci0JICogQGRlcHJlY2F0ZWQgUHJvamVjdCBmYWNldCBzdXBwb3J0IHNob3VsZCBub3cgYmUgdXNlZCBpbnN0ZWFkIG9mIHRoaXMgQVBJLiBAc2VlCi0JICogICAgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0I2dldFJ1bnRpbWUoKQotCSAqLwotCXB1YmxpYyBJUnVudGltZSBnZXRSdW50aW1lVGFyZ2V0KCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvSVB1Ymxpc2hMaXN0ZW5lci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvSVB1Ymxpc2hMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWIyMGE2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL0lQdWJsaXNoTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotoCogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci0vKioKLSAqIEEgcHVibGlzaCBsaXN0ZW5lciBpcyB1c2VkIHRvIGxpc3RlbiBmb3IgcHVibGlzaGluZyBldmVudHMgZnJvbSBhIHNlcnZlci4KLSAqIFRoZSBldmVudHMgYXJlIHR5cGljYWxseSByZWNlaXZlZCBpbiB0aGUgZm9sbG93aW5nIG9yZGVyOgotICogCi0gKiBwdWJsaXNoU3RhcnRlZCgpIC0gVGhlIHB1Ymxpc2ggb3BlcmF0aW9uIGlzIHN0YXJ0aW5nCi0gKiAgIHB1Ymxpc2hNb2R1bGVTdGFydGVkKCkgLSBUaGlzIHNlY3Rpb24gaXMgZmlyZWQgZm9yIGVhY2ggbW9kdWxlIGluIHRoZSBzZXJ2ZXIKLSAqICAgcHVibGlzaE1vZHVsZUZpbmlzaGVkKCkgLSBUaGlzIG1vZHVsZSBpcyBmaW5pc2hlZCBwdWJsaXNoaW5nCi0gKiAgIHB1Ymxpc2hNb2R1bGVTdGFydGVkKCkgLSBUaGUgbmV4dCBtb2R1bGUgaXMgcHVibGlzaGluZwotICogICAuLi4KLSAqIHB1Ymxpc2hGaW5pc2hlZCgpIC0gVGhlIHB1Ymxpc2ggb3BlcmF0aW9uIGlzIGZpbmlzaGVkCi0gKiA8cD4KLSAqIFB1Ymxpc2ggbGlzdGVuZXJzIGFyZSBhZGRlZCB0byBhIHNlcnZlciB2aWEgSVNlcnZlci5hZGRQdWJsaXNoTGlzdGVuZXIoKS4KLSAqIDwvcD4KLSAqIEBzZWUgSVNlcnZlcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQdWJsaXNoTGlzdGVuZXIgewotCS8qKgotCSAqIEZpcmVkIHRvIG5vdGlmeSB0aGF0IHB1Ymxpc2hpbmcgaGFzIGJlZ3VuLgotCSAqCi0JICogQHBhcmFtIHNlcnZlciB0aGUgc2VydmVyIHRoYXQgcHVibGlzaGluZyBzdGFydGVkIG9uCi0JICovCi0JcHVibGljIHZvaWQgcHVibGlzaFN0YXJ0ZWQoSVNlcnZlciBzZXJ2ZXIpOwotCi0JLyoqCi0JICogUHVibGlzaGluZyBoYXMgZmluaXNoZWQuIFJldHVybnMgdGhlIG92ZXJhbGwgc3RhdHVzLgotCSAqCi0JICogQHBhcmFtIHNlcnZlciB0aGUgc2VydmVyIHRoYXQgcHVibGlzaGluZyBmaW5pc2hlZCBvbgotCSAqIEBwYXJhbSBzdGF0dXMgaW5kaWNhdGluZyB3aGF0IChpZiBhbnl0aGluZykgd2VudCB3cm9uZwotCSAqLwotCXB1YmxpYyB2b2lkIHB1Ymxpc2hGaW5pc2hlZChJU2VydmVyIHNlcnZlciwgSVN0YXR1cyBzdGF0dXMpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL0lSdW50aW1lLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9JUnVudGltZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTg3YzhjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL0lSdW50aW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLS8qKgotICogUmVwcmVzZW50cyBhIHJ1bnRpbWUgaW5zdGFuY2UuIEV2ZXJ5IHJ1bnRpbWUgaXMgYW4gaW5zdGFuY2Ugb2YgYQotICogcGFydGljdWxhciwgZml4ZWQgcnVudGltZSB0eXBlLgotICogPHA+Ci0gKiBTZXJ2ZXJzIGhhdmUgYSBydW50aW1lLiBUaGUgc2VydmVyIHJ1bnRpbWUgY29ycmVzcG9uZHMgdG8gdGhlCi0gKiBpbnN0YWxsZWQgY29kZSBiYXNlIGZvciB0aGUgc2VydmVyLiBUaGUgbWFpbiByb2xlIHBsYXllZCBieSB0aGUgc2VydmVyCi0gKiBydW50aW1lIGlzIGluIGlkZW50aWZ5aW5nIGNvZGUgbGlicmFyaWVzIHRvIGNvbXBpbGUgb3IgYnVpbGQgYWdhaW5zdC4KLSAqIEluIHRoZSBjYXNlIG9mIGxvY2FsIHNlcnZlcnMsIHRoZSBzZXJ2ZXIgcnVudGltZSBtYXkgcGxheSBhIHNlY29uZGFyeSByb2xlCi0gKiBvZiBiZWluZyB1c2VkIHRvIGxhdW5jaCB0aGUgc2VydmVyIGZvciB0ZXN0aW5nLiBIYXZpbmcgdGhlIHNlcnZlciBydW50aW1lcwotICogaWRlbnRpZmllZCBhcyBhbiBlbnRpdHkgc2VwYXJhdGUgZnJvbSB0aGUgc2VydmVyIGl0c2VsZiBmYWNpbGl0YXRlcyBzaGFyaW5nCi0gKiBzZXJ2ZXIgcnVudGltZXMgYmV0d2VlbiBzZXZlcmFsIHNlcnZlcnMuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIElSdW50aW1lIGltcGxlbWVudHMgSUFkYXB0YWJsZSB0byBhbGxvdyB1c2VycyB0byBvYnRhaW4gYSBydW50aW1lLXR5cGUtc3BlY2lmaWMKLSAqIGNsYXNzLiBCeSBjYXN0aW5nIHRoZSBydW50aW1lIGV4dGVuc2lvbiB0byB0aGUgdHlwZSBwcmVzY3JpYmVkIGluIHRoZSBBUEkKLSAqIGRvY3VtZW50YXRpb24gZm9yIHRoYXQgcGFydGljdWxhciBydW50aW1lIHR5cGUsIHRoZSBjbGllbnQgY2FuIGFjY2VzcwotICogcnVudGltZS10eXBlLXNwZWNpZmljIHByb3BlcnRpZXMgYW5kIG1ldGhvZHMuIGdldEFkYXB0ZXIoKSBtYXkgaW52b2x2ZSBwbHVnaW4KLSAqIGxvYWRpbmcsIGFuZCBzaG91bGQgbm90IGJlIGNhbGxlZCBmcm9tIHBvcHVwIG1lbnVzLCBldGMuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRoZSBzZXJ2ZXIgZnJhbWV3b3JrIG1haW50YWlucyBhIGdsb2JhbCBsaXN0IG9mIGFsbCBrbm93biBydW50aW1lIGluc3RhbmNlcwotICogKHtAbGluayBTZXJ2ZXJDb3JlI2dldFJ1bnRpbWVzKCl9KS4KLSAqIDwvcD4KLSAqIDxwPgotICogQWxsIHJ1bnRpbWVzIGhhdmUgYSB1bmlxdWUgaWQuIFR3byBydW50aW1lcyAob3IgbW9yZSBsaWtlbHkgYSBydW50aW1lIGFuZCBpdCdzCi0gKiB3b3JraW5nIGNvcHkpIHdpdGggdGhlIHNhbWUgaWQgYXJlIGVxdWFsLCBhbmQgdHdvIHJ1bnRpbWVzIHdpdGggZGlmZmVyZW50IGlkcwotICogYXJlIG5ldmVyIGVxdWFsLgotICogPC9wPgotICogPHA+Ci0gKiBUd28gcnVudGltZXMgYXJlIGlkZW50aWNhbCBpZiBhbmQgb25seSBpZiB0aGV5IGhhdmUgdGhlIHNhbWUgaWQuCi0gKiA8L3A+Ci0gKiA8cD5UaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy48L3A+Ci0gKiAKLSAqIEBzZWUgSVJ1bnRpbWVXb3JraW5nQ29weQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElSdW50aW1lIGV4dGVuZHMgSUFkYXB0YWJsZSB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgZGlzcGxheWFibGUgbmFtZSBmb3IgdGhpcyBydW50aW1lLgotCSAqIDxwPgotCSAqIE5vdGUgdGhhdCB0aGlzIG5hbWUgaXMgYXBwcm9wcmlhdGUgZm9yIHRoZSBjdXJyZW50IGxvY2FsZS4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcmV0dXJuIGEgZGlzcGxheWFibGUgbmFtZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaWQgb2YgdGhpcyBydW50aW1lIGluc3RhbmNlLgotCSAqIEVhY2ggcnVudGltZSAob2YgYSBnaXZlbiB0eXBlKSBoYXMgYSBkaXN0aW5jdCBpZCwgZml4ZWQgZm9yCi0JICogaXRzIGxpZmV0aW1lLiBJZHMgYXJlIGludGVuZGVkIHRvIGJlIHVzZWQgaW50ZXJuYWxseSBhcyBrZXlzOwotCSAqIHRoZXkgYXJlIG5vdCBpbnRlbmRlZCB0byBiZSBzaG93biB0byBlbmQgdXNlcnMuCi0JICogPHA+Ci0JICogRm9yIHRoZSBpZCBvZiB0aGUgcnVudGltZSB0eXBlLCB1c2Uge0BsaW5rIElSdW50aW1lVHlwZSNnZXRJZCgpfQotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBydW50aW1lIGlkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogRGVsZXRlcyB0aGUgcGVyc2lzdGVudCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHJ1bnRpbWUuCi0JICogCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIHRoZXJlIHdhcyBhbnkgZXJyb3IgcmVjZWl2ZWQgd2hpbGUgZGVsZXRpbmcgdGhlIHJ1bnRpbWUKLQkgKiAgICBvciBpZiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgb24gYSB3b3JraW5nIGNvcHkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkZWxldGUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGlzIHJ1bnRpbWUgaXMgbWFya2VkIHJlYWQgb25seS4KLQkgKiBXaGVuIGEgcnVudGltZSBpcyByZWFkIG9ubHksIHdvcmtpbmcgY29waWVzIGNhbiBiZSBjcmVhdGVkIGJ1dAotCSAqIHRoZXkgY2Fubm90IGJlIHNhdmVkLgotCSAqCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIHJ1bnRpbWUgaXMgbWFya2VkIGFzIHJlYWQgb25seSwKLQkgKiAgICBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUmVhZE9ubHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGlzIGEgd29ya2luZyBjb3B5LgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBydW50aW1lIGlzIGEgd29ya2luZyBjb3B5Ci0JICogICAgKGNhbiBiZSBjYXN0IHRvIElSdW50aW1lV29ya2luZ0NvcHkpLCBhbmQKLQkgKiAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNXb3JraW5nQ29weSgpOwotCQotCS8qKgotCSAqIFJldHVybnMgYW4gb2JqZWN0IHdoaWNoIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBnaXZlbiBjbGFzcwotCSAqIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG9iamVjdC4gUmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPiBpZgotCSAqIG5vIHN1Y2ggb2JqZWN0IGNhbiBiZSBmb3VuZCwgb3IgaWYgdGhlIGRlbGVnYXRlIGlzIG5vdAotCSAqIGxvYWRlZC4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCB3aWxsIG5vdCBjaGVjayB0aGUgZGVsZWdhdGUgY2xhc3NlcyBmb3IgYWRhcHRpbmcKLQkgKiB1bmxlc3MgdGhleSBhcmUgYWxyZWFkeSBsb2FkZWQuIE5vIHBsdWdpbiBsb2FkaW5nIHdpbGwgb2NjdXIKLQkgKiB3aGVuIGNhbGxpbmcgdGhpcyBtZXRob2QuIEl0IGlzIHN1aXRhYmxlIGZvciBwb3B1cCBtZW51cyBhbmQKLQkgKiBvdGhlciBVSSBhcnRpZmFjdHMgd2hlcmUgcGVyZm9ybWFuY2UgaXMgYSBjb25jZXJuLgotCSAqIDwvcD4KLQkgKgotCSAqIEBwYXJhbSBhZGFwdGVyIHRoZSBhZGFwdGVyIGNsYXNzIHRvIGxvb2sgdXAKLQkgKiBAcmV0dXJuIGEgb2JqZWN0IGNhc3RhYmxlIHRvIHRoZSBnaXZlbiBjbGFzcywgCi0JICogICAgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBvYmplY3QgZG9lcyBub3QKLQkgKiAgICBoYXZlIGFuIGFkYXB0ZXIgZm9yIHRoZSBnaXZlbiBjbGFzcwotCSAqIEBzZWUgSUFkYXB0YWJsZSNnZXRBZGFwdGVyKENsYXNzKQotCSAqIEBzZWUgI2xvYWRBZGFwdGVyKENsYXNzLCBJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIGFuIG9iamVjdCB3aGljaCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgZ2l2ZW4gY2xhc3MKLQkgKiBhc3NvY2lhdGVkIHdpdGggdGhpcyBvYmplY3QuIFJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4gb25seSBpZgotCSAqIG5vIHN1Y2ggb2JqZWN0IGNhbiBiZSBmb3VuZCBhZnRlciBsb2FkaW5nIGFuZCBpbml0aWFsaXppbmcKLQkgKiBkZWxlZ2F0ZXMuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2Qgd2lsbCBmb3JjZSBhIGxvYWQgYW5kIGluaXRpYWxpemF0aW9uIG9mIGFsbCBkZWxlZ2F0ZQotCSAqIGNsYXNzZXMgYW5kIGNoZWNrIHRoZW0gZm9yIGFkYXB0aW5nLgotCSAqIDwvcD4KLQkgKgotCSAqIEBwYXJhbSBhZGFwdGVyIHRoZSBhZGFwdGVyIGNsYXNzIHRvIGxvb2sgdXAKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCi0JICogICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCi0JICogQHJldHVybiBhIG9iamVjdCBjYXN0YWJsZSB0byB0aGUgZ2l2ZW4gY2xhc3MsIAotCSAqICAgIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMgb2JqZWN0IGRvZXMgbm90Ci0JICogICAgaGF2ZSBhbiBhZGFwdGVyIGZvciB0aGUgZ2l2ZW4gY2xhc3MKLQkgKiBAc2VlICNnZXRBZGFwdGVyKENsYXNzKQotCSAqLwotCXB1YmxpYyBPYmplY3QgbG9hZEFkYXB0ZXIoQ2xhc3MgYWRhcHRlciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHR5cGUgb2YgdGhpcyBydW50aW1lIGluc3RhbmNlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHJ1bnRpbWUgdHlwZQotCSAqLwotCXB1YmxpYyBJUnVudGltZVR5cGUgZ2V0UnVudGltZVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBydW50aW1lIHdvcmtpbmcgY29weSBmb3IgbW9kaWZ5aW5nIHRoaXMgcnVudGltZSBpbnN0YW5jZS4KLQkgKiBJZiB0aGlzIGluc3RhbmNlIGlzIGFscmVhZHkgYSB3b3JraW5nIGNvcHksIGl0IGlzIHJldHVybmVkLgotCSAqIElmIHRoaXMgaW5zdGFuY2UgaXMgbm90IGEgd29ya2luZyBjb3B5LCBhIG5ldyBydW50aW1lIHdvcmtpbmcgY29weQotCSAqIGlzIGNyZWF0ZWQgd2l0aCB0aGUgc2FtZSBpZCBhbmQgYXR0cmlidXRlcy4KLQkgKiBDbGllbnRzIGFyZSByZXNwb25zaWJsZSBmb3Igc2F2aW5nIG9yIHJlbGVhc2luZyB0aGUgd29ya2luZyBjb3B5IHdoZW4KLQkgKiB0aGV5IGFyZSBkb25lIHdpdGggaXQuCi0JICogPHA+Ci0JICogVGhlIHJ1bnRpbWUgd29ya2luZyBjb3B5IGlzIHJlbGF0ZWQgdG8gdGhpcyBydW50aW1lIGluc3RhbmNlCi0JICogaW4gdGhlIGZvbGxvd2luZyB3YXlzOgotCSAqIDxwcmU+Ci0JICogdGhpcy5nZXRXb3JraW5nQ29weSgpLmdldElkKCkgPT0gdGhpcy5nZXRJZCgpCi0JICogdGhpcy5nZXRXb3JraW5nQ29weSgpLmdldE9yaWdpbmFsKCkgPT0gdGhpcwotCSAqIDwvcHJlPgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBbaXNzdWU6IElSdW50aW1lV29ya2luZ0NvcHkgZXh0ZW5kcyBJUnVudGltZS4gCi0JICogUnVudGltZS5nZXRXb3JraW5nQ29weSgpIGNyZWF0ZSBhIG5ldyB3b3JraW5nIGNvcHk7Ci0JICogUnVudGltZVdvcmtpbmdDb3B5LmdldFdvcmtpbmdDb3B5KCkgcmV0dXJucyB0aGlzLgotCSAqIFRoaXMgbWF5IGJlIGNvbnZlbmllbnQgaW4gY29kZSB0aGF0IGlzIGlnbm9yYW50IG9mCi0JICogd2hldGhlciB0aGV5IGFyZSBkZWFsaW5nIHdpdGggYSB3b3JraW5nIGNvcHkgb3Igbm90LgotCSAqIEhvd2V2ZXIsIGl0IGlzIGhhcmQgZm9yIGNsaWVudHMgdG8gbWFuYWdlIHdvcmtpbmcgY29waWVzCi0JICogd2l0aCB0aGlzIGRlc2lnbi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiBhIG5ldyB3b3JraW5nIGNvcHkKLQkgKi8KLQlwdWJsaWMgSVJ1bnRpbWVXb3JraW5nQ29weSBjcmVhdGVXb3JraW5nQ29weSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYWJzb2x1dGUgcGF0aCBpbiB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0gdG8gdGhlIHJvb3Qgb2YgdGhlIHJ1bnRpbWUsCi0JICogdHlwaWNhbGx5IHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0b3J5LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGxvY2F0aW9uIG9mIHRoaXMgcnVudGltZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotCSAqLwotCXB1YmxpYyBJUGF0aCBnZXRMb2NhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoaXMgcnVudGltZSBpcyBhIHN0dWIgKHVzZWQgZm9yIGNvbXBpbGF0aW9uIG9ubHkpCi0JICogb3IgYSBmdWxsIHJ1bnRpbWUuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIHJ1bnRpbWUgaXMgYSBzdHViLCBhbmQKLQkgKiAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTdHViKCk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhpcyBydW50aW1lIGluc3RhbmNlLiBUaGlzIG1ldGhvZCByZXR1cm5zIGFuIGVycm9yIGlmIHRoZSBydW50aW1lCi0JICogaXMgcG9pbnRpbmcgdG8gYSBudWxsIG9yIGludmFsaWQgbG9jYXRpb24gKGUuZy4gbm90IHBvaW50aW5nIHRvIHRoZSBjb3JyZWN0Ci0JICogaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSksIG9yIGlmIHRoZSBydW50aW1lLXR5cGUtc3BlY2lmaWMgcHJvcGVydGllcyBhcmUgbWlzc2luZwotCSAqIG9yIGludmFsaWQuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgaXMgbm90IG9uIHRoZSB3b3JraW5nIGNvcHkgc28gdGhhdCB0aGUgcnVudGltZSBjYW4gYmUgdmFsaWRhdGVkIGF0Ci0JICogYW55IHRpbWUuCi0JICogPC9wPgotCSAqCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqIEByZXR1cm4gYSBzdGF0dXMgb2JqZWN0IHdpdGggY29kZSA8Y29kZT5JU3RhdHVzLk9LPC9jb2RlPiBpZiB0aGlzCi0JICogICBydW50aW1lIGlzIHZhbGlkLCBvdGhlcndpc2UgYSBzdGF0dXMgb2JqZWN0IGluZGljYXRpbmcgd2hhdCBpcwotCSAqICAgd3Jvbmcgd2l0aCBpdAotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcik7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvSVJ1bnRpbWVMaWZlY3ljbGVMaXN0ZW5lci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvSVJ1bnRpbWVMaWZlY3ljbGVMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzA2N2M4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL0lSdW50aW1lTGlmZWN5Y2xlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlOwotLyoqCi0gKiBMaXN0ZW5lciBpbnRlcmZhY2UgZm9yIGNoYW5nZXMgdG8gcnVudGltZXMuCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIGZpcmVkIHdoZW5ldmVyIGEgcnVudGltZSBpcyBhZGRlZCwgbW9kaWZpZWQsIG9yIHJlbW92ZWQuCi0gKiBBbGwgZXZlbnRzIGFyZSBmaXJlZCBwb3N0LWNoYW5nZSwgc28gdGhhdCBhbGwgc2VydmVyIHRvb2xzIEFQSSBjYWxsZWQgYXMgYQotICogcmVzdWx0IG9mIHRoZSBldmVudCB3aWxsIHJldHVybiB0aGUgdXBkYXRlZCByZXN1bHRzLiAoZm9yIGV4YW1wbGUsIG9uCi0gKiBydW50aW1lQWRkZWQgdGhlIG5ldyBzZXJ2ZXIgd2lsbCBiZSBpbiB0aGUgZ2xvYmFsIGxpc3Qgb2YgcnVudGltZXMKLSAqICh7QGxpbmsgU2VydmVyQ29yZSNnZXRSdW50aW1lcygpfSksIGFuZCBvbiBydW50aW1lUmVtb3ZlZCB0aGUgcnVudGltZSB3aWxsCi0gKiBub3QgYmUgaW4gdGhlIGxpc3QuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgU2VydmVyQ29yZQotICogQHNlZSBJUnVudGltZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElSdW50aW1lTGlmZWN5Y2xlTGlzdGVuZXIgewotCS8qKgotCSAqIEEgbmV3IHJ1bnRpbWUgaGFzIGJlZW4gY3JlYXRlZC4KLQkgKgotCSAqIEBwYXJhbSBydW50aW1lIHRoZSBuZXcgcnVudGltZQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bnRpbWVBZGRlZChJUnVudGltZSBydW50aW1lKTsKLQotCS8qKgotCSAqIEFuIGV4aXN0aW5nIHJ1bnRpbWUgaGFzIGJlZW4gdXBkYXRlZCBvciBtb2RpZmllZC4KLQkgKgotCSAqIEBwYXJhbSBydW50aW1lIHRoZSBtb2RpZmllZCBydW50aW1lCi0JICovCi0JcHVibGljIHZvaWQgcnVudGltZUNoYW5nZWQoSVJ1bnRpbWUgcnVudGltZSk7Ci0KLQkvKioKLQkgKiBBIGV4aXN0aW5nIHJ1bnRpbWUgaGFzIGJlZW4gcmVtb3ZlZC4KLQkgKgotCSAqIEBwYXJhbSBydW50aW1lIHRoZSByZW1vdmVkIHJ1bnRpbWUKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW50aW1lUmVtb3ZlZChJUnVudGltZSBydW50aW1lKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9JUnVudGltZVRhcmdldEhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL0lSdW50aW1lVGFyZ2V0SGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTcxMmZmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL0lSdW50aW1lVGFyZ2V0SGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLS8qKgotICogQSBydW50aW1lIHRhcmdldCBoYW5kbGVyIGlzIHVzZWQgdG8gYXBwbHkgc29tZSBwcm9wZXJ0aWVzIHRvIGEgcHJvamVjdAotICogdGhpcyBpcyBiZWluZyB0YXJnZXRlZCB0byBhIGdpdmVuIHJ1bnRpbWUuIEZvciBpbnN0YW5jZSwgdGhlIGhhbmRsZXIKLSAqIG1pZ2h0IHVwZGF0ZSB0aGUgY2xhc3NwYXRoIG9mIGEgSmF2YSBwcm9qZWN0IHRvIGluY2x1ZGUgdGhlIHJ1bnRpbWUncwotICogY2xhc3NlcywgYWRkIHZhbGlkYXRpb24gZm9yIHRoZSBnaXZlbiBydW50aW1lLCBvciByZXN0cmljdCB0aGUgdHlwZSBvZgotICogcmVzb3VyY2VzIHRoYXQgY2FuIGJlIGNyZWF0ZWQuCi0gKiAKLSAqIDxwPlRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLjwvcD4KLSAqIDxwPgotICogPGI+UHJvdmlzaW9uYWwgQVBJOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byAKLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayAKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIAotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqIAotICogQGRlcHJlY2F0ZWQgdXNlIHByb2plY3QgZmFjZXRzIGluc3RlYWQgb2YgcnVudGltZSB0YXJnZXRzCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVJ1bnRpbWVUYXJnZXRIYW5kbGVyIGV4dGVuZHMgSUFkYXB0YWJsZSB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgaWQgb2YgdGhpcyBydW50aW1lIHRhcmdldCBoYW5kbGVyLgotCSAqIEVhY2gga25vd24gcnVudGltZSB0YXJnZXQgaGFuZGxlciBoYXMgYSBkaXN0aW5jdCBpZC4gCi0JICogSWRzIGFyZSBpbnRlbmRlZCB0byBiZSB1c2VkIGludGVybmFsbHkgYXMga2V5czsgdGhleSBhcmUgbm90Ci0JICogaW50ZW5kZWQgdG8gYmUgc2hvd24gdG8gZW5kIHVzZXJzLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHJ1bnRpbWUgdGFyZ2V0IGhhbmRsZXIgaWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgcnVudGltZSB0YXJnZXQgaGFuZGxlciBzdXBwb3J0cwotCSAqIChjYW4gd29yayB3aXRoKSB0aGUgZ2l2ZW4gcnVudGltZS4KLQkgKiAKLQkgKiBAcGFyYW0gcnVudGltZVR5cGUgYSBydW50aW1lIHR5cGUKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBoYW5kbGVyIGNhbiBhY2NlcHQgdGhlIGdpdmVuIHJ1bnRpbWUgdHlwZSwKLQkgKiAgICBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzUnVudGltZVR5cGUoSVJ1bnRpbWVUeXBlIHJ1bnRpbWVUeXBlKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9JUnVudGltZVR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL0lSdW50aW1lVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDZjZjM0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL0lSdW50aW1lVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci0vKioKLSAqIFJlcHJlc2VudHMgYSAoc2VydmVyKSBydW50aW1lIHR5cGUgZnJvbSB3aGljaCBydW50aW1lIGluc3RhbmNlcyBjYW4gYmUKLSAqIGNyZWF0ZWQuCi0gKiA8cD4KLSAqIFRoZSBzZXJ2ZXIgY29yZSBmcmFtZXdvcmsgc3VwcG9ydHMKLSAqIGFuIG9wZW4tZW5kZWQgc2V0IG9mIHJ1bnRpbWUgdHlwZXMsIHdoaWNoIGFyZSBjb250cmlidXRlZCB2aWEKLSAqIHRoZSA8Y29kZT5ydW50aW1lVHlwZXM8L2NvZGU+IGV4dGVuc2lvbiBwb2ludCBpbiB0aGUgc2VydmVyIGNvcmUKLSAqIHBsdWctaW4uIFJ1bnRpbWUgdHlwZSBvYmplY3RzIGNhcnJ5IG5vIHN0YXRlIChhbGwgaW5mb3JtYXRpb24gaXMKLSAqIHJlYWQtb25seSBhbmQgaXMgc3VwcGxpZWQgYnkgdGhlIHNlcnZlciBydW50aW1lIHR5cGUgZGVjbGFyYXRpb24pLgotICogVGhlIGdsb2JhbCBsaXN0IG9mIGtub3duIHJ1bnRpbWUgdHlwZXMgaXMgYXZhaWxhYmxlIHZpYQotICoge0BsaW5rIFNlcnZlckNvcmUjZ2V0UnVudGltZVR5cGVzKCl9LgotICogPC9wPgotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqIDxwPgotICogW2lzc3VlOiBXaGF0IHZhbHVlIGRvIHJ1bnRpbWVzIGFkZD8KLSAqIEl0J3MgbWFpbiByb2xlIGlzIGZvciBzZXR0aW5nIHVwIHRoZSBKYXZhIGJ1aWxkIGNsYXNzcGF0aAotICogZm9yIHByb2plY3RzIGhvbGRpbmcgbW9kdWxlcyB0aGF0IG11c3QgYmUgSmF2YSBjb21waWxlZC4KLSAqIElmIHRoZSBub3Rpb24gb2YgbW9kdWxlIGlzIHRvIHRyYW5zY2VuZCB0aGUgdmFnYXJpZXMgb2YgcGFydGljdWxhcgotICogdHlwZXMgb2Ygc2VydmVyLCBhbmQsIGluZGVlZCwgYmUgcHVibGlzaGVkIHRvIG11bHRpcGxlIHNlcnZlcnMKLSAqIHNpbXVsdGFuZW91c2x5LCB0aGVuIG1hdHRlcnMgb2YgYnVpbGQgY2xhc3NwYXRoIGhhZCBiZXR0ZXIgbm90Ci0gKiBiZSB0aWVkIHRvIHRoZSBwYXJ0aWN1bGFyIHNlcnZlcnMgaW52b2x2ZWQuXQotICogPC9wPgotICogPHA+Ci0gKiBUd28gcnVudGltZSB0eXBlcyBhcmUgaWRlbnRpY2FsIGlmIGFuZCBvbmx5IGlmIHRoZXkgaGF2ZSB0aGUgc2FtZSBpZC4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElSdW50aW1lVHlwZSB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgaWQgb2YgdGhpcyBydW50aW1lIHR5cGUuCi0JICogRWFjaCBrbm93biBzZXJ2ZXIgcnVudGltZSB0eXBlIGhhcyBhIGRpc3RpbmN0IGlkLiAKLQkgKiBJZHMgYXJlIGludGVuZGVkIHRvIGJlIHVzZWQgaW50ZXJuYWxseSBhcyBrZXlzOyB0aGV5IGFyZSBub3QKLQkgKiBpbnRlbmRlZCB0byBiZSBzaG93biB0byBlbmQgdXNlcnMuCi0JICogCi0JICogQHJldHVybiB0aGUgcnVudGltZSB0eXBlIGlkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGlzcGxheWFibGUgbmFtZSBmb3IgdGhpcyBydW50aW1lIHR5cGUuCi0JICogPHA+Ci0JICogTm90ZSB0aGF0IHRoaXMgbmFtZSBpcyBhcHByb3ByaWF0ZSBmb3IgdGhlIGN1cnJlbnQgbG9jYWxlLgotCSAqIDwvcD4KLQkgKgotCSAqIEByZXR1cm4gYSBkaXNwbGF5YWJsZSBuYW1lIGZvciB0aGlzIHJ1bnRpbWUgdHlwZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGlzcGxheWFibGUgZGVzY3JpcHRpb24gZm9yIHRoaXMgcnVudGltZSB0eXBlLgotCSAqIDxwPgotCSAqIE5vdGUgdGhhdCB0aGlzIGRlc2NyaXB0aW9uIGlzIGFwcHJvcHJpYXRlIGZvciB0aGUgY3VycmVudCBsb2NhbGUuCi0JICogPC9wPgotCSAqCi0JICogQHJldHVybiBhIGRpc3BsYXlhYmxlIGRlc2NyaXB0aW9uIGZvciB0aGlzIHJ1bnRpbWUgdHlwZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkaXNwbGF5YWJsZSB2ZW5kb3IgbmFtZSBmb3IgdGhpcyBydW50aW1lIHR5cGUuIElmIHRoZQotCSAqIHJ1bnRpbWUgdHlwZSBkaWQgbm90IHNwZWNpZmljIGEgdmVuZG9yLCBhbiBlbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQuCi0JICogPHA+Ci0JICogTm90ZSB0aGF0IHRoaXMgZGVzY3JpcHRpb24gaXMgYXBwcm9wcmlhdGUgZm9yIHRoZSBjdXJyZW50IGxvY2FsZS4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcmV0dXJuIGEgZGlzcGxheWFibGUgdmVuZG9yIG5hbWUgZm9yIHRoaXMgcnVudGltZSB0eXBlCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWZW5kb3IoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkaXNwbGF5YWJsZSB2ZXJzaW9uIG5hbWUgZm9yIHRoaXMgcnVudGltZSB0eXBlLiBJZiB0aGUKLQkgKiBydW50aW1lIHR5cGUgZGlkIG5vdCBzcGVjaWZpYyBhIHZlbmRvciwgYW4gZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkLgotCSAqIDxwPgotCSAqIE5vdGUgdGhhdCB0aGlzIGRlc2NyaXB0aW9uIGlzIGFwcHJvcHJpYXRlIGZvciB0aGUgY3VycmVudCBsb2NhbGUuCi0JICogPC9wPgotCSAqCi0JICogQHJldHVybiBhIGRpc3BsYXlhYmxlIHZlcnNpb24gbmFtZSBmb3IgdGhpcyBydW50aW1lIHR5cGUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZlcnNpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgbW9kdWxlIHR5cGVzIHRoYXQgdGhpcyBydW50aW1lIHR5cGUgY2FuIHN1cHBvcnQuCi0JICogPHA+Ci0JICogQSBuZXcgYXJyYXkgaXMgcmV0dXJuZWQgb24gZWFjaCBjYWxsLCBzbyBjbGllbnRzIG1heSBzdG9yZSBvciBtb2RpZnkgdGhlIHJlc3VsdC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiB0aGUgYXJyYXkgb2YgbW9kdWxlIHR5cGVzIHtAbGluayBJTW9kdWxlVHlwZX0KLQkgKi8KLQlwdWJsaWMgSU1vZHVsZVR5cGVbXSBnZXRNb2R1bGVUeXBlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoaXMgcnVudGltZSB0eXBlIGNhbiBiZSBpbnN0YW50aWF0ZWQuCi0JICogPHA+Ci0JICogW2lzc3VlOiBJdCdzIHVuY2xlYXIgd2hhdCB0aGlzIG1ldGhvZCBpcyBmb3IuCi0JICogVGhlIGltcGxlbWVudGF0aW9uIGNoZWNrcyB3aGV0aGVyIHRoZSAiY2xhc3MiCi0JICogYW5kICJ3b3JraW5nQ29weUNsYXNzIiBhdHRyaWJ1dGVzIChib3RoIG9wdGlvbmFsKSB3ZXJlIHNwZWNpZmllZC4KLQkgKiBXaGF0IHdvdWxkIGJlIHRoZSBwb2ludCBvZiBhIHJ1bnRpbWUgdHlwZSB0aGF0IGRpZG4ndAotCSAqIGhhdmUgYm90aCBvZiB0aGVzZSBhdHRyaWJ1dGVzIGFuZCBjb3VsZCBub3QgYmUgImNyZWF0ZWQiP10KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIHR5cGUgb2YgcnVudGltZSBjYW4gYmUKLQkgKiAgICBpbnN0YW50aWF0ZWQsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgaXQgY2Fubm90Ci0JICogQHNlZSAjY3JlYXRlUnVudGltZShTdHJpbmcsIElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuQ3JlYXRlKCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgd29ya2luZyBjb3B5IGluc3RhbmNlIG9mIHRoaXMgcnVudGltZSB0eXBlLgotCSAqIEFmdGVyIHNldHRpbmcgdmFyaW91cyBwcm9wZXJ0aWVzIG9mIHRoZSB3b3JraW5nIGNvcHksCi0JICogdGhlIGNsaWVudCBzaG91bGQgY2FsbCB7QGxpbmsgSVJ1bnRpbWVXb3JraW5nQ29weSNzYXZlKGJvb2xlYW4sIElQcm9ncmVzc01vbml0b3IpfQotCSAqIHRvIGJyaW5nIHRoZSBydW50aW1lIGluc3RhbmNlIGludG8gZXhpc3RlbmNlLgotCSAqIDxwPgotCSAqIERlZmF1bHQgdmFsdWVzIGFyZSBzZXQgYnkgY2FsbGluZyB0aGUgaW5zdGFuY2UncyBkZWxlZ2F0ZS4KLQkgKiBDbGllbnRzIHNob3VsZCBhc3N1bWUgdGhhdCB0aGUgbG9jYXRpb24gYW5kIG90aGVyIHByb3BlcnRpZXMgYXJlCi0JICogbm90IHNldCBhbmQgbXVzdCBiZSBleHBsaWNpdGx5IHNldCBieSB0aGUgY2xpZW50LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gaWQgdGhlIGlkIHRvIGFzc2lnbiB0byB0aGUgcnVudGltZSBpbnN0YW5jZTsgYSBnZW5lcmF0ZWQKLQkgKiAgICBpZCBpcyB1c2VkIGlmIGlkIGlzIDxjb2RlPm51bGw8L2NvZGU+IG9yIGFuIGVtcHR5IHN0cmluZwotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLQkgKiBAcmV0dXJuIGEgbmV3IHJ1bnRpbWUgd29ya2luZyBjb3B5IHdpdGggdGhlIGdpdmVuIGlkCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgY3JlYXRpbmcgdGhpcyBydW50aW1lCi0JICogICAgb3Igc2V0dGluZyBpdCdzIGRlZmF1bHQgdmFsdWVzCi0JICovCi0JcHVibGljIElSdW50aW1lV29ya2luZ0NvcHkgY3JlYXRlUnVudGltZShTdHJpbmcgaWQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb247Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvSVJ1bnRpbWVXb3JraW5nQ29weS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvSVJ1bnRpbWVXb3JraW5nQ29weS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmU4ZGUzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL0lSdW50aW1lV29ya2luZ0NvcHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZTsKLQotaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci0vKioKLSAqIEEgd29ya2luZyBjb3B5IHJ1bnRpbWUgb2JqZWN0IHVzZWQgZm9yIGZvcm11bGF0aW5nIGNoYW5nZXMKLSAqIHRvIGEgcnVudGltZSBpbnN0YW5jZSAoe0BsaW5rIElSdW50aW1lfSkuIENoYW5nZXMgbWFkZSBvbiBhCi0gKiB3b3JraW5nIGNvcHkgZG8gbm90IG9jY3VyIChhbmQgYXJlIG5vdCBwZXJzaXN0ZWQpIHVudGlsIGEKLSAqIHNhdmUoKSBpcyBwZXJmb3JtZWQuIAotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBJUnVudGltZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElSdW50aW1lV29ya2luZ0NvcHkgZXh0ZW5kcyBJUnVudGltZSB7Ci0JLyoqCi0JICogU3RhdHVzIGNvZGUgKHZhbHVlIDEpIHJldHVybmVkIGZyb20gdGhlIHNhdmUoKSBtZXRob2Qgd2hlbiB0aGUgc2F2ZQotCSAqIGZhaWxlZCB3aXRoIGZvcmNlIHNldCB0byA8Y29kZT5mYWxzZTwvY29kZT4gYmVjYXVzZSB0aGUgcnVudGltZSBoYXMKLQkgKiBiZWVuIG1vZGlmaWVkIGFuZCBzYXZlZCBzaW5jZSB0aGlzIHdvcmtpbmcgY29weSB3YXMgY3JlYXRlZC4KLQkgKiAKLQkgKiBAc2VlICNzYXZlKGJvb2xlYW4sIElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0FWRV9DT05GTElDVCA9IDE7Ci0JCi0JLyoqCi0JICogUHJvcGVydHkgY2hhbmdlIG5hbWUgKHZhbHVlICJuYW1lIikgdXNlZCB3aGVuIHRoZSBuYW1lIG9mIHRoZSBydW50aW1lCi0JICogY2hhbmdlcy4KLQkgKiAKLQkgKiBAc2VlICNhZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpCi0JICogQHNlZSAjcmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX05BTUUgPSAibmFtZSI7Ci0JCi0JLyoqCi0JICogUHJvcGVydHkgY2hhbmdlIG5hbWUgKHZhbHVlICJsb2NhdGlvbiIpIHVzZWQgd2hlbiB0aGUgbG9jYXRpb24gb2YgdGhlCi0JICogcnVudGltZSBjaGFuZ2VzLgotCSAqIAotCSAqIEBzZWUgI2FkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcikKLQkgKiBAc2VlICNyZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfTE9DQVRJT04gPSAibG9jYXRpb24iOwotCi0JLyoqCi0JICogU2V0cyB0aGUgZGlzcGxheWFibGUgbmFtZSBmb3IgdGhpcyBydW50aW1lLgotCSAqIDxwPgotCSAqIFRoZSBuYW1lIHNob3VsZCBiZSBhcHByb3ByaWF0ZSBmb3IgdGhlIGN1cnJlbnQgbG9jYWxlLgotCSAqIDwvcD4KLQkgKgotCSAqIEBwYXJhbSBuYW1lIGEgZGlzcGxheWFibGUgbmFtZQotCSAqIEBzZWUgSVJ1bnRpbWUjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSk7Ci0JCi0JLyoqCi0JICogU2V0cyBvciB1bnNldHMgd2hldGhlciB0aGlzIHJ1bnRpbWUgaXMgbWFya2VkIGFzIHJlYWQgb25seS4KLQkgKiBXaGVuIGEgcnVudGltZSBpcyByZWFkIG9ubHksIHdvcmtpbmcgY29waWVzIGNhbiBiZSBjcmVhdGVkIGJ1dAotCSAqIHRoZXkgY2Fubm90IGJlIHNhdmVkLgotCSAqCi0JICogQHBhcmFtIHJlYWRPbmx5IDxjb2RlPnRydWU8L2NvZGU+IHRvIHNldCB0aGlzIHJ1bnRpbWUgdG8gYmUgbWFya2VkCi0JICogICAgcmVhZCBvbmx5LCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIHVuc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0UmVhZE9ubHkoYm9vbGVhbiByZWFkT25seSk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoaXMgd29ya2luZyBjb3B5IGhhcyB1bnNhdmVkIGNoYW5nZXMuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIHdvcmtpbmcgY29weSBoYXMgdW5zYXZlZAotCSAqICAgIGNoYW5nZXMsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEaXJ0eSgpOwotCi0JLyoqCi0JICogQWRkcyBhIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lciB0byB0aGlzIHJ1bnRpbWUuCi0JICogPHA+Ci0JICogT25jZSByZWdpc3RlcmVkLCBhIGxpc3RlbmVyIHN0YXJ0cyByZWNlaXZpbmcgbm90aWZpY2F0aW9uIG9mIAotCSAqIHByb3BlcnR5IGNoYW5nZXMgdG8gdGhpcyBydW50aW1lLiBUaGUgbGlzdGVuZXIgY29udGludWVzIHRvIHJlY2VpdmUKLQkgKiBub3RpZmljYXRpb25zIHVudGlsIGl0IGlzIHJlbW92ZWQuCi0JICogSGFzIG5vIGVmZmVjdCBpZiBhbiBpZGVudGljYWwgbGlzdGVuZXIgaXMgYWxyZWFkeSByZWdpc3RlcmVkLgotCSAqIDwvcD4KLQkgKgotCSAqIEBwYXJhbSBsaXN0ZW5lciBhIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lcgotCSAqIEBzZWUgI3JlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogUmVtb3ZlcyBhIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lciBmcm9tIHRoaXMgcnVudGltZS4KLQkgKiBIYXMgbm8gZWZmZWN0IGlmIHRoZSBsaXN0ZW5lciBpcyBub3QgcmVnaXN0ZXJlZC4KLQkgKgotCSAqIEBwYXJhbSBsaXN0ZW5lciBhIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lcgotCSAqIEBzZWUgI2FkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcnVudGltZSBpbnN0YW5jZSB0aGF0IHRoaXMgd29ya2luZyBjb3B5IGlzCi0JICogYXNzb2NpYXRlZCB3aXRoLgotCSAqIDxwPgotCSAqIEZvciBhIHJ1bnRpbWUgd29ya2luZyBjb3B5IGNyZWF0ZWQgYnkgYSBjYWxsIHRvCi0JICoge0BsaW5rIElSdW50aW1lI2NyZWF0ZVdvcmtpbmdDb3B5KCl9LAotCSAqIDxjb2RlPnRoaXMuZ2V0T3JpZ2luYWwoKTwvY29kZT4gcmV0dXJucyB0aGUgb3JpZ2luYWwKLQkgKiBydW50aW1lIG9iamVjdC4gRm9yIGEgcnVudGltZSB3b3JraW5nIGNvcHkganVzdCBjcmVhdGVkIGJ5Ci0JICogYSBjYWxsIHRvIHtAbGluayBJUnVudGltZVR5cGUjY3JlYXRlUnVudGltZShTdHJpbmcsIElQcm9ncmVzc01vbml0b3IpfSwKLQkgKiA8Y29kZT50aGlzLmdldE9yaWdpbmFsKCk8L2NvZGU+IHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGFzc29jaWF0ZWQgcnVudGltZSBpbnN0YW5jZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotCSAqLwotCXB1YmxpYyBJUnVudGltZSBnZXRPcmlnaW5hbCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgYWJzb2x1dGUgcGF0aCBpbiB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0gdG8gdGhlIHJvb3Qgb2YgdGhlIHJ1bnRpbWUsCi0JICogdHlwaWNhbGx5IHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0b3J5LiAKLQkgKiAKLQkgKiBAcGFyYW0gcGF0aCB0aGUgbG9jYXRpb24gb2YgdGhpcyBydW50aW1lLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICogQHNlZSBJUnVudGltZSNnZXRMb2NhdGlvbigpCi0JICovCi0JcHVibGljIHZvaWQgc2V0TG9jYXRpb24oSVBhdGggcGF0aCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBydW50aW1lIGlzIGEgc3R1YiAodXNlZCBmb3IgY29tcGlsYXRpb24gb25seSkKLQkgKiBvciBhIGZ1bGwgcnVudGltZS4KLQkgKiAKLQkgKiBAcGFyYW0gc3R1YiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIHJ1bnRpbWUgaXMgYSBzdHViLCBhbmQKLQkgKiAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3R1Yihib29sZWFuIHN0dWIpOwotCi0JLyoqCi0JICogQ29tbWl0cyB0aGUgY2hhbmdlcyBtYWRlIGluIHRoaXMgd29ya2luZyBjb3B5LiBJZiB0aGVyZSBpcwotCSAqIG5vIGV4dGFudCBydW50aW1lIGluc3RhbmNlIHdpdGggYSBtYXRjaGluZyBpZCBhbmQgcnVudGltZQotCSAqIHR5cGUsIHRoaXMgd2lsbCBjcmVhdGUgYSBydW50aW1lIGluc3RhbmNlIHdpdGggYXR0cmlidXRlcwotCSAqIHRha2VuIGZyb20gdGhpcyB3b3JraW5nIGNvcHksIGFuZCByZXR1cm4gdGhhdCBvYmplY3QuCi0JICogPHA+Ci0JICogSWYgdGhlcmUgYW4gZXhpc3RpbmcgcnVudGltZSBpbnN0YW5jZSB3aXRoIGEgbWF0Y2hpbmcgaWQgYW5kCi0JICogcnVudGltZSB0eXBlLCB0aGlzIHdpbGwgY2hhbmdlIHRoZSBydW50aW1lIGluc3RhbmNlIGFjY29yZGluZ2x5LgotCSAqIFRoZSByZXR1cm5lZCBydW50aW1lIHdpbGwgYmUgdGhlIHNhbWUgcnVudGltZSB0aGlzIGlzIHJldHVybmVkCi0JICogZnJvbSBnZXRPcmlnaW5hbCgpLCBhZnRlciB0aGUgY2hhbmdlcyBoYXZlIGJlZW4gYXBwbGllZC4KLQkgKiBPdGhlcndpc2UsIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIGEgbmV3bHkgY3JlYXRlZCBydW50aW1lLgotCSAqIDwvcD4KLQkgKiBSdW50aW1lcyBjYW4gYmUgc2F2ZWQgZXZlbiB3aGVuIHRoZXkgaGF2ZSBpbnZhbGlkIHByb3BlcnRpZXMuIEl0Ci0JICogaXMgdGhlIGNsaWVudHMgcmVzcG9uc2liaWxpdHkgdG8gY2FsbCB2YWxpZGF0ZSgpIG9yIGNoZWNrIHRoZQotCSAqIHByb3BlcnRpZXMgYmVmb3JlIHNhdmluZy4KLQkgKiA8cD4KLQkgKiBbaXNzdWU6IFdoYXQgaXMgbGlmZWN5Y2xlIGZvciBSdW50aW1lV29ya2luZ0NvcHlEZWxlZ2F0ZQotCSAqIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdvcmtpbmcgY29weT9dCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBmb3JjZSA8Y29kZT50cnVlPC9jb2RlPiB0byBmb3JjZSB0aGUgc2F2ZSwgb3IgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogICAgb3RoZXJ3aXNlCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqIEByZXR1cm4gYSBuZXcgcnVudGltZSBpbnN0YW5jZQotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiB0aGUgc2F2ZSBjb3VsZCBub3QgYmUgY29tcGxldGVkCi0JICogQHNlZSAjU0FWRV9DT05GTElDVAotCSAqLwotCXB1YmxpYyBJUnVudGltZSBzYXZlKGJvb2xlYW4gZm9yY2UsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb247Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvSVNlcnZlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvSVNlcnZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzFkZjgxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL0lTZXJ2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLaAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotLyoqCi0gKiBSZXByZXNlbnRzIGEgc2VydmVyIGluc3RhbmNlLiBFdmVyeSBzZXJ2ZXIgaXMgYW4gaW5zdGFuY2Ugb2YgYQotICogcGFydGljdWxhciwgZml4ZWQgc2VydmVyIHR5cGUuCi0gKiA8cD4KLSAqIE5vdCBzdXJwcmlzaW5nbHksIHRoZSBub3Rpb24gb2YgPGI+c2VydmVyPC9iPiBpcyBjZW50cmFsIGluIHRoZSB3ZWIgdG9vbHMKLSAqIHNlcnZlciBpbmZyYXN0cnVjdHVyZS4gSW4gdGhpcyBjb250ZXh0LCB1bmRlcnN0YW5kIHRoYXQgYSBzZXJ2ZXIgaXMKLSAqIGEgd2ViIHNlcnZlciBvZiBzb21lIGlsay4gSXQgY291bGQgYmUgYSBzaW1wbGUgd2ViIHNlcnZlciBsYWNraW5nIEphdmEKLSAqIHN1cHBvcnQsIG9yIGFuIEoyRUUgYmFzZWQgc2VydmVyLCBvciBwZXJoYXBzIGV2ZW4gc29tZSBraW5kIG9mIGRhdGFiYXNlCi0gKiBzZXJ2ZXIuIEEgbW9yZSBleGFjdCBkZWZpbml0aW9uIGlzIG5vdCByZXF1aXJlZCBmb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgQVBJLgotICogRnJvbSBhIHRvb2wtY2VudHJpYyBwb2ludCBvZiB2aWV3LCBhIHNlcnZlcgotICogaXMgc29tZXRoaW5nIHRoYXQgdGhlIGRldmVsb3BlciBpcyB3cml0aW5nICJjb250ZW50IiBmb3IuCi0gKiBUaGUgdW5pdCBvZiBjb250ZW50IGlzIHRlcm1lZCBhIG1vZHVsZS4KLSAqIEluIGEgc2Vuc2UsIHRoZSBzZXJ2ZXIgZXhpc3RzLCBidXQgbGFja3MgdXNlZnVsIGNvbnRlbnQuIFRoZQotICogZGV2ZWxvcG1lbnQgdGFzayBpcyB0byBwcm92aWRlIHRoYXQgY29udGVudC4gVGhlIGNvbnRlbnQgY2FuIGluY2x1ZGUKLSAqIGFueXRoaW5nIGZyb20gc2ltcGxlLCBzdGF0aWMgSFRNTCB3ZWIgcGFnZXMgdG8gY29tcGxleCwgaGlnaGx5IGR5bmFtaWMKLSAqIHdlYiBhcHBsaWNhdGlvbnMuCi0gKiBJbiB0aGUgY291cnNlIG9mIHdyaXRpbmcgYW5kIGRlYnVnZ2luZyB0aGlzIGNvbnRlbnQsCi0gKiB0aGUgZGV2ZWxvcGVyIHdpbGwgd2FudCB0byB0ZXN0IHRoZWlyIGNvbnRlbnQgb24gYSB3ZWIgc2VydmVyLCB0byBzZWUgaG93IGl0Ci0gKiBnZXRzIHNlcnZlZCB1cC4gRm9yIHRoaXMgdGhleSB3aWxsIG5lZWQgdG8gbGF1bmNoIGEgc2VydmVyIHByb2Nlc3MgcnVubmluZyBvbgotICogc29tZSBob3N0IG1hY2hpbmUgKG9mdGVuIHRoZSBsb2NhbCBob3N0IG9uIHdoaWNoIHRoZSBJREUgaXMgcnVubmluZyksIG9yCi0gKiBhdHRhY2ggdG8gYSBzZXJ2ZXIgdGhhdCdzIGFscmVhZHkgcnVubmluZyBvbiBhIHJlbW90ZSAob3IgbG9jYWwpIGhvc3QuIAotICogVGhlIG5ld2x5IGRldmVsb3BlZCBjb250ZW50IHNpdHRpbmcgaW4gdGhlIGRldmVsb3BlcidzIHdvcmtzcGFjZSBuZWVkcyB0bwotICogZW5kIHVwIGluIGEgbG9jYXRpb24gYW5kIGZvcm1hdCB0aGF0IHRoZSBydW5uaW5nIHNlcnZlciBjYW4gdXNlIGZvciBpdHMKLSAqIHNlcnZpbmcgcHVycG9zZXMuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIEluIHRoaXMgcGljdHVyZSwgYW4gPGNvZGU+SVNlcnZlcjwvY29kZT4gb2JqZWN0IGlzIGEgcHJveHkgZm9yIHRoZSByZWFsIHdlYgotICogc2VydmVyLiBUaHJvdWdoIHRoaXMgcHJveHksIGEgY2xpZW50IGNhbiBjb25maWd1cmUgdGhlIHNlcnZlciwgYW5kIHN0YXJ0LAotICogc3RvcCwgYW5kIHJlc3RhcnQgaXQuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRoZSBzZXJ2ZXIgZnJhbWV3b3JrIG1haW50YWlucyBhIGdsb2JhbCBsaXN0IG9mIGFsbCBrbm93biBzZXJ2ZXIgaW5zdGFuY2VzCi0gKiAoe0BsaW5rIFNlcnZlckNvcmUjZ2V0U2VydmVycygpfSkuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFtyb3VnaCBub3RlczoKLSAqIFNlcnZlciBoYXMgYSBzdGF0ZS4KLSAqIFNlcnZlciBjYW4gYmUgc3RhcnRlZCwgc3RvcHBlZCwgYW5kIHJlc3RhcnRlZC4KLSAqIFRvIG1vZGlmeSBzZXJ2ZXIgYXR0cmlidXRlcywgZ2V0IGEgd29ya2luZyBjb3B5LCBtb2RpZnkgaXQsIGFuZCB0aGVuIHNhdmUgaXQKLSAqIHRvIGNvbW1pdCB0aGUgY2hhbmdlcy4KLSAqIFNlcnZlciBhdHRyaWJ1dGVzLiBTZXJpYWxpemF0aW9uLgotICogQ2hhaW5lZCB3b3JraW5nIGNvcGllcyBmb3IgcnVudGltZSwgc2VydmVyIGNvbmZpZ3VyYXRpb24uCi0gKiBTZXJ2ZXIgaGFzIGEgc2V0IG9mIHJvb3QgbW9kdWxlcy4KLSAqIE1vZHVsZXMgaGF2ZSBzdGF0ZSB3cnQgYSBzZXJ2ZXIuCi0gKiBSZXN0YXJ0aW5nIG1vZHVsZXMuCi0gKiBdCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFR3byBzZXJ2ZXJzIGFyZSBpZGVudGljYWwgaWYgYW5kIG9ubHkgaWYgdGhleSBoYXZlIHRoZSBzYW1lIGlkLgotICogPC9wPgotICogCi0gKiA8cD5UaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy48L3A+Ci0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJU2VydmVyIGV4dGVuZHMgSVNlcnZlckF0dHJpYnV0ZXMgewotCS8qKgotCSAqIEFuIG9wZXJhdGlvbiBsaXN0ZW5lciBpcyB1c2VkIHRvIHJlY2VpdmUgbm90aWZpY2F0aW9uIGJhY2sgYWJvdXQgYQotCSAqIHNwZWNpZmljIHNlcnZlciBvcGVyYXRpb24sIHN1Y2ggYXMgc3RhcnRpbmcgb3Igc3RvcHBpbmcgYSBzZXJ2ZXIuCi0JICogCi0JICogQHNpbmNlIDEuMAotCSAqLwotCXB1YmxpYyBpbnRlcmZhY2UgSU9wZXJhdGlvbkxpc3RlbmVyIHsKLQkJLyoqCi0JCSAqIENhbGxlZCBvbmNlIHdoZW4gdGhlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZS4KLQkJICogCi0JCSAqIEBwYXJhbSByZXN1bHQgYSBzdGF0dXMgb2JqZWN0IHdpdGggY29kZSA8Y29kZT5JU3RhdHVzLk9LPC9jb2RlPiBpZgotCQkgKiAgICB0aGUgb3BlcmF0aW9uIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHksIG90aGVyd2lzZSBhIHN0YXR1cyBvYmplY3QKLQkJICogICAgaW5kaWNhdGluZyB3aHkgaXQgZGlkbid0Ci0JCSAqLwotCQlwdWJsaWMgdm9pZCBkb25lKElTdGF0dXMgcmVzdWx0KTsKLQl9Ci0KLQkvKioKLQkgKiBTZXJ2ZXIgc3RhdGUgY29uc3RhbnQgKHZhbHVlIDApIGluZGljYXRpbmcgdGhhdCB0aGUKLQkgKiBzZXJ2ZXIgaXMgaW4gYW4gdW5rbm93biBzdGF0ZS4KLQkgKiAKLQkgKiBAc2VlICNnZXRTZXJ2ZXJTdGF0ZSgpCi0JICogQHNlZSAjZ2V0TW9kdWxlU3RhdGUoSU1vZHVsZVtdKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX1VOS05PV04gPSAwOwotCi0JLyoqCi0JICogU2VydmVyIHN0YXRlIGNvbnN0YW50ICh2YWx1ZSAxKSBpbmRpY2F0aW5nIHRoYXQgdGhlCi0JICogc2VydmVyIGlzIHN0YXJ0aW5nLCBidXQgbm90IHlldCByZWFkeSB0byBzZXJ2ZSBjb250ZW50LgotCSAqIAotCSAqIEBzZWUgI2dldFNlcnZlclN0YXRlKCkKLQkgKiBAc2VlICNnZXRNb2R1bGVTdGF0ZShJTW9kdWxlW10pCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfU1RBUlRJTkcgPSAxOwotCi0JLyoqCi0JICogU2VydmVyIHN0YXRlIGNvbnN0YW50ICh2YWx1ZSAyKSBpbmRpY2F0aW5nIHRoYXQgdGhlCi0JICogc2VydmVyIGlzIHJlYWR5IHRvIHNlcnZlIGNvbnRlbnQuCi0JICogCi0JICogQHNlZSAjZ2V0U2VydmVyU3RhdGUoKQotCSAqIEBzZWUgI2dldE1vZHVsZVN0YXRlKElNb2R1bGVbXSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURV9TVEFSVEVEID0gMjsKLQotCS8qKgotCSAqIFNlcnZlciBzdGF0ZSBjb25zdGFudCAodmFsdWUgMykgaW5kaWNhdGluZyB0aGF0IHRoZQotCSAqIHNlcnZlciBpcyBzaHV0dGluZyBkb3duLgotCSAqIAotCSAqIEBzZWUgI2dldFNlcnZlclN0YXRlKCkKLQkgKiBAc2VlICNnZXRNb2R1bGVTdGF0ZShJTW9kdWxlW10pCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfU1RPUFBJTkcgPSAzOwotCi0JLyoqCi0JICogU2VydmVyIHN0YXRlIGNvbnN0YW50ICh2YWx1ZSA0KSBpbmRpY2F0aW5nIHRoYXQgdGhlCi0JICogc2VydmVyIGlzIHN0b3BwZWQuCi0JICogCi0JICogQHNlZSAjZ2V0U2VydmVyU3RhdGUoKQotCSAqIEBzZWUgI2dldE1vZHVsZVN0YXRlKElNb2R1bGVbXSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURV9TVE9QUEVEID0gNDsKLQotCS8qKgotCSAqIFB1Ymxpc2ggc3RhdGUgY29uc3RhbnQgKHZhbHVlIDApIGluZGljYXRpbmcgdGhhdCBpdCdzCi0JICogaW4gYW4gdW5rbm93biBzdGF0ZS4KLQkgKiAKLQkgKiBAc2VlICNnZXRTZXJ2ZXJQdWJsaXNoU3RhdGUoKQotCSAqIEBzZWUgI2dldE1vZHVsZVB1Ymxpc2hTdGF0ZShJTW9kdWxlW10pCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFVCTElTSF9TVEFURV9VTktOT1dOID0gMDsKLQotCS8qKgotCSAqIFB1Ymxpc2ggc3RhdGUgY29uc3RhbnQgKHZhbHVlIDEpIGluZGljYXRpbmcgdGhhdCB0aGVyZQotCSAqIGlzIG5vIHB1Ymxpc2ggcmVxdWlyZWQuCi0JICogCi0JICogQHNlZSAjZ2V0U2VydmVyUHVibGlzaFN0YXRlKCkKLQkgKiBAc2VlICNnZXRNb2R1bGVQdWJsaXNoU3RhdGUoSU1vZHVsZVtdKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBVQkxJU0hfU1RBVEVfTk9ORSA9IDE7Ci0KLQkvKioKLQkgKiBQdWJsaXNoIHN0YXRlIGNvbnN0YW50ICh2YWx1ZSAyKSBpbmRpY2F0aW5nIHRoYXQgYW4KLQkgKiBpbmNyZW1lbnRhbCBwdWJsaXNoIGlzIHJlcXVpcmVkLgotCSAqIAotCSAqIEBzZWUgI2dldFNlcnZlclB1Ymxpc2hTdGF0ZSgpCi0JICogQHNlZSAjZ2V0TW9kdWxlUHVibGlzaFN0YXRlKElNb2R1bGVbXSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQVUJMSVNIX1NUQVRFX0lOQ1JFTUVOVEFMID0gMjsKLQotCS8qKgotCSAqIFB1Ymxpc2ggc3RhdGUgY29uc3RhbnQgKHZhbHVlIDMpIGluZGljYXRpbmcgdGhhdCBhCi0JICogZnVsbCBwdWJsaXNoIGlzIHJlcXVpcmVkLgotCSAqIAotCSAqIEBzZWUgI2dldFNlcnZlclB1Ymxpc2hTdGF0ZSgpCi0JICogQHNlZSAjZ2V0TW9kdWxlUHVibGlzaFN0YXRlKElNb2R1bGVbXSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQVUJMSVNIX1NUQVRFX0ZVTEwgPSAzOwotCi0JLyoqCi0JICogUHVibGlzaCBraW5kIGNvbnN0YW50ICh2YWx1ZSAxKSBpbmRpY2F0aW5nIGFuIGluY3JlbWVudGFsIHB1Ymxpc2ggcmVxdWVzdC4KLQkgKiAKLQkgKiBAc2VlICNwdWJsaXNoKGludCwgSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQVUJMSVNIX0lOQ1JFTUVOVEFMID0gMTsKLQotCS8qKgotCSAqIFB1Ymxpc2gga2luZCBjb25zdGFudCAodmFsdWUgMikgaW5kaWNhdGluZyBhIGZ1bGwgcHVibGlzaCByZXF1ZXN0LgotCSAqIAotCSAqIEBzZWUgI3B1Ymxpc2goaW50LCBJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBVQkxJU0hfRlVMTCA9IDI7Ci0KLQkvKioKLQkgKiBQdWJsaXNoIGtpbmQgY29uc3RhbnQgKHZhbHVlIDMpIGluZGljYXRpbmcgYW4gYXV0b21hdGljIHB1Ymxpc2ggcmVxdWVzdC4KLQkgKiAKLQkgKiBAc2VlICNwdWJsaXNoKGludCwgSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQVUJMSVNIX0FVVE8gPSAzOwotCi0JLyoqCi0JICogUHVibGlzaCBraW5kIGNvbnN0YW50ICh2YWx1ZSA0KSBpbmRpY2F0aW5nIGEgcHVibGlzaCBjbGVhbiByZXF1ZXN0Ci0JICogCi0JICogQHNlZSAjcHVibGlzaChpbnQsIElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFVCTElTSF9DTEVBTiA9IDQ7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoaXMgc2VydmVyLgotCSAqIDxwPgotCSAqIE5vdGUgdGhhdCB0aGlzIG9wZXJhdGlvbiBpcyBndWFyYW50ZWVkIHRvIGJlIGZhc3QKLQkgKiAoaXQgZG9lcyBub3QgYWN0dWFsbHkgY29tbXVuaWNhdGUgd2l0aCBhbnkgYWN0dWFsCi0JICogc2VydmVyKS4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcmV0dXJuIG9uZSBvZiB0aGUgc2VydmVyIHN0YXRlICg8Y29kZT5TVEFURV9YWFg8L2NvZGU+KQotCSAqIGNvbnN0YW50cyBkZWNsYXJlZCBvbiB7QGxpbmsgSVNlcnZlcn0KLQkgKi8KLQlwdWJsaWMgaW50IGdldFNlcnZlclN0YXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBJTGF1bmNoTWFuYWdlciBtb2RlIHRoYXQgdGhlIHNlcnZlciBpcyBpbi4gVGhpcyBtZXRob2Qgd2lsbAotCSAqIHJldHVybiBudWxsIGlmIHRoZSBzZXJ2ZXIgaXMgbm90IHJ1bm5pbmcuCi0JICogCi0JICogQHJldHVybiB0aGUgbW9kZSBpbiB3aGljaCBhIHNlcnZlciBpcyBydW5uaW5nLCBvbmUgb2YgdGhlIG1vZGUgY29uc3RhbnRzCi0JICogICAgZGVmaW5lZCBieSB7QGxpbmsgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoTWFuYWdlcn0sIG9yCi0JICogICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHNlcnZlciBpcyBzdG9wcGVkLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TW9kZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2VydmVyJ3Mgc3luYyBzdGF0ZS4KLQkgKgotCSAqIEByZXR1cm4gb25lIG9mIHRoZSBQVUJMSVNIX1hYWCBzdGF0ZSBmbGFncwotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U2VydmVyUHVibGlzaFN0YXRlKCk7Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBnaXZlbiBzZXJ2ZXIgc3RhdGUgbGlzdGVuZXIgdG8gdGhpcyBzZXJ2ZXIuCi0JICogT25jZSByZWdpc3RlcmVkLCBhIGxpc3RlbmVyIHN0YXJ0cyByZWNlaXZpbmcgbm90aWZpY2F0aW9uIG9mIAotCSAqIHN0YXRlIGNoYW5nZXMgdG8gdGhpcyBzZXJ2ZXIuIFRoZSBsaXN0ZW5lciBjb250aW51ZXMgdG8gcmVjZWl2ZQotCSAqIG5vdGlmaWNhdGlvbnMgdW50aWwgaXQgaXMgcmVtb3ZlZC4KLQkgKiBIYXMgbm8gZWZmZWN0IGlmIGFuIGlkZW50aWNhbCBsaXN0ZW5lciBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQuCi0JICoKLQkgKiBAcGFyYW0gbGlzdGVuZXIgdGhlIHNlcnZlciBsaXN0ZW5lcgotCSAqIEBzZWUgI3JlbW92ZVNlcnZlckxpc3RlbmVyKElTZXJ2ZXJMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRTZXJ2ZXJMaXN0ZW5lcihJU2VydmVyTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogQWRkcyB0aGUgZ2l2ZW4gc2VydmVyIHN0YXRlIGxpc3RlbmVyIHRvIHRoaXMgc2VydmVyLgotCSAqIE9uY2UgcmVnaXN0ZXJlZCwgYSBsaXN0ZW5lciBzdGFydHMgcmVjZWl2aW5nIG5vdGlmaWNhdGlvbiBvZiAKLQkgKiBzdGF0ZSBjaGFuZ2VzIHRvIHRoaXMgc2VydmVyLiBUaGUgbGlzdGVuZXIgY29udGludWVzIHRvIHJlY2VpdmUKLQkgKiBub3RpZmljYXRpb25zIHVudGlsIGl0IGlzIHJlbW92ZWQuCi0JICogSGFzIG5vIGVmZmVjdCBpZiBhbiBpZGVudGljYWwgbGlzdGVuZXIgaXMgYWxyZWFkeSByZWdpc3RlcmVkLgotCSAqCi0JICogQHBhcmFtIGxpc3RlbmVyIHRoZSBzZXJ2ZXIgbGlzdGVuZXIKLQkgKiBAcGFyYW0gZXZlbnRNYXNrIHRoZSBiaXQtd2lzZSBPUiBvZiBhbGwgZXZlbnQgdHlwZXMgb2YgaW50ZXJlc3QgdG8gdGhlCi0JICogbGlzdGVuZXIKLQkgKiBAc2VlICNyZW1vdmVTZXJ2ZXJMaXN0ZW5lcihJU2VydmVyTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgYWRkU2VydmVyTGlzdGVuZXIoSVNlcnZlckxpc3RlbmVyIGxpc3RlbmVyLCBpbnQgZXZlbnRNYXNrKTsKLQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIGdpdmVuIHNlcnZlciBzdGF0ZSBsaXN0ZW5lciBmcm9tIHRoaXMgc2VydmVyLiBIYXMgbm8KLQkgKiBlZmZlY3QgaWYgdGhlIGxpc3RlbmVyIGlzIG5vdCByZWdpc3RlcmVkLgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgbGlzdGVuZXIKLQkgKiBAc2VlICNhZGRTZXJ2ZXJMaXN0ZW5lcihJU2VydmVyTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlU2VydmVyTGlzdGVuZXIoSVNlcnZlckxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIEFkZHMgYSBwdWJsaXNoIGxpc3RlbmVyIHRvIHRoaXMgc2VydmVyLgotCSAqIEhhcyBubyBlZmZlY3QgaWYgYW4gaWRlbnRpY2FsIGxpc3RlbmVyIGlzIGFscmVhZHkgcmVnaXN0ZXJlZC4KLQkgKgotCSAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgcHVibGlzaCBsaXN0ZW5lcgotCSAqIEBzZWUgI3JlbW92ZVB1Ymxpc2hMaXN0ZW5lcihJUHVibGlzaExpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFB1Ymxpc2hMaXN0ZW5lcihJUHVibGlzaExpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIFJlbW92ZXMgYSBwdWJsaXNoIGxpc3RlbmVyIGZyb20gdGhpcyBzZXJ2ZXIuCi0JICogSGFzIG5vIGVmZmVjdCBpZiB0aGUgbGlzdGVuZXIgaXMgbm90IHJlZ2lzdGVyZWQuCi0JICoKLQkgKiBAcGFyYW0gbGlzdGVuZXIgdGhlIHB1Ymxpc2ggbGlzdGVuZXIKLQkgKiBAc2VlICNhZGRQdWJsaXNoTGlzdGVuZXIoSVB1Ymxpc2hMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVQdWJsaXNoTGlzdGVuZXIoSVB1Ymxpc2hMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBzZXJ2ZXIgaXMgaW4gYSBzdGF0ZSB0aGF0IGl0IGNhbgotCSAqIGJlIHB1Ymxpc2hlZCB0by4KLQkgKgotCSAqIEByZXR1cm4gYSBzdGF0dXMgb2JqZWN0IHdpdGggY29kZSA8Y29kZT5JU3RhdHVzLk9LPC9jb2RlPiBpZiB0aGUgc2VydmVyIGNhbgotCSAqICAgYmUgcHVibGlzaGVkIHRvLCBvdGhlcndpc2UgYSBzdGF0dXMgb2JqZWN0IGluZGljYXRpbmcgd2hhdCBpcyB3cm9uZwotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGNhblB1Ymxpc2goKTsKLQotCS8qKgotCSAqIFB1Ymxpc2ggdG8gdGhlIHNlcnZlciB1c2luZyB0aGUgcHJvZ3Jlc3MgbW9uaXRvci4gVGhlIHJlc3VsdCBvZiB0aGUKLQkgKiBwdWJsaXNoIG9wZXJhdGlvbiBpcyByZXR1cm5lZCBhcyBhbiBJU3RhdHVzLgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgY2FsbGVkIGZyb20gdGhlIFVJIHRocmVhZC4gUHVibGlzaGluZyBpcyBsb25nLQotCSAqIHJ1bm5pbmcgYW5kIG1heSB0cmlnZ2VyIHJlc291cmNlIGNoYW5nZSBldmVudHMgb3IgYnVpbGRzLiBBbHRob3VnaCB0aGlzCi0JICogZnJhbWV3b3JrIGlzIHNhZmUsIHRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IG90aGVyIGJ1bmRsZXMgYXJlIFVJLXNhZmUKLQkgKiBhbmQgdGhlIHJpc2sgb2YgVUkgZGVhZGxvY2sgaXMgaGlnaC4gCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBraW5kIHRoZSBraW5kIG9mIHB1Ymxpc2ggYmVpbmcgcmVxdWVzdGVkLiBWYWxpZCB2YWx1ZXMgYXJlCi0JICogICAgPHVsPgotCSAqICAgIDxsaT48Y29kZT5QVUJMU0lIX0ZVTEw8L2NvZGU+LSBpbmRpY2F0ZXMgYSBmdWxsIHB1Ymxpc2guPC9saT4KLQkgKiAgICA8bGk+PGNvZGU+UFVCTElTSF9JTkNSRU1FTlRBTDwvY29kZT4tIGluZGljYXRlcyBhIGluY3JlbWVudGFsIHB1Ymxpc2guCi0JICogICAgPGxpPjxjb2RlPlBVQkxJU0hfQ0xFQU48L2NvZGU+LSBpbmRpY2F0ZXMgYSBjbGVhbiByZXF1ZXN0LiBDbGVhbiB0aHJvd3MKLQkgKiAgICAgIG91dCBhbGwgc3RhdGUgYW5kIGNsZWFucyB1cCB0aGUgbW9kdWxlIG9uIHRoZSBzZXJ2ZXIgYmVmb3JlIGRvaW5nIGEKLQkgKiAgICAgIGZ1bGwgcHVibGlzaC4KLQkgKiAgICA8L3VsPgotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLQkgKiBAcmV0dXJuIHN0YXR1cyBpbmRpY2F0aW5nIHdoYXQgKGlmIGFueXRoaW5nKSB3ZW50IHdyb25nCi0JICovCi0JcHVibGljIElTdGF0dXMgcHVibGlzaChpbnQga2luZCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGlzIHNlcnZlciBpcyBpbiBhIHN0YXRlIHRoYXQgaXQgY2FuCi0JICogYmUgc3RhcnRlZCBpbiB0aGUgZ2l2ZW4gbW9kZS4KLQkgKgotCSAqIEBwYXJhbSBsYXVuY2hNb2RlIGEgbW9kZSBpbiB3aGljaCBhIHNlcnZlciBjYW4gYmUgbGF1bmNoZWQsCi0JICogICAgb25lIG9mIHRoZSBtb2RlIGNvbnN0YW50cyBkZWZpbmVkIGJ5Ci0JICogICAge0BsaW5rIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaE1hbmFnZXJ9Ci0JICogQHJldHVybiBhIHN0YXR1cyBvYmplY3Qgd2l0aCBjb2RlIDxjb2RlPklTdGF0dXMuT0s8L2NvZGU+IGlmIHRoZSBzZXJ2ZXIgY2FuCi0JICogICAgYmUgc3RhcnRlZCwgb3RoZXJ3aXNlIGEgc3RhdHVzIG9iamVjdCBpbmRpY2F0aW5nIHdoeSBpdCBjYW4ndAotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGNhblN0YXJ0KFN0cmluZyBsYXVuY2hNb2RlKTsKLQotCS8qKgotCSAqIEFzeW5jaHJvbm91c2x5IHN0YXJ0cyB0aGlzIHNlcnZlciBpbiB0aGUgZ2l2ZW4gbGF1bmNoIG1vZGUuCi0JICogPHA+Ci0JICogSWYgY2FuU3RhcnQobGF1bmNoTW9kZSkgaXMgZmFsc2UsIHRoaXMgbWV0aG9kIHdpbGwgdGhyb3cgYW4KLQkgKiBleGNlcHRpb24uCi0JICogPC9wPgotCSAqIDxwPgotCSAqIElmIHRoZSBjYWxsZXIgd2FudHMgdG8gbGlzdGVuIGZvciBmYWlsdXJlIG9yIHN1Y2Nlc3Mgb2YgdGhlCi0JICogc2VydmVyIHN0YXJ0aW5nLCBpdCBjYW4gYWRkIGEgc2VydmVyIGxpc3RlbmVyIG9yIHVzZSB0aGUKLQkgKiB2ZXJzaW9uIG9mIHRoaXMgbWV0aG9kIHRoYXQgdGFrZXMgYSBzdGF0dXMgbGlzdGVuZXIgYXMgYQotCSAqIHBhcmFtZXRlci4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcGFyYW0gbGF1bmNoTW9kZSBhIG1vZGUgaW4gd2hpY2ggYSBzZXJ2ZXIgY2FuIGJlIGxhdW5jaGVkLAotCSAqICAgIG9uZSBvZiB0aGUgbW9kZSBjb25zdGFudHMgZGVmaW5lZCBieQotCSAqICAgIHtAbGluayBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hNYW5hZ2VyfQotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLQkgKiBAZXhjZXB0aW9uIENvcmVFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHRyeWluZyB0byBzdGFydCB0aGUgc2VydmVyCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoU3RyaW5nIGxhdW5jaE1vZGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0JCi0JLyoqCi0JICogQXN5bmNocm9ub3VzbHkgc3RhcnRzIHRoaXMgc2VydmVyIGluIHRoZSBnaXZlbiBsYXVuY2ggbW9kZS4KLQkgKiA8cD4KLQkgKiBJZiBjYW5TdGFydChsYXVuY2hNb2RlKSBpcyBmYWxzZSwgdGhpcyBtZXRob2Qgd2lsbCB0aHJvdyBhbgotCSAqIGV4Y2VwdGlvbi4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVGhlIG9wZXJhdGlvbiBsaXN0ZW5lciBjYW4gYmUgdXNlZCB0byBhZGQgYSBsaXN0ZW5lciBmb3Igbm90aWZpY2F0aW9uCi0JICogb2YgdGhpcyBzcGVjaWZpYyBzZXJ2ZXIgbGF1bmNoLiBUaGUgbGlzdGVuZXIgd2lsbCBiZSBjYWxsZWQgd2l0aCBhCi0JICogc2luZ2xlIHN1Y2Nlc3NmdWwgc3RhdHVzIChzZXZlcml0eSBPSykgd2hlbiB0aGUgc2VydmVyIGhhcwotCSAqIGZpbmlzaGVkIHN0YXJ0aW5nLCBvciBhIHNpbmdsZSBmYWlsdXJlIChzZXZlcml0eSBFUlJPUikgaWYKLQkgKiB0aGVyZSB3YXMgYW4gZXJyb3Igc3RhcnRpbmcgdGhlIHNlcnZlci4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGxhdW5jaE1vZGUgYSBtb2RlIGluIHdoaWNoIGEgc2VydmVyIGNhbiBiZSBsYXVuY2hlZCwKLQkgKiAgICBvbmUgb2YgdGhlIG1vZGUgY29uc3RhbnRzIGRlZmluZWQgYnkKLQkgKiAgICB7QGxpbmsgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoTWFuYWdlcn0KLQkgKiBAcGFyYW0gbGlzdGVuZXIgYW4gb3BlcmF0aW9uIGxpc3RlbmVyIHRvIHJlY2VpdmUgbm90aWZpY2F0aW9uIHdoZW4gdGhpcwotCSAqICAgIG9wZXJhdGlvbiBpcyBkb25lLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3RpZmljYXRpb24gaXMgbm90Ci0JICogICAgcmVxdWlyZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChTdHJpbmcgbGF1bmNoTW9kZSwgSU9wZXJhdGlvbkxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIFN0YXJ0cyB0aGlzIHNlcnZlciBpbiB0aGUgZ2l2ZW4gbGF1bmNoIG1vZGUgYW5kIHdhaXRzIHVudGlsIHRoZSBzZXJ2ZXIKLQkgKiBoYXMgZmluaXNoZWQgc3RhcnRpbmcuCi0JICogPHA+Ci0JICogVGhpcyBjb252ZW5pZW5jZSBtZXRob2QgdXNlcyB7QGxpbmsgI3N0YXJ0KFN0cmluZywgSVByb2dyZXNzTW9uaXRvcil9Ci0JICogdG8gc3RhcnQgdGhlIHNlcnZlciwgYW5kIGFuIGludGVybmFsIHRocmVhZCBhbmQgbGlzdGVuZXIgdG8gZGV0ZWN0Ci0JICogd2hlbiB0aGUgc2VydmVyIGhhcyBmaW5pc2hlZCBzdGFydGluZy4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcGFyYW0gbGF1bmNoTW9kZSBhIG1vZGUgaW4gd2hpY2ggYSBzZXJ2ZXIgY2FuIGJlIGxhdW5jaGVkLAotCSAqICAgIG9uZSBvZiB0aGUgbW9kZSBjb25zdGFudHMgZGVmaW5lZCBieQotCSAqICAgIHtAbGluayBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hNYW5hZ2VyfQotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLQkgKiBAZGVwcmVjYXRlZCB0aGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiB1c2Ugc3RhcnQoU3RyaW5nLAotCSAqICAgIElQcm9ncmVzc01vbml0b3IsIElPcGVyYXRpb25MaXN0ZW5lcikgaW5zdGVhZAotCSAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgdHJ5aW5nIHRvIHN0YXJ0IHRoZSBzZXJ2ZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzeW5jaHJvbm91c1N0YXJ0KFN0cmluZyBsYXVuY2hNb2RlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoaXMgc2VydmVyIGlzIGluIGEgc3RhdGUgdGhhdCBpdCBjYW4KLQkgKiBiZSByZXN0YXJ0ZWQgaW4gdGhlIGdpdmVuIG1vZGUuIE5vdGUgdGhhdCBvbmx5IHNlcnZlcnMKLQkgKiB0aGF0IGFyZSBjdXJyZW50bHkgcnVubmluZyBjYW4gYmUgcmVzdGFydGVkLgotCSAqCi0JICogQHBhcmFtIG1vZGUgYSBtb2RlIGluIHdoaWNoIGEgc2VydmVyIGNhbiBiZSBsYXVuY2hlZCwKLQkgKiAgICBvbmUgb2YgdGhlIG1vZGUgY29uc3RhbnRzIGRlZmluZWQgYnkKLQkgKiAgICB7QGxpbmsgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoTWFuYWdlcn0KLQkgKiBAcmV0dXJuIGEgc3RhdHVzIG9iamVjdCB3aXRoIGNvZGUgPGNvZGU+SVN0YXR1cy5PSzwvY29kZT4gaWYgdGhlIHNlcnZlciBjYW4KLQkgKiAgICBiZSByZXN0YXJ0ZWQsIG90aGVyd2lzZSBhIHN0YXR1cyBvYmplY3QgaW5kaWNhdGluZyB3aHkgaXQgY2FuJ3QKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBjYW5SZXN0YXJ0KFN0cmluZyBtb2RlKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGlzIHNlcnZlciBpcyBvdXQgb2Ygc3luYyBhbmQgbmVlZHMgdG8gYmUKLQkgKiByZXN0YXJ0ZWQuIFRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIGZhbHNlIHdoZW4gdGhlCi0JICogc2VydmVyIGlzIG5vdCBydW5uaW5nLgotCSAqIDxwPgotCSAqIFtpc3N1ZTogTmVlZCB0byBleHBsYWluIHdoYXQgaXMgaXQgdGhhdCBjYW4gZ2V0IG91dCBvZgotCSAqICJvdXQgb2Ygc3luYyIgaGVyZSwgYW5kIGhvdyB0aGlzIGNhbiBoYXBwZW4uXQotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgc2VydmVyIGlzIG91dCBvZiBzeW5jIGFuZCBuZWVkcyB0byBiZQotCSAqIHJlc3RhcnRlZCwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UgKGUuZy4sIGlmIHRoZSBjb250ZW50cyBoYXZlCi0JICogbm90IGJlZW4gbW9kaWZpZWQgYW5kIHRoZSBzZXJ2ZXIgcHJvY2VzcyBpcyBzdGlsbCBpbiBzeW5jKTsgdGhlCi0JICogcmVzdWx0IGlzIHVuc3BlY2lmaWVkIGlmIHRoZSBzZXJ2ZXIgaXMgbm90IGN1cnJlbnRseSBydW5uaW5nCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0U2VydmVyUmVzdGFydFN0YXRlKCk7Ci0KLQkvKioKLQkgKiBBc3luY2hyb25vdXNseSByZXN0YXJ0cyB0aGlzIHNlcnZlci4gVGhpcyBvcGVyYXRpb24gZG9lcwotCSAqIG5vdGhpbmcgaWYgdGhpcyBzZXJ2ZXIgY2Fubm90IGJlIHN0b3BwZWQgKHtAbGluayAjY2FuUmVzdGFydChTdHJpbmcpfQotCSAqIHJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+LgotCSAqIFRoaXMgbWV0aG9kIGNhbm5vdCBiZSB1c2VkIHRvIHN0YXJ0IHRoZSBzZXJ2ZXIgZnJvbSBhIHN0b3BwZWQgc3RhdGUuCi0JICogPHA+Ci0JICogSWYgdGhlIGNhbGxlciB3YW50cyB0byBsaXN0ZW4gZm9yIGZhaWx1cmUgb3Igc3VjY2VzcyBvZiB0aGUKLQkgKiBzZXJ2ZXIgcmVzdGFydGluZywgaXQgY2FuIGFkZCBhIHNlcnZlciBsaXN0ZW5lciBvciB1c2UgdGhlCi0JICogdmVyc2lvbiBvZiB0aGlzIG1ldGhvZCB0aGF0IHRha2VzIGEgc3RhdHVzIGxpc3RlbmVyIGFzIGEKLQkgKiBwYXJhbWV0ZXIuCi0JICogPC9wPgotCSAqCi0JICogQHBhcmFtIGxhdW5jaE1vZGUgYSBtb2RlIGluIHdoaWNoIGEgc2VydmVyIGNhbiBiZSBsYXVuY2hlZCwKLQkgKiAgICBvbmUgb2YgdGhlIG1vZGUgY29uc3RhbnRzIGRlZmluZWQgYnkKLQkgKiAgICB7QGxpbmsgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoTWFuYWdlcn0KLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCi0JICogICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCi0JICovCi0JcHVibGljIHZvaWQgcmVzdGFydChTdHJpbmcgbGF1bmNoTW9kZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKTsKLQotCS8qKgotCSAqIEFzeW5jaHJvbm91c2x5IHJlc3RhcnRzIHRoaXMgc2VydmVyLiBUaGlzIG9wZXJhdGlvbiBkb2VzCi0JICogbm90aGluZyBpZiB0aGlzIHNlcnZlciBjYW5ub3QgYmUgc3RvcHBlZCAoe0BsaW5rICNjYW5SZXN0YXJ0KFN0cmluZyl9Ci0JICogcmV0dXJucyA8Y29kZT5mYWxzZTwvY29kZT4uCi0JICogVGhpcyBtZXRob2QgY2Fubm90IGJlIHVzZWQgdG8gc3RhcnQgdGhlIHNlcnZlciBmcm9tIGEgc3RvcHBlZCBzdGF0ZS4KLQkgKiA8cD4KLQkgKiBUaGUgb3BlcmF0aW9uIGxpc3RlbmVyIGNhbiBiZSB1c2VkIHRvIGFkZCBhIGxpc3RlbmVyIGZvciBub3RpZmljYXRpb24KLQkgKiBvZiB0aGlzIHNwZWNpZmljIHNlcnZlciByZXN0YXJ0LiBUaGUgbGlzdGVuZXIgd2lsbCBiZSBjYWxsZWQgd2l0aCBhCi0JICogc2luZ2xlIHN1Y2Nlc3NmdWwgc3RhdHVzIChzZXZlcml0eSBPSykgd2hlbiB0aGUgc2VydmVyIGhhcwotCSAqIGZpbmlzaGVkIHJlc3RhcnRpbmcsIG9yIGEgc2luZ2xlIGZhaWx1cmUgKHNldmVyaXR5IEVSUk9SKSBpZgotCSAqIHRoZXJlIHdhcyBhbiBlcnJvciByZXN0YXJ0aW5nIHRoZSBzZXJ2ZXIuCi0JICogPC9wPgotCSAqCi0JICogQHBhcmFtIGxhdW5jaE1vZGUgYSBtb2RlIGluIHdoaWNoIGEgc2VydmVyIGNhbiBiZSBsYXVuY2hlZCwKLQkgKiAgICBvbmUgb2YgdGhlIG1vZGUgY29uc3RhbnRzIGRlZmluZWQgYnkKLQkgKiAgICB7QGxpbmsgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoTWFuYWdlcn0KLQkgKiBAcGFyYW0gbGlzdGVuZXIgYW4gb3BlcmF0aW9uIGxpc3RlbmVyIHRvIHJlY2VpdmUgbm90aWZpY2F0aW9uIHdoZW4gdGhpcwotCSAqICAgIG9wZXJhdGlvbiBpcyBkb25lLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3RpZmljYXRpb24gaXMgbm90Ci0JICogICAgcmVxdWlyZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXN0YXJ0KFN0cmluZyBsYXVuY2hNb2RlLCBJT3BlcmF0aW9uTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogU3luY2hyb25vdXNseSByZXN0YXJ0cyB0aGlzIHNlcnZlci4gVGhpcyBvcGVyYXRpb24gZG9lcwotCSAqIG5vdGhpbmcgaWYgdGhpcyBzZXJ2ZXIgY2Fubm90IGJlIHN0b3BwZWQgKHtAbGluayAjY2FuUmVzdGFydChTdHJpbmcpfQotCSAqIHJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+LgotCSAqIDxwPgotCSAqIFtpc3N1ZTogVGhlcmUgaXMgbm8gd2F5IHRvIGNvbW11bmljYXRlIGZhaWx1cmUgdG8gdGhlCi0JICogY2xpZW50LiBHaXZlbiB0aGF0IHRoaXMgb3BlcmF0aW9uIGNhbiBnbyBhd3J5LCB0aGVyZSBwcm9iYWJseQotCSAqIHNob3VsZCBiZSBhIG1lY2hhbmlzbSB0aGF0IGFsbG93cyBmYWlsaW5nIGFzeW5jaCBvcGVyYXRpb25zCi0JICogdG8gYmUgZGlhZ25vc2VkLl0KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcGFyYW0gbGF1bmNoTW9kZSBhIG1vZGUgaW4gd2hpY2ggYSBzZXJ2ZXIgY2FuIGJlIGxhdW5jaGVkLAotCSAqICAgIG9uZSBvZiB0aGUgbW9kZSBjb25zdGFudHMgZGVmaW5lZCBieQotCSAqICAgIHtAbGluayBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hNYW5hZ2VyfQotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gaWYgdGhlcmUgd2FzIGFuIGVycm9yCi0JICogQGRlcHJlY2F0ZWQgdGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gdXNlIHJlc3RhcnQoU3RyaW5nLAotCSAqICAgIElQcm9ncmVzc01vbml0b3IsIElPcGVyYXRpb25MaXN0ZW5lcikgaW5zdGVhZAotCSAqLwotCXB1YmxpYyB2b2lkIHN5bmNocm9ub3VzUmVzdGFydChTdHJpbmcgbGF1bmNoTW9kZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGlzIHNlcnZlciBpcyBpbiBhIHN0YXRlIHRoYXQgaXQgY2FuCi0JICogYmUgc3RvcHBlZC4KLQkgKiBTZXJ2ZXJzIGNhbiBiZSBzdG9wcGVkIGlmIHRoZXkgYXJlIG5vdCBhbHJlYWR5IHN0b3BwZWQgYW5kIGlmCi0JICogdGhleSBiZWxvbmcgdG8gYSBzdGF0ZS1zZXQgdGhhdCBjYW4gYmUgc3RvcHBlZC4KLQkgKgotCSAqIEByZXR1cm4gYSBzdGF0dXMgb2JqZWN0IHdpdGggY29kZSA8Y29kZT5JU3RhdHVzLk9LPC9jb2RlPiBpZiB0aGUgc2VydmVyIGNhbgotCSAqICAgYmUgc3RvcHBlZCwgb3RoZXJ3aXNlIGEgc3RhdHVzIG9iamVjdCBpbmRpY2F0aW5nIHdoeSBpdCBjYW4ndAotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGNhblN0b3AoKTsKLQotCS8qKgotCSAqIEFzeW5jaHJvbm91c2x5IHN0b3BzIHRoaXMgc2VydmVyLiBUaGlzIG9wZXJhdGlvbiBkb2VzCi0JICogbm90aGluZyBpZiB0aGlzIHNlcnZlciBjYW5ub3QgYmUgc3RvcHBlZCAoe0BsaW5rICNjYW5TdG9wKCl9Ci0JICogcmV0dXJucyA8Y29kZT5mYWxzZTwvY29kZT4uCi0JICogPHA+Ci0JICogSWYgZm9yY2UgaXMgPGNvZGU+ZmFsc2U8L2NvZGU+LCBpdCB3aWxsIGF0dGVtcHQgdG8gc3RvcCB0aGUgc2VydmVyCi0JICogbm9ybWFsbHkvZ3JhY2VmdWxseS4gSWYgZm9yY2UgaXMgPGNvZGU+dHJ1ZTwvY29kZT4sIHRoZW4gdGhlIHNlcnZlcgotCSAqIHByb2Nlc3Mgd2lsbCBiZSB0ZXJtaW5hdGVkIGFueSB3YXkgdGhhdCBpdCBjYW4uCi0JICogPC9wPgotCSAqIDxwPgotCSAqIElmIHRoZSBjYWxsZXIgd2FudHMgdG8gbGlzdGVuIGZvciBzdWNjZXNzIG9yIGZhaWx1cmUgb2YgdGhlCi0JICogc2VydmVyIHN0b3BwaW5nLCBpdCBjYW4gYWRkIGEgc2VydmVyIGxpc3RlbmVyIG9yIHVzZSB0aGUKLQkgKiB2ZXJzaW9uIG9mIHRoaXMgbWV0aG9kIHRoYXQgdGFrZXMgYSBzdGF0dXMgbGlzdGVuZXIgYXMgYQotCSAqIHBhcmFtZXRlci4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGZvcmNlIDxjb2RlPnRydWU8L2NvZGU+IHRvIGtpbGwgdGhlIHNlcnZlciwgb3IgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogICAgdG8gc3RvcCBub3JtYWxseQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoYm9vbGVhbiBmb3JjZSk7Ci0KLQkvKioKLQkgKiBBc3luY2hyb25vdXNseSBzdG9wcyB0aGlzIHNlcnZlci4gVGhpcyBvcGVyYXRpb24gZG9lcwotCSAqIG5vdGhpbmcgaWYgdGhpcyBzZXJ2ZXIgY2Fubm90IGJlIHN0b3BwZWQgKHtAbGluayAjY2FuU3RvcCgpfQotCSAqIHJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+LgotCSAqIDxwPgotCSAqIElmIGZvcmNlIGlzIDxjb2RlPmZhbHNlPC9jb2RlPiwgaXQgd2lsbCBhdHRlbXB0IHRvIHN0b3AgdGhlIHNlcnZlcgotCSAqIG5vcm1hbGx5L2dyYWNlZnVsbHkuIElmIGZvcmNlIGlzIDxjb2RlPnRydWU8L2NvZGU+LCB0aGVuIHRoZSBzZXJ2ZXIKLQkgKiBwcm9jZXNzIHdpbGwgYmUgdGVybWluYXRlZCBhbnkgd2F5IHRoYXQgaXQgY2FuLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBUaGUgb3BlcmF0aW9uIGxpc3RlbmVyIGNhbiBiZSB1c2VkIHRvIGFkZCBhIGxpc3RlbmVyIGZvciBub3RpZmljYXRpb24KLQkgKiBvZiB0aGlzIHNwZWNpZmljIHNlcnZlciBzdG9wLiBUaGUgbGlzdGVuZXIgd2lsbCBiZSBjYWxsZWQgd2l0aCBhCi0JICogc2luZ2xlIHN1Y2Nlc3NmdWwgc3RhdHVzIChzZXZlcml0eSBPSykgd2hlbiB0aGUgc2VydmVyIGhhcwotCSAqIGZpbmlzaGVkIHN0b3BwaW5nLCBvciBhIHNpbmdsZSBmYWlsdXJlIChzZXZlcml0eSBFUlJPUikgaWYKLQkgKiB0aGVyZSB3YXMgYW4gZXJyb3Igc3RvcHBpbmcgdGhlIHNlcnZlci4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGZvcmNlIDxjb2RlPnRydWU8L2NvZGU+IHRvIGtpbGwgdGhlIHNlcnZlciwgb3IgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogICAgdG8gc3RvcCBub3JtYWxseQotCSAqIEBwYXJhbSBsaXN0ZW5lciBhbiBvcGVyYXRpb24gbGlzdGVuZXIgdG8gcmVjZWl2ZSBub3RpZmljYXRpb24gd2hlbiB0aGlzCi0JICogICAgb3BlcmF0aW9uIGlzIGRvbmUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdGlmaWNhdGlvbiBpcyBub3QKLQkgKiAgICByZXF1aXJlZAotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoYm9vbGVhbiBmb3JjZSwgSU9wZXJhdGlvbkxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIFN0b3BzIHRoaXMgc2VydmVyIGFuZCB3YWl0cyB1bnRpbCB0aGUgc2VydmVyIGhhcyBjb21wbGV0ZWx5IHN0b3BwZWQuCi0JICogPHA+Ci0JICogVGhpcyBjb252ZW5pZW5jZSBtZXRob2QgdXNlcyB7QGxpbmsgI3N0b3AoYm9vbGVhbil9Ci0JICogdG8gc3RvcCB0aGUgc2VydmVyLCBhbmQgYW4gaW50ZXJuYWwgdGhyZWFkIGFuZCBsaXN0ZW5lciB0byBkZXRlY3QKLQkgKiB3aGVuIHRoZSBzZXJ2ZXIgaGFzIGNvbXBsaWVkLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gZm9yY2UgPGNvZGU+dHJ1ZTwvY29kZT4gdG8ga2lsbCB0aGUgc2VydmVyLCBvciA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiAgICB0byBzdG9wIG5vcm1hbGx5Ci0JICogQGRlcHJlY2F0ZWQgdGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gdXNlIHN0b3AoYm9vbGVhbiwKLQkgKiAgICBJT3BlcmF0aW9uTGlzdGVuZXIpIGluc3RlYWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzeW5jaHJvbm91c1N0b3AoYm9vbGVhbiBmb3JjZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBnaXZlbiBtb2R1bGUgb24gdGhpcyBzZXJ2ZXIuCi0JICogUmV0dXJucyA8Y29kZT5TVEFURV9VTktOT1dOPC9jb2RlPiBpZiB0aGUgbW9kdWxlCi0JICogaXMgbm90IGFtb25nIHRoZSBvbmVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHNlcnZlci4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kdWxlIHRoZSBtb2R1bGUKLQkgKiBAcmV0dXJuIG9uZSBvZiB0aGUgc3RhdGUgKDxjb2RlPlNUQVRFX1hYWDwvY29kZT4pIGNvbnN0YW50cyBkZWNsYXJlZAotCSAqICAgIG9uIHtAbGluayBJU2VydmVyfQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TW9kdWxlU3RhdGUoSU1vZHVsZVtdIG1vZHVsZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtb2R1bGUncyBzeW5jIHN0YXRlLgotCSAqIAotCSAqIEBwYXJhbSBtb2R1bGUgdGhlIG1vZHVsZQotCSAqIEByZXR1cm4gb25lIG9mIHRoZSBQVUJMSVNIX1hYWCBzdGF0ZSBmbGFncwotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TW9kdWxlUHVibGlzaFN0YXRlKElNb2R1bGVbXSBtb2R1bGUpOwotCi0JLyoqCi0JICogQ2hlY2sgaWYgdGhlIGdpdmVuIG1vZHVsZSBpcyBpbiBzeW5jIG9uIHRoZSBzZXJ2ZXIuIEl0IHNob3VsZAotCSAqIHJldHVybiB0cnVlIGlmIHRoZSBtb2R1bGUgc2hvdWxkIGJlIHJlc3RhcnRlZCAoaXMgb3V0IG9mCi0JICogc3luYykgb3IgZmFsc2UgaWYgdGhlIG1vZHVsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHJlc3RhcnRlZC4KLQkgKgotCSAqIEBwYXJhbSBtb2R1bGUgdGhlIG1vZHVsZQotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldE1vZHVsZVJlc3RhcnRTdGF0ZShJTW9kdWxlW10gbW9kdWxlKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gbW9kdWxlIGNhbiBiZSByZXN0YXJ0ZWQuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgaGFzIGEgcHJvZ3Jlc3MgbW9uaXRvciBiZWNhdXNlIGl0IG1heSBpbnZvbHZlIHBsdWdpbgotCSAqIGFuZCBjbGFzcyBsb2FkaW5nLiBObyBjb21tdW5pY2F0aW9uIHRvIHRoZSBzZXJ2ZXIgd2lsbCBvY2N1ci4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIG1vZHVsZSB0aGUgbW9kdWxlCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqIEByZXR1cm4gYSBzdGF0dXMgb2JqZWN0IHdpdGggY29kZSA8Y29kZT5JU3RhdHVzLk9LPC9jb2RlPiBpZiB0aGUgbW9kdWxlIGNhbgotCSAqICAgIGJlIHJlc3RhcnRlZCwgb3RoZXJ3aXNlIGEgc3RhdHVzIG9iamVjdCBpbmRpY2F0aW5nIHdoeSBpdCBjYW4ndAotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGNhbkNvbnRyb2xNb2R1bGUoSU1vZHVsZVtdIG1vZHVsZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKTsKLQotCS8qKgotCSAqIEFzeW5jaHJvbm91c2x5IHN0YXJ0cyB0aGlzIHNlcnZlciBpbiB0aGUgZ2l2ZW4gbGF1bmNoIG1vZGUuCi0JICogPHA+Ci0JICogSWYgY2FuU3RhcnQobGF1bmNoTW9kZSkgaXMgZmFsc2UsIHRoaXMgbWV0aG9kIHdpbGwgdGhyb3cgYW4KLQkgKiBleGNlcHRpb24uCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFRoZSBvcGVyYXRpb24gbGlzdGVuZXIgY2FuIGJlIHVzZWQgdG8gYWRkIGEgbGlzdGVuZXIgZm9yIG5vdGlmaWNhdGlvbgotCSAqIG9mIHRoaXMgc3BlY2lmaWMgbW9kdWxlIHN0YXJ0LiBUaGUgbGlzdGVuZXIgd2lsbCBiZSBjYWxsZWQgd2l0aCBhCi0JICogc2luZ2xlIHN1Y2Nlc3NmdWwgc3RhdHVzIChzZXZlcml0eSBPSykgd2hlbiB0aGUgbW9kdWxlIGhhcwotCSAqIGZpbmlzaGVkIHN0YXJ0aW5nLCBvciBhIHNpbmdsZSBmYWlsdXJlIChzZXZlcml0eSBFUlJPUikgaWYKLQkgKiB0aGVyZSB3YXMgYW4gZXJyb3Igc3RhcnRpbmcgdGhlIG1vZHVsZS4KLQkgKiA8L3A+Ci0JICoKLQkgKkBwYXJhbSBtb2R1bGUgdGhlIG1vZHVsZSB0byBiZSBzdGFydGVkCi0JICogQHBhcmFtIGxpc3RlbmVyIGFuIG9wZXJhdGlvbiBsaXN0ZW5lciB0byByZWNlaXZlIG5vdGlmaWNhdGlvbiB3aGVuIHRoaXMKLQkgKiAgICBvcGVyYXRpb24gaXMgZG9uZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90aWZpY2F0aW9uIGlzIG5vdAotCSAqICAgIHJlcXVpcmVkCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnRNb2R1bGUoSU1vZHVsZVtdIG1vZHVsZSwgSU9wZXJhdGlvbkxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIEFzeW5jaHJvbm91c2x5IHN0b3BzIHRoZSBnaXZlbiBtb2R1bGUuIFRoaXMgb3BlcmF0aW9uIGRvZXMKLQkgKiBub3RoaW5nIGlmIHRoaXMgbW9kdWxlIGNhbm5vdCBiZSBzdG9wcGVkLgotCSAqIDxwPgotCSAqIFRoZSBvcGVyYXRpb24gbGlzdGVuZXIgY2FuIGJlIHVzZWQgdG8gYWRkIGEgbGlzdGVuZXIgZm9yIG5vdGlmaWNhdGlvbgotCSAqIG9mIHRoaXMgc3BlY2lmaWMgbW9kdWxlIHN0b3AuIFRoZSBsaXN0ZW5lciB3aWxsIGJlIGNhbGxlZCB3aXRoIGEKLQkgKiBzaW5nbGUgc3VjY2Vzc2Z1bCBzdGF0dXMgKHNldmVyaXR5IE9LKSB3aGVuIHRoZSBtb2R1bGUgaGFzCi0JICogZmluaXNoZWQgc3RvcHBpbmcsIG9yIGEgc2luZ2xlIGZhaWx1cmUgKHNldmVyaXR5IEVSUk9SKSBpZgotCSAqIHRoZXJlIHdhcyBhbiBlcnJvciBzdG9wcGluZyB0aGUgbW9kdWxlLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kdWxlIHRoZSBtb2R1bGUgdG8gYmUgc3RvcHBlZAotCSAqIEBwYXJhbSBsaXN0ZW5lciBhbiBvcGVyYXRpb24gbGlzdGVuZXIgdG8gcmVjZWl2ZSBub3RpZmljYXRpb24gd2hlbiB0aGlzCi0JICogICAgb3BlcmF0aW9uIGlzIGRvbmUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdGlmaWNhdGlvbiBpcyBub3QKLQkgKiAgICByZXF1aXJlZAotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3BNb2R1bGUoSU1vZHVsZVtdIG1vZHVsZSwgSU9wZXJhdGlvbkxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIEFzeW5jaHJvbm91c2x5IHJlc3RhcnRzIHRoZSBnaXZlbiBtb2R1bGUgb24gdGhlIHNlcnZlci4KLQkgKiA8cD4KLQkgKiBUaGUgaW1wbGVtZW50YXRpb24gc2hvdWxkIHVwZGF0ZSB0aGUgbW9kdWxlIHN5bmMgc3RhdGUgYW5kIGZpcmUKLQkgKiBhbiBldmVudCBmb3IgdGhlIG1vZHVsZS4gSWYgdGhlIG1vZHVsZSBkb2VzIG5vdCBleGlzdCBvbiB0aGUgc2VydmVyLAotCSAqIGFuIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogW2lzc3VlOiBTaW5jZSB0aGlzIG1ldGhvZCBpcyBhc2N5bmNocm9ub3VzLCBpcyB0aGVyZQotCSAqIGFueSBuZWVkIGZvciB0aGUgcHJvZ3Jlc3MgbW9uaXRvcj9dCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFtpc3N1ZTogSVNlcnZlci5zeW5jaHJvbm91c01vZHVsZVJlc3RhcnQgdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiBpZiBhbnl0aGluZyBnb2VzIHdyb25nLl0KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogW2lzc3VlOiBJZiB0aGUgbW9kdWxlIHdhcyBqdXN0IHB1Ymxpc2hlZCB0byB0aGUgc2VydmVyCi0JICogYW5kIGhhZCBuZXZlciBiZWVuIHN0YXJ0ZWQsIHdvdWxkIGlzIGJlIG9rIHRvICJzdGFydCIKLQkgKiB0aGUgbW9kdWxlIHVzaW5nIHRoaXMgbWV0aG9kP10KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIG1vZHVsZSB0aGUgbW9kdWxlIHRvIGJlIHN0YXJ0ZWQKLQkgKiBAcGFyYW0gbGlzdGVuZXIgYW4gb3BlcmF0aW9uIGxpc3RlbmVyIHRvIHJlY2VpdmUgbm90aWZpY2F0aW9uIHdoZW4gdGhpcwotCSAqICAgIG9wZXJhdGlvbiBpcyBkb25lLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3RpZmljYXRpb24gaXMgbm90Ci0JICogICAgcmVxdWlyZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXN0YXJ0TW9kdWxlKElNb2R1bGVbXSBtb2R1bGUsIElPcGVyYXRpb25MaXN0ZW5lciBsaXN0ZW5lcik7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvSVNlcnZlckF0dHJpYnV0ZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL0lTZXJ2ZXJBdHRyaWJ1dGVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiMmFlYjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvSVNlcnZlckF0dHJpYnV0ZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLaAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci0vKioKLSAqIFJlcHJlc2VudHMgYSBzZXJ2ZXIgaW5zdGFuY2UuIEV2ZXJ5IHNlcnZlciBpcyBhbiBpbnN0YW5jZSBvZiBhCi0gKiBwYXJ0aWN1bGFyLCBmaXhlZCBzZXJ2ZXIgdHlwZS4KLSAqIDxwPgotICogTm90IHN1cnByaXNpbmdseSwgdGhlIG5vdGlvbiBvZiA8Yj5zZXJ2ZXI8L2I+IGlzIGNlbnRyYWwgaW4gdGhlIHdlYiB0b29scwotICogc2VydmVyIGluZnJhc3RydWN0dXJlLiBJbiB0aGlzIGNvbnRleHQsIHVuZGVyc3RhbmQgdGhhdCBhIHNlcnZlciBpcwotICogYSB3ZWIgc2VydmVyIG9mIHNvbWUgaWxrLiBJdCBjb3VsZCBiZSBhIHNpbXBsZSB3ZWIgc2VydmVyIGxhY2tpbmcgSmF2YQotICogc3VwcG9ydCwgb3IgYW4gSjJFRSBiYXNlZCBzZXJ2ZXIsIG9yIHBlcmhhcHMgZXZlbiBzb21lIGtpbmQgb2YgZGF0YWJhc2UKLSAqIHNlcnZlci4gQSBtb3JlIGV4YWN0IGRlZmluaXRpb24gaXMgbm90IHJlcXVpcmVkIGZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBBUEkuCi0gKiBGcm9tIGEgdG9vbC1jZW50cmljIHBvaW50IG9mIHZpZXcsIGEgc2VydmVyCi0gKiBpcyBzb21ldGhpbmcgdGhhdCB0aGUgZGV2ZWxvcGVyIGlzIHdyaXRpbmcgImNvbnRlbnQiIGZvci4KLSAqIFRoZSB1bml0IG9mIGNvbnRlbnQgaXMgdGVybWVkIGEgbW9kdWxlLgotICogSW4gYSBzZW5zZSwgdGhlIHNlcnZlciBleGlzdHMsIGJ1dCBsYWNrcyB1c2VmdWwgY29udGVudC4gVGhlCi0gKiBkZXZlbG9wbWVudCB0YXNrIGlzIHRvIHByb3ZpZGUgdGhhdCBjb250ZW50LiBUaGUgY29udGVudCBjYW4gaW5jbHVkZQotICogYW55dGhpbmcgZnJvbSBzaW1wbGUsIHN0YXRpYyBIVE1MIHdlYiBwYWdlcyB0byBjb21wbGV4LCBoaWdobHkgZHluYW1pYwotICogd2ViIGFwcGxpY2F0aW9ucy4KLSAqIEluIHRoZSBjb3Vyc2Ugb2Ygd3JpdGluZyBhbmQgZGVidWdnaW5nIHRoaXMgY29udGVudCwKLSAqIHRoZSBkZXZlbG9wZXIgd2lsbCB3YW50IHRvIHRlc3QgdGhlaXIgY29udGVudCBvbiBhIHdlYiBzZXJ2ZXIsIHRvIHNlZSBob3cgaXQKLSAqIGdldHMgc2VydmVkIHVwLiBGb3IgdGhpcyB0aGV5IHdpbGwgbmVlZCB0byBsYXVuY2ggYSBzZXJ2ZXIgcHJvY2VzcyBydW5uaW5nIG9uCi0gKiBzb21lIGhvc3QgbWFjaGluZSAob2Z0ZW4gdGhlIGxvY2FsIGhvc3Qgb24gd2hpY2ggdGhlIElERSBpcyBydW5uaW5nKSwgb3IKLSAqIGF0dGFjaCB0byBhIHNlcnZlciB0aGF0J3MgYWxyZWFkeSBydW5uaW5nIG9uIGEgcmVtb3RlIChvciBsb2NhbCkgaG9zdC4gCi0gKiBUaGUgbmV3bHkgZGV2ZWxvcGVkIGNvbnRlbnQgc2l0dGluZyBpbiB0aGUgZGV2ZWxvcGVyJ3Mgd29ya3NwYWNlIG5lZWRzIHRvCi0gKiBlbmQgdXAgaW4gYSBsb2NhdGlvbiBhbmQgZm9ybWF0IHRoYXQgdGhlIHJ1bm5pbmcgc2VydmVyIGNhbiB1c2UgZm9yIGl0cwotICogc2VydmluZyBwdXJwb3Nlcy4KLSAqIDwvcD4KLSAqIDxwPgotICogSW4gdGhpcyBwaWN0dXJlLCBhbiA8Y29kZT5JU2VydmVyPC9jb2RlPiBvYmplY3QgaXMgYSBwcm94eSBmb3IgdGhlIHJlYWwgd2ViCi0gKiBzZXJ2ZXIuIFRocm91Z2ggdGhpcyBwcm94eSwgYSBjbGllbnQgY2FuIGNvbmZpZ3VyZSB0aGUgc2VydmVyLCBhbmQgc3RhcnQsCi0gKiBzdG9wLCBhbmQgcmVzdGFydCBpdC4KLSAqIDwvcD4KLSAqIDxwPgotICogSVNlcnZlckF0dHJpYnV0ZXMgaW1wbGVtZW50cyBJQWRhcHRhYmxlIHRvIGFsbG93IHVzZXJzIHRvIG9idGFpbiBhCi0gKiBzZXJ2ZXItdHlwZS1zcGVjaWZpYyBjbGFzcy4gQnkgY2FzdGluZyB0aGUgcnVudGltZSBleHRlbnNpb24gdG8gdGhlIHR5cGUKLSAqIHByZXNjcmliZWQgaW4gdGhlIEFQSSBkb2N1bWVudGF0aW9uIGZvciB0aGF0IHBhcnRpY3VsYXIgc2VydmVyIHR5cGUsIHRoZQotICogY2xpZW50IGNhbiBhY2Nlc3Mgc2VydmVyLXR5cGUtc3BlY2lmaWMgcHJvcGVydGllcyBhbmQgbWV0aG9kcy4KLSAqIGdldEFkYXB0ZXIoKSBtYXkgaW52b2x2ZSBwbHVnaW4gbG9hZGluZywgYW5kIHNob3VsZCBub3QgYmUgY2FsbGVkIGZyb20KLSAqIHBvcHVwIG1lbnVzLCBldGMuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRoZSBzZXJ2ZXIgZnJhbWV3b3JrIG1haW50YWlucyBhIGdsb2JhbCBsaXN0IG9mIGFsbCBrbm93biBzZXJ2ZXIgaW5zdGFuY2VzCi0gKiAoe0BsaW5rIFNlcnZlckNvcmUjZ2V0U2VydmVycygpfSkuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFtyb3VnaCBub3RlczoKLSAqIFNlcnZlciBoYXMgYSBzdGF0ZS4KLSAqIFNlcnZlciBjYW4gYmUgc3RhcnRlZCwgc3RvcHBlZCwgYW5kIHJlc3RhcnRlZC4KLSAqIFRvIG1vZGlmeSBzZXJ2ZXIgYXR0cmlidXRlcywgZ2V0IGEgd29ya2luZyBjb3B5LCBtb2RpZnkgaXQsIGFuZCB0aGVuIHNhdmUgaXQKLSAqIHRvIGNvbW1pdCB0aGUgY2hhbmdlcy4KLSAqIFNlcnZlciBhdHRyaWJ1dGVzLiBTZXJpYWxpemF0aW9uLgotICogQ2hhaW5lZCB3b3JraW5nIGNvcGllcyBmb3IgcnVudGltZSwgc2VydmVyIGNvbmZpZ3VyYXRpb24uCi0gKiBTZXJ2ZXIgaGFzIGEgc2V0IG9mIHJvb3QgbW9kdWxlcy4KLSAqIE1vZHVsZXMgaGF2ZSBzdGF0ZSB3cnQgYSBzZXJ2ZXIuCi0gKiBSZXN0YXJ0aW5nIG1vZHVsZXMuXQotICogPC9wPgotICogPHA+Ci0gKiBUd28gc2VydmVycyBhcmUgaWRlbnRpY2FsIGlmIGFuZCBvbmx5IGlmIHRoZXkgaGF2ZSB0aGUgc2FtZSBpZC4KLSAqIDwvcD4KLSAqIAotICogPHA+VGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuPC9wPgotICogCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVNlcnZlckF0dHJpYnV0ZXMgZXh0ZW5kcyBJQWRhcHRhYmxlIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkaXNwbGF5YWJsZSBuYW1lIGZvciB0aGlzIHNlcnZlci4KLQkgKiA8cD4KLQkgKiBOb3RlIHRoYXQgdGhpcyBuYW1lIGlzIGFwcHJvcHJpYXRlIGZvciB0aGUgY3VycmVudCBsb2NhbGUuCi0JICogPC9wPgotCSAqCi0JICogQHJldHVybiBhIGRpc3BsYXlhYmxlIG5hbWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpZCBvZiB0aGlzIHNlcnZlci4KLQkgKiBFYWNoIHNlcnZlciAob2YgYSBnaXZlbiB0eXBlKSBoYXMgYSBkaXN0aW5jdCBpZCwgZml4ZWQgZm9yCi0JICogaXRzIGxpZmV0aW1lLiBJZHMgYXJlIGludGVuZGVkIHRvIGJlIHVzZWQgaW50ZXJuYWxseSBhcyBrZXlzOwotCSAqIHRoZXkgYXJlIG5vdCBpbnRlbmRlZCB0byBiZSBzaG93biB0byBlbmQgdXNlcnMuCi0JICogCi0JICogQHJldHVybiB0aGUgc2VydmVyIGlkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogRGVsZXRlcyB0aGUgcGVyc2lzdGVudCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHNlcnZlci4KLQkgKiAKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gaWYgdGhlcmUgd2FzIGFueSBlcnJvciByZWNlaXZlZCB3aGlsZSBkZWxldGluZyB0aGUgc2VydmVyCi0JICogICAgb3IgaWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkIG9uIGEgd29ya2luZyBjb3B5Ci0JICovCi0JcHVibGljIHZvaWQgZGVsZXRlKCkgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBzZXJ2ZXIgaXMgbWFya2VkIHJlYWQgb25seS4KLQkgKiBXaGVuIGEgc2VydmVyIGlzIHJlYWQgb25seSwgd29ya2luZyBjb3BpZXMgY2FuIGJlIGNyZWF0ZWQgYnV0Ci0JICogdGhleSBjYW5ub3QgYmUgc2F2ZWQuCi0JICoKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgc2VydmVyIGlzIG1hcmtlZCBhcyByZWFkIG9ubHksCi0JICogICAgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBpcyBhIHdvcmtpbmcgY29weS4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgc2VydmVyIGlzIGEgd29ya2luZyBjb3B5LAotCSAqICAgIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNXb3JraW5nQ29weSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhbiBvYmplY3Qgd2hpY2ggaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGdpdmVuIGNsYXNzCi0JICogYXNzb2NpYXRlZCB3aXRoIHRoaXMgb2JqZWN0LiBSZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IGlmCi0JICogbm8gc3VjaCBvYmplY3QgY2FuIGJlIGZvdW5kLCBvciBpZiB0aGUgZGVsZWdhdGUgaXMgbm90Ci0JICogbG9hZGVkLgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgbm90IGNoZWNrIHRoZSBkZWxlZ2F0ZSBjbGFzc2VzIGZvciBhZGFwdGluZwotCSAqIHVubGVzcyB0aGV5IGFyZSBhbHJlYWR5IGxvYWRlZC4gTm8gcGx1Z2luIGxvYWRpbmcgd2lsbCBvY2N1cgotCSAqIHdoZW4gY2FsbGluZyB0aGlzIG1ldGhvZC4gSXQgaXMgc3VpdGFibGUgZm9yIHBvcHVwIG1lbnVzIGFuZAotCSAqIG90aGVyIFVJIGFydGlmYWN0cyB3aGVyZSBwZXJmb3JtYW5jZSBpcyBhIGNvbmNlcm4uCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyIHRoZSBhZGFwdGVyIGNsYXNzIHRvIGxvb2sgdXAKLQkgKiBAcmV0dXJuIGEgb2JqZWN0IGNhc3RhYmxlIHRvIHRoZSBnaXZlbiBjbGFzcywgCi0JICogICAgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBvYmplY3QgZG9lcyBub3QKLQkgKiAgICBoYXZlIGFuIGFkYXB0ZXIgZm9yIHRoZSBnaXZlbiBjbGFzcwotCSAqIEBzZWUgSUFkYXB0YWJsZSNnZXRBZGFwdGVyKENsYXNzKQotCSAqIEBzZWUgI2xvYWRBZGFwdGVyKENsYXNzLCBJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKTsKLQotCS8qKgotCSAqIFJldHVybnMgYW4gb2JqZWN0IHdoaWNoIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBnaXZlbiBjbGFzcwotCSAqIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG9iamVjdC4gUmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPiBvbmx5IGlmCi0JICogbm8gc3VjaCBvYmplY3QgY2FuIGJlIGZvdW5kIGFmdGVyIGxvYWRpbmcgYW5kIGluaXRpYWxpemluZwotCSAqIGRlbGVnYXRlcy4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCB3aWxsIGZvcmNlIGEgbG9hZCBhbmQgaW5pdGlhbGl6YXRpb24gb2YgYWxsIGRlbGVnYXRlCi0JICogY2xhc3NlcyBhbmQgY2hlY2sgdGhlbSBmb3IgYWRhcHRpbmcuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyIHRoZSBhZGFwdGVyIGNsYXNzIHRvIGxvb2sgdXAKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCi0JICogICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCi0JICogQHJldHVybiBhIG9iamVjdCBjYXN0YWJsZSB0byB0aGUgZ2l2ZW4gY2xhc3MsIAotCSAqICAgIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMgb2JqZWN0IGRvZXMgbm90Ci0JICogICAgaGF2ZSBhbiBhZGFwdGVyIGZvciB0aGUgZ2l2ZW4gY2xhc3MKLQkgKiBAc2VlICNnZXRBZGFwdGVyKENsYXNzKQotCSAqLwotCXB1YmxpYyBPYmplY3QgbG9hZEFkYXB0ZXIoQ2xhc3MgYWRhcHRlciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGhvc3QgZm9yIHRoZSBzZXJ2ZXIuCi0JICogVGhlIGZvcm1hdCBvZiB0aGUgaG9zdCBjYW4gYmUgZWl0aGVyIGEgcXVhbGlmaWVkIG9yIHVucXVhbGlmaWVkIGhvc3RuYW1lLAotCSAqIG9yIGFuIElQIGFkZHJlc3MgYW5kIG11c3QgY29uZm9ybSB0byBSRkMgMjczMi4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgaG9zdCBzdHJpbmcgY29uZm9ybWluZyB0byBSRkMgMjczMgotCSAqIEBzZWUgamF2YS5uZXQuVVJMI2dldEhvc3QoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SG9zdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcnVudGltZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBzZXJ2ZXIuCi0JICogPHA+Ci0JICogTm90ZTogVGhlIHJ1bnRpbWUgb2YgYSBzZXJ2ZXIgd29ya2luZyBjb3B5IG1heSBvciBtYXkgbm90Ci0JICogYmUgYSB3b3JraW5nIGNvcHkuIEZvciBhIHNlcnZlciBpbnN0YW5jZSB0aGF0IGlzIG5vdCBhCi0JICogd29ya2luZyBjb3B5LCB0aGUgcnVudGltZSBpbnN0YW5jZSBpcyBub3QgYSB3b3JraW5nIGNvcHkKLQkgKiBlaXRoZXIuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFtpc3N1ZTogQWNjb3JkaW5nIHRvIHNlcnZlclR5cGUgZXh0ZW5zaW9uIHBvaW50LCAKLQkgKiBydW50aW1lVHlwZUlkIGlzIGEgbWFuZGF0b3J5IGF0dHJpYnV0ZS4gSXQgc2VlbXMgb2RkCi0JICogdGhlbiB0byBoYXZlIHNlcnZlciBydW50aW1lIGluc3RhbmNlIGJlaW5nIGFuCi0JICogb3B0aW9uYWwgcHJvcGVydHkgb2Ygc2VydmVyIGluc3RhbmNlLiBXaGF0IGRvZXMgaXQgbWVhbgotCSAqIGZvciBhIHNlcnZlciB0byBub3QgaGF2ZSBhIHJ1bnRpbWU/XQotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBydW50aW1lLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICovCi0JcHVibGljIElSdW50aW1lIGdldFJ1bnRpbWUoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0eXBlIG9mIHRoaXMgc2VydmVyLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHNlcnZlciB0eXBlCi0JICogQHNlZSBJU2VydmVyVHlwZQotCSAqLwotCXB1YmxpYyBJU2VydmVyVHlwZSBnZXRTZXJ2ZXJUeXBlKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2VydmVyIGNvbmZpZ3VyYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgc2VydmVyLgotCSAqIDxwPgotCSAqIE5vdGU6IFRoZSBzZXJ2ZXIgY29uZmlndXJhdGlvbiBvZiBhIHNlcnZlciB3b3JraW5nIGNvcHkgbWF5Ci0JICogb3IgbWF5IG5vdCBiZSBhIHdvcmtpbmcgY29weS4gRm9yIGEgc2VydmVyIGluc3RhbmNlIHRoYXQgaXMKLQkgKiBub3QgYSB3b3JraW5nIGNvcHksIHRoZSBzZXJ2ZXIgY29uZmlndXJhdGlvbiBpbnN0YW5jZSBpcyBub3QKLQkgKiBhIHdvcmtpbmcgY29weSBlaXRoZXIuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFtpc3N1ZTogQWNjb3JkaW5nIHRvIHNlcnZlclR5cGUgZXh0ZW5zaW9uIHBvaW50LCAKLQkgKiBjb25maWd1cmF0aW9uVHlwZUlkIGlzIGFuIG9wdGlvbmFsIGF0dHJpYnV0ZS4gSWYgYSBzZXJ2ZXIgdHlwZQotCSAqIGhhcyBubyBzZXJ2ZXIgY29uZmlndXJhdGlvbiB0eXBlLCB0aGVuIGl0IHNlZW1zIHJlYXNvbmFibGUgdG8gCi0JICogZXhwZWN0IHRoaXMgbWV0aG9kIHRvIHJldHVybiBudWxsIGZvciBhbGwgaW5zdGFuY2VzIG9mIHRoYXQgc2VydmVyCi0JICogdHlwZS4gQnV0IHdoYXQgYWJvdXQgYSBzZXJ2ZXIgdHlwZSB0aGF0IGV4cGxpY2l0bHkgc3BlY2lmaWVzCi0JICogYSBzZXJ2ZXIgY29uZmlndXJhdGlvbiB0eXBlLiBEb2VzIHRoYXQgbWVhbiB0aGF0IGFsbCBzZXJ2ZXIKLQkgKiBpbnN0YW5jZXMgb2YgdGhhdCBzZXJ2ZXIgdHlwZSBtdXN0IGhhdmUgYSBzZXJ2ZXIgY29uZmlndXJhdGlvbgotCSAqIGluc3RhbmNlIG9mIHRoYXQgc2VydmVyIGNvbmZpZ3VyYXRpb24gdHlwZSwgYW5kIHRoYXQgdGhpcyBtZXRob2QKLQkgKiBuZXZlciByZXR1cm5zIG51bGwgaW4gdGhvc2UgY2FzZXM/XQotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzZXJ2ZXIgY29uZmlndXJhdGlvbiwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotCSAqLwotCXB1YmxpYyBJRm9sZGVyIGdldFNlcnZlckNvbmZpZ3VyYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBzZXJ2ZXIgd29ya2luZyBjb3B5IGZvciBtb2RpZnlpbmcgdGhpcyBzZXJ2ZXIgaW5zdGFuY2UuCi0JICogSWYgdGhpcyBpbnN0YW5jZSBpcyBhbHJlYWR5IGEgd29ya2luZyBjb3B5LCBpdCBpcyByZXR1cm5lZC4KLQkgKiBJZiB0aGlzIGluc3RhbmNlIGlzIG5vdCBhIHdvcmtpbmcgY29weSwgYSBuZXcgc2VydmVyIHdvcmtpbmcgY29weQotCSAqIGlzIGNyZWF0ZWQgd2l0aCB0aGUgc2FtZSBpZCBhbmQgYXR0cmlidXRlcy4KLQkgKiBDbGllbnRzIGFyZSByZXNwb25zaWJsZSBmb3Igc2F2aW5nIG9yIHJlbGVhc2luZyB0aGUgd29ya2luZyBjb3B5IHdoZW4KLQkgKiB0aGV5IGFyZSBkb25lIHdpdGggaXQuCi0JICogPHA+Ci0JICogVGhlIHNlcnZlciB3b3JraW5nIGNvcHkgaXMgcmVsYXRlZCB0byB0aGlzIHNlcnZlciBpbnN0YW5jZQotCSAqIGluIHRoZSBmb2xsb3dpbmcgd2F5czoKLQkgKiA8cHJlPgotCSAqIHRoaXMuZ2V0V29ya2luZ0NvcHkoKS5nZXRJZCgpID09IHRoaXMuZ2V0SWQoKQotCSAqIHRoaXMuZ2V0V29ya2luZ0NvcHkoKS5nZXRGaWxlKCkgPT0gdGhpcy5nZXRGaWxlKCkKLQkgKiB0aGlzLmdldFdvcmtpbmdDb3B5KCkuZ2V0T3JpZ2luYWwoKSA9PSB0aGlzCi0JICogdGhpcy5nZXRXb3JraW5nQ29weSgpLmdldFJ1bnRpbWUoKSA9PSB0aGlzLmdldFJ1bnRpbWUoKQotCSAqIHRoaXMuZ2V0V29ya2luZ0NvcHkoKS5nZXRTZXJ2ZXJDb25maWd1cmF0aW9uKCkgPT0gdGhpcy5nZXRTZXJ2ZXJDb25maWd1cmF0aW9uKCkKLQkgKiA8L3ByZT4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogW2lzc3VlOiBJU2VydmVyV29ya2luZ0NvcHkgZXh0ZW5kcyBJU2VydmVyLiAKLQkgKiBTZXJ2ZXIuZ2V0V29ya2luZ0NvcHkoKSBjcmVhdGUgYSBuZXcgd29ya2luZyBjb3B5OwotCSAqIFNlcnZlcldvcmtpbmdDb3B5LmdldFdvcmtpbmdDb3B5KCkgcmV0dXJucyB0aGlzLgotCSAqIFRoaXMgbWF5IGJlIGNvbnZlbmllbnQgaW4gY29kZSB0aGF0IGlzIGlnbm9yYW50IG9mCi0JICogd2hldGhlciB0aGV5IGFyZSBkZWFsaW5nIHdpdGggYSB3b3JraW5nIGNvcHkgb3Igbm90LgotCSAqIEhvd2V2ZXIsIGl0IGlzIGhhcmQgZm9yIGNsaWVudHMgdG8gbWFuYWdlIHdvcmtpbmcgY29waWVzCi0JICogd2l0aCB0aGlzIGRlc2lnbi5dCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gYSBuZXcgd29ya2luZyBjb3B5Ci0JICovCi0JcHVibGljIElTZXJ2ZXJXb3JraW5nQ29weSBjcmVhdGVXb3JraW5nQ29weSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhbiBhcnJheSBvZiB1c2VyIG1vZHVsZXMgdGhhdCBhcmUgY3VycmVudGx5IGNvbmZpZ3VyZWQgb24KLQkgKiB0aGUgc2VydmVyLiBXaGVuIHRoZSBzZXJ2ZXIgaXMgcHVibGlzaGVkLCB0aGVzZSBhcmUgdGhlIHByb2plY3RzCi0JICogdGhhdCB3aWxsIGJlIGNvbmZpZ3VyZWQgb24gdGhlIHNlcnZlci4gVGhpcyBtZXRob2QgbWF5IG5vdCByZXR1cm4KLQkgKiB0aGUgbGlzdCBvZiBwcm9qZWN0cyB0aGF0IGFyZSBjdXJyZW50bHkgb24gdGhlIHNlcnZlciBpZiBhIG1vZHVsZQotCSAqIGhhcyBiZWVuIGFkZGVkIHNpbmNlIHRoZSBsYXN0IHB1Ymxpc2guCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgcm9vdCBtb2R1bGVzLCB3aGljaCBhcmUgbm90IHBhcmVudGVkIHdpdGhpbgotCSAqIGFub3RoZXIgbW9kdWxlcy4gRWFjaCBvZiB0aGVzZSBtYXkgY29udGFpbiBjaGlsZCBtb2R1bGVzLCB3aGljaCBhcmUKLQkgKiBhbHNvIGRlcGxveWVkIHRvIHRoaXMgc2VydmVyLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgcG9zc2libHktZW1wdHkgYXJyYXkgb2YgbW9kdWxlcwotCSAqLwotCXB1YmxpYyBJTW9kdWxlW10gZ2V0TW9kdWxlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgbW9kdWxlIG1vZGlmaWNhdGlvbnMgY291bGQgYmUgbWFkZSB0byB0aGlzCi0JICogc2VydmVyIGF0IHRoaXMgdGltZS4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBtYXkgZGVjaWRlIGJhc2VkIG9uIHRoZSB0eXBlIG9mIG1vZHVsZQotCSAqIG9yIHJlZnVzZSBzaW1wbHkgZHVlIHRvIHJlYWNoaW5nIGEgbWF4aW11bSBudW1iZXIgb2YKLQkgKiBtb2R1bGVzIG9yIG90aGVyIGNyaXRlcmlhLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBbaXNzdWU6IFRoaXMgc2VlbXMgb2RkIHRvIGhhdmUgYSBwcmUtZmxpZ2h0IG1ldGhvZC4KLQkgKiBJIHNob3VsZCBleHBlY3QgdGhhdCB0aGUgY2xpZW50IGNhbiBwcm9wb3NlIG1ha2luZwotCSAqIGFueSBzZXQgb2YgbW9kdWxlIGNoYW5nZXMgdGhleSBkZXNpcmUgKHZpYSBhIHNlcnZlcgotCSAqIHdvcmtpbmcgY29weSkuIElmIHRoZSBzZXJ2ZXIgZG9lc24ndCBsaWtlIGl0LCB0aGUgb3BlcmF0aW9uCi0JICogc2hvdWxkIGZhaWwuXQotCSAqIDwvcD4KLQkgKgotCSAqIEBwYXJhbSBhZGQgYSBwb3NzaWJseS1lbXB0eSBsaXN0IG9mIG1vZHVsZXMgdG8gYWRkCi0JICogQHBhcmFtIHJlbW92ZSBhIHBvc3NpYmx5LWVtcHR5IGxpc3Qgb2YgbW9kdWxlcyB0byByZW1vdmUKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCi0JICogICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcHJvcG9zZWQgbW9kaWZpY2F0aW9ucwotCSAqIGxvb2sgZmVhc2libGUsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIElTdGF0dXMgY2FuTW9kaWZ5TW9kdWxlcyhJTW9kdWxlW10gYWRkLCBJTW9kdWxlW10gcmVtb3ZlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY2hpbGQgbW9kdWxlKHMpIG9mIHRoaXMgbW9kdWxlLiBJZiB0aGlzCi0JICogbW9kdWxlIGNvbnRhaW5zIG90aGVyIG1vZHVsZXMsIGl0IHNob3VsZCBsaXN0IHRob3NlCi0JICogbW9kdWxlcy4gSWYgbm90LCBpdCBzaG91bGQgcmV0dXJuIGFuIGVtcHR5IGxpc3QuCi0JICoKLQkgKiA8cD5UaGlzIG1ldGhvZCBzaG91bGQgb25seSByZXR1cm4gdGhlIGRpcmVjdCBjaGlsZHJlbi4KLQkgKiBUbyBvYnRhaW4gdGhlIGZ1bGwgbW9kdWxlIHRyZWUsIHRoaXMgbWV0aG9kIG1heSBiZQotCSAqIHJlY3Vyc2l2ZWx5IGNhbGxlZCBvbiB0aGUgY2hpbGRyZW4uPC9wPgotCSAqCi0JICogQHBhcmFtIG1vZHVsZSBhIG1vZHVsZQotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGRpcmVjdCBtb2R1bGUgY2hpbGRyZW4KLQkgKi8KLQlwdWJsaWMgSU1vZHVsZVtdIGdldENoaWxkTW9kdWxlcyhJTW9kdWxlIG1vZHVsZVtdLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFyZW50IG1vZHVsZShzKSBvZiB0aGlzIG1vZHVsZS4gV2hlbiBkZXRlcm1pbmluZyBpZiBhIGdpdmVuCi0JICogcHJvamVjdCBjYW4gcnVuIG9uIGEgc2VydmVyLCB0aGlzIG1ldGhvZCB3aWxsIGJlIHVzZWQgdG8gZmluZCB0aGUgYWN0dWFsCi0JICogbW9kdWxlKHMpIHRoYXQgbWF5IGJlIHJ1biBvbiB0aGUgc2VydmVyLiBGb3IgaW5zdGFuY2UsIGEgV2ViIG1vZHVsZSBtYXkKLQkgKiByZXR1cm4gYSBsaXN0IG9mIEVBUiBtb2R1bGVzIHRoYXQgaXQgaXMgY29udGFpbmVkIGluIGlmIHRoZSBzZXJ2ZXIgb25seQotCSAqIHN1cHBvcnRzIGNvbmZpZ3VyaW5nIEVBUiBtb2R1bGVzLgotCSAqCi0JICogPHA+SWYgdGhlIG1vZHVsZSB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQsIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIG51bGwuCi0JICogSWYgdGhlIHR5cGUgaXMgbm9ybWFsbHkgc3VwcG9ydGVkIGJ1dCB0aGVyZSBpcyBhIGNvbmZpZ3VyYXRpb24KLQkgKiBwcm9ibGVtIG9yIG1pc3NpbmcgcGFyZW50LCBldGMuLCB0aGlzIG1ldGhvZCB3aWxsIGZpcmUgYSBDb3JlRXhjZXB0aW9uCi0JICogdGhhdCBtYXkgdGhlbiBiZSBwcmVzZW50ZWQgdG8gdGhlIHVzZXIuPC9wPgotCSAqCi0JICogPHA+SWYgaXQgZG9lcyByZXR1cm4gdmFsaWQgcGFyZW50KHMpLCB0aGlzIG1ldGhvZCB3aWxsIGFsd2F5cyByZXR1cm4KLQkgKiB0aGUgdG9wbW9zdCBwYXJlbnQgbW9kdWxlKHMpLCBldmVuIGlmIHRoZXJlIGFyZSBhIGZldyBsZXZlbHMKLQkgKiAoYSBoZWlyYXJjaHkpIG9mIG1vZHVsZXMuPC9wPgotCSAqCi0JICogQHBhcmFtIG1vZHVsZSBhIG1vZHVsZQotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHBvc3NpYmxlIHJvb3QgbW9kdWxlcwotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHByb2JsZW0KLQkgKi8KLQlwdWJsaWMgSU1vZHVsZVtdIGdldFJvb3RNb2R1bGVzKElNb2R1bGUgbW9kdWxlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogUmV0dXJucyBhbiBhcnJheSBvZiBTZXJ2ZXJQb3J0cyB0aGF0IHRoaXMgc2VydmVyIGhhcy4KLQkgKiAKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCi0JICogICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCi0JICogQHJldHVybiBhIHBvc3NpYmx5IGVtcHR5IGFycmF5IG9mIHNlcnZlcnMgcG9ydHMKLQkgKi8KLQlwdWJsaWMgU2VydmVyUG9ydFtdIGdldFNlcnZlclBvcnRzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcik7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvSVNlcnZlckxpZmVjeWNsZUxpc3RlbmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9JU2VydmVyTGlmZWN5Y2xlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJjMjBiOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9JU2VydmVyTGlmZWN5Y2xlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlOwotLyoqCi0gKiBMaXN0ZW5lciBpbnRlcmZhY2UgZm9yIGNoYW5nZXMgdG8gc2VydmVycy4KLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgaXMgZmlyZWQgd2hlbmV2ZXIgYSBzZXJ2ZXIgaXMgYWRkZWQsIG1vZGlmaWVkLCBvciByZW1vdmVkLgotICogQWxsIGV2ZW50cyBhcmUgZmlyZWQgcG9zdC1jaGFuZ2UsIHNvIHRoYXQgYWxsIHNlcnZlciB0b29scyBBUEkgY2FsbGVkIGFzIGEKLSAqIHJlc3VsdCBvZiB0aGUgZXZlbnQgd2lsbCByZXR1cm4gdGhlIHVwZGF0ZWQgcmVzdWx0cy4gKGZvciBleGFtcGxlLCBvbgotICogc2VydmVyQWRkZWQgdGhlIG5ldyBzZXJ2ZXIgd2lsbCBiZSBpbiB0aGUgZ2xvYmFsIGxpc3Qgb2Ygc2VydmVycwotICogKHtAbGluayBTZXJ2ZXJDb3JlI2dldFNlcnZlcnMoKX0pLCBhbmQgb24gc2VydmVyUmVtb3ZlZCB0aGUgc2VydmVyIHdpbGwKLSAqIG5vdCBiZSBpbiB0aGUgbGlzdC4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBTZXJ2ZXJDb3JlCi0gKiBAc2VlIElTZXJ2ZXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJU2VydmVyTGlmZWN5Y2xlTGlzdGVuZXIgewotCS8qKgotCSAqIEEgbmV3IHNlcnZlciBoYXMgYmVlbiBjcmVhdGVkLgotCSAqCi0JICogQHBhcmFtIHNlcnZlciB0aGUgbmV3IHNlcnZlcgotCSAqLwotCXB1YmxpYyB2b2lkIHNlcnZlckFkZGVkKElTZXJ2ZXIgc2VydmVyKTsKLQotCS8qKgotCSAqIEFuIGV4aXN0aW5nIHNlcnZlciBoYXMgYmVlbiB1cGRhdGVkIG9yIG1vZGlmaWVkLgotCSAqCi0JICogQHBhcmFtIHNlcnZlciB0aGUgbW9kaWZpZWQgc2VydmVyCi0JICovCi0JcHVibGljIHZvaWQgc2VydmVyQ2hhbmdlZChJU2VydmVyIHNlcnZlcik7Ci0KLQkvKioKLQkgKiBBIGV4aXN0aW5nIHNlcnZlciBoYXMgYmVlbiByZW1vdmVkLgotCSAqCi0JICogQHBhcmFtIHNlcnZlciB0aGUgcmVtb3ZlZCBzZXJ2ZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXJ2ZXJSZW1vdmVkKElTZXJ2ZXIgc2VydmVyKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9JU2VydmVyTGlzdGVuZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL0lTZXJ2ZXJMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODQwNTgxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL0lTZXJ2ZXJMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmU7Ci0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIHVzZWQgYnkgdGhlIHNlcnZlciB0byBicm9hZGNhc3QgYSBjaGFuZ2Ugb2Ygc3RhdGUuCi0gKiBVc3VhbGx5LCB0aGUgY2hhbmdlIG9mIHN0YXRlIHdpbGwgYmUgY2F1c2VkIGJ5IHNvbWUgdXNlciBhY3Rpb24sCi0gKiAoZS5nLiByZXF1ZXN0aW5nIHRvIHN0YXJ0IGEgc2VydmVyKSBob3dldmVyLCBpdCBpcyBlcXVhbGx5IGZpbmUgZm9yCi0gKiBhIHNlcnZlciB0byBicm9hZGNhc3QgYSBjaGFuZ2Ugb2Ygc3RhdGUgdGhyb3VnaCBubyBkaXJlY3QgdXNlciBhY3Rpb24uCi0gKiAoZS5nLiBzdG9wcGluZyBiZWNhdXNlIHRoZSBzZXJ2ZXIgY3Jhc2hlZCkgVGhpcyBpbmZvcm1hdGlvbiBjYW4gYmUKLSAqIHVzZWQgdG8gaW5mb3JtIHRoZSB1c2VyIG9mIHRoZSBjaGFuZ2Ugb3IgdXBkYXRlIHRoZSBVSS4KLSAqCi0gKiA8cD5Ob3RlOiBUaGUgc2VydmVyIGxpc3RlbmVyIGV2ZW50IE1VU1QgTk9UIGRpcmVjdGx5IGJlIHVzZWQgdG8gbW9kaWZ5Ci0gKiB0aGUgc2VydmVyJ3Mgb3IgbW9kdWxlJ3Mgc3RhdGUgdmlhIG9uZSBvZiB0aGUgc2VydmVyJ3MgbWV0aG9kLiBGb3IgZXhhbXBsZSwgCi0gKiBhIHNlcnZlciBzdG9wcGVkIGV2ZW50IGNhbm5vdCBkaXJlY3RseSB0cmlnZ2VyIGEgc3RhcnQoKS4gRG9pbmcgdGhpcyBtYXkgCi0gKiBjYXVzZSB0aGUgdGhyZWFkIHRvIGhhbmcuPC9wPgotICogICAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJU2VydmVyTGlzdGVuZXIgewotCS8qKgotCSAqIEEgc2VydmVyIG9yIG1vZHVsZSBoYXMgYmVlbiBjaGFuZ2VkIGFzIHNwZWNpZmllZCBpbiB0aGUgZXZlbnQuCi0JICogCi0JICogQHBhcmFtIGV2ZW50IGEgc2VydmVyIGV2ZW50IHRoYXQgY29udGFpbnMgaW5mb3JtYXRpb24gb24gdGhlIGNoYW5nZQotCSAqLwotCXB1YmxpYyB2b2lkIHNlcnZlckNoYW5nZWQoU2VydmVyRXZlbnQgZXZlbnQpOyAKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9JU2VydmVyVHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvSVNlcnZlclR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBhMmQ2ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9JU2VydmVyVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci0vKioKLSAqIFJlcHJlc2VudHMgYSBzZXJ2ZXIgdHlwZSBmcm9tIHdoaWNoIHNlcnZlciBpbnN0YW5jZXMgY2FuIGJlIGNyZWF0ZWQuCi0gKiA8cD4KLSAqIFRoZSBzZXJ2ZXIgY29yZSBmcmFtZXdvcmsgc3VwcG9ydHMKLSAqIGFuIG9wZW4tZW5kZWQgc2V0IG9mIHNlcnZlciB0eXBlcywgd2hpY2ggYXJlIGNvbnRyaWJ1dGVkIHZpYQotICogdGhlIDxjb2RlPnNlcnZlclR5cGVzPC9jb2RlPiBleHRlbnNpb24gcG9pbnQgaW4gdGhlIHNlcnZlciBjb3JlCi0gKiBwbHVnLWluLiBTZXJ2ZXIgdHlwZSBvYmplY3RzIGNhcnJ5IG5vIHN0YXRlIChhbGwgaW5mb3JtYXRpb24gaXMKLSAqIHJlYWQtb25seSBhbmQgaXMgc3VwcGxpZWQgYnkgdGhlIHNlcnZlciB0eXBlIGRlY2xhcmF0aW9uKS4KLSAqIFRoZSBnbG9iYWwgbGlzdCBvZiBrbm93biBzZXJ2ZXIgdHlwZXMgaXMgYXZhaWxhYmxlIHZpYQotICoge0BsaW5rIFNlcnZlckNvcmUjZ2V0U2VydmVyVHlwZXMoKX0uIAotICogPC9wPgotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqIDxwPgotICogVHdvIHNlcnZlciB0eXBlcyBhcmUgaWRlbnRpY2FsIGlmIGFuZCBvbmx5IGlmIHRoZXkgaGF2ZSB0aGUgc2FtZSBpZC4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTZXJ2ZXJUeXBlIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpZCBvZiB0aGlzIHNlcnZlciB0eXBlLgotCSAqIEVhY2gga25vd24gc2VydmVyIHR5cGUgaGFzIGEgZGlzdGluY3QgaWQuIAotCSAqIElkcyBhcmUgaW50ZW5kZWQgdG8gYmUgdXNlZCBpbnRlcm5hbGx5IGFzIGtleXM7IHRoZXkgYXJlIG5vdAotCSAqIGludGVuZGVkIHRvIGJlIHNob3duIHRvIGVuZCB1c2Vycy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzZXJ2ZXIgdHlwZSBpZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRpc3BsYXlhYmxlIG5hbWUgZm9yIHRoaXMgc2VydmVyIHR5cGUuCi0JICogPHA+Ci0JICogTm90ZSB0aGF0IHRoaXMgbmFtZSBpcyBhcHByb3ByaWF0ZSBmb3IgdGhlIGN1cnJlbnQgbG9jYWxlLgotCSAqIDwvcD4KLQkgKgotCSAqIEByZXR1cm4gYSBkaXNwbGF5YWJsZSBuYW1lIGZvciB0aGlzIHNlcnZlciB0eXBlCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkaXNwbGF5YWJsZSBkZXNjcmlwdGlvbiBmb3IgdGhpcyBzZXJ2ZXIgdHlwZS4KLQkgKiA8cD4KLQkgKiBOb3RlIHRoYXQgdGhpcyBkZXNjcmlwdGlvbiBpcyBhcHByb3ByaWF0ZSBmb3IgdGhlIGN1cnJlbnQgbG9jYWxlLgotCSAqIDwvcD4KLQkgKgotCSAqIEByZXR1cm4gYSBkaXNwbGF5YWJsZSBkZXNjcmlwdGlvbiBmb3IgdGhpcyBzZXJ2ZXIgdHlwZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHR5cGUgb2Ygc2VydmVyIHJ1bnRpbWUgdGhhdCB0aGlzIHR5cGUKLQkgKiBvZiBzZXJ2ZXIgcmVxdWlyZXMuCi0JICogPHA+Ci0JICogW2lzc3VlOiAicnVudGltZVR5cGVJZCIgaXMgbWFuZGF0b3J5IGFjY29yZGluZyB0aGUKLQkgKiBzZXJ2ZXJUeXBlcyBzY2hlbWEuIFRoaXMgc3VnZ2VzdHMgdGhhdCBhbGwgdHlwZXMKLQkgKiBvZiBzZXJ2ZXJzIGhhdmUgYSBzZXJ2ZXIgcnVudGltZS4gQnV0IHRoZXJlIGlzIGFsc28KLQkgKiBhIGJvb2xlYW4gInJ1bnRpbWUiIGF0dHJpYnV0ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlCi0JICogc2VydmVyIHJlcXVpcmVzIGEgcnVudGltZS4gSSBzdXBlY3QgdGhhdCBzZXJ2ZXIgdHlwZQotCSAqIGhhcyBhbiBvcHRpb25hbCBzZXJ2ZXIgcnVudGltZSwgaW4gd2hpY2ggY2FzZSB5b3UKLQkgKiBjYW4gbWFrZSAicnVudGltZVR5cGVJZCIgb3B0aW9uYWwgYW5kIGRpc3BlbnNlIHdpdGgKLQkgKiAicnVudGltZSIuXQotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBbaXNzdWU6IERvZXMgaXQgcmVhbGx5IG1ha2Ugc2Vuc2UgZm9yCi0JICogcnVudGltZVR5cGVzIGFuZCBzZXJ2ZXJUeXBlcyBiZSBzZXBhcmF0ZSBleHRlbnNpb24KLQkgKiBwb2ludHM/IFdvdWxkIGl0IG5vdCBiZSBzdWZmaWNpZW50IHRvIGhhdmUgdGhlIHBhcnR5IGRlY2xhcmluZwotCSAqIHRoZSBzZXJ2ZXIgdHlwZSBhbHNvIGRlY2xhcmUgdGhlIHNlcnZlciBydW50aW1lIHR5cGU/Ci0JICogSGF2aW5nIHJ1bnRpbWVUeXBlIGFzIGEgc2VwYXJhdGUgZXh0ZW5zaW9uIHBvaW50Ci0JICogb25seSBtYWtlcyBzZW5zZSBpZiBpdCB3b3VsZCBiZSBwb3NzaWJsZSBpbiBwcmluY2lwbGUgdG8gCi0JICogZGVjbGFyZSBhIHNlcnZlciBydW50aW1lIHR5cGUgdGhhdCBjb3VsZCBhY3R1YWxseSBiZQotCSAqIHVzZWQgb24gc2VydmVyYWwgc2VydmVyIHR5cGVzLiBJZiBzZXJ2ZXIgcnVudGltZXMKLQkgKiBhbHdheXMgZW5kIHVwIGJlaW5nIHNlcnZlci10eXBlIHNwZWNpZmljLCBpdCB3b3VsZCBiZSBiZXR0ZXIKLQkgKiB0byBjb21iaW5lIHRoZW0uXQotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBbaXNzdWU6IFdoYXQgc2hvdWxkIGhhcHBlbiB3aGVuIGEgc2VydmVyIHR5cGUgbWVudGlvbnMKLQkgKiB0aGUgaWQgb2YgYSBzZXJ2ZXIgcnVudGltZSB0eXBlIHRoYXQgaXMgbm90IGtub3duCi0JICogdG8gdGhlIHN5c3RlbT9dCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gYSBzZXJ2ZXIgcnVudGltZSB0eXBlCi0JICovCi0JcHVibGljIElSdW50aW1lVHlwZSBnZXRSdW50aW1lVHlwZSgpOwotCQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGlzIHR5cGUgb2Ygc2VydmVyIHJlcXVpcmVzIGEgc2VydmVyCi0JICogcnVudGltZS4KLQkgKiA8cD4KLQkgKiBbaXNzdWU6IFNlZSBpc3N1ZXMgb24gZ2V0UnVudGltZVR5cGUoKS4gSSBzdXNwZWN0IHRoaXMKLQkgKiBtZXRob2QgaXMgdW5uZWNlc3NhcnksIGFuZCB0aGF0IAotCSAqIHRoaXMuZ2V0UnVudGltZVR5cGUoKSAhPSBudWxsIHdpbGwgZG8uXQotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgdHlwZSBvZiBzZXJ2ZXIgcmVxdWlyZXMKLQkgKiBhIHNlcnZlciBydW50aW1lLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGl0IGRvZXMgbm90Ci0JICogQHNlZSAjZ2V0UnVudGltZVR5cGUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc1J1bnRpbWUoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyB0eXBlIG9mIHNlcnZlciBzdXBwb3J0cyB0aGUgZ2l2ZW4gbGF1bmNoIG1vZGUuCi0JICogPHA+Ci0JICogW2lzc3VlOiBJdCBhbHNvIHNlZW1zIG9kZCB0aGF0IHRoaXMgaXMgcGFydCBvZiB0aGUgc2VydmVyIHR5cGUKLQkgKiBkZWNsYXJhdGlvbi4gVGhpcyBtZWFucyB0aGF0IGFueSBzZXJ2ZXIgdHlwZSBoYXMgdG8gY29tbWl0Ci0JICogc28gZWFybHkgb24gd2hpY2ggbW9kZXMgaXQgc3VwcG9ydHMuXQotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbGF1bmNoTW9kZSBhIG1vZGUgaW4gd2hpY2ggYSBzZXJ2ZXIgY2FuIGJlIGxhdW5jaGVkLAotCSAqICAgIG9uZSBvZiB0aGUgbW9kZSBjb25zdGFudHMgZGVmaW5lZCBieQotCSAqICAgIHtAbGluayBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hNYW5hZ2VyfQotCSAqIEByZXR1cm4gd2hldGhlciB0aGlzIHR5cGUgb2Ygc2VydmVyIHN1cHBvcnRzIHRoZSBnaXZlbiBtb2RlCi0JICovCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHNMYXVuY2hNb2RlKFN0cmluZyBsYXVuY2hNb2RlKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGlzIHR5cGUgb2Ygc2VydmVyIHJlcXVpcmVzIGEgc2VydmVyCi0JICogY29uZmlndXJhdGlvbi4KLQkgKiA8cD4KLQkgKiBbaXNzdWU6IEl0J3Mgbm90IGNsZWFyIGhvdyB0aGlzIG1ldGhvZCBkaWZmZXJzIGZyb20gCi0JICogdGhpcy5nZXRTZXJ2ZXJDb25maWd1cmF0aW9uVHlwZSgpICE9IG51bGxdCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyB0eXBlIG9mIHNlcnZlciByZXF1aXJlcwotCSAqICAgIGEgc2VydmVyIGNvbmZpZ3VyYXRpb24sIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgaXQgZG9lcyBub3QKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNTZXJ2ZXJDb25maWd1cmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgdHlwZSBvZiBzZXJ2ZXIgY2FuIHJ1biBvbiBhIHJlbW90ZSBob3N0LgotCSAqIFJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZSBzZXJ2ZXIgdHlwZSBjYW4gb25seSBiZSBydW4gb24gImxvY2FsaG9zdCIKLQkgKiAodGhlIGxvY2FsIG1hY2hpbmUpLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyB0eXBlIG9mIHNlcnZlciBjYW4gcnVuIG9uCi0JICogICAgYSByZW1vdGUgaG9zdCwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBpdCBjYW5ub3QKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1JlbW90ZUhvc3RzKCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIHdvcmtpbmcgY29weSBpbnN0YW5jZSBvZiB0aGlzIHNlcnZlciB0eXBlLgotCSAqIEFmdGVyIHNldHRpbmcgdmFyaW91cyBwcm9wZXJ0aWVzIG9mIHRoZSB3b3JraW5nIGNvcHksCi0JICogdGhlIGNsaWVudCBzaG91bGQgY2FsbCB7QGxpbmsgSVNlcnZlcldvcmtpbmdDb3B5I3NhdmUoYm9vbGVhbiwgSVByb2dyZXNzTW9uaXRvcil9Ci0JICogdG8gYnJpbmcgdGhlIHNlcnZlciBpbnN0YW5jZSBpbnRvIGV4aXN0ZW5jZS4KLQkgKiA8cD4KLQkgKiBbaXNzdWU6IFdoeSBpcyBhIHJ1bnRpbWUgcGFzc2VkIGluPyAKLQkgKiBJU2VydmVyV29ya2luZ0NvcHkuc2V0UnVudGltZShydW50aW1lKSBjb3VsZCBiZSBjYWxsZWQgb24KLQkgKiB0aGUgcmVzdWx0IHRvIGFjY29tcGxpc2ggdGhlIHNhbWUgdGhpbmcuXQotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBbaXNzdWU6IFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCBuZXZlciBjcmVhdGVzIGEgc2VydmVyCi0JICogY29uZmlnIHdvcmtpbmcgY29weSwgd2hlcmVhcyB0aGUgb3RoZXIgb25lIGRvZXMhP10KLQkgKiBDb25zaWRlciBjb21iaW5pbmcgdGhlIG1ldGhvZCB3aXRoIHRoZSBvdGhlci5dCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFRoZSBzZXJ2ZXIgcmV0dXJuZWQgZnJvbSB0aGlzIG1ldGhvZCB3aWxsIGhhdmUgaXQncyBob3N0IHNldCB0bwotCSAqICJsb2NhbGhvc3QiLiBPdGhlciBkZWZhdWx0cyB3aWxsIGJlIHNldCBieSBjYWxsaW5nIHRoZSBzZXJ2ZXIKLQkgKiBkZWxlZ2F0ZSdzIHNldERlZmF1bHRzKCkgbWV0aG9kLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gaWQgdGhlIGlkIHRvIGFzc2lnbiB0byB0aGUgc2VydmVyIGluc3RhbmNlOyBhIGdlbmVyYXRlZAotCSAqICAgIGlkIGlzIHVzZWQgaWYgaWQgaXMgPGNvZGU+bnVsbDwvY29kZT4gb3IgYW4gZW1wdHkgc3RyaW5nCi0JICogQHBhcmFtIGZpbGUgdGhlIGZpbGUgaW4gdGhlIHdvcmtzcGFjZSB3aGVyZSB0aGUgc2VydmVyIGluc3RhbmNlCi0JICogICAgaXMgdG8gYmUgc2VyaWFsaXplZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGluZm9ybWF0aW9uIGlzCi0JICogICAgaW5zdGVhZCB0byBiZSBwZXJzaXN0ZWQgd2l0aCB0aGUgd29ya3NwYWNlIGJ1dCBub3Qgd2l0aCBhbnkKLQkgKiAgICBwYXJ0aWN1bGFyIHdvcmtzcGFjZSByZXNvdXJjZQotCSAqIEBwYXJhbSBydW50aW1lIHRoZSBydW50aW1lIHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBzZXJ2ZXIgaW5zdGFuY2UsCi0JICogICAgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLQkgKiBAcmV0dXJuIGEgbmV3IHNlcnZlciB3b3JraW5nIGNvcHkgd2l0aCB0aGUgZ2l2ZW4gaWQKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gaWYgYW4gZXhjZXB0aW9uIG9jY3VycyB3aGlsZSBjcmVhdGluZyB0aGlzIHJ1bnRpbWUKLQkgKiAgICBvciBzZXR0aW5nIGl0J3MgZGVmYXVsdCB2YWx1ZXMKLQkgKi8KLQlwdWJsaWMgSVNlcnZlcldvcmtpbmdDb3B5IGNyZWF0ZVNlcnZlcihTdHJpbmcgaWQsIElGaWxlIGZpbGUsIElSdW50aW1lIHJ1bnRpbWUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgd29ya2luZyBjb3B5IGluc3RhbmNlIG9mIHRoaXMgc2VydmVyIHR5cGUuCi0JICogQWZ0ZXIgc2V0dGluZyB2YXJpb3VzIHByb3BlcnRpZXMgb2YgdGhlIHdvcmtpbmcgY29weSwKLQkgKiB0aGUgY2xpZW50IHNob3VsZCBjYWxsIHtAbGluayBJU2VydmVyV29ya2luZ0NvcHkjc2F2ZShib29sZWFuLCBJUHJvZ3Jlc3NNb25pdG9yKX0KLQkgKiB0byBicmluZyB0aGUgc2VydmVyIGluc3RhbmNlIGludG8gZXhpc3RlbmNlLgotCSAqIDxwPgotCSAqIFtpc3N1ZTogU2luY2UgdGhpcyBtZXRob2QganVzdCBjcmVhdGVzIGEgd29ya2luZyBjb3B5LAotCSAqIGl0J3Mgbm90IGNsZWFyIHRoZSBvcGVyYXRpb24gaXMgbG9uZy1ydW5uaW5nIGFuZCBpbiBuZWVkCi0JICogb2YgYSBwcm9ncmVzcyBtb25pdG9yLl0KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVGhlIHNlcnZlciByZXR1cm5lZCBmcm9tIHRoaXMgbWV0aG9kIHdpbGwgaGF2ZSBpdCdzIGhvc3Qgc2V0IHRvCi0JICogImxvY2FsaG9zdCIuIE90aGVyIGRlZmF1bHRzIHdpbGwgYmUgc2V0IGJ5IGNhbGxpbmcgdGhlIHNlcnZlcgotCSAqIGRlbGVnYXRlJ3Mgc2V0RGVmYXVsdHMoKSBtZXRob2QuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFtpc3N1ZTogVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIGNyZWF0ZXMgYSBzZXJ2ZXIKLQkgKiBjb25maWcgd29ya2luZyBjb3B5LCB3aGVyZWFzIHRoZSBvdGhlciBvbmUgZG9lcyBub3QhPwotCSAqIENvbnNpZGVyIGNvbWJpbmluZyB0aGUgbWV0aG9kIHdpdGggdGhlIG90aGVyLl0KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGlkIHRoZSBpZCB0byBhc3NpZ24gdG8gdGhlIHNlcnZlciBpbnN0YW5jZTsgYSBnZW5lcmF0ZWQKLQkgKiAgICBpZCBpcyB1c2VkIGlmIGlkIGlzIDxjb2RlPm51bGw8L2NvZGU+IG9yIGFuIGVtcHR5IHN0cmluZwotCSAqIEBwYXJhbSBmaWxlIHRoZSBmaWxlIGluIHRoZSB3b3Jrc3BhY2Ugd2hlcmUgdGhlIHNlcnZlciBpbnN0YW5jZQotCSAqICAgIGlzIHRvIGJlIHNlcmlhbGl6ZWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBpbmZvcm1hdGlvbiBpcwotCSAqICAgIGluc3RlYWQgdG8gYmUgcGVyc2lzdGVkIHdpdGggdGhlIHdvcmtzcGFjZSBidXQgbm90IHdpdGggYW55Ci0JICogICAgcGFydGljdWxhciB3b3Jrc3BhY2UgcmVzb3VyY2UKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCi0JICogICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCi0JICogQHJldHVybiBhIG5ldyBzZXJ2ZXIgd29ya2luZyBjb3B5IHdpdGggdGhlIGdpdmVuIGlkCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgY3JlYXRpbmcgdGhpcyBydW50aW1lCi0JICogICAgb3Igc2V0dGluZyBpdCdzIGRlZmF1bHQgdmFsdWVzCi0JICovCi0JcHVibGljIElTZXJ2ZXJXb3JraW5nQ29weSBjcmVhdGVTZXJ2ZXIoU3RyaW5nIGlkLCBJRmlsZSBmaWxlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL0lTZXJ2ZXJXb3JraW5nQ29weS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvSVNlcnZlcldvcmtpbmdDb3B5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0NDY1MTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvSVNlcnZlcldvcmtpbmdDb3B5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi2gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmU7Ci0KLWltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLS8qKgotICogQSB3b3JraW5nIGNvcHkgc2VydmVyIG9iamVjdCB1c2VkIGZvciBmb3JtdWxhdGluZyBjaGFuZ2VzCi0gKiB0byBhIHNlcnZlciBpbnN0YW5jZSAoe0BsaW5rIElTZXJ2ZXJ9KS4KLSAqCi0gKiA8cD5UaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy48L3A+Ci0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJU2VydmVyV29ya2luZ0NvcHkgZXh0ZW5kcyBJU2VydmVyQXR0cmlidXRlcyB7Ci0JLyoqCi0JICogU3RhdHVzIGNvZGUgKHZhbHVlIDEpIHJldHVybmVkIGZyb20gdGhlIHNhdmUoKSBtZXRob2Qgd2hlbiB0aGUgc2F2ZQotCSAqIGZhaWxlZCB3aXRoIGZvcmNlIHNldCB0byA8Y29kZT5mYWxzZTwvY29kZT4gYmVjYXVzZSB0aGUgcnVudGltZSBoYXMKLQkgKiBiZWVuIG1vZGlmaWVkIGFuZCBzYXZlZCBzaW5jZSB0aGlzIHdvcmtpbmcgY29weSB3YXMgY3JlYXRlZC4KLQkgKiAKLQkgKiBAc2VlICNzYXZlKGJvb2xlYW4sIElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0FWRV9DT05GTElDVCA9IDE7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBkaXNwbGF5YWJsZSBuYW1lIGZvciB0aGlzIHNlcnZlci4KLQkgKiA8cD4KLQkgKiBUaGUgbmFtZSBzaG91bGQgYmUgYXBwcm9wcmlhdGUgZm9yIHRoZSBjdXJyZW50IGxvY2FsZS4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcGFyYW0gbmFtZSBhIGRpc3BsYXlhYmxlIG5hbWUKLQkgKiBAc2VlIElTZXJ2ZXJBdHRyaWJ1dGVzI2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpOwotCQotCS8qKgotCSAqIFNldHMgb3IgdW5zZXRzIHdoZXRoZXIgdGhpcyBzZXJ2ZXIgaXMgbWFya2VkIGFzIHJlYWQgb25seS4KLQkgKiBXaGVuIGEgc2VydmVyIGlzIHJlYWQgb25seSwgd29ya2luZyBjb3BpZXMgY2FuIGJlIGNyZWF0ZWQgYnV0Ci0JICogdGhleSBjYW5ub3QgYmUgc2F2ZWQuCi0JICoKLQkgKiBAcGFyYW0gcmVhZE9ubHkgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gc2V0IHRoaXMgc2VydmVyIHRvIGJlIG1hcmtlZAotCSAqICAgIHJlYWQgb25seSwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiB0byB1bnNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlYWRPbmx5KGJvb2xlYW4gcmVhZE9ubHkpOwotCQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGlzIHdvcmtpbmcgY29weSBoYXMgdW5zYXZlZCBjaGFuZ2VzLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyB3b3JraW5nIGNvcHkgaGFzIHVuc2F2ZWQKLQkgKiAgICBjaGFuZ2VzLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGlydHkoKTsKLQotCS8qKgotCSAqIEFkZHMgYSBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIgdG8gdGhpcyBzZXJ2ZXIuCi0JICogPHA+Ci0JICogT25jZSByZWdpc3RlcmVkLCBhIGxpc3RlbmVyIHN0YXJ0cyByZWNlaXZpbmcgbm90aWZpY2F0aW9uIG9mIAotCSAqIHByb3BlcnR5IGNoYW5nZXMgdG8gdGhpcyBzZXJ2ZXIuIFRoZSBsaXN0ZW5lciBjb250aW51ZXMgdG8gcmVjZWl2ZQotCSAqIG5vdGlmaWNhdGlvbnMgdW50aWwgaXQgaXMgcmVtb3ZlZC4KLQkgKiBIYXMgbm8gZWZmZWN0IGlmIGFuIGlkZW50aWNhbCBsaXN0ZW5lciBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQuCi0JICogPC9wPgotCSAqCi0JICogQHBhcmFtIGxpc3RlbmVyIGEgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyCi0JICogQHNlZSAjcmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGEgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyIGZyb20gdGhpcyBzZXJ2ZXIuCi0JICogSGFzIG5vIGVmZmVjdCBpZiB0aGUgbGlzdGVuZXIgaXMgbm90IHJlZ2lzdGVyZWQuCi0JICoKLQkgKiBAcGFyYW0gbGlzdGVuZXIgYSBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIKLQkgKiBAc2VlICNhZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHNlcnZlciBjb25maWd1cmF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHNlcnZlciB3b3JraW5nIGNvcHkuCi0JICogPHA+Ci0JICogTm90ZTogVGhlIHNlcnZlciBjb25maWd1cmF0aW9uIG9mIGEgc2VydmVyIHdvcmtpbmcgY29weSBtYXkKLQkgKiBvciBtYXkgbm90IGJlIGEgd29ya2luZyBjb3B5LgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBbaXNzdWU6IEFjY29yZGluZyB0byBzZXJ2ZXJUeXBlIGV4dGVuc2lvbiBwb2ludCwgCi0JICogY29uZmlndXJhdGlvblR5cGVJZCBpcyBhbiBvcHRpb25hbCBhdHRyaWJ1dGUuIFdoYXQgaGFwcGVucyBpZiB0aGUKLQkgKiBzZXJ2ZXIgY29uZmlndXJhdGlvbiBwYXNzZWQgaXMgbnVsbCBidXQgdGhlIHNlcnZlciBtdXN0IGhhdmUgYQotCSAqIHNlcnZlciBjb25maWd1cmF0aW9uPyBXaGF0IGhhcHBlbnMgb2YgdGhlIHNlcnZlciBjb25maWd1cmF0aW9uCi0JICogaGFzIHRoZSB3cm9uZyB0eXBlPyBEbyB0aGUgZXJyb3JzIGdldCBkZXRlY3RlZCBhbmQgcmVwb3J0ZWQgbm93LCBvcgotCSAqIHVwb24gc2F2ZSgpP10KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGNvbmZpZ3VyYXRpb24gdGhlIHNlcnZlciBjb25maWd1cmF0aW9uLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VydmVyQ29uZmlndXJhdGlvbihJRm9sZGVyIGNvbmZpZ3VyYXRpb24pOwotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNlcnZlciBpbnN0YW5jZSB0aGF0IHRoaXMgd29ya2luZyBjb3B5IGlzCi0JICogYXNzb2NpYXRlZCB3aXRoLgotCSAqIDxwPgotCSAqIEZvciBhIHNlcnZlciB3b3JraW5nIGNvcHkgY3JlYXRlZCBieSBhIGNhbGwgdG8KLQkgKiB7QGxpbmsgSVNlcnZlciNjcmVhdGVXb3JraW5nQ29weSgpfSwKLQkgKiA8Y29kZT50aGlzLmdldE9yaWdpbmFsKCk8L2NvZGU+IHJldHVybnMgdGhlIG9yaWdpbmFsCi0JICogc2VydmVyIG9iamVjdC4gRm9yIGEgc2VydmVyIHdvcmtpbmcgY29weSBqdXN0IGNyZWF0ZWQgYnkKLQkgKiBhIGNhbGwgdG8ge0BsaW5rIElTZXJ2ZXJUeXBlI2NyZWF0ZVNlcnZlcihTdHJpbmcsIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlLCBJUHJvZ3Jlc3NNb25pdG9yKX0sCi0JICogPGNvZGU+dGhpcy5nZXRPcmlnaW5hbCgpPC9jb2RlPiByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBhc3NvY2lhdGVkIHNlcnZlciBpbnN0YW5jZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotCSAqLwotCXB1YmxpYyBJU2VydmVyIGdldE9yaWdpbmFsKCk7Ci0KLQkvKioKLQkgKiBDb21taXRzIHRoZSBjaGFuZ2VzIG1hZGUgaW4gdGhpcyB3b3JraW5nIGNvcHkuIElmIHRoZXJlIGlzCi0JICogbm8gZXh0YW50IHNlcnZlciBpbnN0YW5jZSB3aXRoIGEgbWF0Y2hpbmcgaWQgYW5kIHNlcnZlcgotCSAqIHR5cGUsIHRoaXMgd2lsbCBjcmVhdGUgYSBzZXJ2ZXIgaW5zdGFuY2Ugd2l0aCBhdHRyaWJ1dGVzCi0JICogdGFrZW4gZnJvbSB0aGlzIHdvcmtpbmcgY29weS4gSWYgdGhlcmUgYW4gZXhpc3Rpbmcgc2VydmVyCi0JICogaW5zdGFuY2Ugd2l0aCBhIG1hdGNoaW5nIGlkIGFuZCBzZXJ2ZXIgdHlwZSwgdGhpcyB3aWxsCi0JICogY2hhbmdlIHRoZSBzZXJ2ZXIgaW5zdGFuY2UgYWNjb3JkaW5nbHkuCi0JICogPHA+Ci0JICogSWYgdGhlcmUgYW4gZXhpc3Rpbmcgc2VydmVyIGluc3RhbmNlIHdpdGggYSBtYXRjaGluZyBpZCBhbmQKLQkgKiBzZXJ2ZXIgdHlwZSwgdGhpcyB3aWxsIGNoYW5nZSB0aGUgc2VydmVyIGluc3RhbmNlIGFjY29yZGluZ2x5LgotCSAqIFRoZSByZXR1cm5lZCBzZXJ2ZXIgd2lsbCBiZSB0aGUgc2FtZSBzZXJ2ZXIgdGhpcyBpcyByZXR1cm5lZAotCSAqIGZyb20gZ2V0T3JpZ2luYWwoKSwgYWZ0ZXIgdGhlIGNoYW5nZXMgaGF2ZSBiZWVuIGFwcGxpZWQuCi0JICogT3RoZXJ3aXNlLCB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiBhIG5ld2x5IGNyZWF0ZWQgc2VydmVyLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBTZXJ2ZXJzIGNhbiBiZSBzYXZlZCBldmVuIHdoZW4gdGhleSBoYXZlIGludmFsaWQgcHJvcGVydGllcy4gSXQKLQkgKiBpcyB0aGUgY2xpZW50cyByZXNwb25zaWJpbGl0eSB0byB2YWxpZGF0ZSBvciBjaGVjayB0aGUKLQkgKiBwcm9wZXJ0aWVzIGJlZm9yZSBzYXZpbmcuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGRvZXMgbm90IGFwcGx5IGNoYW5nZXMgdG8gdGhlIHNlcnZlci4gQSBwdWJsaXNoKCkKLQkgKiBtdXN0IGJlIGNvbXBsZXRlZCB0byBwdXNoIG91dCBhZnRlciB0aGUgc2F2ZSB0byBwdXNoIG91dCBhbnkKLQkgKiBjaGFuZ2VzIHRvIHRoZSBzZXJ2ZXIuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFtpc3N1ZTogV2hhdCBpcyBsaWZlY3ljbGUgZm9yIFNlcnZlcldvcmtpbmdDb3B5RGVsZWdhdGUKLQkgKiBhc3NvY2lhdGVkIHdpdGggdGhpcyB3b3JraW5nIGNvcHk/XQotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBbaXNzdWU6IFNpbmNlIGl0IGRvZXMgbm90IG1ha2Ugc2Vuc2UgdG8gY29tbWl0IGEgc2VydmVyCi0JICogd29ya2luZyBjb3B5IHdpdGhvdXQgZmlyc3QgY29tbWl0dGluZyBhbnkgYXNzb2NpYXRlZAotCSAqIHJ1bnRpbWUgYW5kIHNlcnZlciBjb25maWcgd29ya2luZyBjb3BpZXMsIHRoZSBzZW1hbnRpY3MKLQkgKiBvZiBzYXZlQWxsIHNob3VsZCBiZSBwYXJ0IGFuZCBwYXJjZWwgb2YgdGhlCi0JICogbm9ybWFsIHNhdmUsIGFuZCB0aGUgc2F2ZUFsbCBtZXRob2QgZWxpbWluYXRlZC5dCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBmb3JjZSA8Y29kZT50cnVlPC9jb2RlPiB0byBmb3JjZSB0aGUgc2F2ZSwgb3IgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogICAgb3RoZXJ3aXNlCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqIEByZXR1cm4gYSBuZXcgc2VydmVyIGluc3RhbmNlCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIFttaXNzaW5nXQotCSAqIEBzZWUgI1NBVkVfQ09ORkxJQ1QKLQkgKi8KLQlwdWJsaWMgSVNlcnZlciBzYXZlKGJvb2xlYW4gZm9yY2UsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBDb21taXRzIHRoZSBjaGFuZ2VzIG1hZGUgaW4gdGhpcyBzZXJ2ZXIgd29ya2luZyBjb3B5IGFmdGVyCi0JICogZmlyc3QgY29tbWl0dGluZyBhbnkgYXNzb2NpYXRlZCBzZXJ2ZXIgY29uZmlndXJhdGlvbiBvcgotCSAqIHNlcnZlciBydW50aW1lIHdvcmtpbmcgY29waWVzLgotCSAqIDxwPgotCSAqIFRoaXMgY29udmVuaWVuY2UgbWV0aG9kIGlzIGVxdWl2YWxlbnQgdG86Ci0JICogPHByZT4KLQkgKiBJUnVudGltZSBydCA9IHRoaXMuZ2V0UnVudGltZSgpOwotCSAqIGlmIChydCAhPSBudWxsICYmIHJ0LmlzV29ya2luZ0NvcHkoKSkgewotCSAqICAgICgoSVJ1bnRpbWVXb3JraW5nQ29weSkgcnQpLnNhdmUobW9uaXRvcik7Ci0JICogfQotCSAqIElTZXJ2ZXJDb25maWd1cmF0aW9uIGNmID0gdGhpcy5nZXRTZXJ2ZXJDb25maWd1cmF0aW9uKCk7Ci0JICogaWYgKGNmICE9IG51bGwgJiYgY2YuaXNXb3JraW5nQ29weSgpKSB7Ci0JICogICAgKChJU2VydmVyQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5KSBjZikuc2F2ZShtb25pdG9yKTsKLQkgKiB9Ci0JICogcmV0dXJuIHNhdmUobW9uaXRvcik7Ci0JICogPC9wcmU+Ci0JICogPC9wPgotCSAqIDxwPgotCSAqIFtpc3N1ZTogU2luY2UgaXQgZG9lcyBub3QgbWFrZSBzZW5zZSB0byBjb21taXQgYSBzZXJ2ZXIKLQkgKiB3b3JraW5nIGNvcHkgd2l0aG91dCBmaXJzdCBjb21taXR0aW5nIGFueSBhc3NvY2lhdGVkCi0JICogcnVudGltZSBhbmQgc2VydmVyIGNvbmZpZyB3b3JraW5nIGNvcGllcywgdGhlIHNlbWFudGljcwotCSAqIG9mIHRoaXMgb3BlcmF0aW9uIHNob3VsZCBiZSBwYXJ0IGFuZCBwYXJjZWwgb2YgdGhlCi0JICogbm9ybWFsIHNhdmUsIGFuZCB0aGUgc2F2ZUFsbCBtZXRob2QgZWxpbWluYXRlZC5dCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBmb3JjZSA8Y29kZT50cnVlPC9jb2RlPiB0byBmb3JjZSB0aGUgc2F2ZSwgb3IgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogICAgb3RoZXJ3aXNlCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqIEByZXR1cm4gYSBuZXcgc2VydmVyIGluc3RhbmNlCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIFttaXNzaW5nXQotCSAqIEBzZWUgI1NBVkVfQ09ORkxJQ1QKLQkgKi8KLQlwdWJsaWMgSVNlcnZlciBzYXZlQWxsKGJvb2xlYW4gZm9yY2UsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBydW50aW1lIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHNlcnZlciB3b3JraW5nIGNvcHkuCi0JICogPHA+Ci0JICogTm90ZTogVGhlIHJ1bnRpbWUgb2YgYSBzZXJ2ZXIgd29ya2luZyBjb3B5IG1heQotCSAqIG9yIG1heSBub3QgYmUgYSB3b3JraW5nIGNvcHkuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFtpc3N1ZTogQWNjb3JkaW5nIHRvIHNlcnZlclR5cGUgZXh0ZW5zaW9uIHBvaW50LCAKLQkgKiBydW50aW1lVHlwZUlkIGlzIGEgbWFuZGF0b3J5IGF0dHJpYnV0ZS4gQnV0IElTZXJ2ZXIuZ2V0UnVudGltZSgpCi0JICogaXMgYWxsb3dlZCB0byByZXR1cm4gbnVsbCwgc3VnZ2VzdGluZyB0aGF0IGl0IGlzIG9wdGlvbmFsIGZvciBpbnN0YW5jZXMuCi0JICogV2hhdCBoYXBwZW5zIGlmIHRoZSBydW50aW1lIHBhc3NlZCBpcyBudWxsIGJ1dCB0aGUgc2VydmVyIG11c3QKLQkgKiBoYXZlIGEgcnVudGltZT8gV2hhdCBoYXBwZW5zIGlmIHRoZSBydW50aW1lIGhhcyB0aGUgd3JvbmcKLQkgKiB0eXBlPyBEbyB0aGUgZXJyb3JzIGdldCBkZXRlY3RlZCBhbmQgcmVwb3J0ZWQgbm93LCBvciB1cG9uIHNhdmUoKT9dCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBydW50aW1lIHRoZSBydW50aW1lLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICovCi0JcHVibGljIHZvaWQgc2V0UnVudGltZShJUnVudGltZSBydW50aW1lKTsKLQotCS8qKgotCSAqIENoYW5nZXMgdGhlIGhvc3QgZm9yIHRoZSBzZXJ2ZXIuCi0JICogVGhlIGZvcm1hdCBvZiB0aGUgaG9zdCBjYW4gYmUgZWl0aGVyIGEgcXVhbGlmaWVkIG9yIHVucXVhbGlmaWVkIGhvc3RuYW1lLAotCSAqIG9yIGFuIElQIGFkZHJlc3MgYW5kIG11c3QgY29uZm9ybSB0byBSRkMgMjczMi4KLQkgKiAKLQkgKiA8cD4KLQkgKiBbaXNzdWU6IFRoaXMgaXMgYSBxdWVzdGlvbmFibGUgb3BlcmF0aW9uIGlmIHRoZXJlIGlzIGEgcnVubmluZwotCSAqIHNlcnZlciBhc3NvY2lhdGVkIHdpdGggdGhlIG9yaWdpbmFsLiBXaGVuIGEgaG9zdCBuYW1lCi0JICogY2hhbmdlIGlzIGNvbW1pdHRlZCwgdGhlIHNlcnZlciBpbnN0YW5jZSBsb3NlcyBjb250YWN0IHdpdGgKLQkgKiB0aGUgcnVubmluZyBzZXJ2ZXIgYmVjYXVzZSBvZiB0aGUgaG9zdCBuYW1lIGNoYW5nZS5dCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBob3N0IGEgaG9zdCBzdHJpbmcgY29uZm9ybWluZyB0byBSRkMgMjczMgotCSAqIEBzZWUgSVNlcnZlciNnZXRIb3N0KCkKLQkgKiBAc2VlIGphdmEubmV0LlVSTCNnZXRIb3N0KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIb3N0KFN0cmluZyBob3N0KTsKLQotCS8qKgotCSAqIE1vZGlmaWVzIHRoZSBsaXN0IG9mIG1vZHVsZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzZXJ2ZXIuCi0JICogVGhlIG1vZHVsZXMgaW5jbHVkZWQgaW4gdGhlIDxjb2RlPmFkZDwvY29kZT4gbGlzdAotCSAqIG11c3QgZXhpc3QgaW4gdGhlIHdvcmtzcGFjZSBhbmQgbXVzdCBub3QgYWxyZWFkeSBiZSBhc3NvY2lhdGVkCi0JICogd2l0aCB0aGUgc2VydmVyLgotCSAqIFRoZSBtb2R1bGVzIGluY2x1ZGVkIGluIHRoZSA8Y29kZT5yZW1vdmU8L2NvZGU+IGxpc3QKLQkgKiBtdXN0IGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2VydmVyLCBidXQgbWF5IG9yIG1heSBub3QgZXhpc3QKLQkgKiBpbiB0aGUgd29ya3NwYWNlLgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgbm90IGNvbW11bmljYXRlIHdpdGggdGhlIHNlcnZlci4gQWZ0ZXIgc2F2aW5nLAotCSAqIHB1Ymxpc2goKSBjYW4gYmUgdXNlZCB0byBzeW5jIHVwIHdpdGggdGhlIHNlcnZlci4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogW2lzc3VlOiBIb3cgdG8gZm9ybXVsYXRlIHdoYXQgaXQgbWVhbnMKLQkgKiB0byBzYXkgInRoZSBtb2R1bGUgbXVzdCBleGlzdCBpbiB0aGUgd29ya3NwYWNlIj9dCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFtpc3N1ZTogVGhlIHNwZWMgc2hvdWxkIGJlIG1vcmUgbGF4LiBBdHRlbXB0aW5nIHRvIGFkZAotCSAqIGEgbW9kdWxlIHRoYXQncyBhbHJlYWR5IGluY2x1ZGUgc2hvdWxkIGJlIHF1aWV0bHkgaWdub3JlOwotCSAqIGRpdHRvIHJlbW92aW5nIGEgbW9kdWxlIHRoYXQncyBub3Qgb24gdGhpcyBsaXN0LiBUaGlzCi0JICogc2ltcGxpZmllcyB0aGUgaGFuZGxpbmcgb2YgdmFyaW91cyBvdGhlciB3YWNrbyBjYXNlcyAKLQkgKiBzdWNoIGFzIGR1cGxpY2F0aW9uIHdpdGhpbiBhbmQgYmV0d2VlbiB0aGUgYWRkIGFuZCByZW1vdmUKLQkgKiBsaXN0cy5dCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFtpc3N1ZTogVGhlIHNwZWMgaGFkIGFsc28gc2FpZDogIi4uLmNhbk1vZGlmeU1vZHVsZXMoKQotCSAqIHNob3VsZCBoYXZlIHJldHVybmVkIHRydWUuIFRoZSBjb25maWd1cmF0aW9uIG11c3QgYXNzdW1lCi0JICogYW55IGRlZmF1bHQgc2V0dGluZ3MgYW5kIGFkZCB0aGUgbW9kdWxlIHdpdGhvdXQgYW55IFVJLiJdCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFtpc3N1ZTogV2hhdCBlcnJvciBjaGVja2luZyBzaG91bGQgYmUgcGVyZm9ybWVkIGJ5IHRoaXMKLQkgKiBvcGVyYXRpb24sIGFuZCB3aGF0IG5lZWRzIHRvIGJlIHBlcmZvcm1lZCBieSBzYXZlKCkgaWYKLQkgKiB0aGUgY2xpZW50IHRyaWVzIHRvIGNvbW1pdCB0aGVzZSBoeXBvdGhldGlzaXplZCBjaGFuZ2VzP10KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcGFyYW0gYWRkIGEgcG9zc2libHktZW1wdHkgbGlzdCBvZiBtb2R1bGVzIHRvIGFkZAotCSAqIEBwYXJhbSByZW1vdmUgYSBwb3NzaWJseS1lbXB0eSBsaXN0IG9mIG1vZHVsZXMgdG8gcmVtb3ZlCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBbbWlzc2luZ10KLQkgKi8KLQlwdWJsaWMgdm9pZCBtb2RpZnlNb2R1bGVzKElNb2R1bGVbXSBhZGQsIElNb2R1bGVbXSByZW1vdmUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb247Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvU2VydmVyQ29yZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvU2VydmVyQ29yZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODExMjAyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL1NlcnZlckNvcmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLaAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLio7Ci0vKioKLSAqIE1haW4gY2xhc3MgZm9yIHNlcnZlciBjb3JlIEFQSS4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBwcm92aWRlcyBBUEkgdG8gYWNjZXNzIG1vc3Qgb2YgdGhlIHR5cGVzIGluIHRoZSBzZXJ2ZXIKLSAqIGZyYW1ld29yaywgaW5jbHVkaW5nIHNlcnZlciBydW50aW1lcyBhbmQgc2VydmVycy4gTWV0aG9kcyAqKgotICogVGhlIG1ldGhvZHMgb24gdGhpcyBjbGFzcyBhcmUgdGhyZWFkIHNhZmUuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgYWxsIGl0cyBmdW5jdGlvbmFsaXR5IHRocm91Z2ggc3RhdGljIG1lbWJlcnMuCi0gKiBJdCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZCBvciBpbnN0YW50aWF0ZWQuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFNlcnZlckNvcmUgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fU0VSVkVSX1RZUEUgPSAic2VydmVyVHlwZXMiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fUlVOVElNRV9UWVBFID0gInJ1bnRpbWVUeXBlcyI7Ci0KLQkvLwljYWNoZWQgY29weSBvZiBhbGwgcnVudGltZSB0eXBlcwotCXByaXZhdGUgc3RhdGljIExpc3QgcnVudGltZVR5cGVzOwotCi0JLy8JY2FjaGVkIGNvcHkgb2YgYWxsIHNlcnZlciBhbmQgY29uZmlndXJhdGlvbiB0eXBlcwotCXByaXZhdGUgc3RhdGljIExpc3Qgc2VydmVyVHlwZXM7Ci0KLQlwcml2YXRlIHN0YXRpYyBJUmVnaXN0cnlDaGFuZ2VMaXN0ZW5lciByZWdpc3RyeUxpc3RlbmVyOwotCi0Jc3RhdGljIHsKLQkJZXhlY3V0ZVN0YXJ0dXBzKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUmVnaXN0cnlDaGFuZ2VMaXN0ZW5lciBpbXBsZW1lbnRzIElSZWdpc3RyeUNoYW5nZUxpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgcmVnaXN0cnlDaGFuZ2VkKElSZWdpc3RyeUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQlJRXh0ZW5zaW9uRGVsdGFbXSBkZWx0YXMgPSBldmVudC5nZXRFeHRlbnNpb25EZWx0YXMoU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgRVhURU5TSU9OX1JVTlRJTUVfVFlQRSk7Ci0JCQlpZiAoZGVsdGFzICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGRlbHRhcy5sZW5ndGg7IGkrKykgewotCQkJCQloYW5kbGVSdW50aW1lVHlwZURlbHRhKGRlbHRhc1tpXSk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlkZWx0YXMgPSBldmVudC5nZXRFeHRlbnNpb25EZWx0YXMoU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgRVhURU5TSU9OX1NFUlZFUl9UWVBFKTsKLQkJCWlmIChkZWx0YXMgIT0gbnVsbCkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGVsdGFzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWhhbmRsZVNlcnZlclR5cGVEZWx0YShkZWx0YXNbaV0pOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENhbm5vdCBjcmVhdGUgU2VydmVyQ29yZSAtIHVzZSBzdGF0aWMgbWV0aG9kcy4KLQkgKi8KLQlwcml2YXRlIFNlcnZlckNvcmUoKSB7Ci0JCS8vIGNhbid0IGNyZWF0ZQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc291cmNlIG1hbmFnZXIuCi0JICoKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5SZXNvdXJjZU1hbmFnZXIKLQkgKi8KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBSZXNvdXJjZU1hbmFnZXIgZ2V0UmVzb3VyY2VNYW5hZ2VyKCkgewotCQlyZXR1cm4gUmVzb3VyY2VNYW5hZ2VyLmdldEluc3RhbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcHJlZmVyZW5jZSBpbmZvcm1hdGlvbiBmb3IgdGhlIHByb2plY3QuIFRoZSBwcm9qZWN0IG1heSBub3QKLQkgKiBiZSBudWxsLgotCSAqCi0JICogQHBhcmFtIHByb2plY3QgYSBwcm9qZWN0Ci0JICogQHJldHVybiB0aGUgcHJvcGVydGllcyBvZiB0aGUgcHJvamVjdAotCSAqIEBkZXByZWNhdGVkIFByb2plY3QgZmFjZXQgc3VwcG9ydCBzaG91bGQgbm93IGJlIHVzZWQgaW5zdGVhZCBvZiB0aGlzIEFQSS4gQHNlZQotCSAqICAgIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdCNnZXRSdW50aW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQcm9qZWN0UHJvcGVydGllcyBnZXRQcm9qZWN0UHJvcGVydGllcyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCXJldHVybiBuZXcgSVByb2plY3RQcm9wZXJ0aWVzKCkgewotCQkJcHVibGljIElSdW50aW1lIGdldFJ1bnRpbWVUYXJnZXQoKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBhcnJheSBvZiBhbGwga25vd24gcnVudGltZSB0eXBlcy4KLQkgKiA8cD4KLQkgKiBBIG5ldyBhcnJheSBpcyByZXR1cm5lZCBvbiBlYWNoIGNhbGwsIHNvIGNsaWVudHMgbWF5IHN0b3JlIG9yIG1vZGlmeSB0aGUgcmVzdWx0LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiBydW50aW1lIHR5cGVzIHtAbGluayBJUnVudGltZVR5cGV9Ci0JICovCi0JcHVibGljIHN0YXRpYyBJUnVudGltZVR5cGVbXSBnZXRSdW50aW1lVHlwZXMoKSB7Ci0JCWlmIChydW50aW1lVHlwZXMgPT0gbnVsbCkKLQkJCWxvYWRSdW50aW1lVHlwZXMoKTsKLQkJCi0JCUlSdW50aW1lVHlwZVtdIHJ0ID0gbmV3IElSdW50aW1lVHlwZVtydW50aW1lVHlwZXMuc2l6ZSgpXTsKLQkJcnVudGltZVR5cGVzLnRvQXJyYXkocnQpOwotCQlyZXR1cm4gcnQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcnVudGltZSB0eXBlIHdpdGggdGhlIGdpdmVuIGlkLCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIGlmIG5vbmUuIFRoaXMgY29udmVuaWVuY2UgbWV0aG9kIHNlYXJjaGVzIHRoZSBsaXN0IG9mIGtub3duCi0JICogcnVudGltZSB0eXBlcyAoe0BsaW5rICNnZXRSdW50aW1lVHlwZXMoKX0pIGZvciB0aGUgb25lIHdpdGggYSBtYXRjaGluZwotCSAqIHJ1bnRpbWUgdHlwZSBpZCAoe0BsaW5rIElSdW50aW1lVHlwZSNnZXRJZCgpfSkuIFRoZSBpZCBtYXkgbm90IGJlIG51bGwuCi0JICoKLQkgKiBAcGFyYW0gaWQgdGhlIHJ1bnRpbWUgdHlwZSBpZAotCSAqIEByZXR1cm4gdGhlIHJ1bnRpbWUgdHlwZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm8gcnVudGltZSB0eXBlCi0JICogd2l0aCB0aGUgZ2l2ZW4gaWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElSdW50aW1lVHlwZSBmaW5kUnVudGltZVR5cGUoU3RyaW5nIGlkKSB7Ci0JCWlmIChpZCA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCi0JCWlmIChydW50aW1lVHlwZXMgPT0gbnVsbCkKLQkJCWxvYWRSdW50aW1lVHlwZXMoKTsKLQkJCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gcnVudGltZVR5cGVzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCUlSdW50aW1lVHlwZSBydW50aW1lVHlwZSA9IChJUnVudGltZVR5cGUpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChpZC5lcXVhbHMocnVudGltZVR5cGUuZ2V0SWQoKSkpCi0JCQkJcmV0dXJuIHJ1bnRpbWVUeXBlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgYWxsIGtub3duIHJ1bnRpbWUgdGFyZ2V0IGhhbmRsZXIgaW5zdGFuY2VzLgotCSAqIDxwPgotCSAqIEEgbmV3IGFycmF5IGlzIHJldHVybmVkIG9uIGVhY2ggY2FsbCwgc28gY2xpZW50cyBtYXkgc3RvcmUgb3IgbW9kaWZ5IHRoZSByZXN1bHQuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gYSBwb3NzaWJseS1lbXB0eSBhcnJheSBvZiBydW50aW1lIHRhcmdldCBoYW5kbGVyIGluc3RhbmNlcwotCSAqICAgIHtAbGluayBJUnVudGltZVRhcmdldEhhbmRsZXJ9Ci0JICovCi0JcHVibGljIHN0YXRpYyBJUnVudGltZVRhcmdldEhhbmRsZXJbXSBnZXRSdW50aW1lVGFyZ2V0SGFuZGxlcnMoKSB7Ci0JCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJBdHRlbXB0IHRvIHVzZSBkZXByZWNhdGVkIGNvZGUiKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBydW50aW1lIHRhcmdldCBoYW5kbGVyIHdpdGggdGhlIGdpdmVuIGlkLCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIGlmIG5vbmUuIFRoaXMgY29udmVuaWVuY2UgbWV0aG9kIHNlYXJjaGVzIHRoZSBsaXN0IG9mIGtub3duIHJ1bnRpbWUKLQkgKiB0YXJnZXQgaGFuZGxlcnMgKHtAbGluayAjZ2V0UnVudGltZVRhcmdldEhhbmRsZXJzKCl9KSBmb3IgdGhlIG9uZSB3aXRoCi0JICogYSBtYXRjaGluZyBydW50aW1lIHRhcmdldCBoYW5kbGVyIGlkICh7QGxpbmsgSVJ1bnRpbWVUYXJnZXRIYW5kbGVyI2dldElkKCl9KS4KLQkgKiBUaGUgaWQgbWF5IG5vdCBiZSBudWxsLgotCSAqCi0JICogQHBhcmFtIGlkIHRoZSBydW50aW1lIHRhcmdldCBoYW5kbGVyIGlkCi0JICogQHJldHVybiB0aGUgcnVudGltZSB0YXJnZXQgaGFuZGxlciBpbnN0YW5jZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYKLQkgKiAgIHRoZXJlIGlzIG5vIHJ1bnRpbWUgdGFyZ2V0IGhhbmRsZXIgd2l0aCB0aGUgZ2l2ZW4gaWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElSdW50aW1lVGFyZ2V0SGFuZGxlciBmaW5kUnVudGltZVRhcmdldEhhbmRsZXIoU3RyaW5nIGlkKSB7Ci0JCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJBdHRlbXB0IHRvIHVzZSBkZXByZWNhdGVkIGNvZGUiKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGFsbCBrbm93biBzZXJ2ZXIgdHlwZXMuCi0JICogPHA+Ci0JICogQSBuZXcgYXJyYXkgaXMgcmV0dXJuZWQgb24gZWFjaCBjYWxsLCBzbyBjbGllbnRzIG1heSBzdG9yZSBvciBtb2RpZnkgdGhlIHJlc3VsdC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiB0aGUgYXJyYXkgb2Ygc2VydmVyIHR5cGVzIHtAbGluayBJU2VydmVyVHlwZX0KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTZXJ2ZXJUeXBlW10gZ2V0U2VydmVyVHlwZXMoKSB7Ci0JCWlmIChzZXJ2ZXJUeXBlcyA9PSBudWxsKQotCQkJbG9hZFNlcnZlclR5cGVzKCk7Ci0JCQotCQlJU2VydmVyVHlwZVtdIHN0ID0gbmV3IElTZXJ2ZXJUeXBlW3NlcnZlclR5cGVzLnNpemUoKV07Ci0JCXNlcnZlclR5cGVzLnRvQXJyYXkoc3QpOwotCQlyZXR1cm4gc3Q7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2VydmVyIHR5cGUgd2l0aCB0aGUgZ2l2ZW4gaWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogaWYgbm9uZS4gVGhpcyBjb252ZW5pZW5jZSBtZXRob2Qgc2VhcmNoZXMgdGhlIGxpc3Qgb2Yga25vd24KLQkgKiBzZXJ2ZXIgdHlwZXMgKHtAbGluayAjZ2V0U2VydmVyVHlwZXMoKX0pIGZvciB0aGUgb25lIHdpdGggYSBtYXRjaGluZwotCSAqIHNlcnZlciB0eXBlIGlkICh7QGxpbmsgSVNlcnZlclR5cGUjZ2V0SWQoKX0pLiBUaGUgaWQgbWF5IG5vdCBiZSBudWxsLgotCSAqCi0JICogQHBhcmFtIGlkIHRoZSBzZXJ2ZXIgdHlwZSBpZAotCSAqIEByZXR1cm4gdGhlIHNlcnZlciB0eXBlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBubyBzZXJ2ZXIgdHlwZQotCSAqIHdpdGggdGhlIGdpdmVuIGlkCi0JICovCi0JcHVibGljIHN0YXRpYyBJU2VydmVyVHlwZSBmaW5kU2VydmVyVHlwZShTdHJpbmcgaWQpIHsKLQkJaWYgKGlkID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0KLQkJaWYgKHNlcnZlclR5cGVzID09IG51bGwpCi0JCQlsb2FkU2VydmVyVHlwZXMoKTsKLQkJCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gc2VydmVyVHlwZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJSVNlcnZlclR5cGUgc2VydmVyVHlwZSA9IChJU2VydmVyVHlwZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKGlkLmVxdWFscyhzZXJ2ZXJUeXBlLmdldElkKCkpKQotCQkJCXJldHVybiBzZXJ2ZXJUeXBlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGUgdGhlIHNlcnZlciBzdGFydHVwIGV4dGVuc2lvbiBwb2ludHMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgZXhlY3V0ZVN0YXJ0dXBzKCkgewotCQlUcmFjZS50cmFjZShUcmFjZS5FWFRFTlNJT05fUE9JTlQsICItPi0gTG9hZGluZyAuc3RhcnR1cCBleHRlbnNpb24gcG9pbnQgLT4tIik7Ci0JCUlFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNmID0gcmVnaXN0cnkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsICJpbnRlcm5hbFN0YXJ0dXAiKTsKLQotCQlpbnQgc2l6ZSA9IGNmLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJSVN0YXJ0dXAgc3RhcnR1cCA9IChJU3RhcnR1cCkgY2ZbaV0uY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsKLQkJCQl0cnkgewotCQkJCQlzdGFydHVwLnN0YXJ0dXAoKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiU3RhcnR1cCBmYWlsZWQiICsgc3RhcnR1cC50b1N0cmluZygpLCBleCk7Ci0JCQkJfQotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkVYVEVOU0lPTl9QT0lOVCwgIiAgTG9hZGVkIHN0YXJ0dXA6ICIgKyBjZltpXS5nZXRBdHRyaWJ1dGUoImlkIikpOwotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICIgIENvdWxkIG5vdCBsb2FkIHN0YXJ0dXA6ICIgKyBjZltpXS5nZXRBdHRyaWJ1dGUoImlkIiksIHQpOwotCQkJfQotCQl9Ci0JCQotCQlUcmFjZS50cmFjZShUcmFjZS5FWFRFTlNJT05fUE9JTlQsICItPC0gRG9uZSBsb2FkaW5nIC5zdGFydHVwIGV4dGVuc2lvbiBwb2ludCAtPC0iKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkIHRoZSBydW50aW1lIHR5cGVzLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIGxvYWRSdW50aW1lVHlwZXMoKSB7Ci0JCWlmIChydW50aW1lVHlwZXMgIT0gbnVsbCkKLQkJCXJldHVybjsKLQkJVHJhY2UudHJhY2UoVHJhY2UuRVhURU5TSU9OX1BPSU5ULCAiLT4tIExvYWRpbmcgLnJ1bnRpbWVUeXBlcyBleHRlbnNpb24gcG9pbnQgLT4tIik7Ci0JCQotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjZiA9IHJlZ2lzdHJ5LmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcihTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCBFWFRFTlNJT05fUlVOVElNRV9UWVBFKTsKLQkJcnVudGltZVR5cGVzID0gbmV3IEFycmF5TGlzdChjZi5sZW5ndGgpOwotCQlhZGRSdW50aW1lVHlwZXMoY2YpOwotCQlhZGRSZWdpc3RyeUxpc3RlbmVyKCk7Ci0JCQotCQlUcmFjZS50cmFjZShUcmFjZS5FWFRFTlNJT05fUE9JTlQsICItPC0gRG9uZSBsb2FkaW5nIC5ydW50aW1lVHlwZXMgZXh0ZW5zaW9uIHBvaW50IC08LSIpOwotCX0KLQotCS8qKgotCSAqIExvYWQgdGhlIHJ1bnRpbWUgdHlwZXMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgYWRkUnVudGltZVR5cGVzKElDb25maWd1cmF0aW9uRWxlbWVudFtdIGNmKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2YubGVuZ3RoOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJUnVudGltZVR5cGUgcnVudGltZVR5cGUgPSBuZXcgUnVudGltZVR5cGUoY2ZbaV0pOwotCQkJCXJ1bnRpbWVUeXBlcy5hZGQocnVudGltZVR5cGUpOwotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkVYVEVOU0lPTl9QT0lOVCwgIiAgTG9hZGVkIHJ1bnRpbWVUeXBlOiAiICsgY2ZbaV0uZ2V0QXR0cmlidXRlKCJpZCIpKTsKLQkJCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiICBDb3VsZCBub3QgbG9hZCBydW50aW1lVHlwZTogIiArIGNmW2ldLmdldEF0dHJpYnV0ZSgiaWQiKSwgdCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBMb2FkIHRoZSBzZXJ2ZXIgdHlwZXMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgbG9hZFNlcnZlclR5cGVzKCkgewotCQlpZiAoc2VydmVyVHlwZXMgIT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCVRyYWNlLnRyYWNlKFRyYWNlLkVYVEVOU0lPTl9QT0lOVCwgIi0+LSBMb2FkaW5nIC5zZXJ2ZXJUeXBlcyBleHRlbnNpb24gcG9pbnQgLT4tIik7Ci0JCQotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjZiA9IHJlZ2lzdHJ5LmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcihTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCBFWFRFTlNJT05fU0VSVkVSX1RZUEUpOwotCQlzZXJ2ZXJUeXBlcyA9IG5ldyBBcnJheUxpc3QoY2YubGVuZ3RoKTsKLQkJYWRkU2VydmVyVHlwZXMoY2YpOwotCQlhZGRSZWdpc3RyeUxpc3RlbmVyKCk7Ci0JCQotCQlUcmFjZS50cmFjZShUcmFjZS5FWFRFTlNJT05fUE9JTlQsICItPC0gRG9uZSBsb2FkaW5nIC5zZXJ2ZXJUeXBlcyBleHRlbnNpb24gcG9pbnQgLTwtIik7Ci0JfQotCi0JLyoqCi0JICogTG9hZCB0aGUgc2VydmVyIHR5cGVzLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIGFkZFNlcnZlclR5cGVzKElDb25maWd1cmF0aW9uRWxlbWVudFtdIGNmKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2YubGVuZ3RoOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJU2VydmVyVHlwZSBzZXJ2ZXJUeXBlID0gbmV3IFNlcnZlclR5cGUoY2ZbaV0pOwotCQkJCXNlcnZlclR5cGVzLmFkZChzZXJ2ZXJUeXBlKTsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5FWFRFTlNJT05fUE9JTlQsICIgIExvYWRlZCBzZXJ2ZXJUeXBlOiAiICsgY2ZbaV0uZ2V0QXR0cmlidXRlKCJpZCIpKTsKLQkJCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiICBDb3VsZCBub3QgbG9hZCBzZXJ2ZXJUeXBlOiAiICsgY2ZbaV0uZ2V0QXR0cmlidXRlKCJpZCIpLCB0KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJ1bnRpbWUgd2l0aCB0aGUgZ2l2ZW4gaWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogaWYgbm9uZS4gVGhpcyBjb252ZW5pZW5jZSBtZXRob2Qgc2VhcmNoZXMgdGhlIGxpc3Qgb2Yga25vd24KLQkgKiBydW50aW1lcyAoe0BsaW5rICNnZXRSdW50aW1lcygpfSkgZm9yIHRoZSBvbmUgd2l0aCBhIG1hdGNoaW5nCi0JICogcnVudGltZSBpZCAoe0BsaW5rIElSdW50aW1lI2dldElkKCl9KS4gVGhlIGlkIG1heSBub3QgYmUgbnVsbC4KLQkgKgotCSAqIEBwYXJhbSBpZCB0aGUgcnVudGltZSBpZAotCSAqIEByZXR1cm4gdGhlIHJ1bnRpbWUgaW5zdGFuY2UsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vIHJ1bnRpbWUKLQkgKiB3aXRoIHRoZSBnaXZlbiBpZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVJ1bnRpbWUgZmluZFJ1bnRpbWUoU3RyaW5nIGlkKSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZU1hbmFnZXIoKS5nZXRSdW50aW1lKGlkKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGFsbCBrbm93biBydW50aW1lIGluc3RhbmNlcy4gVGhlIGxpc3Qgd2lsbCBub3QgY29udGFpbiBhbnkKLQkgKiB3b3JraW5nIGNvcGllcy4KLQkgKiA8cD4KLQkgKiBBIG5ldyBhcnJheSBpcyByZXR1cm5lZCBvbiBlYWNoIGNhbGwsIHNvIGNsaWVudHMgbWF5IHN0b3JlIG9yIG1vZGlmeSB0aGUgcmVzdWx0LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgcG9zc2libHktZW1wdHkgYXJyYXkgb2YgcnVudGltZSBpbnN0YW5jZXMge0BsaW5rIElSdW50aW1lfQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVJ1bnRpbWVbXSBnZXRSdW50aW1lcygpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlTWFuYWdlcigpLmdldFJ1bnRpbWVzKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2VydmVyIHdpdGggdGhlIGdpdmVuIGlkLCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIGlmIG5vbmUuIFRoaXMgY29udmVuaWVuY2UgbWV0aG9kIHNlYXJjaGVzIHRoZSBsaXN0IG9mIGtub3duCi0JICogc2VydmVycyAoe0BsaW5rICNnZXRTZXJ2ZXJzKCl9KSBmb3IgdGhlIG9uZSB3aXRoIGEgbWF0Y2hpbmcKLQkgKiBzZXJ2ZXIgaWQgKHtAbGluayBJU2VydmVyI2dldElkKCl9KS4gVGhlIGlkIG11c3Qgbm90IGJlIG51bGwuCi0JICoKLQkgKiBAcGFyYW0gaWQgdGhlIHNlcnZlciBpZAotCSAqIEByZXR1cm4gdGhlIHNlcnZlciBpbnN0YW5jZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm8gc2VydmVyCi0JICogd2l0aCB0aGUgZ2l2ZW4gaWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTZXJ2ZXIgZmluZFNlcnZlcihTdHJpbmcgaWQpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlTWFuYWdlcigpLmdldFNlcnZlcihpZCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBhcnJheSBvZiBhbGwga25vd24gc2VydmVyIGluc3RhbmNlcy4gVGhlIGFycmF5IHdpbGwgbm90IGluY2x1ZGUgYW55Ci0JICogd29ya2luZyBjb3BpZXMuCi0JICogPHA+Ci0JICogQSBuZXcgYXJyYXkgaXMgcmV0dXJuZWQgb24gZWFjaCBjYWxsLCBzbyBjbGllbnRzIG1heSBzdG9yZSBvciBtb2RpZnkgdGhlIHJlc3VsdC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiBhIHBvc3NpYmx5LWVtcHR5IGFycmF5IG9mIHNlcnZlciBpbnN0YW5jZXMge0BsaW5rIElTZXJ2ZXJ9Ci0JICovCi0JcHVibGljIHN0YXRpYyBJU2VydmVyW10gZ2V0U2VydmVycygpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlTWFuYWdlcigpLmdldFNlcnZlcnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgbmV3IHJ1bnRpbWUgbGlmZWN5Y2xlIGxpc3RlbmVyLgotCSAqIEhhcyBubyBlZmZlY3QgaWYgYW4gaWRlbnRpY2FsIGxpc3RlbmVyIGlzIGFscmVhZHkgcmVnaXN0ZXJlZC4KLQkgKgotCSAqIEBwYXJhbSBsaXN0ZW5lciBhIHJ1bnRpbWUgbGlmZWN5Y2xlIGxpc3RlbmVyCi0JICogQHNlZSAjcmVtb3ZlUnVudGltZUxpZmVjeWNsZUxpc3RlbmVyKElSdW50aW1lTGlmZWN5Y2xlTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZFJ1bnRpbWVMaWZlY3ljbGVMaXN0ZW5lcihJUnVudGltZUxpZmVjeWNsZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWdldFJlc291cmNlTWFuYWdlcigpLmFkZFJ1bnRpbWVMaWZlY3ljbGVMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBhIHJ1bnRpbWUgbGlmZWN5Y2xlIGxpc3RlbmVyLgotCSAqIEhhcyBubyBlZmZlY3QgaWYgdGhlIGxpc3RlbmVyIGlzIG5vdCByZWdpc3RlcmVkLgotCSAqCi0JICogQHBhcmFtIGxpc3RlbmVyIGEgcnVudGltZSBsaWZlY3ljbGUgbGlzdGVuZXIKLQkgKiBAc2VlICNhZGRSdW50aW1lTGlmZWN5Y2xlTGlzdGVuZXIoSVJ1bnRpbWVMaWZlY3ljbGVMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlUnVudGltZUxpZmVjeWNsZUxpc3RlbmVyKElSdW50aW1lTGlmZWN5Y2xlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJZ2V0UmVzb3VyY2VNYW5hZ2VyKCkucmVtb3ZlUnVudGltZUxpZmVjeWNsZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgbmV3IHNlcnZlciBsaWZlY3ljbGUgbGlzdGVuZXIuCi0JICogSGFzIG5vIGVmZmVjdCBpZiBhbiBpZGVudGljYWwgbGlzdGVuZXIgaXMgYWxyZWFkeSByZWdpc3RlcmVkLgotCSAqCi0JICogQHBhcmFtIGxpc3RlbmVyIGEgc2VydmVyIGxpZmVjeWNsZSBsaXN0ZW5lcgotCSAqIEBzZWUgI3JlbW92ZVNlcnZlckxpZmVjeWNsZUxpc3RlbmVyKElTZXJ2ZXJMaWZlY3ljbGVMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkU2VydmVyTGlmZWN5Y2xlTGlzdGVuZXIoSVNlcnZlckxpZmVjeWNsZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWdldFJlc291cmNlTWFuYWdlcigpLmFkZFNlcnZlckxpZmVjeWNsZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGEgc2VydmVyIGxpZmVjeWNsZSBsaXN0ZW5lci4KLQkgKiBIYXMgbm8gZWZmZWN0IGlmIHRoZSBsaXN0ZW5lciBpcyBub3QgcmVnaXN0ZXJlZC4KLQkgKgotCSAqIEBwYXJhbSBsaXN0ZW5lciBhIHNlcnZlciBsaWZlY3ljbGUgbGlzdGVuZXIKLQkgKiAjYWRkU2VydmVyTGlmZWN5Y2xlTGlzdGVuZXIoSVNlcnZlckxpZmVjeWNsZUxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVTZXJ2ZXJMaWZlY3ljbGVMaXN0ZW5lcihJU2VydmVyTGlmZWN5Y2xlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJZ2V0UmVzb3VyY2VNYW5hZ2VyKCkucmVtb3ZlU2VydmVyTGlmZWN5Y2xlTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHByZWZlcnJlZCBydW50aW1lIHNlcnZlciBmb3IgdGhlIGdpdmVuIG1vZHVsZS4gVGhpcyBtZXRob2QKLQkgKiByZXR1cm5zIG51bGwgaWYgdGhlIHNlcnZlciB3YXMgbmV2ZXIgY2hvc2VuIG9yIGRvZXMgbm90IGN1cnJlbnRseSBleGlzdC4gKGlmIHRoZQotCSAqIHNlcnZlciBpcyByZWNyZWF0ZWQgb3Igd2FzIGluIGEgY2xvc2VkIHByb2plY3QsIGV0Yy4gdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4KLQkgKiB0aGUgb3JpZ2luYWwgdmFsdWUgaWYgaXQgYmVjb21lcyBhdmFpbGFibGUgYWdhaW4pCi0JICoKLQkgKiBAcGFyYW0gbW9kdWxlIGEgbW9kdWxlCi0JICogQHJldHVybiB0aGUgY3VycmVudCBkZWZhdWx0IHNlcnZlciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm8KLQkgKiAgICBkZWZhdWx0IHNlcnZlcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVNlcnZlciBnZXREZWZhdWx0U2VydmVyKElNb2R1bGUgbW9kdWxlKSB7Ci0JCXJldHVybiBNb2R1bGVQcm9wZXJ0aWVzLmdldEluc3RhbmNlKCkuZ2V0RGVmYXVsdFNlcnZlcihtb2R1bGUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHByZWZlcnJlZCBydW50aW1lIHNlcnZlciBmb3IgdGhlIGdpdmVuIG1vZHVsZS4gU2V0IHRoZSBzZXJ2ZXIgdG8KLQkgKiBudWxsIHRvIGNsZWFyIHRoZSBzZXR0aW5nLiBJZiB0aGVyZSBpcyBhIHByb2JsZW0gc2F2aW5nIHRoZSBmaWxlLCBhIENvcmVFeGNlcHRpb24KLQkgKiB3aWxsIGJlIHRocm93bi4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kdWxlIHRoZSBtb2R1bGUgdG8gc2V0IHRoZSBkZWZhdWx0IGZvcgotCSAqIEBwYXJhbSBzZXJ2ZXIgdGhlIHNlcnZlciB0byBzZXQgdGhlIGRlZmF1bHQgc2VydmVyLCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqICAgIHRvIHVuc2V0IHRoZSBkZWZhdWx0Ci0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHByb2JsZW0gc2V0dGluZyB0aGUgZGVmYXVsdCBzZXJ2ZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0RGVmYXVsdFNlcnZlcihJTW9kdWxlIG1vZHVsZSwgSVNlcnZlciBzZXJ2ZXIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlNb2R1bGVQcm9wZXJ0aWVzLmdldEluc3RhbmNlKCkuc2V0RGVmYXVsdFNlcnZlcihtb2R1bGUsIHNlcnZlciwgbW9uaXRvcik7Ci0JfQotCi0JLyoqCi0JICogSGFuZGxlcyBhIGNoYW5nZSB0byB0aGUgc2VydmVyIHR5cGUgZXh0ZW5zaW9uIHBvaW50IGR1ZSB0byBidW5kbGVzIGdldHRpbmcgYWRkZWQKLQkgKiBvciByZW1vdmVkIGR5bmFtaWNhbGx5IGF0IHJ1bnRpbWUuCi0JICogCi0JICogQHBhcmFtIGRlbHRhIGFuIGV4dGVuc2lvbiBkZWx0YQotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBoYW5kbGVTZXJ2ZXJUeXBlRGVsdGEoSUV4dGVuc2lvbkRlbHRhIGRlbHRhKSB7Ci0JCWlmIChzZXJ2ZXJUeXBlcyA9PSBudWxsKSAvLyBub3QgbG9hZGVkIHlldAotCQkJcmV0dXJuOwotCQkKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2YgPSBkZWx0YS5nZXRFeHRlbnNpb24oKS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCi0JCWlmIChkZWx0YS5nZXRLaW5kKCkgPT0gSUV4dGVuc2lvbkRlbHRhLkFEREVEKSB7Ci0JCQlhZGRTZXJ2ZXJUeXBlcyhjZik7Ci0JCX0gZWxzZSB7Ci0JCQlpbnQgc2l6ZSA9IHNlcnZlclR5cGVzLnNpemUoKTsKLQkJCVNlcnZlclR5cGVbXSBzdCA9IG5ldyBTZXJ2ZXJUeXBlW3NpemVdOwotCQkJc2VydmVyVHlwZXMudG9BcnJheShzdCk7Ci0JCQlpbnQgc2l6ZTIgPSBjZi5sZW5ndGg7Ci0JCQkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBzaXplMjsgaisrKSB7Ci0JCQkJCWlmIChzdFtpXS5nZXRJZCgpLmVxdWFscyhjZltqXS5nZXRBdHRyaWJ1dGUoImlkIikpKSB7Ci0JCQkJCQlzdFtpXS5kaXNwb3NlKCk7Ci0JCQkJCQlzZXJ2ZXJUeXBlcy5yZW1vdmUoc3RbaV0pOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWdldFJlc291cmNlTWFuYWdlcigpLnJlc29sdmVTZXJ2ZXJzKCk7Ci0JfQotCi0JLyoqCi0JICogSGFuZGxlcyBhIGNoYW5nZSB0byB0aGUgcnVudGltZSB0eXBlIGV4dGVuc2lvbiBwb2ludCBkdWUgdG8gYnVuZGxlcyBnZXR0aW5nIGFkZGVkCi0JICogb3IgcmVtb3ZlZCBkeW5hbWljYWxseSBhdCBydW50aW1lLgotCSAqIAotCSAqIEBwYXJhbSBkZWx0YSBhbiBleHRlbnNpb24gZGVsdGEKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgaGFuZGxlUnVudGltZVR5cGVEZWx0YShJRXh0ZW5zaW9uRGVsdGEgZGVsdGEpIHsKLQkJaWYgKHJ1bnRpbWVUeXBlcyA9PSBudWxsKSAvLyBub3QgbG9hZGVkIHlldAotCQkJcmV0dXJuOwotCQkKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2YgPSBkZWx0YS5nZXRFeHRlbnNpb24oKS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCi0JCWlmIChkZWx0YS5nZXRLaW5kKCkgPT0gSUV4dGVuc2lvbkRlbHRhLkFEREVEKSB7Ci0JCQlhZGRSdW50aW1lVHlwZXMoY2YpOwotCQl9IGVsc2UgewotCQkJaW50IHNpemUgPSBydW50aW1lVHlwZXMuc2l6ZSgpOwotCQkJUnVudGltZVR5cGVbXSBydCA9IG5ldyBSdW50aW1lVHlwZVtzaXplXTsKLQkJCXJ1bnRpbWVUeXBlcy50b0FycmF5KHJ0KTsKLQkJCWludCBzaXplMiA9IGNmLmxlbmd0aDsKLQkJCQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHNpemUyOyBqKyspIHsKLQkJCQkJaWYgKHJ0W2ldLmdldElkKCkuZXF1YWxzKGNmW2pdLmdldEF0dHJpYnV0ZSgiaWQiKSkpIHsKLQkJCQkJCXJ0W2ldLmRpc3Bvc2UoKTsKLQkJCQkJCXJ1bnRpbWVUeXBlcy5yZW1vdmUocnRbaV0pOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWdldFJlc291cmNlTWFuYWdlcigpLnJlc29sdmVSdW50aW1lcygpOwotCQlnZXRSZXNvdXJjZU1hbmFnZXIoKS5yZXNvbHZlU2VydmVycygpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkUmVnaXN0cnlMaXN0ZW5lcigpIHsKLQkJaWYgKHJlZ2lzdHJ5TGlzdGVuZXIgIT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCXJlZ2lzdHJ5TGlzdGVuZXIgPSBuZXcgUmVnaXN0cnlDaGFuZ2VMaXN0ZW5lcigpOwotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlyZWdpc3RyeS5hZGRSZWdpc3RyeUNoYW5nZUxpc3RlbmVyKHJlZ2lzdHJ5TGlzdGVuZXIsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQpOwotCQlTZXJ2ZXJQbHVnaW4uc2V0UmVnaXN0cnlMaXN0ZW5lcihyZWdpc3RyeUxpc3RlbmVyKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvU2VydmVyRXZlbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL1NlcnZlckV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkNmM4NWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvU2VydmVyRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLaAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZTsKLS8qKgotICogQW4gZXZlbnQgZmlyZWQgd2hlbiBhIHNlcnZlciBjaGFuZ2Ugb3IgbW9kdWxlIGNoYW5nZXMuCi0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFNlcnZlckV2ZW50IHsKLQlwcml2YXRlIElTZXJ2ZXIgc2VydmVyOwotCXByaXZhdGUgaW50IGtpbmQ7Ci0JcHJpdmF0ZSBJTW9kdWxlW10gbW9kdWxlVHJlZTsKLQlwcml2YXRlIGludCBzdGF0ZTsKLQlwcml2YXRlIGludCBwdWJsaXNoU3RhdGU7Ci0JcHJpdmF0ZSBib29sZWFuIHJlc3RhcnRTdGF0ZTsKLQkKLQkvKioKLQkgKiBGb3Igbm90aWZpY2F0aW9uIHdoZW4gdGhlIHN0YXRlIGhhcyBjaGFuZ2VkLgotCSAqIDxwPgotCSAqIFRoaXMga2luZCBpcyBtdXR1YWxseSBleGNsdXNpdmUgd2l0aCA8Y29kZT5QVUJMSVNIX1NUQVRFX0NIQU5HRTwvY29kZT4gYW5kIAotCSAqIDxjb2RlPlJFU1RBUlRfU1RBVEVfQ0hBTkdFPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSAjZ2V0S2luZCgpCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfQ0hBTkdFID0gMHgwMDAxOwotCQotCS8qKgotCSAqIEZpcmVkIHdoZW4gcHVibGlzaGVkIGlzIG5lZWRlZCBvciBubyBsb25nZXIgbmVlZHMgdG8gYmUgcHVibGlzaGVkLCAKLQkgKiBvciBpdCdzIHN0YXRlIGhhcyBjaGFuZ2VkLgotCSAqIDxwPgotCSAqIFRoaXMga2luZCBpcyBtdXR1YWxseSBleGNsdXNpdmUgd2l0aCA8Y29kZT5TVEFURV9DSEFOR0U8L2NvZGU+IGFuZCAKLQkgKiA8Y29kZT5SRVNUQVJUX1NUQVRFX0NIQU5HRTwvY29kZT4uCi0JICogPC9wPgotCSAqIAotCSAqIEBzZWUgI2dldEtpbmQoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBVQkxJU0hfU1RBVEVfQ0hBTkdFID0gMHgwMDAyOwotCQotCS8qKgotCSAqIEZvciBub3RpZmljYXRpb24gd2hlbiB0aGUgc2VydmVyIGlzUmVzdGFydE5lZWRlZCgpIHByb3BlcnR5IGNoYW5nZXMuCi0JICogPHA+Ci0JICogVGhpcyBraW5kIGlzIG11dHVhbGx5IGV4Y2x1c2l2ZSB3aXRoIDxjb2RlPlNUQVRFX0NIQU5HRTwvY29kZT4gYW5kIAotCSAqIDxjb2RlPlBVQkxJU0hfU1RBVEVfQ0hBTkdFPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSAjZ2V0S2luZCgpCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTVEFSVF9TVEFURV9DSEFOR0UgPSAweDAwMDQ7Ci0JCi0JLyoqCi0JICogRm9yIGV2ZW50IG9uIHNlcnZlciBjaGFuZ2VzLiBUaGlzIGtpbmQgaXMgbXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggPGNvZGU+TU9EVUxFX0NIQU5HRTwvY29kZT4uCi0JICogCi0JICogQHNlZSAjZ2V0S2luZCgpCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VSVkVSX0NIQU5HRSA9IDB4MDAxMDsKLQkKLQkvKioKLQkgKiBGb3IgZXZlbnQgb24gbW9kdWxlIGNoYW5nZXMuIFRoaXMga2luZCBpcyBtdXR1YWxseSBleGNsdXNpdmUgd2l0aCA8Y29kZT5TRVJWRVJfQ0hBTkdFPC9jb2RlPi4KLQkgKiAKLQkgKiBAc2VlICNnZXRLaW5kKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT0RVTEVfQ0hBTkdFID0gMHgwMDIwOwotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IHNlcnZlciBldmVudCBmb3Igc2VydmVyIGNoYW5nZSBldmVudHMuCi0JICogCi0JICogQHBhcmFtIGtpbmQgdGhlIGtpbmQgb2YgdGhlIGNoYW5nZS4gKDxjb2RlPlhYWF9DSEFOR0U8L2NvZGU+KS4gSWYgdGhlIGtpbmQgZG9lcyBub3QgCi0JICogICAgaW5jbHVkZSB0aGUgPGNvZGU+U0VSVkVSX0NIQU5HRTwvY29kZT4ga2luZCwgdGhlIFNFUlZFUl9DSEFOR0Ugd2lsbCBiZSBhZGRlZCBhdXRvbWF0aWNhbGx5LiAgCi0JICogICAgY29uc3RhbnRzIGRlY2xhcmVkIG9uIHtAbGluayBTZXJ2ZXJFdmVudH0KLQkgKiBAcGFyYW0gc2VydmVyIHRoZSBzZXJ2ZXIgdGhhdCB0aGUgc2VydmVyIGV2ZW50IHRha2VzIHBsYWNlCi0JICogQHBhcmFtIHN0YXRlIHRoZSBzZXJ2ZXIgc3RhdGUgYWZ0ZXIgdGhlIGNoYW5nZSAoPGNvZGU+U1RBVEVfWFhYPC9jb2RlPikKLQkgKiAgICBjb25zdGFudHMgZGVjbGFyZWQgb24ge0BsaW5rIElTZXJ2ZXJ9Ci0JICogQHBhcmFtIHB1Ymxpc2hpbmdTdGF0ZSB0aGUgc2VydmVyIHB1Ymxpc2hpbmcgc3RhdGUgYWZ0ZXIgdGhlIAotCSAqICAgIGNoYW5nZSAoPGNvZGU+UFVCTElTSF9TVEFURV9YWFg8L2NvZGU+KQotCSAqICAgIGNvbnN0YW50cyBkZWNsYXJlZCBvbiB7QGxpbmsgSVNlcnZlcn0KLQkgKiBAcGFyYW0gcmVzdGFydFN0YXRlIGdldCB0aGUgc2VydmVyIHJlc3RhcnQgc3RhdGUgYWZ0ZXIgdGhlIHNlcnZlciBpcyByZXN0YXJ0IAotCSAqICAgIG5lZWRlZCBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnQKLQkgKi8KLQlwdWJsaWMgU2VydmVyRXZlbnQoaW50IGtpbmQsIElTZXJ2ZXIgc2VydmVyLCBpbnQgc3RhdGUsIGludCBwdWJsaXNoaW5nU3RhdGUsIGJvb2xlYW4gcmVzdGFydFN0YXRlKSB7Ci0JCXRoaXMua2luZCA9IGtpbmQgfD0gU0VSVkVSX0NIQU5HRTsKLQkJdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7Ci0JCXRoaXMuc3RhdGUgPSBzdGF0ZTsKLQkJdGhpcy5wdWJsaXNoU3RhdGUgPSBwdWJsaXNoaW5nU3RhdGU7Ci0JCXRoaXMucmVzdGFydFN0YXRlID0gcmVzdGFydFN0YXRlOwotCQkKLQkJaWYgKHNlcnZlciA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU2VydmVyIHBhcmFtZXRlciBtdXN0IG5vdCBiZSBudWxsIik7Ci0JCWlmICgoa2luZCAmIE1PRFVMRV9DSEFOR0UpICE9IDApCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJLaW5kIHBhcmFtZXRlciBpbnZhbGlkIik7Ci0JCQotCQljaGVja0tpbmQoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgU2VydmVyRXZlbnQgZm9yIG1vZHVsZSBjaGFuZ2UgZXZlbnRzLgotCSAqIAotCSAqIEBwYXJhbSBraW5kIHRoZSBraW5kIG9mIHRoZSBjaGFuZ2UuICg8Y29kZT5YWFhfQ0hBTkdFPC9jb2RlPikuIElmIHRoZSBraW5kIGRvZXMgbm90IAotCSAqICAgIGluY2x1ZGUgdGhlIDxjb2RlPk1PRFVMRV9DSEFOR0U8L2NvZGU+IGtpbmQsIHRoZSBNT0RVTEVfQ0hBTkdFIHdpbGwgYmUgYWRkZWQgYXV0b21hdGljYWxseS4gIAotCSAqICAgIGNvbnN0YW50cyBkZWNsYXJlZCBvbiB7QGxpbmsgU2VydmVyRXZlbnR9Ci0JICogQHBhcmFtIHNlcnZlciB0aGUgc2VydmVyIHRoYXQgdGhlIG1vZHVsZSBldmVudCB0YWtlcyBwbGFjZQotCSAqIEBwYXJhbSBtb2R1bGUgdGhlIG1vZHVsZSB0aGF0IGhhcyBjaGFuZ2VkCi0JICogQHBhcmFtIHN0YXRlIHRoZSBtb2R1bGUgc3RhdGUgYWZ0ZXIgdGhlIGNoYW5nZSAoPGNvZGU+U1RBVEVfWFhYPC9jb2RlPikKLQkgKiAgICBjb25zdGFudHMgZGVjbGFyZWQgb24ge0BsaW5rIElTZXJ2ZXJ9Ci0JICogQHBhcmFtIHB1Ymxpc2hpbmdTdGF0ZSB0aGUgbW9kdWxlIHB1Ymxpc2hpbmcgc3RhdGUgYWZ0ZXIgdGhlIAotCSAqICAgIGNoYW5nZSAoPGNvZGU+UFVCTElTSF9TVEFURV9YWFg8L2NvZGU+KQotCSAqICAgIGNvbnN0YW50cyBkZWNsYXJlZCBvbiB7QGxpbmsgSVNlcnZlcn0KLQkgKiBAcGFyYW0gcmVzdGFydFN0YXRlIGdldCB0aGUgbW9kdWxlIHJlc3RhcnQgc3RhdGUgYWZ0ZXIgdGhlIG1vZHVsZSBpcyByZXN0YXJ0IAotCSAqICAgIG5lZWRlZCBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnQuCi0JICovCi0JcHVibGljIFNlcnZlckV2ZW50KGludCBraW5kLCBJU2VydmVyIHNlcnZlciwgSU1vZHVsZVtdIG1vZHVsZSwgaW50IHN0YXRlLCBpbnQgcHVibGlzaGluZ1N0YXRlLCBib29sZWFuIHJlc3RhcnRTdGF0ZSkgewotCQl0aGlzLmtpbmQgPSBraW5kIHw9IE1PRFVMRV9DSEFOR0U7Ci0JCXRoaXMuc2VydmVyID0gc2VydmVyOwotCQl0aGlzLm1vZHVsZVRyZWUgPSBtb2R1bGU7Ci0JCXRoaXMuc3RhdGUgPSBzdGF0ZTsKLQkJdGhpcy5wdWJsaXNoU3RhdGUgPSBwdWJsaXNoaW5nU3RhdGU7Ci0JCXRoaXMucmVzdGFydFN0YXRlID0gcmVzdGFydFN0YXRlOwotCQkKLQkJaWYgKG1vZHVsZVRyZWUgPT0gbnVsbCB8fCBtb2R1bGVUcmVlLmxlbmd0aCA9PSAwKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTW9kdWxlIHBhcmFtZXRlciBpbnZhbGlkIik7Ci0JCWlmICgoa2luZCAmIFNFUlZFUl9DSEFOR0UpICE9IDApCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJLaW5kIHBhcmFtZXRlciBpbnZhbGlkIik7Ci0JCQotCQljaGVja0tpbmQoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNoZWNrS2luZCgpIHsKLQkJaW50IGkgPSAwOwotCQlpZiAoKGtpbmQgJiBTVEFURV9DSEFOR0UpICE9IDApCi0JCQlpKys7Ci0JCWlmICgoa2luZCAmIFJFU1RBUlRfU1RBVEVfQ0hBTkdFKSAhPSAwKQotCQkJaSsrOwotCQlpZiAoKGtpbmQgJiBQVUJMSVNIX1NUQVRFX0NIQU5HRSkgIT0gMCkKLQkJCWkrKzsKLQkJCi0JCWlmIChpICE9IDEpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJLaW5kIHBhcmFtZXRlciBpbnZhbGlkIik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUga2luZCBvZiB0aGUgc2VydmVyIGV2ZW50LgotCSAqIDxwPgotCSAqIFRoaXMga2luZCBjYW4gYmUgdXNlZCB0byB0ZXN0IHdoZXRoZXIgdGhpcyBldmVudCBpcyBhIHNlcnZlciBldmVudCBvciBtb2R1bGUgZXZlbnQgYnkgdXNpbmcKLQkgKiB0aGUgZm9sbG93aW5nIGNvZGUgKHRoZSBleGFtcGxlIGlzIGNoZWNraW5nIGZvciB0aGUgc2VydmVyIGV2ZW50KToKLQkgKiAoKGdldEtpbmQoKSB8IFNFUlZFUl9DSEFOR0UpICE9IDApIAotCSAqIHRoZSBmb2xsb3dpbmcgY29kZSAodGhlIGV4YW1wbGUgaXMgY2hlY2tpbmcgZm9yIHRoZSBtb2R1bGUgZXZlbnQpOgotCSAqICgoZ2V0S2luZCgpIHwgTU9EVUxFX0NIQU5HRSkgIT0gMCkgCi0JICogCi0JICogQHJldHVybiB0aGUga2luZCBvZiB0aGUgY2hhbmdlICg8Y29kZT5YWFhfQ0hBTkdFPC9jb2RlPgotCSAqICAgIGNvbnN0YW50cyBkZWNsYXJlZCBvbiB7QGxpbmsgU2VydmVyRXZlbnR9Ci0JICovCi0JcHVibGljIGludCBnZXRLaW5kKCkgewotCQlyZXR1cm4ga2luZDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbW9kdWxlIHRyZWUgb2YgdGhlIG1vZHVsZSBpbnZvbHZlZCBpbiB0aGUgbW9kdWxlIGNoYW5nZSBldmVudCwKLQkgKiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgZXZlbnQgaXMgbm90IGEgbW9kdWxlIGV2ZW50LCBpLmUuIGlzTW9kdWxlRXZlbnQoKSBpcyBmYWxzZS4KLQkgKiAgCi0JICogQHJldHVybiB0aGUgbW9kdWxlIHRyZWUgb2YgdGhlIG1vZHVsZSBpbnZvbHZlZCBpbiB0aGUgbW9kdWxlIGNoYW5nZSBldmVudCwKLQkgKiAgICBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgZXZlbnQgaXMgbm90IGEgbW9kdWxlIGV2ZW50LCBpLmUuCi0JICogICAgaXNNb2R1bGVFdmVudCgpIGlzIGZhbHNlLgotCSAqLwotCXB1YmxpYyBJTW9kdWxlW10gZ2V0TW9kdWxlKCkgewotCQlyZXR1cm4gbW9kdWxlVHJlZTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBwdWJsaXNoIHN0YXRlIGFmdGVyIHRoZSBjaGFuZ2UgdGhhdCB0cmlnZ2VycyB0aGlzIHNlcnZlciBldmVudC4gSWYgdGhpcyBldmVudCAKLQkgKiBpcyBvZiB0aGUgU0VSVkVSX0NIQU5HRSBraW5kLCB0aGVuIHRoZSBwdWJsaXNoaW5nIHN0YXRlIGlzIHRoZSBzZXJ2ZXIgcHVibGlzaGluZyBzdGF0ZS4KLQkgKiBJZiB0aGlzIGV2ZW50IGlzIG9mIHRoZSBNT0RVTEVfQ0hBTkdFIGtpbmQsIHRoZW4gdGhlIHB1Ymxpc2hpbmcgc3RhdGUgaXMgdGhlIG1vZHVsZQotCSAqIHB1Ymxpc2hpbmcgc3RhdGUuCi0JICogCi0JICogQHJldHVybiB0aGUgcHVibGlzaGluZyBzdGF0ZSBhZnRlciB0aGUgY2hhbmdlICg8Y29kZT5QVUJMSVNIX1NUQVRFX1hYWDwvY29kZT4pCi0JICogICAgY29uc3RhbnRzIGRlY2xhcmVkIG9uIHtAbGluayBJU2VydmVyfQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0UHVibGlzaFN0YXRlKCkgewotCQlyZXR1cm4gcHVibGlzaFN0YXRlOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgdGhlIHJlc3RhcnQgc3RhdGUgYWZ0ZXIgaXNSZXN0YXJ0TmVlZGVkKCkgcHJvcGVydHkgY2hhbmdlIGV2ZW50LgotCSAqIElmIHRoaXMgZXZlbnQgaXMgb2YgdGhlIFNFUlZFUl9DSEFOR0Uga2luZCwgdGhlbiB0aGUgcmVzdGFydCBzdGF0ZSBpcyB0aGUgc2VydmVyIAotCSAqIHJlc3RhcnQgc3RhdGUuIElmIHRoaXMgZXZlbnQgaXMgb2YgdGhlIE1PRFVMRV9DSEFOR0Uga2luZCwgdGhlbiB0aGUgcmVzdGFydCBzdGF0ZSAKLQkgKiBpcyB0aGUgbW9kdWxlIHJlc3RhcnQgc3RhdGUuIAotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgcmVzdGFydCBpcyBuZWVkZWQsIGFuZAotCSAqICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRSZXN0YXJ0U3RhdGUoKSB7Ci0JCXJldHVybiByZXN0YXJ0U3RhdGU7Ci0JfQotCQotCS8qKgotCSAqIEdldCB0aGUgc3RhdGUgYWZ0ZXIgdGhlIGNoYW5nZSB0aGF0IHRyaWdnZXJzIHRoaXMgc2VydmVyIGV2ZW50LiBJZiB0aGlzIGV2ZW50IAotCSAqIGlzIG9mIHRoZSBTRVJWRVJfQ0hBTkdFIGtpbmQsIHRoZW4gdGhlIHN0YXRlIGlzIHRoZSBzZXJ2ZXIgc3RhdGUuCi0JICogSWYgdGhpcyBldmVudCBpcyBvZiB0aGUgTU9EVUxFX0NIQU5HRSBraW5kLCB0aGVuIHRoZSBzdGF0ZSBpcyB0aGUgbW9kdWxlCi0JICogc3RhdGUuCi0JICogCi0JICogQHJldHVybiB0aGUgc2VydmVyIHN0YXRlIGFmdGVyIHRoZSBjaGFuZ2UgKDxjb2RlPlNUQVRFX1hYWDwvY29kZT4pCi0JICogICAgY29uc3RhbnRzIGRlY2xhcmVkIG9uIHtAbGluayBJU2VydmVyfQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3RhdGUoKSB7Ci0JCXJldHVybiBzdGF0ZTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2VydmVyIGludm9sdmVkIGluIHRoZSBjaGFuZ2UgZXZlbnQuCi0JICogCi0JICogQHJldHVybiB0aGUgc2VydmVyIGludm9sdmVkIGluIHRoZSBjaGFuZ2UgZXZlbnQuCi0JICovCi0JcHVibGljIElTZXJ2ZXIgZ2V0U2VydmVyKCkgewotCQlyZXR1cm4gc2VydmVyOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9TZXJ2ZXJQb3J0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9TZXJ2ZXJQb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5MTRiZjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvU2VydmVyUG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlOwotLyoqCi0gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBwb3J0IG9uIGEgc2VydmVyLgotICogCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJQb3J0IHsKLQlwcml2YXRlIFN0cmluZyBpZDsKLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCXByaXZhdGUgaW50IHBvcnQ7Ci0JcHJpdmF0ZSBTdHJpbmcgcHJvdG9jb2w7Ci0JcHJpdmF0ZSBTdHJpbmdbXSBjb250ZW50VHlwZXM7Ci0JcHJpdmF0ZSBib29sZWFuIGFkdmFuY2VkOwotCQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBzZXJ2ZXIgcG9ydC4KLQkgKiAKLQkgKiBAcGFyYW0gaWQgYSBzZXJ2ZXItc3BlY2lmaWMgcG9ydCBpZAotCSAqIEBwYXJhbSBuYW1lIGEgaHVtYW4tcmVhZGFibGUgbmFtZSBmb3IgdGhlIHBvcnQKLQkgKiBAcGFyYW0gcG9ydCB0aGUgbnVtYmVyIG51bWJlcgotCSAqIEBwYXJhbSBwcm90b2NvbCB0aGUgcG9ydCdzIHByb3RvY29sCi0JICovCi0JcHVibGljIFNlcnZlclBvcnQoU3RyaW5nIGlkLCBTdHJpbmcgbmFtZSwgaW50IHBvcnQsIFN0cmluZyBwcm90b2NvbCkgewotCQl0aGlzKGlkLCBuYW1lLCBwb3J0LCBwcm90b2NvbCwgbnVsbCwgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IHNlcnZlciBwb3J0LgotCSAqIAotCSAqIEBwYXJhbSBpZCBhIHNlcnZlci1zcGVjaWZpYyBwb3J0IGlkCi0JICogQHBhcmFtIG5hbWUgYSBodW1hbi1yZWFkYWJsZSBuYW1lIGZvciB0aGUgcG9ydAotCSAqIEBwYXJhbSBwb3J0IHRoZSBudW1iZXIgbnVtYmVyCi0JICogQHBhcmFtIHByb3RvY29sIHRoZSBwb3J0J3MgcHJvdG9jb2wKLQkgKiBAcGFyYW0gY29udGVudFR5cGVzIHRoZSBjb250ZW50IHR5cGVzIHRoYXQgdGhlIHBvcnQgc3VwcG9ydHMKLQkgKiBAcGFyYW0gYWR2YW5jZWQgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHBvcnQgaXMgImFkdmFuY2VkIiBhbmQgc2hvdWxkIG9ubHkKLQkgKiAgICBiZSBzaG93biB0byBhZHZhbmNlZCB1c2VycywgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBTZXJ2ZXJQb3J0KFN0cmluZyBpZCwgU3RyaW5nIG5hbWUsIGludCBwb3J0LCBTdHJpbmcgcHJvdG9jb2wsIFN0cmluZ1tdIGNvbnRlbnRUeXBlcywgYm9vbGVhbiBhZHZhbmNlZCkgewotCQlzdXBlcigpOwotCQl0aGlzLmlkID0gaWQ7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMucG9ydCA9IHBvcnQ7Ci0JCXRoaXMucHJvdG9jb2wgPSBwcm90b2NvbDsKLQkJdGhpcy5jb250ZW50VHlwZXMgPSBjb250ZW50VHlwZXM7Ci0JCXRoaXMuYWR2YW5jZWQgPSBhZHZhbmNlZDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gb3B0aW9uYWwgaW50ZXJuYWwgaWQgdXNlZCB0byBpZGVudGlmeSB0aGlzIHBvcnQuCi0JICogCi0JICogQHJldHVybiBhbiBpbnRlcm5hbCBpZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHBvcnQuCi0JICogCi0JICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgcG9ydAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhY3R1YWwgcG9ydCBudW1iZXIuCi0JICogCi0JICogQHJldHVybiB0aGUgcG9ydCBudW1iZXIKLQkgKi8KLQlwdWJsaWMgaW50IGdldFBvcnQoKSB7Ci0JCXJldHVybiBwb3J0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHByb3RvY29sLCBlLmcuIEhUVFAgb2YgdGhpcyBwb3J0LiBSZXR1cm5zIG51bGwKLQkgKiBpZiB0aGUgcHJvdG9jb2wgaXMgdW5rbm93bi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBwcm9jb3RvbAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvdG9jb2woKSB7Ci0JCXJldHVybiBwcm90b2NvbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb250ZW50IHR5cGVzIHRoYXQgdGhpcyBwb3J0IHdvdWxkIG5vcm1hbGx5IHNlcnZlLCBvciBudWxsCi0JICogaWYgdGhlIGNvbnRlbnQgaXMgdW5rbm93bi4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgcG9zc2libHkgZW1wdHkgYXJyYXkgb2YgY29udGVudCB0eXBlcwotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRDb250ZW50VHlwZXMoKSB7Ci0JCXJldHVybiBjb250ZW50VHlwZXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoaXMgcG9ydCBpcyBhbiAiYWR2YW5jZWQiIHBvcnQgYW5kIHNob3VsZCBub3QgYmUgc2hvd24KLQkgKiB0byBub3ZpY2UgdXNlcnMuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcG9ydCBpcyBhZHZhbmNlZCwgb3IgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogICAgb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBZHZhbmNlZCgpIHsKLQkJcmV0dXJuIGFkdmFuY2VkOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIE9iamVjdCNlcXVhbHMoT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCWlmICghKG9iaiBpbnN0YW5jZW9mIFNlcnZlclBvcnQpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlTZXJ2ZXJQb3J0IHNwID0gKFNlcnZlclBvcnQpIG9iajsKLQkJcmV0dXJuIChzcC5wb3J0ID09IHBvcnQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgT2JqZWN0I2hhc2hDb2RlKCkKLQkgKi8KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gcG9ydDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE9iamVjdCN0b1N0cmluZygpCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJTZXJ2ZXJQb3J0IFsiICsgZ2V0TmFtZSgpICsgIiwgIiArIGdldElkKCkgKyAiLCAiICsgZ2V0UG9ydCgpICsgIiwgIiArIGdldFByb3RvY29sKCkgKyAiXSI7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL1NlcnZlclV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL1NlcnZlclV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUxY2I2MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9TZXJ2ZXJVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi2gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLio7Ci0vKioKLSAqIFNlcnZlciB1dGlsaXR5IG1ldGhvZHMuIFRoZXNlIHN0YXRpYyBtZXRob2RzIGNhbiBiZSB1c2VkIHRvIHBlcmZvcm0KLSAqIGNvbW1vbiBvcGVyYXRpb25zIG9uIHNlcnZlciBhcnRpZmFjdHMuCi0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFNlcnZlclV0aWwgewotCS8qKgotCSAqIFN0YXRpYyB1dGlsaXR5IGNsYXNzIC0gY2Fubm90IGNyZWF0ZSBhbiBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIFNlcnZlclV0aWwoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwcm9qZWN0IG1vZHVsZXMgYXR0YWNoZWQgdG8gYSBwcm9qZWN0LgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0IGEgcHJvamVjdAotCSAqIEByZXR1cm4gYSBwb3NzaWJseSBlbXB0eSBhcnJheSBvZiBtb2R1bGVzCi0JICovCi0JcHVibGljIHN0YXRpYyBJTW9kdWxlIGdldE1vZHVsZShJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0KLQkJSU1vZHVsZVtdIG1vZHVsZXMgPSBnZXRNb2R1bGVzKCk7Ci0JCWlmIChtb2R1bGVzICE9IG51bGwpIHsKLQkJCWludCBzaXplID0gbW9kdWxlcy5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCWlmIChtb2R1bGVzW2ldICE9IG51bGwgJiYgcHJvamVjdC5lcXVhbHMobW9kdWxlc1tpXS5nZXRQcm9qZWN0KCkpKQotCQkJCQlyZXR1cm4gbW9kdWxlc1tpXTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbW9kdWxlIGZyb20gdGhlIGdpdmVuIG1vZHVsZUlkLiBUaGUgbW9kdWxlSWQgbXVzdCBub3QgYmUgbnVsbC4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kdWxlSWQgYSBtb2R1bGUgaWQKLQkgKiBAcmV0dXJuIHRoZSBtb2R1bGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBtb2R1bGUgY291bGQgbm90IGJlIGZvdW5kCi0JICovCi0JcHVibGljIHN0YXRpYyBJTW9kdWxlIGdldE1vZHVsZShTdHJpbmcgbW9kdWxlSWQpIHsKLQkJaWYgKG1vZHVsZUlkID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCQotCQlpbnQgaW5kZXggPSBtb2R1bGVJZC5pbmRleE9mKCI6Iik7Ci0JCWlmIChpbmRleCA8PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlTdHJpbmcgZmFjdG9yeUlkID0gbW9kdWxlSWQuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQkJTW9kdWxlRmFjdG9yeSBtb2R1bGVGYWN0b3J5ID0gU2VydmVyUGx1Z2luLmZpbmRNb2R1bGVGYWN0b3J5KGZhY3RvcnlJZCk7Ci0JCWlmIChtb2R1bGVGYWN0b3J5ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlTdHJpbmcgbW9kdWxlU3ViSWQgPSBtb2R1bGVJZC5zdWJzdHJpbmcoaW5kZXgrMSk7Ci0JCUlNb2R1bGUgbW9kdWxlID0gbW9kdWxlRmFjdG9yeS5nZXRNb2R1bGUobW9kdWxlU3ViSWQpOwotCQlpZiAobW9kdWxlICE9IG51bGwpCi0JCQlyZXR1cm4gbW9kdWxlOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYWxsIHRoZSBhdmFpbGFibGUgbW9kdWxlcyBmcm9tIGFsbCBmYWN0b3JpZXMgd2hvc2UKLQkgKiB0eXBlIG1hdGNoZXMgdGhlIGdpdmVuIG1vZHVsZSB0eXBlcy4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kdWxlVHlwZXMgYW4gYXJyYXkgb2YgbW9kdWxlIHR5cGVzCi0JICogQHJldHVybiBhIHBvc3NpYmx5IGVtcHR5IGFycmF5IG9mIG1vZHVsZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElNb2R1bGVbXSBnZXRNb2R1bGVzKElNb2R1bGVUeXBlW10gbW9kdWxlVHlwZXMpIHsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCU1vZHVsZUZhY3RvcnlbXSBmYWN0b3JpZXMgPSBTZXJ2ZXJQbHVnaW4uZ2V0TW9kdWxlRmFjdG9yaWVzKCk7Ci0JCWlmIChmYWN0b3JpZXMgIT0gbnVsbCkgewotCQkJaW50IHNpemUgPSBmYWN0b3JpZXMubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlpZiAoaXNTdXBwb3J0ZWRNb2R1bGUoZmFjdG9yaWVzW2ldLmdldE1vZHVsZVR5cGVzKCksIG1vZHVsZVR5cGVzKSkgewotCQkJCQlJTW9kdWxlW10gbW9kdWxlcyA9IGZhY3Rvcmllc1tpXS5nZXRNb2R1bGVzKCk7Ci0JCQkJCWlmIChtb2R1bGVzICE9IG51bGwpIHsKLQkJCQkJCWludCBzaXplMiA9IG1vZHVsZXMubGVuZ3RoOwotCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBzaXplMjsgaisrKQotCQkJCQkJCWxpc3QuYWRkKG1vZHVsZXNbal0pOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCUlNb2R1bGVbXSBtb2R1bGVzID0gbmV3IElNb2R1bGVbbGlzdC5zaXplKCldOwotCQlsaXN0LnRvQXJyYXkobW9kdWxlcyk7Ci0JCXJldHVybiBtb2R1bGVzOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYWxsIHRoZSBhdmFpbGFibGUgbW9kdWxlcyBmcm9tIGFsbCBmYWN0b3JpZXMgd2hvc2UKLQkgKiB0eXBlIG1hdGNoZXMgdGhlIGdpdmVuIG1vZHVsZSB0eXBlIGlkLgotCSAqIAotCSAqIEBwYXJhbSB0eXBlIGEgbW9kdWxlIHR5cGUKLQkgKiBAcmV0dXJuIGEgcG9zc2libHkgZW1wdHkgYXJyYXkgb2YgbW9kdWxlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgSU1vZHVsZVtdIGdldE1vZHVsZXMoU3RyaW5nIHR5cGUpIHsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCU1vZHVsZUZhY3RvcnlbXSBmYWN0b3JpZXMgPSBTZXJ2ZXJQbHVnaW4uZ2V0TW9kdWxlRmFjdG9yaWVzKCk7Ci0JCWlmIChmYWN0b3JpZXMgIT0gbnVsbCkgewotCQkJaW50IHNpemUgPSBmYWN0b3JpZXMubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlpZiAoaXNTdXBwb3J0ZWRNb2R1bGUoZmFjdG9yaWVzW2ldLmdldE1vZHVsZVR5cGVzKCksIHR5cGUsIG51bGwpKSB7Ci0JCQkJCUlNb2R1bGVbXSBtb2R1bGVzID0gZmFjdG9yaWVzW2ldLmdldE1vZHVsZXMoKTsKLQkJCQkJaWYgKG1vZHVsZXMgIT0gbnVsbCkgewotCQkJCQkJaW50IHNpemUyID0gbW9kdWxlcy5sZW5ndGg7Ci0JCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHNpemUyOyBqKyspCi0JCQkJCQkJaWYodHlwZS5lcXVhbHMobW9kdWxlc1tqXS5nZXRNb2R1bGVUeXBlKCkuZ2V0SWQoKSkpCi0JCQkJCQkJCWxpc3QuYWRkKG1vZHVsZXNbal0pOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCUlNb2R1bGVbXSBtb2R1bGVzID0gbmV3IElNb2R1bGVbbGlzdC5zaXplKCldOwotCQlsaXN0LnRvQXJyYXkobW9kdWxlcyk7Ci0JCXJldHVybiBtb2R1bGVzOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIGFueSBvZiB0aGUgZ2l2ZW4gbW9kdWxlVHlwZXMgaGF2ZSB0aGUgZ2l2ZW4KLQkgKiBtb2R1bGUgdHlwZSBpZCBhbmQgdmVyc2lvbiBpZC4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kdWxlVHlwZXMgYW4gYXJyYXkgb2YgbW9kdWxlIHR5cGVzCi0JICogQHBhcmFtIHR5cGVJZCBhIG1vZHVsZSB0eXBlCi0JICogQHBhcmFtIHZlcnNpb25JZCBhIG1vZHVsZSB2ZXJzaW9uCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbW9kdWxlIHR5cGUgaXMgc3VwcG9ydGVkLCBhbmQKLQkgKiAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzU3VwcG9ydGVkTW9kdWxlKElNb2R1bGVUeXBlW10gbW9kdWxlVHlwZXMsIFN0cmluZyB0eXBlSWQsIFN0cmluZyB2ZXJzaW9uSWQpIHsKLQkJaWYgKG1vZHVsZVR5cGVzICE9IG51bGwpIHsKLQkJCWludCBzaXplID0gbW9kdWxlVHlwZXMubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlpZiAoaXNTdXBwb3J0ZWRNb2R1bGUobW9kdWxlVHlwZXNbaV0sIHR5cGVJZCwgdmVyc2lvbklkKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNTdXBwb3J0ZWRNb2R1bGUoSU1vZHVsZVR5cGVbXSBtb2R1bGVUeXBlcywgSU1vZHVsZVR5cGVbXSBtdCkgewotCQlpZiAobXQgIT0gbnVsbCkgewotCQkJaW50IHNpemUgPSBtdC5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCWlmIChpc1N1cHBvcnRlZE1vZHVsZShtb2R1bGVUeXBlcywgbXRbaV0pKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiBhbnkgb2YgdGhlIGdpdmVuIG1vZHVsZVR5cGVzIG1hdGNoIHRoZSBnaXZlbgotCSAqIG1vZHVsZSB0eXBlLgotCSAqIAotCSAqIEBwYXJhbSBtb2R1bGVUeXBlcyBhbiBhcnJheSBvZiBtb2R1bGVzIHR5cGVzCi0JICogQHBhcmFtIG10IGEgbW9kdWxlIHR5cGUKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBtb2R1bGUgdHlwZSBpcyBzdXBwb3J0ZWQsIGFuZAotCSAqICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTdXBwb3J0ZWRNb2R1bGUoSU1vZHVsZVR5cGVbXSBtb2R1bGVUeXBlcywgSU1vZHVsZVR5cGUgbXQpIHsKLQkJaWYgKG1vZHVsZVR5cGVzICE9IG51bGwpIHsKLQkJCWludCBzaXplID0gbW9kdWxlVHlwZXMubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlpZiAoaXNTdXBwb3J0ZWRNb2R1bGUobW9kdWxlVHlwZXNbaV0sIG10KSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzU3VwcG9ydGVkTW9kdWxlKElNb2R1bGVUeXBlIG1vZHVsZVR5cGUsIFN0cmluZyB0eXBlLCBTdHJpbmcgdmVyc2lvbikgewotCQlTdHJpbmcgdHlwZTIgPSBtb2R1bGVUeXBlLmdldElkKCk7Ci0JCWlmIChtYXRjaGVzKHR5cGUsIHR5cGUyKSkgewotCQkJU3RyaW5nIHZlcnNpb24yID0gbW9kdWxlVHlwZS5nZXRWZXJzaW9uKCk7Ci0JCQlpZiAobWF0Y2hlcyh2ZXJzaW9uLCB2ZXJzaW9uMikpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdHdvIGdpdmVuIG1vZHVsZSB0eXBlcyBhcmUgY29tcGF0aWJsZS4gVGhlIG1vZHVsZVR5cGVzIG1heSBub3QKLQkgKiBiZSBudWxsLgotCSAqIAotCSAqIEBwYXJhbSBtb2R1bGVUeXBlIGEgbW9kdWxlIHR5cGUKLQkgKiBAcGFyYW0gbXQgYSBtb2R1bGUgdHlwZQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG1vZHVsZSB0eXBlIGlzIHN1cHBvcnRlZCwgYW5kCi0JICogICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1N1cHBvcnRlZE1vZHVsZShJTW9kdWxlVHlwZSBtb2R1bGVUeXBlLCBJTW9kdWxlVHlwZSBtdCkgewotCQlpZiAobW9kdWxlVHlwZSA9PSBudWxsIHx8IG10ID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCQotCQlTdHJpbmcgdHlwZTIgPSBtb2R1bGVUeXBlLmdldElkKCk7Ci0JCWlmIChtYXRjaGVzKG10LmdldElkKCksIHR5cGUyKSkgewotCQkJU3RyaW5nIHZlcnNpb24yID0gbW9kdWxlVHlwZS5nZXRWZXJzaW9uKCk7Ci0JCQlpZiAobWF0Y2hlcyhtdC5nZXRWZXJzaW9uKCksIHZlcnNpb24yKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBtYXRjaGVzKFN0cmluZyBhLCBTdHJpbmcgYikgewotCQlpZiAoYSA9PSBudWxsIHx8IGIgPT0gbnVsbCB8fCAiKiIuZXF1YWxzKGEpIHx8ICIqIi5lcXVhbHMoYikgfHwgYS5zdGFydHNXaXRoKGIpIHx8IGIuc3RhcnRzV2l0aChhKQotCQkJfHwgKGEuZW5kc1dpdGgoIi4qIikgJiYgYi5zdGFydHNXaXRoKGEuc3Vic3RyaW5nKDAsIGEubGVuZ3RoKCkgLSAxKSkpCi0JCQl8fCAoYi5lbmRzV2l0aCgiLioiKSAmJiBhLnN0YXJ0c1dpdGgoYi5zdWJzdHJpbmcoMCwgYi5sZW5ndGgoKSAtIDEpKSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbGwgdGhlIGF2YWlsYWJsZSBtb2R1bGVzIGZyb20gYWxsIGZhY3Rvcmllcy4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgcG9zc2libHkgZW1wdHkgYXJyYXkgb2YgbW9kdWxlcwotCSAqLwotCXByaXZhdGUgc3RhdGljIElNb2R1bGVbXSBnZXRNb2R1bGVzKCkgewotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQotCQlNb2R1bGVGYWN0b3J5W10gZmFjdG9yaWVzID0gU2VydmVyUGx1Z2luLmdldE1vZHVsZUZhY3RvcmllcygpOwotCQlpZiAoZmFjdG9yaWVzICE9IG51bGwpIHsKLQkJCWludCBzaXplID0gZmFjdG9yaWVzLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJSU1vZHVsZVtdIG1vZHVsZXMgPSBmYWN0b3JpZXNbaV0uZ2V0TW9kdWxlcygpOwotCQkJCWlmIChtb2R1bGVzICE9IG51bGwpIHsKLQkJCQkJaW50IHNpemUyID0gbW9kdWxlcy5sZW5ndGg7Ci0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgc2l6ZTI7IGorKykgewotCQkJCQkJaWYgKCFsaXN0LmNvbnRhaW5zKG1vZHVsZXNbal0pKSB7Ci0JCQkJCQkJaWYgKGlzU3VwcG9ydGVkTW9kdWxlKGZhY3Rvcmllc1tpXS5nZXRNb2R1bGVUeXBlcygpLCBtb2R1bGVzW2pdLmdldE1vZHVsZVR5cGUoKSkpCi0JCQkJCQkJCWxpc3QuYWRkKG1vZHVsZXNbal0pOwotCQkJCQkJCWVsc2UKLQkJCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIkludmFsaWQgbW9kdWxlIHJldHVybmVkIGZyb20gZmFjdG9yeSwgaWdub3JlZDogIiArIG1vZHVsZXNbal0pOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCUlNb2R1bGVbXSBtb2R1bGVzID0gbmV3IElNb2R1bGVbbGlzdC5zaXplKCldOwotCQlsaXN0LnRvQXJyYXkobW9kdWxlcyk7Ci0JCXJldHVybiBtb2R1bGVzOwotCX0KLQotCS8qKgotCSAqIEFkZHMgb3IgcmVtb3ZlcyBtb2R1bGVzIGZyb20gYSBzZXJ2ZXIuIFdpbGwgc2VhcmNoIGZvciB0aGUgZmlyc3QgcGFyZW50IG1vZHVsZQotCSAqIG9mIGVhY2ggbW9kdWxlIGFuZCBhZGQgaXQgdG8gdGhlIHNlcnZlciBpbnN0ZWFkLiBUaGlzIG1ldGhvZCB3aWxsIGhhbmRsZSBtdWx0aXBsZQotCSAqIG1vZHVsZXMgaGF2aW5nIHRoZSBzYW1lIHBhcmVudCAodGhlIHBhcmVudCB3aWxsIG9ubHkgYmUgYWRkZWQgb25jZSksIGJ1dCBtYXkgbm90Ci0JICogaGFuZGxlIHRoZSBjYXNlIHdoZXJlIHRoZSBzYW1lIG1vZHVsZSBvciBwYXJlbnQgaXMgYmVpbmcgYm90aCBhZGRlZCBhbmQgcmVtb3ZlZC4KLQkgKiAKLQkgKiBAcGFyYW0gc2VydmVyIGEgc2VydmVyCi0JICogQHBhcmFtIGFkZCBhbiBhcnJheSBvZiBtb2R1bGVzIHRvIGFkZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8gbm90IGFkZCBhbnkKLQkgKiBAcGFyYW0gcmVtb3ZlIGFuIGFycmF5IG9mIG1vZHVsZXMgdG8gcmVtb3ZlLCBvciA8Y29kZT5udWxsPC9jb2RlPiB0byBub3QgcmVtb3ZlIGFueQotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gaWYgYW55dGhpbmcgZ29lcyB3cm9uZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtb2RpZnlNb2R1bGVzKElTZXJ2ZXJXb3JraW5nQ29weSBzZXJ2ZXIsIElNb2R1bGVbXSBhZGQsIElNb2R1bGVbXSByZW1vdmUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoc2VydmVyID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCQotCQlpZiAoYWRkID09IG51bGwpCi0JCQlhZGQgPSBuZXcgSU1vZHVsZVswXTsKLQkJaWYgKHJlbW92ZSA9PSBudWxsKQotCQkJcmVtb3ZlID0gbmV3IElNb2R1bGVbMF07Ci0JCQotCQlpbnQgc2l6ZSA9IGFkZC5sZW5ndGg7Ci0JCUxpc3QgYWRkUGFyZW50TW9kdWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJCXRyeSB7Ci0JCQkJSU1vZHVsZVtdIHBhcmVudHMgPSBzZXJ2ZXIuZ2V0Um9vdE1vZHVsZXMoYWRkW2ldLCBtb25pdG9yKTsKLQkJCQlpZiAocGFyZW50cyAhPSBudWxsKSB7Ci0JCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQkJaWYgKHBhcmVudHMubGVuZ3RoID4gMCkgewkJCQkKLQkJCQkJCU9iamVjdCBwYXJlbnQgPSBwYXJlbnRzWzBdOwotCQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCQkJaWYgKCFhZGRQYXJlbnRNb2R1bGVzLmNvbnRhaW5zKHBhcmVudCkpCi0JCQkJCQkJYWRkUGFyZW50TW9kdWxlcy5hZGQocGFyZW50KTsKLQkJCQkJfQotCQkJCX0gCi0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJDb3VsZCBub3QgZmluZCBwYXJlbnQgbW9kdWxlIiwgZSk7Ci0JCQl9Ci0JCQkKLQkJCWlmICghZm91bmQpCi0JCQkJYWRkUGFyZW50TW9kdWxlcy5hZGQoYWRkW2ldKTsKLQkJfQotCQkKLQkJc2l6ZSA9IHJlbW92ZS5sZW5ndGg7Ci0JCUxpc3QgcmVtb3ZlUGFyZW50TW9kdWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJCXRyeSB7Ci0JCQkJSU1vZHVsZVtdIHBhcmVudHMgPSBzZXJ2ZXIuZ2V0Um9vdE1vZHVsZXMocmVtb3ZlW2ldLCBtb25pdG9yKTsKLQkJCQlpZiAocGFyZW50cyAhPSBudWxsKSB7Ci0JCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQkJaWYgKHBhcmVudHMubGVuZ3RoID4gMCkgewkJCQkKLQkJCQkJCU9iamVjdCBwYXJlbnQgPSBwYXJlbnRzWzBdOwotCQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCQkJaWYgKCFyZW1vdmVQYXJlbnRNb2R1bGVzLmNvbnRhaW5zKHBhcmVudCkpCi0JCQkJCQkJcmVtb3ZlUGFyZW50TW9kdWxlcy5hZGQocGFyZW50KTsKLQkJCQkJfQotCQkJCX0gCi0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJDb3VsZCBub3QgZmluZCBwYXJlbnQgbW9kdWxlIDIiLCBlKTsKLQkJCX0KLQkJCQotCQkJaWYgKCFmb3VuZCkKLQkJCQlyZW1vdmVQYXJlbnRNb2R1bGVzLmFkZChyZW1vdmVbaV0pOwotCQl9Ci0JCQotCQlJTW9kdWxlW10gYWRkMiA9IG5ldyBJTW9kdWxlW2FkZFBhcmVudE1vZHVsZXMuc2l6ZSgpXTsKLQkJYWRkUGFyZW50TW9kdWxlcy50b0FycmF5KGFkZDIpOwotCQlJTW9kdWxlW10gcmVtb3ZlMiA9IG5ldyBJTW9kdWxlW3JlbW92ZVBhcmVudE1vZHVsZXMuc2l6ZSgpXTsKLQkJcmVtb3ZlUGFyZW50TW9kdWxlcy50b0FycmF5KHJlbW92ZTIpOwotCQkKLQkJc2VydmVyLm1vZGlmeU1vZHVsZXMoYWRkMiwgcmVtb3ZlMiwgbW9uaXRvcik7Ci0JfQotCi0JLyoqCi0JICogU2V0cyBhIGRlZmF1bHQgbmFtZSBvbiB0aGUgZ2l2ZW4gcnVudGltZS4KLQkgKiAKLQkgKiBAcGFyYW0gcnVudGltZSBhIHJ1bnRpbWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0UnVudGltZURlZmF1bHROYW1lKElSdW50aW1lV29ya2luZ0NvcHkgcnVudGltZSkgewotCQlTdHJpbmcgdHlwZU5hbWUgPSBydW50aW1lLmdldFJ1bnRpbWVUeXBlKCkuZ2V0TmFtZSgpOwotCQkKLQkJU3RyaW5nIG5hbWUgPSBOTFMuYmluZChNZXNzYWdlcy5kZWZhdWx0UnVudGltZU5hbWUsIHR5cGVOYW1lKTsKLQkJaW50IGkgPSAyOwotCQl3aGlsZSAoaXNOYW1lSW5Vc2UobmFtZSkpIHsKLQkJCW5hbWUgPSBOTFMuYmluZChNZXNzYWdlcy5kZWZhdWx0UnVudGltZU5hbWUyLCBuZXcgU3RyaW5nW10ge3R5cGVOYW1lLCBpICsgIiJ9KTsKLQkJCWkrKzsKLQkJfQotCQlydW50aW1lLnNldE5hbWUobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyBhIGRlZmF1bHQgbmFtZSBvbiB0aGUgZ2l2ZW4gc2VydmVyLgotCSAqIAotCSAqIEBwYXJhbSBzZXJ2ZXIgYSBzZXJ2ZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0U2VydmVyRGVmYXVsdE5hbWUoSVNlcnZlcldvcmtpbmdDb3B5IHNlcnZlcikgewotCQlpZiAoc2VydmVyID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCQotCQlTdHJpbmcgdHlwZU5hbWUgPSBzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpLmdldE5hbWUoKTsKLQkJU3RyaW5nIGhvc3QgPSBzZXJ2ZXIuZ2V0SG9zdCgpOwotCQkKLQkJU3RyaW5nIG5hbWUgPSBOTFMuYmluZChNZXNzYWdlcy5kZWZhdWx0U2VydmVyTmFtZSwgbmV3IFN0cmluZ1tdIHt0eXBlTmFtZSwgaG9zdH0pOwotCQlpbnQgaSA9IDI7Ci0JCXdoaWxlIChpc05hbWVJblVzZShuYW1lKSkgewotCQkJbmFtZSA9IE5MUy5iaW5kKE1lc3NhZ2VzLmRlZmF1bHRTZXJ2ZXJOYW1lMiwgbmV3IFN0cmluZ1tdIHt0eXBlTmFtZSwgaG9zdCwgaSArICIifSk7Ci0JCQlpKys7Ci0JCX0KLQkJc2VydmVyLnNldE5hbWUobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkRmlsZW5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJSVN0YXR1cyBzdGF0dXMgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkudmFsaWRhdGVOYW1lKG5hbWUsIElSZXNvdXJjZS5GSUxFKTsKLQkJaWYgKHN0YXR1cyAhPSBudWxsICYmICFzdGF0dXMuaXNPSygpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJc3RhdHVzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnZhbGlkYXRlTmFtZShuYW1lLCBJUmVzb3VyY2UuRk9MREVSKTsKLQkJaWYgKHN0YXR1cyAhPSBudWxsICYmICFzdGF0dXMuaXNPSygpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFZhbGlkRmlsZU5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKGlzVmFsaWRGaWxlbmFtZShuYW1lKSkKLQkJCXJldHVybiBuYW1lOwotCQotCQkvLyByZW1vdmUgaW52YWxpZCBjaGFyYWN0ZXJzCi0JCVN0cmluZ1tdIHMgPSBuZXcgU3RyaW5nW10geyIuIiwgIlxcIiwgIi8iLCAiPyIsICI6IiwgIioiLCAiXCIiLCAifCIsICI8IiwgIj4ifTsKLQkJaW50IGluZCA9IDA7Ci0JCXdoaWxlIChpbmQgPCBzLmxlbmd0aCkgewotCQkJaW50IGluZGV4ID0gbmFtZS5pbmRleE9mKHNbaW5kXSk7Ci0JCQl3aGlsZSAoaW5kZXggPj0gMCkgewotCQkJCW5hbWUgPSBuYW1lLnN1YnN0cmluZygwLCBpbmRleCkgKyBuYW1lLnN1YnN0cmluZyhpbmRleCsxKTsKLQkJCQlpbmRleCA9IG5hbWUuaW5kZXhPZihzW2luZF0pOwotCQkJfQotCQkJaW5kKys7Ci0JCX0KLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiB1bnVzZWQgZmlsZSBpbiB0aGUgZ2l2ZW4gcHJvamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdCBhIHByb2plY3QKLQkgKiBAcGFyYW0gdHlwZSBhIHNlcnZlciB0eXBlCi0JICogQHJldHVybiBhbiB1bnVzZWQgZmlsZSB3aXRoaW4gdGhlIGdpdmVuIHByb2plY3QKLQkgKi8KLQkvKnB1YmxpYyBzdGF0aWMgSUZpbGUgZ2V0VW51c2VkU2VydmVyRmlsZShJUHJvamVjdCBwcm9qZWN0LCBJU2VydmVyVHlwZSB0eXBlKSB7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwgfHwgdHlwZSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQkKLQkJU3RyaW5nIHR5cGVOYW1lID0gZ2V0VmFsaWRGaWxlTmFtZSh0eXBlLmdldE5hbWUoKSk7Ci0JCVN0cmluZyBuYW1lID0gTkxTLmJpbmQoTWVzc2FnZXMuZGVmYXVsdFNlcnZlck5hbWUzLCB0eXBlTmFtZSkrICIuIiAgKyBTZXJ2ZXIuRklMRV9FWFRFTlNJT047Ci0JCWludCBpID0gMjsKLQkJd2hpbGUgKGlzRmlsZU5hbWVJblVzZShwcm9qZWN0LCBuYW1lKSkgewotCQkJbmFtZSA9IE5MUy5iaW5kKE1lc3NhZ2VzLmRlZmF1bHRTZXJ2ZXJOYW1lNCwgbmV3IFN0cmluZ1tdIHt0eXBlTmFtZSwgaSArICIifSkgKyAiLiIgICsgU2VydmVyLkZJTEVfRVhURU5TSU9OOwotCQkJaSsrOwotCQl9Ci0JCXJldHVybiBwcm9qZWN0LmdldEZpbGUobmFtZSk7Ci0JfSovCi0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIHVudXNlZCBmaWxlIGluIHRoZSBnaXZlbiBwcm9qZWN0LgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0IGEgcHJvamVjdAotCSAqIEBwYXJhbSBzZXJ2ZXIgYSBzZXJ2ZXIKLQkgKiBAcmV0dXJuIGFuIHVudXNlZCBmaWxlIHdpdGhpbiB0aGUgZ2l2ZW4gcHJvamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUZpbGUgZ2V0VW51c2VkU2VydmVyRmlsZShJUHJvamVjdCBwcm9qZWN0LCBJU2VydmVyIHNlcnZlcikgewotCQlpZiAocHJvamVjdCA9PSBudWxsIHx8IHNlcnZlciA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQkKLQkJU3RyaW5nIHR5cGVOYW1lID0gZ2V0VmFsaWRGaWxlTmFtZShzZXJ2ZXIuZ2V0TmFtZSgpKTsKLQkJU3RyaW5nIG5hbWUgPSBOTFMuYmluZChNZXNzYWdlcy5kZWZhdWx0U2VydmVyTmFtZTMsIHR5cGVOYW1lKSsgIi4iICArIFNlcnZlci5GSUxFX0VYVEVOU0lPTjsKLQkJaW50IGkgPSAyOwotCQl3aGlsZSAoaXNGaWxlTmFtZUluVXNlKHByb2plY3QsIG5hbWUpKSB7Ci0JCQluYW1lID0gTkxTLmJpbmQoTWVzc2FnZXMuZGVmYXVsdFNlcnZlck5hbWU0LCBuZXcgU3RyaW5nW10ge3R5cGVOYW1lLCBpICsgIiJ9KSArICIuIiAgKyBTZXJ2ZXIuRklMRV9FWFRFTlNJT047Ci0JCQlpKys7Ci0JCX0KLQkJcmV0dXJuIHByb2plY3QuZ2V0RmlsZShuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgYSBzZXJ2ZXIgb3IgcnVudGltZSBleGlzdHMgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLQkgKgotCSAqIEBwYXJhbSBuYW1lIGEgbmFtZQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG5hbWUgaXMgaW4gdXNlLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogICAgb3RoZXJ3aXNlCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc05hbWVJblVzZShTdHJpbmcgbmFtZSkgewotCQlpZiAobmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIHRydWU7Ci0JCi0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCi0JCWFkZEFsbChsaXN0LCBTZXJ2ZXJDb3JlLmdldFJ1bnRpbWVzKCkpOwotCQlhZGRBbGwobGlzdCwgU2VydmVyQ29yZS5nZXRTZXJ2ZXJzKCkpOwotCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3Qgb2JqID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElTZXJ2ZXJBdHRyaWJ1dGVzICYmIG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgoKElTZXJ2ZXJBdHRyaWJ1dGVzKW9iaikuZ2V0TmFtZSgpKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBJUnVudGltZSAmJiBuYW1lLmVxdWFsc0lnbm9yZUNhc2UoKChJUnVudGltZSlvYmopLmdldE5hbWUoKSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkQWxsKExpc3QgbGlzdCwgT2JqZWN0W10gb2JqKSB7Ci0JCWlmIChvYmogPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCWludCBzaXplID0gb2JqLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCWxpc3QuYWRkKG9ialtpXSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIGFuIGVsZW1lbnQgZXhpc3RzIHdpdGggdGhlIGdpdmVuIG5hbWUuCi0JICoKLQkgKiBAcGFyYW0gcHJvamVjdCBhIHByb2plY3QKLQkgKiBAcGFyYW0gbmFtZSBhIGZpbGUgb3IgZm9sZGVyIG5hbWUKLQkgKiBAcmV0dXJuIGJvb2xlYW4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGZpbGUgb3IgZm9sZGVyIG5hbWUgaXMgYmVpbmcKLQkgKiAgICB1c2VkLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNGaWxlTmFtZUluVXNlKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBuYW1lKSB7Ci0JCWlmIChuYW1lID09IG51bGwgfHwgcHJvamVjdCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJaWYgKHByb2plY3QuZ2V0RmlsZShuYW1lKS5leGlzdHMoKSkKLQkJCXJldHVybiB0cnVlOwotCQlpZiAocHJvamVjdC5nZXRGb2xkZXIobmFtZSkuZXhpc3RzKCkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGxpc3Qgb2YgYWxsIHJ1bnRpbWUgdGFyZ2V0cyB0aGF0IG1hdGNoIHRoZSBnaXZlbiB0eXBlIGFuZCB2ZXJzaW9uLgotCSAqIElmIHR5cGUgb3IgdmVyc2lvbiBpcyBudWxsLCBpdCBtYXRjaGVzIGFsbCBvZiB0aGF0IHR5cGUgb3IgdmVyc2lvbi4KLQkgKiAKLQkgKiBAcGFyYW0gdHlwZSBhIG1vZHVsZSB0eXBlCi0JICogQHBhcmFtIHZlcnNpb24gYSBtb2R1bGUgdmVyc2lvbgotCSAqIEByZXR1cm4gYSBwb3NzaWJseS1lbXB0eSBhcnJheSBvZiBydW50aW1lIGluc3RhbmNlcyB7QGxpbmsgSVJ1bnRpbWV9Ci0JICovCi0JcHVibGljIHN0YXRpYyBJUnVudGltZVtdIGdldFJ1bnRpbWVzKFN0cmluZyB0eXBlLCBTdHJpbmcgdmVyc2lvbikgewotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlSdW50aW1lW10gcnVudGltZXMgPSBTZXJ2ZXJDb3JlLmdldFJ1bnRpbWVzKCk7Ci0JCWlmIChydW50aW1lcyAhPSBudWxsKSB7Ci0JCQlpbnQgc2l6ZSA9IHJ1bnRpbWVzLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJSVJ1bnRpbWVUeXBlIHJ1bnRpbWVUeXBlID0gcnVudGltZXNbaV0uZ2V0UnVudGltZVR5cGUoKTsKLQkJCQlpZiAocnVudGltZVR5cGUgIT0gbnVsbCAmJiBpc1N1cHBvcnRlZE1vZHVsZShydW50aW1lVHlwZS5nZXRNb2R1bGVUeXBlcygpLCB0eXBlLCB2ZXJzaW9uKSkgewotCQkJCQlsaXN0LmFkZChydW50aW1lc1tpXSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlJUnVudGltZVtdIHJ1bnRpbWVzMiA9IG5ldyBJUnVudGltZVtsaXN0LnNpemUoKV07Ci0JCWxpc3QudG9BcnJheShydW50aW1lczIpOwotCQlyZXR1cm4gcnVudGltZXMyOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGxpc3Qgb2YgYWxsIHJ1bnRpbWUgdHlwZXMgdGhhdCBtYXRjaCB0aGUgZ2l2ZW4gdHlwZSBhbmQgdmVyc2lvbi4KLQkgKiBJZiB0eXBlIG9yIHZlcnNpb24gaXMgbnVsbCwgaXQgbWF0Y2hlcyBhbGwgb2YgdGhhdCB0eXBlIG9yIHZlcnNpb24uCi0JICogCi0JICogQHBhcmFtIHR5cGUgYSBtb2R1bGUgdHlwZQotCSAqIEBwYXJhbSB2ZXJzaW9uIGEgbW9kdWxlIHZlcnNpb24KLQkgKiBAcmV0dXJuIGEgcG9zc2libHktZW1wdHkgYXJyYXkgb2YgcnVudGltZSB0eXBlIGluc3RhbmNlcyB7QGxpbmsgSVJ1bnRpbWVUeXBlfQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVJ1bnRpbWVUeXBlW10gZ2V0UnVudGltZVR5cGVzKFN0cmluZyB0eXBlLCBTdHJpbmcgdmVyc2lvbikgewotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlSdW50aW1lVHlwZVtdIHJ1bnRpbWVUeXBlcyA9IFNlcnZlckNvcmUuZ2V0UnVudGltZVR5cGVzKCk7Ci0JCWlmIChydW50aW1lVHlwZXMgIT0gbnVsbCkgewotCQkJaW50IHNpemUgPSBydW50aW1lVHlwZXMubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlpZiAoaXNTdXBwb3J0ZWRNb2R1bGUocnVudGltZVR5cGVzW2ldLmdldE1vZHVsZVR5cGVzKCksIHR5cGUsIHZlcnNpb24pKSB7Ci0JCQkJCWxpc3QuYWRkKHJ1bnRpbWVUeXBlc1tpXSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlJUnVudGltZVR5cGVbXSBydCA9IG5ldyBJUnVudGltZVR5cGVbbGlzdC5zaXplKCldOwotCQlsaXN0LnRvQXJyYXkocnQpOwotCQlyZXR1cm4gcnQ7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhIGxpc3Qgb2YgYWxsIHJ1bnRpbWUgdHlwZXMgdGhhdCBtYXRjaCB0aGUgZ2l2ZW4gdHlwZSwgdmVyc2lvbiwKLQkgKiBhbmQgcGFydGlhbCBydW50aW1lIHR5cGUgaWQuIElmIHR5cGUsIHZlcnNpb24sIG9yIHJ1bnRpbWVUeXBlSWQgaXMgbnVsbCwKLQkgKiBpdCBtYXRjaGVzIGFsbCBvZiB0aGF0IHR5cGUgb3IgdmVyc2lvbi4KLQkgKiAKLQkgKiBAcGFyYW0gdHlwZSBhIG1vZHVsZSB0eXBlCi0JICogQHBhcmFtIHZlcnNpb24gYSBtb2R1bGUgdmVyc2lvbgotCSAqIEBwYXJhbSBydW50aW1lVHlwZUlkIHRoZSBpZCBvZiBhIHJ1bnRpbWUgdHlwZQotCSAqIEByZXR1cm4gYSBwb3NzaWJseS1lbXB0eSBhcnJheSBvZiBydW50aW1lIHR5cGUgaW5zdGFuY2VzIHtAbGluayBJUnVudGltZVR5cGV9Ci0JICovCi0JcHVibGljIHN0YXRpYyBJUnVudGltZVR5cGVbXSBnZXRSdW50aW1lVHlwZXMoU3RyaW5nIHR5cGUsIFN0cmluZyB2ZXJzaW9uLCBTdHJpbmcgcnVudGltZVR5cGVJZCkgewotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlSdW50aW1lVHlwZVtdIHJ1bnRpbWVUeXBlcyA9IFNlcnZlckNvcmUuZ2V0UnVudGltZVR5cGVzKCk7Ci0JCWlmIChydW50aW1lVHlwZXMgIT0gbnVsbCkgewotCQkJaW50IHNpemUgPSBydW50aW1lVHlwZXMubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlpZiAoaXNTdXBwb3J0ZWRNb2R1bGUocnVudGltZVR5cGVzW2ldLmdldE1vZHVsZVR5cGVzKCksIHR5cGUsIHZlcnNpb24pKSB7Ci0JCQkJCWlmIChydW50aW1lVHlwZUlkID09IG51bGwgfHwgcnVudGltZVR5cGVzW2ldLmdldElkKCkuc3RhcnRzV2l0aChydW50aW1lVHlwZUlkKSkKLQkJCQkJCWxpc3QuYWRkKHJ1bnRpbWVUeXBlc1tpXSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlJUnVudGltZVR5cGVbXSBydCA9IG5ldyBJUnVudGltZVR5cGVbbGlzdC5zaXplKCldOwotCQlsaXN0LnRvQXJyYXkocnQpOwotCQlyZXR1cm4gcnQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGxpc3Qgb2YgYWxsIHNlcnZlcnMgdGhhdCB0aGlzIGRlcGxveWFibGUgaXMgbm90IGN1cnJlbnRseQotCSAqIGNvbmZpZ3VyZWQgb24sIGJ1dCBjb3VsZCBiZSBhZGRlZCB0by4gSWYgaW5jbHVkZUVycm9ycyBpcyB0cnVlLCB0aGlzCi0JICogbWV0aG9kIHJldHVybiBzZXJ2ZXJzIHdoZXJlIHRoZSBwYXJlbnQgZGVwbG95YWJsZSBtYXkgdGhyb3cgZXJyb3JzLiBGb3IKLQkgKiBpbnN0YW5jZSwgdGhpcyBkZXBsb3lhYmxlIG1heSBiZSB0aGUgd3Jvbmcgc3BlYyBsZXZlbC4KLQkgKgotCSAqIEBwYXJhbSBtb2R1bGUgYSBtb2R1bGUKLQkgKiBAcGFyYW0gaW5jbHVkZUVycm9ycyA8Y29kZT50cnVlPC9jb2RlPiB0byBpbmNsdWRlIHNlcnZlcnMgdGhhdCByZXR1cm5lZAotCSAqICAgIGVycm9ycyB3aGVuIHRyeWluZyB0byBhZGQgdGhlIG1vZHVsZSwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCi0JICogICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCi0JICogQHJldHVybiBhIHBvc3NpYmx5IGVtcHR5IGFycmF5IG9mIHNlcnZlcnMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTZXJ2ZXJbXSBnZXRBdmFpbGFibGVTZXJ2ZXJzRm9yTW9kdWxlKElNb2R1bGUgbW9kdWxlLCBib29sZWFuIGluY2x1ZGVFcnJvcnMsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAobW9kdWxlID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IElTZXJ2ZXJbMF07Ci0KLQkJLy8gZG8gaXQgdGhlIHNsb3cgd2F5IC0gZ28gdGhyb3VnaCBhbGwgc2VydmVycyBhbmQKLQkJLy8gc2VlIGlmIHRoaXMgZGVwbG95YWJsZSBpcyBub3QgY29uZmlndXJlZCBpbiBpdAotCQkvLyBidXQgY291bGQgYmUgYWRkZWQKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlJU2VydmVyW10gc2VydmVycyA9IFNlcnZlckNvcmUuZ2V0U2VydmVycygpOwotCQlpZiAoc2VydmVycyAhPSBudWxsKSB7Ci0JCQlpbnQgc2l6ZSA9IHNlcnZlcnMubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlpZiAoIWNvbnRhaW5zTW9kdWxlKHNlcnZlcnNbaV0sIG1vZHVsZSwgbW9uaXRvcikpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCUlNb2R1bGVbXSBwYXJlbnRzID0gc2VydmVyc1tpXS5nZXRSb290TW9kdWxlcyhtb2R1bGUsIG1vbml0b3IpOwotCQkJCQkJaWYgKHBhcmVudHMgIT0gbnVsbCAmJiBwYXJlbnRzLmxlbmd0aCA+IDApIHsKLQkJCQkJCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQkJCQkJaWYgKHBhcmVudHMgIT0gbnVsbCkgewotCQkJCQkJCQlpbnQgc2l6ZTIgPSBwYXJlbnRzLmxlbmd0aDsKLQkJCQkJCQkJZm9yIChpbnQgaiA9IDA7ICFmb3VuZCAmJiBqIDwgc2l6ZTI7IGorKykgewotCQkJCQkJCQkJSU1vZHVsZSBwYXJlbnQgPSBwYXJlbnRzW2pdOwotCQkJCQkJCQkJSVN0YXR1cyBzdGF0dXMgPSBzZXJ2ZXJzW2ldLmNhbk1vZGlmeU1vZHVsZXMobmV3IElNb2R1bGVbXSB7IHBhcmVudCB9LCBuZXcgSU1vZHVsZVswXSwgbW9uaXRvcik7Ci0JCQkJCQkJCQlpZiAoc3RhdHVzID09IG51bGwgfHwgc3RhdHVzLmlzT0soKSl7Ci0JCQkJCQkJCQkJbGlzdC5hZGQoc2VydmVyc1tpXSk7Ci0JCQkJCQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gc2UpIHsKLQkJCQkJCWlmIChpbmNsdWRlRXJyb3JzKQotCQkJCQkJCWxpc3QuYWRkKHNlcnZlcnNbaV0pOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQkvLyBtYWtlIHN1cmUgdGhhdCB0aGUgcHJlZmVycmVkIHNlcnZlciBpcyB0aGUgZmlyc3Qgb25lCi0JCS8vSVNlcnZlciBzZXJ2ZXIgPSBTZXJ2ZXJDb3JlLmdldFNlcnZlclByZWZlcmVuY2VzKCkuZ2V0RGVwbG95YWJsZVNlcnZlclByZWZlcmVuY2UoZGVwbG95YWJsZSk7Ci0JCS8vaWYgKHNlcnZlciAhPSBudWxsICYmIGxpc3QuY29udGFpbnMoc2VydmVyKSAmJiBsaXN0LmluZGV4T2Yoc2VydmVyKSAhPSAwKSB7Ci0JCS8vCWxpc3QucmVtb3ZlKHNlcnZlcik7Ci0JCS8vCWxpc3QuYWRkKDAsIHNlcnZlcik7Ci0JCS8vfQotCi0JCUlTZXJ2ZXJbXSBhbGxTZXJ2ZXJzID0gbmV3IElTZXJ2ZXJbbGlzdC5zaXplKCldOwotCQlsaXN0LnRvQXJyYXkoYWxsU2VydmVycyk7Ci0JCXJldHVybiBhbGxTZXJ2ZXJzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIGFsbCBzZXJ2ZXJzIHRoYXQgdGhpcyBtb2R1bGUgaXMgY29uZmlndXJlZCBvbi4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kdWxlIGEgbW9kdWxlCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqIEByZXR1cm4gYSBwb3NzaWJseS1lbXB0eSBhcnJheSBvZiBzZXJ2ZXIgaW5zdGFuY2VzIHtAbGluayBJU2VydmVyfQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVNlcnZlcltdIGdldFNlcnZlcnNCeU1vZHVsZShJTW9kdWxlIG1vZHVsZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmIChtb2R1bGUgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgSVNlcnZlclswXTsKLQotCQkvLyBkbyBpdCB0aGUgc2xvdyB3YXkgLSBnbyB0aHJvdWdoIGFsbCBzZXJ2ZXJzIGFuZAotCQkvLyBzZWUgaWYgdGhpcyBtb2R1bGUgaXMgY29uZmlndXJlZCBpbiBpdAotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlTZXJ2ZXJbXSBzZXJ2ZXJzID0gU2VydmVyQ29yZS5nZXRTZXJ2ZXJzKCk7Ci0JCWlmIChzZXJ2ZXJzICE9IG51bGwpIHsKLQkJCWludCBzaXplID0gc2VydmVycy5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCWlmIChjb250YWluc01vZHVsZShzZXJ2ZXJzW2ldLCBtb2R1bGUsIG1vbml0b3IpKQotCQkJCQlsaXN0LmFkZChzZXJ2ZXJzW2ldKTsKLQkJCX0KLQkJfQotCQkKLQkJSVNlcnZlcltdIGFsbFNlcnZlcnMgPSBuZXcgSVNlcnZlcltsaXN0LnNpemUoKV07Ci0JCWxpc3QudG9BcnJheShhbGxTZXJ2ZXJzKTsKLQkJcmV0dXJuIGFsbFNlcnZlcnM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBzZXJ2ZXIgY3VycmVudGx5IGNvbnRhaW5zIHRoZSBnaXZlbiBtb2R1bGUuCi0JICoKLQkgKiBAcGFyYW0gc2VydmVyIGEgc2VydmVyCi0JICogQHBhcmFtIG1vZHVsZSBhIG1vZHVsZQotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLQkgKiBAcmV0dXJuIGJvb2xlYW4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG1vZHVsZSBpcyBjb250YWluZWQgb24gdGhlIHNlcnZlciwKLQkgKiAgICBvciA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zTW9kdWxlKElTZXJ2ZXIgc2VydmVyLCBmaW5hbCBJTW9kdWxlIG1vZHVsZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmIChzZXJ2ZXIgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiY29udGFpbnNNb2R1bGUoKSAiICsgc2VydmVyICsgIiAiICsgbW9kdWxlKTsKLQkJCi0JCWNsYXNzIEhlbHBlciB7Ci0JCQlib29sZWFuIGI7Ci0JCX0KLQkJZmluYWwgSGVscGVyIGggPSBuZXcgSGVscGVyKCk7Ci0KLQkJKChTZXJ2ZXIpc2VydmVyKS52aXNpdChuZXcgSU1vZHVsZVZpc2l0b3IoKSB7Ci0JCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJTW9kdWxlW10gbW9kdWxlcykgewotCQkJCWludCBzaXplID0gbW9kdWxlcy5sZW5ndGg7Ci0JCQkJaWYgKG1vZHVsZXNbc2l6ZSAtIDFdLmVxdWFscyhtb2R1bGUpKSB7Ci0JCQkJCWguYiA9IHRydWU7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0sIG51bGwpOwotCQlyZXR1cm4gaC5iOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNlcnZlciBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGxhdW5jaCBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWd1cmF0aW9uIGEgbGF1bmNoIGNvbmZpZ3VyYXRpb24KLQkgKiBAcmV0dXJuIHRoZSBzZXJ2ZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBsYXVuY2ggY29uZmlndXJhdGlvbiwgb3IKLQkgKiAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBzZXJ2ZXIgY291bGQgYmUgZm91bmQKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBwcm9ibGVtIGdldHRpbmcgdGhlIGF0dHJpYnV0ZSBmcm9tCi0JICogICAgdGhlIGxhdW5jaCBjb25maWd1cmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBJU2VydmVyIGdldFNlcnZlcihJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBzZXJ2ZXJJZCA9IGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKFNlcnZlci5BVFRSX1NFUlZFUl9JRCwgKFN0cmluZykgbnVsbCk7Ci0KLQkJaWYgKHNlcnZlcklkICE9IG51bGwpCi0JCQlyZXR1cm4gU2VydmVyQ29yZS5maW5kU2VydmVyKHNlcnZlcklkKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHdoZXRoZXIgdGhpcyBzZXJ2ZXIgY2FuIGJlIGVkaXR0ZWQuCi0JICogCi0JICogQHBhcmFtIGNvbnRleHQgdGhlIGNvbnRleHQgKFNoZWxsKQotCSAqIEBwYXJhbSBzZXJ2ZXIgdGhlIHNlcnZlcgotCSAqIEByZXR1cm4gYSBzdGF0dXMgb2JqZWN0IHdpdGggY29kZSA8Y29kZT5JU3RhdHVzLk9LPC9jb2RlPiBpZiB0aGUgc2VydmVyCi0JICogICBjYW4gYmUgZWRpdGVkLCBvdGhlcndpc2UgYSBzdGF0dXMgb2JqZWN0IGluZGljYXRpbmcgd2hhdCB3aGVuIHdyb25nCi0JICogICB3aXRoIHRoZSBjaGVja291dAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyB2YWxpZGF0ZUVkaXQoT2JqZWN0IGNvbnRleHQsIElTZXJ2ZXIgc2VydmVyKSB7Ci0JCXJldHVybiAoKFNlcnZlcilzZXJ2ZXIpLnZhbGlkYXRlRWRpdChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwb3J0IHRoYXQgaXMgYmVpbmcgdXNlZCB0byBtb25pdG9yIHRoZSBnaXZlbiBwb3J0IG9uIHRoZSBzZXJ2ZXIuCi0JICogVGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgd2hlbmV2ZXIgY3JlYXRpbmcgYSAnY2xpZW50JyBmb3IgdGhlIHNlcnZlciwgYW5kIGFsbG93cwotCSAqIHRoZSBjbGllbnQgdG8gc2VhbWxlc3NseSB1c2UgYSBtb25pdG9yZWQgcG9ydCBpbnN0ZWFkIG9mIGdvaW5nIGRpcmVjdGx5IHRvIHRoZQotCSAqIHNlcnZlci4KLQkgKiAKLQkgKiA8Yj5Qcm92aXNpb25hbCBBUEk6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIAotCSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayAKLQkgKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAKLQkgKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gc2VydmVyIGEgc2VydmVyCi0JICogQHBhcmFtIHBvcnQgYSBwb3J0IG9uIHRoZSBzZXJ2ZXIKLQkgKiBAcGFyYW0gY29udGVudFR5cGUgdGhlIGNvbnRlbnQgdHlwZSwgZS5nLiAid2ViIgotCSAqIEByZXR1cm4gdGhlIG1vbml0b3JlZCBwb3J0LCBvciB0aGUgb3JpZ2luYWwgcG9ydCBudW1iZXIgaWYgdGhlIHBvcnQgaXMgbm90Ci0JICogICAgY3VycmVudGx5IGJlaW5nIG1vbml0b3JlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGdldE1vbml0b3JlZFBvcnQoSVNlcnZlciBzZXJ2ZXIsIGludCBwb3J0LCBTdHJpbmcgY29udGVudFR5cGUpIHsKLQkJcmV0dXJuIFNlcnZlck1vbml0b3JNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0TW9uaXRvcmVkUG9ydChzZXJ2ZXIsIHBvcnQsIGNvbnRlbnRUeXBlKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvVGFza01vZGVsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9UYXNrTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE2ZGJiNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9UYXNrTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLS8qKgotICogQSB0YXNrIG1vZGVsIHJlcHJlc2VudHMgYSBtb2RlbCB0aGF0IGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBtdWx0aXBsZQotICogdGFza3MgaW4gYSBjb21tb24gd29ya2Zsb3cuCi0gKiA8cD4KLSAqIFRoZSB0YXNrIG1vZGVsIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvdmVyYWxsIHRhc2sgZmxvdyBhbmQgYWxsb3dzCi0gKiB0YXNrcyB0byBzdG9yZSBhbmQgcmV0cmVpdmUgZGF0YS4gSXRzIHVzYWdlIGFsbG93cyBtdXRsaXBsZSB0YXNrcyB0byBiZQotICogY2hhaW5lZCB0b2dldGhlciBhbmQgc2hhcmUgZGF0YSBmcm9tIHRoZSBvdXRwdXQgb2Ygb25lIHRhc2sgdG8gdGhlIGlucHV0Ci0gKiBvZiBhbm90aGVyLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrTW9kZWwgewotCS8qKgotCSAqIFRhc2sgbW9kZWwgaWQgZm9yIGFuIElSdW50aW1lLgotCSAqIAotCSAqIEBzZWUgI2dldE9iamVjdChTdHJpbmcpCi0JICogQHNlZSAjcHV0T2JqZWN0KFN0cmluZywgT2JqZWN0KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBU0tfUlVOVElNRSA9ICJydW50aW1lIjsKLQkKLQkvKioKLQkgKiBUYXNrIG1vZGVsIGlkIGZvciBhbiBJU2VydmVyLgotCSAqIAotCSAqIEBzZWUgI2dldE9iamVjdChTdHJpbmcpCi0JICogQHNlZSAjcHV0T2JqZWN0KFN0cmluZywgT2JqZWN0KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBU0tfU0VSVkVSID0gInNlcnZlciI7Ci0KLQkvKioKLQkgKiBUYXNrIG1vZGVsIGlkIGZvciBhbiBhcnJheSBvZiBtb2R1bGVzLgotCSAqIFRoZSB2YWx1ZSBpcyBhIExpc3QgY29udGFpbmluZyBJTW9kdWxlW10gYXJyYXlzLgotCSAqIAotCSAqIEBzZWUgI2dldE9iamVjdChTdHJpbmcpCi0JICogQHNlZSBUYXNrTW9kZWwjcHV0T2JqZWN0KFN0cmluZywgT2JqZWN0KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBU0tfTU9EVUxFUyA9ICJtb2R1bGVzIjsKLQkKLQkvKioKLQkgKiBUYXNrIG1vZGVsIGlkIGZvciBhIGxhdW5jaCBtb2RlLgotCSAqIAotCSAqIEBzZWUgI2dldE9iamVjdChTdHJpbmcpCi0JICogQHNlZSAjcHV0T2JqZWN0KFN0cmluZywgT2JqZWN0KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBU0tfTEFVTkNIX01PREUgPSAibGF1bmNoLW1vZGUiOwotCQotCXByaXZhdGUgTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBvYmplY3QgaW4gdGhlIHRhc2sgbW9kZWwgd2l0aCB0aGUgZ2l2ZW4gaWQuCi0JICogPHA+Ci0JICogVGhlIGlkIGNhbiBiZSBhbnkgb2YgdGhlIHByZWRlZmluZWQgaWRzIHdpdGhpbiBUYXNrTW9kZWwsIG9yCi0JICogYW55IG90aGVyIGtleSB0byByZXRyZWl2ZSB0YXNrLXNwZWNpZmljIGRhdGEuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBpZCBhbiBpZCBmb3IgdGhlIG9iamVjdAotCSAqIEByZXR1cm4gdGhlIG9iamVjdCB3aXRoIHRoZSBnaXZlbiBpZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiAgICBpZiBubyBvYmplY3QgY291bGQgYmUgZm91bmQgd2l0aCB0aGF0IGlkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRPYmplY3QoU3RyaW5nIGlkKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gbWFwLmdldChpZCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFB1dCBhbiBvYmplY3QgaW50byB0aGUgdGFzayBtb2RlbCB3aXRoIHRoZSBnaXZlbiBpZC4KLQkgKiA8cD4KLQkgKiBUaGUgaWQgY2FuIGJlIGFueSBvZiB0aGUgcHJlZGVmaW5lZCBpZHMgd2l0aGluIFRhc2tNb2RlbCwgb3IKLQkgKiBhbnkgb3RoZXIga2V5IHRvIHN0b3JlIHRhc2stc3BlY2lmaWMgZGF0YS4gCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBpZCB0aGUgaWQgdG8gYXNzb2NpYXRlIHRoZSBvYmplY3Qgd2l0aAotCSAqIEBwYXJhbSBvYmogYW4gb2JqZWN0LCBvciA8Y29kZT5udWxsPC9jb2RlPiB0byByZXNldCAoY2xlYXIpIHRoZSBpZAotCSAqLwotCXB1YmxpYyB2b2lkIHB1dE9iamVjdChTdHJpbmcgaWQsIE9iamVjdCBvYmopIHsKLQkJbWFwLnB1dChpZCwgb2JqKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvQmFzZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvQmFzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmMxNTRjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL0Jhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLaAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0vKioKLSAqIEhlbHBlciBjbGFzcyBmb3Igc3RvcmluZyBydW50aW1lIGFuZCBzZXJ2ZXIgYXR0cmlidXRlcy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2UgewotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfTE9DS0VEID0gImxvY2tlZCI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9QUklWQVRFID0gInByaXZhdGUiOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfTkFNRSA9ICJuYW1lIjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0lEID0gImlkIjsKLQotCXByb3RlY3RlZCBNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLQkKLQkvLyBmaWxlIGxvYWRlZCBmcm9tLCBvciBudWxsIGlmIGl0IGlzIHNhdmVkIGluIG1ldGFkYXRhCi0JcHJvdGVjdGVkIElGaWxlIGZpbGU7Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IG9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZQotCSAqLwotCXB1YmxpYyBCYXNlKElGaWxlIGZpbGUpIHsKLQkJdGhpcy5maWxlID0gZmlsZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgb2JqZWN0LgotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICogQHBhcmFtIGlkCi0JICovCi0JcHVibGljIEJhc2UoSUZpbGUgZmlsZSwgU3RyaW5nIGlkKSB7Ci0JCXRoaXMuZmlsZSA9IGZpbGU7Ci0JCS8vdGhpcy5tYXAgPSBtYXA7Ci0JCW1hcC5wdXQoUFJPUF9JRCwgaWQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRpbWVzdGFtcCBvZiB0aGlzIG9iamVjdC4KLQkgKiBUaW1lc3RhbXBzIGFyZSBtb25vdG9uaWNhbGx5IGluY3JlYXNlZCBlYWNoIHRpbWUgdGhlIG9iamVjdCBpcyBzYXZlZAotCSAqIGFuZCBjYW4gYmUgdXNlZCB0byBkZXRlcm1pbmUgaWYgYW55IGNoYW5nZXMgaGF2ZSBiZWVuIG1hZGUgb24gZGlzawotCSAqIHNpbmNlIHRoZSBvYmplY3Qgd2FzIGxvYWRlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBvYmplY3QncyB0aW1lc3RhbXAKLQkgKi8KLQlwdWJsaWMgaW50IGdldFRpbWVzdGFtcCgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgidGltZXN0YW1wIiwgLTEpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpbGUgd2hlcmUgdGhpcyBzZXJ2ZXIgaW5zdGFuY2UgaXMgc2VyaWFsaXplZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBmaWxlIGluIHRoZSB3b3Jrc3BhY2Ugd2hlcmUgdGhlIHNlcnZlciBpbnN0YW5jZQotCSAqIGlzIHNlcmlhbGl6ZWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBpbmZvcm1hdGlvbiBpcwotCSAqIGluc3RlYWQgdG8gYmUgcGVyc2lzdGVkIHdpdGggdGhlIHdvcmtzcGFjZSBidXQgbm90IHdpdGggYW55Ci0JICogcGFydGljdWxhciB3b3Jrc3BhY2UgcmVzb3VyY2UKLQkgKi8KLQlwdWJsaWMgSUZpbGUgZ2V0RmlsZSgpIHsKLQkJcmV0dXJuIGZpbGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGUoU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIFN0cmluZyBkZWZhdWx0VmFsdWUpIHsKLQkJdHJ5IHsKLQkJCU9iamVjdCBvYmogPSBtYXAuZ2V0KGF0dHJpYnV0ZU5hbWUpOwotCQkJaWYgKG9iaiA9PSBudWxsKQotCQkJCXJldHVybiBkZWZhdWx0VmFsdWU7Ci0JCQlyZXR1cm4gKFN0cmluZykgb2JqOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQkJcmV0dXJuIGRlZmF1bHRWYWx1ZTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEF0dHJpYnV0ZShTdHJpbmcgYXR0cmlidXRlTmFtZSwgaW50IGRlZmF1bHRWYWx1ZSkgewotCQl0cnkgewotCQkJT2JqZWN0IG9iaiA9IG1hcC5nZXQoYXR0cmlidXRlTmFtZSk7Ci0JCQlpZiAob2JqID09IG51bGwpCi0JCQkJcmV0dXJuIGRlZmF1bHRWYWx1ZTsKLQkJCXJldHVybiBJbnRlZ2VyLnBhcnNlSW50KChTdHJpbmcpIG9iaik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQlyZXR1cm4gZGVmYXVsdFZhbHVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldEF0dHJpYnV0ZShTdHJpbmcgYXR0cmlidXRlTmFtZSwgYm9vbGVhbiBkZWZhdWx0VmFsdWUpIHsKLQkJdHJ5IHsKLQkJCU9iamVjdCBvYmogPSBtYXAuZ2V0KGF0dHJpYnV0ZU5hbWUpOwotCQkJaWYgKG9iaiA9PSBudWxsKQotCQkJCXJldHVybiBkZWZhdWx0VmFsdWU7Ci0JCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKChTdHJpbmcpIG9iaikuYm9vbGVhblZhbHVlKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQlyZXR1cm4gZGVmYXVsdFZhbHVlOwotCX0KLQkKLQlwdWJsaWMgTGlzdCBnZXRBdHRyaWJ1dGUoU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIExpc3QgZGVmYXVsdFZhbHVlKSB7Ci0JCXRyeSB7Ci0JCQlPYmplY3Qgb2JqID0gbWFwLmdldChhdHRyaWJ1dGVOYW1lKTsKLQkJCWlmIChvYmogPT0gbnVsbCkKLQkJCQlyZXR1cm4gZGVmYXVsdFZhbHVlOwotCQkJTGlzdCBsaXN0ID0gKExpc3QpIG9iajsKLQkJCWlmIChsaXN0ICE9IG51bGwpCi0JCQkJcmV0dXJuIGxpc3Q7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQlyZXR1cm4gZGVmYXVsdFZhbHVlOwotCX0KLQkKLQlwdWJsaWMgTWFwIGdldEF0dHJpYnV0ZShTdHJpbmcgYXR0cmlidXRlTmFtZSwgTWFwIGRlZmF1bHRWYWx1ZSkgewotCQl0cnkgewotCQkJT2JqZWN0IG9iaiA9IG1hcC5nZXQoYXR0cmlidXRlTmFtZSk7Ci0JCQlpZiAob2JqID09IG51bGwpCi0JCQkJcmV0dXJuIGRlZmF1bHRWYWx1ZTsKLQkJCU1hcCBtYXAyID0gKE1hcCkgb2JqOwotCQkJaWYgKG1hcDIgIT0gbnVsbCkKLQkJCQlyZXR1cm4gbWFwMjsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCXJldHVybiBkZWZhdWx0VmFsdWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZShQUk9QX0lELCAiIik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKFBST1BfTkFNRSwgIiIpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUmVhZE9ubHkoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoUFJPUF9MT0NLRUQsIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgcnVudGltZSBpcyBwcml2YXRlIChub3Qgc2hvd24KLQkgKiBpbiB0aGUgVUkgdG8gdGhlIHVzZXJzKSwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIHJ1bnRpbWUgaXMgcHJpdmF0ZSwKLQkgKiAgICBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUHJpdmF0ZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZShQUk9QX1BSSVZBVEUsIGZhbHNlKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNXb3JraW5nQ29weSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFhNTFJvb3QoKTsKLQkKLQlwcm90ZWN0ZWQgdm9pZCBzYXZlKElNZW1lbnRvIG1lbWVudG8pIHsKLQkJLy9JTWVtZW50byBjaGlsZCA9IG1lbWVudG8uY3JlYXRlQ2hpbGQoInByb3BlcnRpZXMiKTsKLQkJSU1lbWVudG8gY2hpbGQgPSBtZW1lbnRvOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IG1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlTdHJpbmcga2V5ID0gKFN0cmluZykgaXRlcmF0b3IubmV4dCgpOwotCQkJT2JqZWN0IG9iaiA9IG1hcC5nZXQoa2V5KTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBTdHJpbmcpCi0JCQkJY2hpbGQucHV0U3RyaW5nKGtleSwgKFN0cmluZykgb2JqKTsKLQkJCWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIEludGVnZXIpIHsKLQkJCQlJbnRlZ2VyIGluID0gKEludGVnZXIpIG9iajsKLQkJCQljaGlsZC5wdXRJbnRlZ2VyKGtleSwgaW4uaW50VmFsdWUoKSk7Ci0JCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIEJvb2xlYW4pIHsKLQkJCQlCb29sZWFuIGJvb2wgPSAoQm9vbGVhbikgb2JqOwotCQkJCWNoaWxkLnB1dEJvb2xlYW4oa2V5LCBib29sLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgTGlzdCkgewotCQkJCUxpc3QgbGlzdCA9IChMaXN0KSBvYmo7Ci0JCQkJc2F2ZUxpc3QoY2hpbGQsIGtleSwgbGlzdCk7Ci0JCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIE1hcCkgewotCQkJCU1hcCBtYXAyID0gKE1hcCkgb2JqOwotCQkJCXNhdmVNYXAoY2hpbGQsIGtleSwgbWFwMik7Ci0JCQkJCi0JCQl9Ci0JCX0KLQkJc2F2ZVN0YXRlKGNoaWxkKTsKLQl9Ci0JcHJvdGVjdGVkIHZvaWQgc2F2ZU1hcChJTWVtZW50byBtZW1lbnRvLCBTdHJpbmcga2V5LCBNYXAgbWFwMikgewotCQlJTWVtZW50byBjaGlsZCA9IG1lbWVudG8uY3JlYXRlQ2hpbGQoIm1hcCIpOwotCQljaGlsZC5wdXRTdHJpbmcoImtleSIsIGtleSk7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbWFwMi5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlTdHJpbmcgcyA9IChTdHJpbmcpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWNoaWxkLnB1dFN0cmluZyhzLCAoU3RyaW5nKW1hcDIuZ2V0KHMpKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzYXZlTGlzdChJTWVtZW50byBtZW1lbnRvLCBTdHJpbmcga2V5LCBMaXN0IGxpc3QpIHsKLQkJSU1lbWVudG8gY2hpbGQgPSBtZW1lbnRvLmNyZWF0ZUNoaWxkKCJsaXN0Iik7Ci0JCWNoaWxkLnB1dFN0cmluZygia2V5Iiwga2V5KTsKLQkJaW50IGkgPSAwOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJU3RyaW5nIHMgPSAoU3RyaW5nKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQljaGlsZC5wdXRTdHJpbmcoInZhbHVlIiArIChpKyspLCBzKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNhdmVUb0ZpbGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlYTUxNZW1lbnRvIG1lbWVudG8gPSBYTUxNZW1lbnRvLmNyZWF0ZVdyaXRlUm9vdChnZXRYTUxSb290KCkpOwotCQkJc2F2ZShtZW1lbnRvKTsKLQotCQkJSW5wdXRTdHJlYW0gaW4gPSBtZW1lbnRvLmdldElucHV0U3RyZWFtKCk7Ci0JCQlpZiAoZmlsZS5leGlzdHMoKSkKLQkJCQlmaWxlLnNldENvbnRlbnRzKGluLCB0cnVlLCB0cnVlLCBQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yLCAxMDAwKSk7Ci0JCQllbHNlCi0JCQkJZmlsZS5jcmVhdGUoaW4sIHRydWUsIFByb2dyZXNzVXRpbC5nZXRTdWJNb25pdG9yRm9yKG1vbml0b3IsIDEwMDApKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBzYXZlICIgKyBnZXRYTUxSb290KCksIGUpOwotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCBOTFMuYmluZChNZXNzYWdlcy5lcnJvclNhdmluZywgZ2V0RmlsZSgpLnRvU3RyaW5nKCkpLCBlKSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgZG9TYXZlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoZmlsZSAhPSBudWxsKQotCQkJc2F2ZVRvRmlsZShtb25pdG9yKTsKLQkJZWxzZQotCQkJc2F2ZVRvTWV0YWRhdGEobW9uaXRvcik7Ci0JCVJlc291cmNlTWFuYWdlci5nZXRJbnN0YW5jZSgpLnJlc29sdmVTZXJ2ZXJzKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNhdmVUb01ldGFkYXRhKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHNhdmVTdGF0ZShJTWVtZW50byBtZW1lbnRvKTsKLQotCXByb3RlY3RlZCB2b2lkIGxvYWQoSU1lbWVudG8gbWVtZW50bykgewotCQltYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBtZW1lbnRvLmdldE5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJU3RyaW5nIGtleSA9IChTdHJpbmcpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCW1hcC5wdXQoa2V5LCBtZW1lbnRvLmdldFN0cmluZyhrZXkpKTsKLQkJfQotCQlJTWVtZW50b1tdIGNoaWxkcmVuID0gbWVtZW50by5nZXRDaGlsZHJlbigibGlzdCIpOwotCQlpZiAoY2hpbGRyZW4gIT0gbnVsbCkgewotCQkJaW50IHNpemUgPSBjaGlsZHJlbi5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCWxvYWRMaXN0KGNoaWxkcmVuW2ldKTsKLQkJCX0KLQkJfQotCQlJTWVtZW50b1tdIG1hcHMgPSBtZW1lbnRvLmdldENoaWxkcmVuKCJtYXAiKTsKLQkJaWYgKG1hcHMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPG1hcHMubGVuZ3RoIDsgaSsrKSB7Ci0JCQkJbG9hZE1hcChtYXBzW2ldKTsKLQkJCX0KLQkJfQotCQkKLQkJbG9hZFN0YXRlKG1lbWVudG8pOwotCX0KLQotCQotCXByb3RlY3RlZCB2b2lkIGxvYWRNYXAoSU1lbWVudG8gbWVtZW50bykgewotCQlTdHJpbmcga2V5ID0gbWVtZW50by5nZXRTdHJpbmcoImtleSIpOwotCQlNYXAgdk1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCUxpc3Qga2V5cyA9IG1lbWVudG8uZ2V0TmFtZXMoKTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBrZXlzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJU3RyaW5nIHMgPSAoU3RyaW5nKWl0ZXJhdG9yLm5leHQoKTsKLQkJCVN0cmluZyB2ID0gbWVtZW50by5nZXRTdHJpbmcocyk7Ci0JCQl2TWFwLnB1dChzLHYpOwotCQl9Ci0JCW1hcC5wdXQoa2V5LCB2TWFwKTsKLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIHZvaWQgbG9hZExpc3QoSU1lbWVudG8gbWVtZW50bykgewotCQlTdHJpbmcga2V5ID0gbWVtZW50by5nZXRTdHJpbmcoImtleSIpOwotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWludCBpID0gMDsKLQkJU3RyaW5nIGtleTIgPSBtZW1lbnRvLmdldFN0cmluZygidmFsdWUiICsgKGkrKykpOwotCQl3aGlsZSAoa2V5MiAhPSBudWxsKSB7Ci0JCQlsaXN0LmFkZChrZXkyKTsKLQkJCWtleTIgPSBtZW1lbnRvLmdldFN0cmluZygidmFsdWUiICsgKGkrKykpOwotCQl9Ci0JCW1hcC5wdXQoa2V5LCBsaXN0KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgbG9hZFN0YXRlKElNZW1lbnRvIG1lbWVudG8pOwotCQotCXByb3RlY3RlZCB2b2lkIHJlc29sdmUoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0JCi0JcHVibGljIHZvaWQgZGVsZXRlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoaXNXb3JraW5nQ29weSgpKQotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCAiQ2Fubm90IGRlbGV0ZSBhIHdvcmtpbmcgY29weSIsIG51bGwpKTsKLQkJCi0JCWlmIChmaWxlICE9IG51bGwpCi0JCQlmaWxlLmRlbGV0ZSh0cnVlLCB0cnVlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJZWxzZQotCQkJZGVsZXRlRnJvbU1ldGFkYXRhKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGVsZXRlRnJvbU1ldGFkYXRhKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJaWYgKCEob2JqIGluc3RhbmNlb2YgQmFzZSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQlCYXNlIGJhc2UgPSAoQmFzZSkgb2JqOwotCQlpZiAoZ2V0SWQoKSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gZ2V0SWQoKS5lcXVhbHMoYmFzZS5nZXRJZCgpKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsb2FkRnJvbUZpbGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlucHV0U3RyZWFtIGluID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWluID0gZmlsZS5nZXRDb250ZW50cygpOwotCQkJSU1lbWVudG8gbWVtZW50byA9IFhNTE1lbWVudG8ubG9hZE1lbWVudG8oaW4pOwotCQkJbG9hZChtZW1lbnRvKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBsb2FkIGZyb20gZmlsZSIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yTG9hZGluZywgZ2V0RmlsZSgpLnRvU3RyaW5nKCkpLCBlKSk7Ci0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCWluLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCS8vIGlnbm9yZQotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGxvYWRGcm9tTWVtZW50byhJTWVtZW50byBtZW1lbnRvLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJbG9hZChtZW1lbnRvKTsKLQl9Ci0JCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbG9hZEZyb21QYXRoKElQYXRoIHBhdGgsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlGaWxlSW5wdXRTdHJlYW0gZmluID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWZpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0ocGF0aC50b0ZpbGUoKSk7Ci0JCQlJTWVtZW50byBtZW1lbnRvID0gWE1MTWVtZW50by5sb2FkTWVtZW50byhmaW4pOwotCQkJbG9hZChtZW1lbnRvKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBsb2FkIGZyb20gcGF0aDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JMb2FkaW5nLCBwYXRoLnRvU3RyaW5nKCkpLCBlKSk7Ci0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCWZpbi5jbG9zZSgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBpZ25vcmUKLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZUVkaXQoT2JqZWN0IGNvbnRleHQpIHsKLQkJaWYgKGZpbGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQotCQlyZXR1cm4gZmlsZS5nZXRXb3Jrc3BhY2UoKS52YWxpZGF0ZUVkaXQobmV3IElGaWxlW10geyBmaWxlIH0sIGNvbnRleHQpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9DaGFpbmVkSm9iLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9DaGFpbmVkSm9iLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3YmRlYWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvQ2hhaW5lZEpvYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotoCogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSUpvYkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklKb2JDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iQ2hhbmdlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLS8qKgotICogQSBKb2IgdGhhdCBjYW4gc3RhcnQgYW5vdGhlciBqb2IgdXBvbiBzdWNjZXNzZnVsIGNvbXBsZXRpb24uCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDaGFpbmVkSm9iIGV4dGVuZHMgSm9iIHsKLQlwcml2YXRlIElTZXJ2ZXIgc2VydmVyOwotCXByaXZhdGUgSm9iIG5leHRKb2I7Ci0JcHJpdmF0ZSBJSm9iQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgZGVwZW5kYW50IGpvYi4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgam9iCi0JICogQHBhcmFtIHNlcnZlciB0aGUgc2VydmVyIHRvIHB1Ymxpc2ggdG8KLQkgKi8KLQlwdWJsaWMgQ2hhaW5lZEpvYihTdHJpbmcgbmFtZSwgSVNlcnZlciBzZXJ2ZXIpIHsKLQkJc3VwZXIobmFtZSk7Ci0JCXRoaXMuc2VydmVyID0gc2VydmVyOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSm9iI2JlbG9uZ3NUbyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGJlbG9uZ3NUbyhPYmplY3QgZmFtaWx5KSB7Ci0JCXJldHVybiBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELmVxdWFscyhmYW1pbHkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNlcnZlciB0aGF0IHRoaXMgam9iIHdhcyBjcmVhdGVkIHdpdGguCi0JICogCi0JICogQHJldHVybiBhIHNlcnZlcgotCSAqLwotCXB1YmxpYyBJU2VydmVyIGdldFNlcnZlcigpIHsKLQkJcmV0dXJuIHNlcnZlcjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBsaXN0ZW5lciBmb3Igd2hlbiB0aGlzIGpvYiBmaW5pc2hlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVMaXN0ZW5lcigpIHsKLQkJaWYgKGxpc3RlbmVyICE9IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQlsaXN0ZW5lciA9IG5ldyBKb2JDaGFuZ2VBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZG9uZShJSm9iQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlqb2JEb25lKGV2ZW50LmdldFJlc3VsdCgpKTsKLQkJCX0KLQkJfTsKLQkJCi0JCWFkZEpvYkNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB0aGlzIGpvYiBpcyBjb21wbGV0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gc3RhdHVzIHRoZSByZXN1bHQgb2YgdGhlIGN1cnJlbnQgam9iCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgam9iRG9uZShJU3RhdHVzIHN0YXR1cykgewotCQlpZiAobGlzdGVuZXIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCXJlbW92ZUpvYkNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJbGlzdGVuZXIgPSBudWxsOwotCQkKLQkJaWYgKG5leHRKb2IgIT0gbnVsbCAmJiBzdGF0dXMgIT0gbnVsbCAmJiBzdGF0dXMuZ2V0U2V2ZXJpdHkoKSAhPSBJU3RhdHVzLkVSUk9SCi0JCQkJJiYgc3RhdHVzLmdldFNldmVyaXR5KCkgIT0gSVN0YXR1cy5DQU5DRUwpCi0JCQluZXh0Sm9iLnNjaGVkdWxlKCk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBuZXh0IGpvYiwgd2hpY2ggc2hvdWxkIGJlIHNjaGVkdWxlZCBpZiBhbmQgb25seSBpZiB0aGlzIGpvYiBjb21wbGV0ZXMKLQkgKiBzdWNjZXNzZnVsbHkuIFRoZSBuZXh0IGpvYiB3aWxsIGJlIHJ1biBhcyBsb25nIGFzIHRoZSByZXN1bHQgb2YgdGhpcyBqb2IgaXMKLQkgKiBub3QgYW4gRVJST1Igb3IgQ0FOQ0VMIHN0YXR1cy4KLQkgKiBUaGlzIG1ldGhvZCBpcyBub3QgdGhyZWFkLXNhZmUuIEhvd2V2ZXIsIHRoZSBuZXh0IGpvYiBjYW4gYmUgY2hhbmdlZCBhbnl0aW1lCi0JICogdXAgdW50aWwgdGhlIGN1cnJlbnQgam9iIGNvbXBsZXRlcy4KLQkgKiAKLQkgKiBAcGFyYW0gam9iIHRoZSBuZXh0IGpvYiB0aGF0IHNob3VsZCBiZSBzY2hlZHVsZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROZXh0Sm9iKEpvYiBqb2IpIHsKLQkJbmV4dEpvYiA9IGpvYjsKLQkJY3JlYXRlTGlzdGVuZXIoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvQ2xpZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9DbGllbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTY0OGY3My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9DbGllbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLaAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLkNsaWVudERlbGVnYXRlOwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIENsaWVudCBpbXBsZW1lbnRzIElDbGllbnQgewotCXByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQ7Ci0JcHJpdmF0ZSBDbGllbnREZWxlZ2F0ZSBkZWxlZ2F0ZTsKLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBjbGllbnQuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQgYSBjb25maWd1cmF0aW9uIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgQ2xpZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJQ2xpZW50I2dldElkKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImlkIik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVsYXRpdmUgcHJpb3JpdHkgb2YgdGhpcyBhZGFwdGVyLgotCSAqCi0JICogQHJldHVybiBhIHByaW9yaXR5Ci0JICovCi0JcHVibGljIGludCBnZXRQcmlvcml0eSgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBJbnRlZ2VyLnBhcnNlSW50KGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJwcmlvcml0eSIpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAwOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJQ2xpZW50I2dldERlc2NyaXB0aW9uKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImRlc2NyaXB0aW9uIik7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGF1bmNoYWJsZSgpIHsKLQkJcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJsYXVuY2hhYmxlIik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJQ2xpZW50I2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJU3RyaW5nIGxhYmVsID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoIm5hbWUiKTsKLQkJaWYgKGxhYmVsID09IG51bGwpCi0JCQlyZXR1cm4gIm4vYSI7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRlbGVnYXRlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGRlbGVnYXRlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBpdCBjb3VsZG4ndCBiZSBsb2FkZWQKLQkgKi8KLQlwdWJsaWMgQ2xpZW50RGVsZWdhdGUgZ2V0RGVsZWdhdGUoKSB7Ci0JCWlmIChkZWxlZ2F0ZSA9PSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWRlbGVnYXRlID0gKENsaWVudERlbGVnYXRlKSBlbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBjcmVhdGUgZGVsZWdhdGUiICsgdG9TdHJpbmcoKSArICI6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRlbGVnYXRlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSUNsaWVudCNzdXBwb3J0cyhJU2VydmVyLCBPYmplY3QsIFN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhJU2VydmVyIHNlcnZlciwgT2JqZWN0IGxhdW5jaGFibGUsIFN0cmluZyBsYXVuY2hNb2RlKSB7Ci0JCWlmIChsYXVuY2hhYmxlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCS8vaWYgKCFsYXVuY2hhYmxlLmdldENsYXNzKCkuZ2V0TmFtZSgpLmVxdWFscyhnZXRMYXVuY2hhYmxlKCkpKQotCQkvLwlyZXR1cm4gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZ2V0RGVsZWdhdGUoKS5zdXBwb3J0cyhzZXJ2ZXIsIGxhdW5jaGFibGUsIGxhdW5jaE1vZGUpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgY2FsbGluZyBkZWxlZ2F0ZSAiICsgdG9TdHJpbmcoKSArICI6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElDbGllbnQjbGF1bmNoKElTZXJ2ZXIsIE9iamVjdCwgU3RyaW5nLCBJTGF1bmNoKQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGxhdW5jaChJU2VydmVyIHNlcnZlciwgT2JqZWN0IGxhdW5jaGFibGUsIFN0cmluZyBsYXVuY2hNb2RlLCBJTGF1bmNoIGxhdW5jaCkgewotCQl0cnkgewotCQkJcmV0dXJuIGdldERlbGVnYXRlKCkubGF1bmNoKHNlcnZlciwgbGF1bmNoYWJsZSwgbGF1bmNoTW9kZSwgbGF1bmNoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGNhbGxpbmcgZGVsZWdhdGUgIiArIHRvU3RyaW5nKCkgKyAiOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuCi0JICogCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIkNsaWVudFsiICsgZ2V0SWQoKSArICJdIjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvRGVsZXRlZE1vZHVsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvRGVsZXRlZE1vZHVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzAwMDdkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL0RlbGV0ZWRNb2R1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi2gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlVHlwZTsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxldGVkTW9kdWxlIGltcGxlbWVudHMgSU1vZHVsZSB7Ci0JcHJvdGVjdGVkIFN0cmluZyBpZDsKLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWU7Ci0JcHJvdGVjdGVkIElNb2R1bGVUeXBlIG1vZHVsZVR5cGUyOwotCi0JcHVibGljIERlbGV0ZWRNb2R1bGUoU3RyaW5nIGlkLCBTdHJpbmcgbmFtZSwgSU1vZHVsZVR5cGUgbW9kdWxlVHlwZSkgewotCQl0aGlzLmlkID0gaWQ7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMubW9kdWxlVHlwZTIgPSBtb2R1bGVUeXBlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQlwdWJsaWMgSU1vZHVsZVR5cGUgZ2V0TW9kdWxlVHlwZSgpIHsKLQkJcmV0dXJuIG1vZHVsZVR5cGUyOwotCX0KLQotCXB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRNb2R1bGVMaXN0ZW5lcihJTW9kdWxlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJLy8gaWdub3JlCi0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlTW9kdWxlTGlzdGVuZXIoSU1vZHVsZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCS8vIGlnbm9yZQotCX0KLQotCXB1YmxpYyBJTW9kdWxlW10gZ2V0Q2hpbGRNb2R1bGVzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGxvYWRBZGFwdGVyKENsYXNzIGFkYXB0ZXIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlpZiAoIShvYmogaW5zdGFuY2VvZiBJTW9kdWxlKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJCQotCQlJTW9kdWxlIG0gPSAoSU1vZHVsZSkgb2JqOwotCQlpZiAoIWdldElkKCkuZXF1YWxzKG0uZ2V0SWQoKSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQkKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJEZWxldGVkTW9kdWxlWyIgKyBuYW1lICsgIiwiICsgaWQgKyAiXSI7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL0lDbGllbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL0lDbGllbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY5ODI4YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9JQ2xpZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLaAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLS8qKgotICogQSBsYXVuY2hhYmxlIGNsaWVudCBpcyBhIGNsaWVudCBzaWRlIGFwcGxpY2F0aW9uIG9yIHRlc3QKLSAqIGhhcm5lc3MgdGhhdCBjYW4gYmUgbGF1bmNoZWQgKHJ1bikgYWdhaW5zdCBhIHJlc291cmNlCi0gKiBydW5uaW5nIG9uIGEgc2VydmVyLgotICogCi0gKiA8cD5UaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy48L3A+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNsaWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgaWQgb2YgdGhpcyBjbGllbnQuIEVhY2gga25vd24gY2xpZW50IGhhcyBhIGRpc3RpbmN0IGlkLiAKLQkgKiBJZHMgYXJlIGludGVuZGVkIHRvIGJlIHVzZWQgaW50ZXJuYWxseSBhcyBrZXlzOyB0aGV5IGFyZSBub3QKLQkgKiBpbnRlbmRlZCB0byBiZSBzaG93biB0byBlbmQgdXNlcnMuCi0JICogCi0JICogQHJldHVybiB0aGUgY2xpZW50IGlkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGlzcGxheWFibGUgbmFtZSBmb3IgdGhpcyBjbGllbnQuCi0JICogPHA+Ci0JICogTm90ZSB0aGF0IHRoaXMgbmFtZSBpcyBhcHByb3ByaWF0ZSBmb3IgdGhlIGN1cnJlbnQgbG9jYWxlLgotCSAqIDwvcD4KLQkgKgotCSAqIEByZXR1cm4gYSBkaXNwbGF5YWJsZSBuYW1lIGZvciB0aGlzIGNsaWVudAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGlzcGxheWFibGUgZGVzY3JpcHRpb24gZm9yIHRoaXMgY2xpZW50LgotCSAqIDxwPgotCSAqIE5vdGUgdGhhdCB0aGlzIGRlc2NyaXB0aW9uIGlzIGFwcHJvcHJpYXRlIGZvciB0aGUgY3VycmVudCBsb2NhbGUuCi0JICogPC9wPgotCSAqCi0JICogQHJldHVybiBhIGRpc3BsYXlhYmxlIGRlc2NyaXB0aW9uIGZvciB0aGlzIGNsaWVudAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGxhdW5jaGFibGUgY2FuIGJlIHJ1biBieSB0aGlzIGNsaWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gc2VydmVyIHRoZSBzZXJ2ZXIKLQkgKiBAcGFyYW0gbGF1bmNoYWJsZSB0aGUgbGF1bmNoYWJsZSBvYmplY3QKLQkgKiBAcGFyYW0gbGF1bmNoTW9kZSB0aGUgbW9kZQotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzKElTZXJ2ZXIgc2VydmVyLCBPYmplY3QgbGF1bmNoYWJsZSwgU3RyaW5nIGxhdW5jaE1vZGUpOwotCi0JLyoqCi0JICogTGF1bmNoZXMgdGhlIGNsaWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gc2VydmVyIHRoZSBzZXJ2ZXIKLQkgKiBAcGFyYW0gbGF1bmNoYWJsZSB0aGUgbGF1bmNoYWJsZSBvYmplY3QKLQkgKiBAcGFyYW0gbGF1bmNoTW9kZSB0aGUgbW9kZQotCSAqIEBwYXJhbSBsYXVuY2ggdGhlIGxhdW5jaAotCSAqIEByZXR1cm4gYSBzdGF0dXMgb2JqZWN0IHdpdGggY29kZSA8Y29kZT5JU3RhdHVzLk9LPC9jb2RlPiBpZiB0aGUgbGF1bmNoIHdhcwotCSAqICAgc3VjY2Vzc2Z1bCwgb3RoZXJ3aXNlIGEgc3RhdHVzIG9iamVjdCBpbmRpY2F0aW5nIHdoYXQgd2VudCB3cm9uZwotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGxhdW5jaChJU2VydmVyIHNlcnZlciwgT2JqZWN0IGxhdW5jaGFibGUsIFN0cmluZyBsYXVuY2hNb2RlLCBJTGF1bmNoIGxhdW5jaCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvSUluc3RhbGxhYmxlUnVudGltZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvSUluc3RhbGxhYmxlUnVudGltZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzQ1YWQzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL0lJbnN0YWxsYWJsZVJ1bnRpbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotLyoqCi0gKiBSZXByZXNlbnRzIGFuIGluc3RhbGxhYmxlIHJ1bnRpbWUuCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogPC9wPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElJbnN0YWxsYWJsZVJ1bnRpbWUgewotCS8qKgotCSAqIFJldHVybnMgdGhlIGlkIG9mIHRoaXMgcnVudGltZSB0eXBlLgotCSAqIEVhY2gga25vd24gc2VydmVyIHJ1bnRpbWUgdHlwZSBoYXMgYSBkaXN0aW5jdCBpZC4gCi0JICogSWRzIGFyZSBpbnRlbmRlZCB0byBiZSB1c2VkIGludGVybmFsbHkgYXMga2V5czsgdGhleSBhcmUgbm90Ci0JICogaW50ZW5kZWQgdG8gYmUgc2hvd24gdG8gZW5kIHVzZXJzLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHJ1bnRpbWUgdHlwZSBpZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIEtpY2tzIG9mZiBhIGJhY2tncm91bmQgam9iIHRvIGluc3RhbGwgdGhlIHJ1bnRpbWUuCi0JICogCi0JICogQHBhcmFtIHBhdGggdGhlIHBhdGggdG8gaW5zdGFsbCB0aGUgcnVudGltZSBhdAotCSAqLwotCXB1YmxpYyB2b2lkIGluc3RhbGwoSVBhdGggcGF0aCk7Ci0KLQkvKioKLQkgKiBJbnN0YWxsIHRoaXMgcnVudGltZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aCB0aGUgcGF0aCB0byBpbnN0YWxsIHRoZSBydW50aW1lIGF0Ci0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZCAKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gaWYgYW4gZXhjZXB0aW9uIG9jY3VycyB3aGlsZSBjcmVhdGluZyB0aGlzIHJ1bnRpbWUKLQkgKiAgICBvciBzZXR0aW5nIGl0J3MgZGVmYXVsdCB2YWx1ZXMKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnN0YWxsKElQYXRoIHBhdGgsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb247Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvSUluc3RhbGxhYmxlU2VydmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9JSW5zdGFsbGFibGVTZXJ2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE4MGEyOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9JSW5zdGFsbGFibGVTZXJ2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci0vKioKLSAqIFJlcHJlc2VudHMgYW4gaW5zdGFsbGFibGUgc2VydmVyIGFkYXB0ZXIuCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogPC9wPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElJbnN0YWxsYWJsZVNlcnZlciB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgaWQgb2YgdGhpcyBydW50aW1lIHR5cGUuCi0JICogRWFjaCBrbm93biBzZXJ2ZXIgcnVudGltZSB0eXBlIGhhcyBhIGRpc3RpbmN0IGlkLiAKLQkgKiBJZHMgYXJlIGludGVuZGVkIHRvIGJlIHVzZWQgaW50ZXJuYWxseSBhcyBrZXlzOyB0aGV5IGFyZSBub3QKLQkgKiBpbnRlbmRlZCB0byBiZSBzaG93biB0byBlbmQgdXNlcnMuCi0JICogCi0JICogQHJldHVybiB0aGUgcnVudGltZSB0eXBlIGlkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGlzcGxheWFibGUgbmFtZSBmb3IgdGhpcyBydW50aW1lIHR5cGUuCi0JICogPHA+Ci0JICogTm90ZSB0aGF0IHRoaXMgbmFtZSBpcyBhcHByb3ByaWF0ZSBmb3IgdGhlIGN1cnJlbnQgbG9jYWxlLgotCSAqIDwvcD4KLQkgKgotCSAqIEByZXR1cm4gYSBkaXNwbGF5YWJsZSBuYW1lIGZvciB0aGlzIHJ1bnRpbWUgdHlwZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGlzcGxheWFibGUgZGVzY3JpcHRpb24gZm9yIHRoaXMgcnVudGltZSB0eXBlLgotCSAqIDxwPgotCSAqIE5vdGUgdGhhdCB0aGlzIGRlc2NyaXB0aW9uIGlzIGFwcHJvcHJpYXRlIGZvciB0aGUgY3VycmVudCBsb2NhbGUuCi0JICogPC9wPgotCSAqCi0JICogQHJldHVybiBhIGRpc3BsYXlhYmxlIGRlc2NyaXB0aW9uIGZvciB0aGlzIHJ1bnRpbWUgdHlwZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRpc3BsYXlhYmxlIHZlbmRvciBuYW1lIGZvciB0aGlzIHJ1bnRpbWUgdHlwZS4gSWYgdGhlCi0JICogcnVudGltZSB0eXBlIGRpZCBub3Qgc3BlY2lmaWMgYSB2ZW5kb3IsIGFuIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZC4KLQkgKiA8cD4KLQkgKiBOb3RlIHRoYXQgdGhpcyBkZXNjcmlwdGlvbiBpcyBhcHByb3ByaWF0ZSBmb3IgdGhlIGN1cnJlbnQgbG9jYWxlLgotCSAqIDwvcD4KLQkgKgotCSAqIEByZXR1cm4gYSBkaXNwbGF5YWJsZSB2ZW5kb3IgbmFtZSBmb3IgdGhpcyBydW50aW1lIHR5cGUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZlbmRvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGlzcGxheWFibGUgdmVyc2lvbiBuYW1lIGZvciB0aGlzIHJ1bnRpbWUgdHlwZS4gSWYgdGhlCi0JICogcnVudGltZSB0eXBlIGRpZCBub3Qgc3BlY2lmaWMgYSB2ZW5kb3IsIGFuIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZC4KLQkgKiA8cD4KLQkgKiBOb3RlIHRoYXQgdGhpcyBkZXNjcmlwdGlvbiBpcyBhcHByb3ByaWF0ZSBmb3IgdGhlIGN1cnJlbnQgbG9jYWxlLgotCSAqIDwvcD4KLQkgKgotCSAqIEByZXR1cm4gYSBkaXNwbGF5YWJsZSB2ZXJzaW9uIG5hbWUgZm9yIHRoaXMgcnVudGltZSB0eXBlCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCk7Ci0KLQkvKioKLQkgKiBJbnN0YWxsIHRoaXMgc2VydmVyLgotCSAqIAotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQgCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgY3JlYXRpbmcgdGhpcyBydW50aW1lCi0JICogICAgb3Igc2V0dGluZyBpdCdzIGRlZmF1bHQgdmFsdWVzCi0JICovCi0JcHVibGljIHZvaWQgaW5zdGFsbChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL0lMYXVuY2hhYmxlQWRhcHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvSUxhdW5jaGFibGVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkMGU5MmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvSUxhdW5jaGFibGVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLaAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci0vKioKLSAqIFRoaXMgaW50ZXJmYWNlLCB0eXBpY2FsbHkgaW1wbGVtZW50ZWQgYnkgdGhlIHNlcnZlcgotICogY29kZSwgY29udmVydHMgZnJvbSBhbiBJTW9kdWxlQXJ0aWZhY3QgdG8gYW4KLSAqIElMYXVuY2hhYmxlLgotICogCi0gKiA8cD5UaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy48L3A+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUxhdW5jaGFibGVBZGFwdGVyIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpZCBvZiB0aGlzIGFkYXB0ZXIuIEVhY2gga25vd24gYWRhcHRlciBoYXMgYSBkaXN0aW5jdCBpZC4gCi0JICogSWRzIGFyZSBpbnRlbmRlZCB0byBiZSB1c2VkIGludGVybmFsbHkgYXMga2V5czsgdGhleSBhcmUgbm90Ci0JICogaW50ZW5kZWQgdG8gYmUgc2hvd24gdG8gZW5kIHVzZXJzLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGFkYXB0ZXIgaWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbGF1bmNoYWJsZSBvYmplY3QgZnJvbSB0aGlzIG1vZHVsZSBvYmplY3QuCi0JICogCi0JICogQHBhcmFtIHNlcnZlciB0aGUgc2VydmVyCi0JICogQHBhcmFtIG1vZHVsZUFydGlmYWN0IGFuIGFydGlmYWN0IGluIHRoZSBtb2R1bGUKLQkgKiBAcmV0dXJuIGEgbGF1bmNoYWJsZSBvYmplY3QKLQkgKiBAZXhjZXB0aW9uIENvcmVFeGNlcHRpb24gdGhyb3duIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSByZXR1cm5pbmcgdGhlIGxhdW5jaGFibGUKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldExhdW5jaGFibGUoSVNlcnZlciBzZXJ2ZXIsIElNb2R1bGVBcnRpZmFjdCBtb2R1bGVBcnRpZmFjdCkgdGhyb3dzIENvcmVFeGNlcHRpb247Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvSU1lbWVudG8uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL0lNZW1lbnRvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwODI0MzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvSU1lbWVudG8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLaAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotLyoqCi0gKiBJbnRlcmZhY2UgdG8gYSBtZW1lbnRvIHVzZWQgZm9yIHNhdmluZyB0aGUgaW1wb3J0YW50IHN0YXRlIG9mIGFuIG9iamVjdAotICogaW4gYSBmb3JtIHRoYXQgY2FuIGJlIHBlcnNpc3RlZCBpbiB0aGUgZmlsZSBzeXN0ZW0uCi0gKiA8cD4KLSAqIE1lbWVudG9zIHdlcmUgZGVzaWduZWQgd2l0aCB0aGUgZm9sbG93aW5nIHJlcXVpcmVtZW50cyBpbiBtaW5kOgotICogPG9sPgotICogIDxsaT5DZXJ0YWluIG9iamVjdHMgbmVlZCB0byBiZSBzYXZlZCBhbmQgcmVzdG9yZWQgYWNyb3NzIHBsYXRmb3JtIHNlc3Npb25zLgotICogICAgPC9saT4KLSAqICA8bGk+V2hlbiBhbiBvYmplY3QgaXMgcmVzdG9yZWQsIGFuIGFwcHJvcHJpYXRlIGNsYXNzIGZvciBhbiBvYmplY3QgbWlnaHQgbm90Ci0gKiAgICBiZSBhdmFpbGFibGUuIEl0IG11c3QgYmUgcG9zc2libGUgdG8gc2tpcCBhbiBvYmplY3QgaW4gdGhpcyBjYXNlLjwvbGk+Ci0gKiAgPGxpPldoZW4gYW4gb2JqZWN0IGlzIHJlc3RvcmVkLCB0aGUgYXBwcm9wcmlhdGUgY2xhc3MgZm9yIHRoZSBvYmplY3QgbWF5IGJlCi0gKiAgICBkaWZmZXJlbnQgZnJvbSB0aGUgb25lIHdoZW4gdGhlIG9iamVjdCB3YXMgb3JpZ2luYWxseSBzYXZlZC4gSWYgc28sIHRoZQotICogICAgbmV3IGNsYXNzIHNob3VsZCBzdGlsbCBiZSBhYmxlIHRvIHJlYWQgdGhlIG9sZCBmb3JtIG9mIHRoZSBkYXRhLjwvbGk+Ci0gKiA8L29sPgotICogPC9wPgotICogPHA+Ci0gKiBNZW1lbnRvcyBtZWV0IHRoZXNlIHJlcXVpcmVtZW50cyBieSBwcm92aWRpbmcgc3VwcG9ydCBmb3Igc3RvcmluZyBhCi0gKiBtYXBwaW5nIG9mIGFyYml0cmFyeSBzdHJpbmcga2V5cyB0byBwcmltaXRpdmUgdmFsdWVzLCBhbmQgYnkgYWxsb3dpbmcKLSAqIG1lbWVudG9zIHRvIGhhdmUgb3RoZXIgbWVtZW50b3MgYXMgY2hpbGRyZW4gKGFycmFuZ2VkIGludG8gYSB0cmVlKS4KLSAqIEEgcm9idXN0IGV4dGVybmFsIHN0b3JhZ2UgZm9ybWF0IGJhc2VkIG9uIFhNTCBpcyB1c2VkLgotICogPC9wPjxwPgotICogVGhlIGtleSBmb3IgYW4gYXR0cmlidXRlIG1heSBiZSBhbnkgYWxwaGEgbnVtZXJpYyB2YWx1ZS4gIEhvd2V2ZXIsIHRoZQotICogdmFsdWUgb2YgPGNvZGU+VEFHX0lEPC9jb2RlPiBpcyByZXNlcnZlZCBmb3IgaW50ZXJuYWwgdXNlLgotICogPC9wPjxwPgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU1lbWVudG8gewotCS8qKgotCSAqIFNwZWNpYWwgcmVzZXJ2ZWQga2V5IHVzZWQgdG8gc3RvcmUgdGhlIG1lbWVudG8gaWQgCi0JICogKHZhbHVlIDxjb2RlPiJvcmcuZWNsaXBzZS51aS5pZCI8L2NvZGU+KS4KLQkgKgotCSAqIEBzZWUgI2dldElkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0lEID0gIklNZW1lbnRvLmludGVybmFsLmlkIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjaGlsZCBvZiB0aGlzIG1lbWVudG8gd2l0aCB0aGUgZ2l2ZW4gdHlwZS4KLQkgKiA8cD4KLQkgKiBUaGUgPGNvZGU+Z2V0Q2hpbGQ8L2NvZGU+IGFuZCA8Y29kZT5nZXRDaGlsZHJlbjwvY29kZT4gbWV0aG9kcwotCSAqIGFyZSB1c2VkIHRvIHJldHJpZXZlIGNoaWxkcmVuIG9mIGEgZ2l2ZW4gdHlwZS4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZQotCSAqIEByZXR1cm4gYSBuZXcgY2hpbGQgbWVtZW50bwotCSAqIEBzZWUgI2dldENoaWxkCi0JICogQHNlZSAjZ2V0Q2hpbGRyZW4KLQkgKi8KLQlwdWJsaWMgSU1lbWVudG8gY3JlYXRlQ2hpbGQoU3RyaW5nIHR5cGUpOwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY2hpbGQgb2YgdGhpcyBtZW1lbnRvIHdpdGggdGhlIGdpdmVuIHR5cGUgYW5kIGlkLgotCSAqIFRoZSBpZCBpcyBzdG9yZWQgaW4gdGhlIGNoaWxkIG1lbWVudG8gKHVzaW5nIGEgc3BlY2lhbCByZXNlcnZlZAotCSAqIGtleSwgPGNvZGU+VEFHX0lEPC9jb2RlPikgYW5kIGNhbiBiZSByZXRyaWV2ZWQgdXNpbmcgPGNvZGU+Z2V0SWQ8L2NvZGU+LgotCSAqIDxwPgotCSAqIFRoZSA8Y29kZT5nZXRDaGlsZDwvY29kZT4gYW5kIDxjb2RlPmdldENoaWxkcmVuPC9jb2RlPiBtZXRob2RzCi0JICogYXJlIHVzZWQgdG8gcmV0cmlldmUgY2hpbGRyZW4gb2YgYSBnaXZlbiB0eXBlLgotCSAqIDwvcD4KLQkgKgotCSAqIEBwYXJhbSB0eXBlIHRoZSB0eXBlCi0JICogQHBhcmFtIGlkIHRoZSBjaGlsZCBpZAotCSAqIEByZXR1cm4gYSBuZXcgY2hpbGQgbWVtZW50byB3aXRoIHRoZSBnaXZlbiB0eXBlIGFuZCBpZAotCSAqIEBzZWUgI2dldElkCi0JICovCi0JcHVibGljIElNZW1lbnRvIGNyZWF0ZUNoaWxkKFN0cmluZyB0eXBlLCBTdHJpbmcgaWQpOwotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpcnN0IGNoaWxkIHdpdGggdGhlIGdpdmVuIHR5cGUgaWQuCi0JICoKLQkgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSBpZAotCSAqIEByZXR1cm4gdGhlIGZpcnN0IGNoaWxkIHdpdGggdGhlIGdpdmVuIHR5cGUKLQkgKi8KLQlwdWJsaWMgSU1lbWVudG8gZ2V0Q2hpbGQoU3RyaW5nIHR5cGUpOwotCQotCS8qKgotCSAqIFJldHVybnMgYWxsIGNoaWxkcmVuIHdpdGggdGhlIGdpdmVuIHR5cGUgaWQuCi0JICoKLQkgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSBpZAotCSAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgY2hpbGRyZW4gd2l0aCB0aGUgZ2l2ZW4gdHlwZQotCSAqLwotCXB1YmxpYyBJTWVtZW50b1tdIGdldENoaWxkcmVuKFN0cmluZyB0eXBlKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmbG9hdGluZyBwb2ludCB2YWx1ZSBvZiB0aGUgZ2l2ZW4ga2V5LgotCSAqCi0JICogQHBhcmFtIGtleSB0aGUga2V5Ci0JICogQHJldHVybiB0aGUgdmFsdWUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBrZXkgd2FzIG5vdCBmb3VuZCBvciB3YXMgZm91bmQKLQkgKiAgIGJ1dCB3YXMgbm90IGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyCi0JICovCi0JcHVibGljIEZsb2F0IGdldEZsb2F0KFN0cmluZyBrZXkpOwotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGlkIGZvciB0aGlzIG1lbWVudG8uCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBtZW1lbnRvIGlkLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICogQHNlZSAjY3JlYXRlQ2hpbGQoamF2YS5sYW5nLlN0cmluZyxqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuYW1lIGZvciB0aGlzIG1lbWVudG8uCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBtZW1lbnRvIG5hbWUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLQkgKiBAc2VlICNjcmVhdGVDaGlsZChqYXZhLmxhbmcuU3RyaW5nLGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbnRlZ2VyIHZhbHVlIG9mIHRoZSBnaXZlbiBrZXkuCi0JICoKLQkgKiBAcGFyYW0ga2V5IHRoZSBrZXkKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGtleSB3YXMgbm90IGZvdW5kIG9yIHdhcyBmb3VuZAotCSAqICAgYnV0IHdhcyBub3QgYW4gaW50ZWdlcgotCSAqLwotCXB1YmxpYyBJbnRlZ2VyIGdldEludGVnZXIoU3RyaW5nIGtleSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdHJpbmcgdmFsdWUgb2YgdGhlIGdpdmVuIGtleS4KLQkgKgotCSAqIEBwYXJhbSBrZXkgdGhlIGtleQotCSAqIEByZXR1cm4gdGhlIHZhbHVlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUga2V5IHdhcyBub3QgZm91bmQgb3Igd2FzIGZvdW5kCi0JICogIGJ1dCB3YXMgbm90IGFuIGludGVnZXIKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGJvb2xlYW4gdmFsdWUgb2YgdGhlIGdpdmVuIGtleS4KLQkgKgotCSAqIEBwYXJhbSBrZXkgdGhlIGtleQotCSAqIEByZXR1cm4gdGhlIHZhbHVlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUga2V5IHdhcyBub3QgZm91bmQgb3Igd2FzIGZvdW5kCi0JICogIGJ1dCB3YXMgbm90IGEgYm9vbGVhbgotCSAqLwotCXB1YmxpYyBCb29sZWFuIGdldEJvb2xlYW4oU3RyaW5nIGtleSk7Ci0JCi0JcHVibGljIExpc3QgZ2V0TmFtZXMoKTsKLQkKLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4ga2V5IHRvIHRoZSBnaXZlbiBmbG9hdGluZyBwb2ludCBudW1iZXIuCi0JICoKLQkgKiBAcGFyYW0ga2V5IHRoZSBrZXkKLQkgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlCi0JICovCi0JcHVibGljIHZvaWQgcHV0RmxvYXQoU3RyaW5nIGtleSwgZmxvYXQgdmFsdWUpOwotCQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBrZXkgdG8gdGhlIGdpdmVuIGludGVnZXIuCi0JICoKLQkgKiBAcGFyYW0ga2V5IHRoZSBrZXkKLQkgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlCi0JICovCi0JcHVibGljIHZvaWQgcHV0SW50ZWdlcihTdHJpbmcga2V5LCBpbnQgdmFsdWUpOwotCQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBrZXkgdG8gdGhlIGdpdmVuIGJvb2xlYW4gdmFsdWUuCi0JICoKLQkgKiBAcGFyYW0ga2V5IHRoZSBrZXkKLQkgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlCi0JICovCi0JcHVibGljIHZvaWQgcHV0Qm9vbGVhbihTdHJpbmcga2V5LCBib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIENvcHkgdGhlIGF0dHJpYnV0ZXMgYW5kIGNoaWxkcmVuIGZyb20gIDxjb2RlPm1lbWVudG88L2NvZGU+Ci0JICogdG8gdGhlIHJlY2VpdmVyLgotCSAqCi0JICogQHBhcmFtIG1lbWVudG8gdGhlIElNZW1lbnRvIHRvIGJlIGNvcGllZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBwdXRNZW1lbnRvKElNZW1lbnRvIG1lbWVudG8pOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIGtleSB0byB0aGUgZ2l2ZW4gc3RyaW5nLgotCSAqCi0JICogQHBhcmFtIGtleSB0aGUga2V5Ci0JICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZQotCSAqLwotCXB1YmxpYyB2b2lkIHB1dFN0cmluZyhTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL0lNb2R1bGVMaXN0ZW5lci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvSU1vZHVsZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkMDMyOTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvSU1vZHVsZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU1vZHVsZUxpc3RlbmVyIHsKLQkvKioKLQkgKiBBIG1vZHVsZSBoYXMgYmVlbiBjaGFuZ2VkIGFzIHNwZWNpZmllZCBpbiB0aGUgZXZlbnQuCi0JICoKLQkgKiBAcGFyYW0gZXZlbnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLk1vZHVsZUV2ZW50Ci0JICovCi0JcHVibGljIHZvaWQgbW9kdWxlQ2hhbmdlZChNb2R1bGVFdmVudCBldmVudCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvSU1vZHVsZVB1Ymxpc2hIZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL0lNb2R1bGVQdWJsaXNoSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhNmRmYWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvSU1vZHVsZVB1Ymxpc2hIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotLyoqCi0gKiBUZW1wb3JhcnkgaW50ZXJmYWNlIHRvIGhlbHAgdGhlIHdlYiBzZXJ2aWNlcyB0ZWFtLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNb2R1bGVQdWJsaXNoSGVscGVyIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYXRoIHRoYXQgdGhlIG1vZHVsZSBpcyBwdWJsaXNoZWQgdG8sIG9yIG51bGwgaWYgdGhlIG1vZHVsZSBpcyBub3QKLQkgKiBwdWJsaXNoZWQgdG8gdGhlIHNlcnZlciBvciB0aGUgbG9jYXRpb24gaXMgdW5rbm93bi4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kdWxlIGEgbW9kdWxlIG9uIHRoZSBzZXJ2ZXIgCi0JICogQHJldHVybiB0aGUgcGF0aCB0aGF0IHRoZSBtb2R1bGUgaXMgcHVibGlzaGVkIHRvLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3QKLQkgKiAgIGEgdmFsaWQgbW9kdWxlIG9yIHRoZSBsb2NhdGlvbiBpcyB1bmtub3duCi0JICovCi0JcHVibGljIElQYXRoIGdldFB1Ymxpc2hEaXJlY3RvcnkoSU1vZHVsZVtdIG1vZHVsZSk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9JTW9kdWxlUmVzb3VyY2VEZWx0YVZpc2l0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL0lNb2R1bGVSZXNvdXJjZURlbHRhVmlzaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWU3MzI1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL0lNb2R1bGVSZXNvdXJjZURlbHRhVmlzaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSU1vZHVsZVJlc291cmNlRGVsdGE7Ci0vKioKLSAqIEFuIG9iamVjdHMgdGhhdCB2aXNpdHMgbW9kdWxlIHJlc291cmNlIGRlbHRhcy4KLSAqIDxwPiAKLSAqIFVzYWdlOgotICogPHByZT4KLSAqIGNsYXNzIFZpc2l0b3IgaW1wbGVtZW50cyBJTW9kdWxlUmVzb3VyY2VEZWx0YVZpc2l0b3IgewotICogICAgIHB1YmxpYyBib29sZWFuIHZpc2l0KElNb2R1bGVSZXNvdXJjZURlbHRhIGRlbHRhKSB7Ci0gKiAgICAgICBzd2l0Y2ggKGRlbHRhLmdldEtpbmQoKSkgewotICogICAgICAgICBjYXNlIElNb2R1bGVSZXNvdXJjZURlbHRhLkFEREVEIDoKLSAqICAgICAgICAgICAgIC8vIGhhbmRsZSBhZGRlZCByZXNvdXJjZQotICogICAgICAgICAgICAgYnJlYWs7Ci0gKiAgICAgICAgIGNhc2UgSU1vZHVsZVJlc291cmNlRGVsdGEuUkVNT1ZFRCA6Ci0gKiAgICAgICAgICAgICAvLyBoYW5kbGUgcmVtb3ZlZCByZXNvdXJjZQotICogICAgICAgICAgICAgYnJlYWs7Ci0gKiAgICAgICAgIGNhc2UgSU1vZHVsZVJlc291cmNlRGVsdGEuQ0hBTkdFRCA6Ci0gKiAgICAgICAgICAgICAvLyBoYW5kbGUgY2hhbmdlZCByZXNvdXJjZQotICogICAgICAgICAgICAgYnJlYWs7Ci0gKiAgICAgICAgIH0KLSAqICAgICAgIHJldHVybiB0cnVlOwotICogICAgIH0KLSAqIH0KLSAqIElNb2R1bGVSZXNvdXJjZURlbHRhIHJvb3REZWx0YSA9IC4uLjsKLSAqIHJvb3REZWx0YS5hY2NlcHQobmV3IFZpc2l0b3IoKSk7Ci0gKiA8L3ByZT4KLSAqIDwvcD4KLSAqIDxwPgotICogQ2xpZW50cyBtYXkgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLgotICogPC9wPgotICoKLSAqIFtpc3N1ZTogQHNlZSBJTW9kdWxlUmVzb3VyY2VEZWx0YSNhY2NlcHQoSU1vZHVsZVJlc291cmNlVmlzaXRvcildCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU1vZHVsZVJlc291cmNlRGVsdGFWaXNpdG9yIHsKLQkvKiogCi0JICogVmlzaXRzIHRoZSBnaXZlbiBtb2R1bGUgcmVzb3VyY2UgZGVsdGEuCi0JICogCi0JICogQHBhcmFtIGRlbHRhIHRoZSByZXNvdXJjZSBkZWx0YQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHJlc291cmNlIGRlbHRhJ3MgY2hpbGRyZW4gc2hvdWxkCi0JICoJCWJlIHZpc2l0ZWQ7IDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGV5IHNob3VsZCBiZSBza2lwcGVkLgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiB0aGUgdmlzaXQgZmFpbHMgZm9yIHNvbWUgcmVhc29uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KElNb2R1bGVSZXNvdXJjZURlbHRhIGRlbHRhKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9JTW9kdWxlVmlzaXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvSU1vZHVsZVZpc2l0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBlMzYyYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9JTW9kdWxlVmlzaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKLS8qKgotICogQSB2aXNpdG9yIG9uIGEgc2VydmVyJ3MgbW9kdWxlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBJTW9kdWxlVmlzaXRvciB7Ci0JLyoqCi0JICogVmlzaXQgYSBzaW5nbGUgbW9kdWxlLiBSZXR1cm5zIHRydWUgdG8ga2VlcCB2aXNpdGluZywgYW5kCi0JICogZmFsc2UgaWYgaXQgc2hvdWxkIHN0b3AgdmlzaXRpbmcgdGhlIG1vZHVsZS4gCi0JICogCi0JICogQHBhcmFtIG1vZHVsZSBhIG1vZHVsZSBvbiB0aGUgc2VydmVyCi0JICogQHJldHVybiBib29sZWFuIDxjb2RlPnRydWU8L2NvZGU+IHRvIHZpc2l0IHRoZSBuZXh0IG1vZHVsZSwgb3IKLQkgKiAgICA8Y29kZT5mYWxzZTwvY29kZT4gdG8gc3RvcCB2aXNpdGluZwotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KElNb2R1bGVbXSBtb2R1bGUpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL0lNb25pdG9yZWRTZXJ2ZXJQb3J0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9JTW9uaXRvcmVkU2VydmVyUG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OWFlMjNiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL0lNb25pdG9yZWRTZXJ2ZXJQb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJQb3J0OwotCi0vKioKLSAqIEFuIG1vbml0b3JlZCBwb3J0IG9uIGEgc2VydmVyLgotICogCi0gKiA8cD5UaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy48L3A+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU1vbml0b3JlZFNlcnZlclBvcnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHNlcnZlciB0aGF0IGl0IGJlaW5nIG1vbml0b3JlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyCi0JICovCi0JcHVibGljIElTZXJ2ZXIgZ2V0U2VydmVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZXJ2ZXIgcG9ydC4KLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIubW9kZWwuSVNlcnZlclBvcnQKLQkgKi8KLQlwdWJsaWMgU2VydmVyUG9ydCBnZXRTZXJ2ZXJQb3J0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHBvcnQgdGhhdCBpcyBiZWluZyB1c2VkIHRvIG1vbml0b3IuCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldE1vbml0b3JQb3J0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb250ZW50IHR5cGVzIHRoYXQgYXJlIGJlaW5nIG1vbml0b3JlZCwgb3IgbnVsbCBmb3IgYWxsIGNvbnRlbnQuCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nW10KLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0Q29udGVudFR5cGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIG1vbml0b3IgaXMgY3VycmVudGx5IHJ1bm5pbmcvYWN0aXZlLgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU3RhcnRlZCgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL0lPcmRlcmVkLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9JT3JkZXJlZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMGYzMDA3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL0lPcmRlcmVkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKLS8qKgotICogQW4gb2JqZWN0IHRoYXQgaGFzIGFuIGFic29sdXRlIG9yZGVyaW5nLCBhbmQgY2FuIGJlIG9yZGVyZWQgYWdhaW5zdCBvdGhlciBvYmplY3RzLgotICogCi0gKiA8cD4KLSAqIFtpc3N1ZTogSXQgaXMgbm90b3Jpb3VzbHkgZGlmZmljdWx0IHRvIHBsYWNlIGFueSBraW5kIG9mCi0gKiB1c2VmdWwgb3JkZXIgb24gb2JqZWN0cyB0aGF0IGFyZSBjb250cmlidXRlZCBpbmRlcGVuZGVudGx5IGJ5Ci0gKiBub24tY29sbGFib3JhdGluZyBwYXJ0aWVzLiBUaGUgSU9yZGVyZWQgbWVjaGFuaXNtIGlzIHdlYWssIGFuZAotICogY2FuJ3QgcmVhbGx5IHNvbHZlIHRoZSBwcm9ibGVtLiBJc3N1ZXMgb2YgcHJlc2VudGF0aW9uIGFyZSB1c3VhbGx5Ci0gKiBiZXN0IGxlZnQgdG8gdGhlIFVJLCB3aGljaCBjYW4gc29ydCBvYmplY3RzIGJhc2VkIG9uIGFyYml0cmFyeQotICogcHJvcGVydGllcy5dCi0gKiA8L3A+Ci0gKiAKLSAqIDxwPlRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLjwvcD4KLSAqLwotcHVibGljIGludGVyZmFjZSBJT3JkZXJlZCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgb3JkZXIgKGluZGV4L3ByaW9yaXR5KS4KLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0T3JkZXIoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9JUHVibGlzaFRhc2suamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL0lQdWJsaXNoVGFzay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDkxNWUzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL0lQdWJsaXNoVGFzay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuUHVibGlzaE9wZXJhdGlvbjsKLS8qKgotICogQSB0YXNrIGZvciBhIHNlcnZlci4KLSAqIAotICogPHA+VGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuPC9wPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQdWJsaXNoVGFzayB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgaWQgb2YgdGhlIGFkYXB0ZXIuCi0JICoKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIHR5cGUgKGdpdmVuIGJ5IHRoZSBpZCkgY2FuIHVzZSB0aGlzIHRhc2suIFRoaXMKLQkgKiByZXN1bHQgaXMgYmFzZWQgb24gdGhlIHJlc3VsdCBvZiB0aGUgZ2V0VHlwZUlkcygpIG1ldGhvZC4KLQkgKiAKLQkgKiBAcGFyYW0gaWQgYSBzZXJ2ZXIgdHlwZSBpZAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzVHlwZShTdHJpbmcgaWQpOwotCi0JLyoqCi0JICogTGV0cyB0aGUgdGFzayBrbm93IHRoYXQgaXQgaXMgYWJvdXQgdG8gYmUgdXNlZC4gVGhpcyBtZXRob2Qgc2hvdWxkCi0JICogYmUgdXNlZCB0byBjbGVhbiBvdXQgYW55IHByZXZpb3VzbHkgY2FjaGVkIGluZm9ybWF0aW9uLCBvciBzdGFydCB0bwotCSAqIGNyZWF0ZSBhIG5ldyBjYWNoZS4KLQkgKiAKLQkgKiBAcGFyYW0gc2VydmVyIHRoZSBzZXJ2ZXIKLQkgKiBAcGFyYW0gbW9kdWxlcyBhIGxpc3QgY29udGFpbmluZyBJTW9kdWxlIGFycmF5cwotCSAqIEByZXR1cm4gYSBwb3NzaWJseSBlbXB0eSBhcnJheSBvZiBvcHRpb25hbCB0YXNrcyAKLQkgKi8KLQlwdWJsaWMgUHVibGlzaE9wZXJhdGlvbltdIGdldFRhc2tzKElTZXJ2ZXIgc2VydmVyLCBMaXN0IG1vZHVsZXMpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGFza3MgdGhhdCBzaG91bGQgYmUgcGVyZm9ybWVkIGR1cmluZyBwdWJsaXNoaW5nLgotCSAqIAotCSAqIEBwYXJhbSBzZXJ2ZXIgdGhlIHNlcnZlcgotCSAqIEBwYXJhbSBtb2R1bGVzIGEgbGlzdCBjb250YWluaW5nIElNb2R1bGUgYXJyYXlzCi0JICogQHBhcmFtIGtpbmQgb25lIG9mIHRoZSBJU2VydmVyLlBVQkxJU0hfWFggY29uc3RhbnRzCi0JICogQHBhcmFtIGtpbmRMaXN0IG9uZSBvZiB0aGUgSVNlcnZlciBwdWJsaXNoIGNoYW5nZSBjb25zdGFudHMKLQkgKiBAcmV0dXJuIHRoZSB0YXNrcyB0aGF0IHNob3VsZCBiZSBwZXJmb3JtZWQgb24gdGhlIHNlcnZlcgotCSAqLwotCXB1YmxpYyBQdWJsaXNoT3BlcmF0aW9uW10gZ2V0VGFza3MoSVNlcnZlciBzZXJ2ZXIsIGludCBraW5kLCBMaXN0IG1vZHVsZXMsIExpc3Qga2luZExpc3QpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL0lSdW50aW1lTG9jYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvSVJ1bnRpbWVMb2NhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1YmY5ZWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvSVJ1bnRpbWVMb2NhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWVXb3JraW5nQ29weTsKLS8qKgotICogQSBydW50aW1lIGxvY2F0b3IgcHJvdmlkZXMgdGhlIGFiaWxpdHkgdG8gbG9jYXRlIG9yIHNlYXJjaCBmb3IgYWRkaXRpb25hbAotICogcnVudGltZXMgb2YgYSBwYXJ0aWN1bGFyIHR5cGUuCi0gKiA8cD4KLSAqIFJ1bnRpbWUgbG9jYXRvcnMgYXJlIGZvdW5kIHZpYSBTZXJ2ZXJDb3JlLmdldFJ1bnRpbWVMb2NhdG9ycygpLgotICogPC9wPgotICogCi0gKiA8cD5UaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy48L3A+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVJ1bnRpbWVMb2NhdG9yIHsKLQkvKioKLQkgKiBBIGNhbGxiYWNrIGxpc3RlbmVyIGludGVyZmFjZS4KLQkgKi8KLQlwdWJsaWMgaW50ZXJmYWNlIElSdW50aW1lU2VhcmNoTGlzdGVuZXIgewotCQkvKioKLQkJICogQ2FsbGVkIHdoZW4gYSBuZXcgcnVudGltZSBpcyBmb3VuZCBieSB0aGUgbG9jYXRvci4KLQkJICogVGhlIHJ1bnRpbWUgbXVzdCBuZXZlciBiZSBudWxsLgotCQkgKiAKLQkJICogQHBhcmFtIHJ1bnRpbWUgdGhlIHJ1bnRpbWUgdGhhdCB3YXMgZm91bmQuCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBydW50aW1lRm91bmQoSVJ1bnRpbWVXb3JraW5nQ29weSBydW50aW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpZCBvZiB0aGlzIHJ1bnRpbWUgbG9jYXRvci4KLQkgKiBFYWNoIGtub3duIHJ1bnRpbWUgbG9jYXRvciBoYXMgYSBkaXN0aW5jdCBpZC4gCi0JICogSWRzIGFyZSBpbnRlbmRlZCB0byBiZSB1c2VkIGludGVybmFsbHkgYXMga2V5czsgdGhleSBhcmUgbm90Ci0JICogaW50ZW5kZWQgdG8gYmUgc2hvd24gdG8gZW5kIHVzZXJzLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHJ1bnRpbWUgbG9jYXRvciBpZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcnVudGltZSBsb2NhdG9yIGNhbiBmaW5kIHJ1bnRpbWVzIG9mIHRoZSBnaXZlbiB0eXBlLgotCSAqIFRoZSBpZCBzaG91bGQgbmV2ZXIgYmUgbnVsbC4KLQkgKiAKLQkgKiBAcGFyYW0gcnVudGltZVR5cGVJZCB0aGUgaWQgb2YgYSBydW50aW1lIHR5cGUKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1R5cGUoU3RyaW5nIHJ1bnRpbWVUeXBlSWQpOwotCi0JLyoqCi0JICogU2VhcmNoZXMgZm9yIGxvY2FsIHJ1bnRpbWVzLgotCSAqIEl0IHVzZXMgdGhlIGNhbGxiYWNrIGxpc3RlbmVyIHRvIHJlcG9ydCBydW50aW1lcyB0aGF0IGFyZSBmb3VuZC4KLQkgKiBUaGUgcGF0aCBjb250YWlucyB0aGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgZm9sZGVyIHRvIHNlYXJjaCBpbiwKLQkgKiBvciA8Y29kZT5udWxsPC9jb2RlPiB0byBzZWFyY2ggdGhlIGVudGlyZSBtYWNoaW5lLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoIHRvIHNlYXJjaCBmb3IgcnVudGltZXMgaW4KLQkgKiBAcGFyYW0gbGlzdGVuZXIgYSBsaXN0ZW5lciB0byByZXBvcnQgc3RhdHVzIHRvCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNlYXJjaEZvclJ1bnRpbWVzKElQYXRoIHBhdGgsIElSdW50aW1lU2VhcmNoTGlzdGVuZXIgbGlzdGVuZXIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb247Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvSVNlcnZlckxvY2F0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL0lTZXJ2ZXJMb2NhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0MmNhZmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvSVNlcnZlckxvY2F0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJXb3JraW5nQ29weTsKLS8qKgotICogQSBzZXJ2ZXIgbG9jYXRvciBwcm92aWRlcyB0aGUgYWJpbGl0eSB0byBsb2NhdGUgb3Igc2VhcmNoIGZvciBhZGRpdGlvbmFsCi0gKiBzZXJ2ZXJzIG9mIGEgcGFydGljdWxhciB0eXBlLCBvbiBhIHBhcnRpY3VsYXIgaG9zdC4KLSAqIDxwPgotICogU2VydmVyIGxvY2F0b3JzIGFyZSBmb3VuZCB2aWEgU2VydmVyQ29yZS5nZXRTZXJ2ZXJMb2NhdG9ycygpLgotICogPC9wPgotICogCi0gKiA8cD5UaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy48L3A+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVNlcnZlckxvY2F0b3IgewotCS8qKgotCSAqIEEgY2FsbGJhY2sgbGlzdGVuZXIgaW50ZXJmYWNlLgotCSAqLwotCXB1YmxpYyBpbnRlcmZhY2UgSVNlcnZlclNlYXJjaExpc3RlbmVyIHsKLQkJLyoqCi0JCSAqIENhbGxlZCB3aGVuIGEgbmV3IHNlcnZlciBpcyBmb3VuZCBieSB0aGUgbG9jYXRvci4KLQkJICogVGhlIHNlcnZlciBtdXN0IG5ldmVyIGJlIG51bGwuCi0JCSAqIAotCQkgKiBAcGFyYW0gc2VydmVyIHRoZSBydW50aW1lIHRoYXQgd2FzIGZvdW5kLgotCQkgKi8KLQkJcHVibGljIHZvaWQgc2VydmVyRm91bmQoSVNlcnZlcldvcmtpbmdDb3B5IHNlcnZlcik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaWQgb2YgdGhpcyBzZXJ2ZXIgbG9jYXRvci4KLQkgKiBFYWNoIGtub3duIHNlcnZlciBsb2NhdG9yIGhhcyBhIGRpc3RpbmN0IGlkLiAKLQkgKiBJZHMgYXJlIGludGVuZGVkIHRvIGJlIHVzZWQgaW50ZXJuYWxseSBhcyBrZXlzOyB0aGV5IGFyZSBub3QKLQkgKiBpbnRlbmRlZCB0byBiZSBzaG93biB0byBlbmQgdXNlcnMuCi0JICogCi0JICogQHJldHVybiB0aGUgc2VydmVyIGxvY2F0b3IgaWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNlcnZlciBsb2NhdG9yIGNhbiBmaW5kIHNlcnZlcnMgb2YgdGhlIGdpdmVuIHR5cGUuCi0JICogVGhlIGlkIHNob3VsZCBuZXZlciBiZSBudWxsLgotCSAqIAotCSAqIEBwYXJhbSBzZXJ2ZXJUeXBlSWQgdGhlIGlkIG9mIGEgc2VydmVyIHR5cGUKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1R5cGUoU3RyaW5nIHNlcnZlclR5cGVJZCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIHR5cGUgb2Ygc2VydmVyIGNhbiBydW4gb24gYSByZW1vdGUgaG9zdC4KLQkgKiBSZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGUgc2VydmVyIHR5cGUgY2FuIG9ubHkgYmUgcnVuIG9uICJsb2NhbGhvc3QiCi0JICogKHRoZSBsb2NhbCBtYWNoaW5lKS4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgdHlwZSBvZiBzZXJ2ZXIgY2FuIHJ1biBvbgotCSAqICAgIGEgcmVtb3RlIGhvc3QsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgaXQgY2Fubm90Ci0JICovCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHNSZW1vdGVIb3N0cygpOwotCi0JLyoqCi0JICogU2VhcmNoZXMgZm9yIHNlcnZlcnMuIAotCSAqIEl0IHVzZXMgdGhlIGNhbGxiYWNrIGxpc3RlbmVyIHRvIHJlcG9ydCBzZXJ2ZXJzIHRoYXQgYXJlIGZvdW5kLgotCSAqIAotCSAqIEBwYXJhbSBob3N0IGEgaG9zdCBzdHJpbmcgY29uZm9ybWluZyB0byBSRkMgMjczMgotCSAqIEBwYXJhbSBsaXN0ZW5lciBhIGxpc3RlbmVyIHRvIHJlcG9ydCBzdGF0dXMgdG8KLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCi0JICogICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2VhcmNoRm9yU2VydmVycyhTdHJpbmcgaG9zdCwgSVNlcnZlclNlYXJjaExpc3RlbmVyIGxpc3RlbmVyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL0lTZXJ2ZXJNb25pdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9JU2VydmVyTW9uaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODBkMTg2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL0lTZXJ2ZXJNb25pdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKLS8qKgotICogQW4gaW50ZXJmYWNlIHRvIGEgVENQL0lQIG1vbml0b3IuCi0gKiAKLSAqIDxwPlRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLjwvcD4KLSAqLwotcHVibGljIGludGVyZmFjZSBJU2VydmVyTW9uaXRvciB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgaWQgb2YgdGhlIG1vbml0b3IuCi0JICoKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsYWJlbCAobmFtZSkgb2YgdGhpcyBtb25pdG9yLgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGVzY3JpcHRpb24gb2YgdGhpcyBtb25pdG9yLgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFN0YXJ0IG1vbml0b3JpbmcgdGhlIGdpdmVuIHBvcnQsIGFuZCByZXR1cm4gdGhlIHBvcnQgbnVtYmVyIHRvCi0JICogdHVubmVsIHJlcXVlc3RzIHRocm91Z2guIFRoZSBtb25pdG9yUG9ydCBpcyB0aGUgbmV3IHBvcnQgdG8gdXNlLCBvcgotCSAqIC0xIHRvIHBpY2sgYSByYW5kb20gcG9ydC4KLQkgKiAKLQkgKiBAcGFyYW0gcG9ydAotCSAqIEByZXR1cm4KLQkgKi8KLQkvL3B1YmxpYyBpbnQgc3RhcnRNb25pdG9yaW5nKElTZXJ2ZXIgc2VydmVyLCBTZXJ2ZXJQb3J0IHBvcnQsIGludCBtb25pdG9yUG9ydCkgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBTdG9wIG1vbml0b3JpbmcgdGhlIGdpdmVuIHBvcnQuCi0JICogCi0JICogQHBhcmFtIHBvcnQKLQkgKi8KLQkvL3B1YmxpYyB2b2lkIHN0b3BNb25pdG9yaW5nKElTZXJ2ZXIgc2VydmVyLCBTZXJ2ZXJQb3J0IHBvcnQpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL0lTZXJ2ZXJNb25pdG9yTWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvSVNlcnZlck1vbml0b3JNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkMWZhZjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvSVNlcnZlck1vbml0b3JNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJQb3J0OwotLyoqCi0gKiAKLSAqIDxwPlRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLjwvcD4KLSAqLwotcHVibGljIGludGVyZmFjZSBJU2VydmVyTW9uaXRvck1hbmFnZXIgewotCS8qKgotCSAqIFJldHVybnMgdGhlIGFycmF5IG9mIHBvcnRzIHRoYXQgYXJlIGN1cnJlbnRseSBiZWluZyBtb25pdG9yZWQuCi0JICoKLQkgKiBAcGFyYW0gc2VydmVyIGEgc2VydmVyCi0JICogQHJldHVybiBhbiBhcnJheSBjb250YWluaW5nIHRoZSBtb25pdG9yZWQgcG9ydHMgZm9yIHRoaXMgc2VydmVyCi0JICovCi0JcHVibGljIElNb25pdG9yZWRTZXJ2ZXJQb3J0W10gZ2V0TW9uaXRvcmVkUG9ydHMoSVNlcnZlciBzZXJ2ZXIpOwotCi0JLyoqCi0JICogU3RhcnRzIG1vbml0b3JpbmcgdGhlIGdpdmVuIHBvcnQsIGFuZCByZXR1cm5zIHRoZSBuZXcgcG9ydCAjIHRvIHVzZSB0aGF0IHdpbGwKLQkgKiByb3V0ZSB0byB0aGUgbW9uaXRvcmVkIHBvcnQuCi0JICogCi0JICogQHBhcmFtIHNlcnZlcgotCSAqIEBwYXJhbSBwb3J0Ci0JICogQHBhcmFtIG1vbml0b3JQb3J0IC0gdGhlIG5ldyBwb3J0IG51bWJlciB0byB1c2UgZm9yIG1vbml0b3JpbmcsIG9yIC0xIHRvIHBpY2sgYSBuZXcgcG9ydAotCSAqIEBwYXJhbSBjb250ZW50Ci0JICogQHJldHVybiBtb25pdG9yIHBvcnQgbnVtYmVyCi0JICovCi0JcHVibGljIElNb25pdG9yZWRTZXJ2ZXJQb3J0IGNyZWF0ZU1vbml0b3IoSVNlcnZlciBzZXJ2ZXIsIFNlcnZlclBvcnQgcG9ydCwgaW50IG1vbml0b3JQb3J0LCBTdHJpbmdbXSBjb250ZW50KTsKLQotCS8qKgotCSAqIFN0b3AgbW9uaXRvcmluZyB0aGUgZ2l2ZW4gcG9ydC4gVGhyb3dzIGEgQ29yZUV4Y2VwdGlvbiBpZiB0aGVyZSB3YXMgYSBwcm9ibGVtCi0JICogc3RvcHBpbmcgdGhlIG1vbml0b3JpbmcKLQkgKgotCSAqIEBwYXJhbSBtc3AgdGhlIG1vbml0b3JlZCBwb3J0Ci0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTW9uaXRvcihJTW9uaXRvcmVkU2VydmVyUG9ydCBtc3ApOwotCi0JLyoqCi0JICogU3RhcnQgdGhlIG1vbml0b3IuIElmIHRoZSBtc3AgcG9ydCBpcyAtMSwgaXQgd2lsbCBiZSB1cGRhdGVkIHRvIHRoZSBwb3J0IHRoYXQgaXMgYWN0dWFsbHkgaW4gdXNlLgotCSAqIAotCSAqIEBwYXJhbSBtc3AgdGhlIG1vbml0b3JlZCBwb3J0IAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0TW9uaXRvcihJTW9uaXRvcmVkU2VydmVyUG9ydCBtc3ApIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogU3RvcCBtb25pdG9yaW5nLgotCSAqIAotCSAqIEBwYXJhbSBtc3AgdGhlIG1vbml0b3JlZCBwb3J0Ci0JICovCi0JcHVibGljIHZvaWQgc3RvcE1vbml0b3IoSU1vbml0b3JlZFNlcnZlclBvcnQgbXNwKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1vbml0b3JlZCBwb3J0IHRvIHVzZSB3aGVuIG1ha2luZyByZXF1ZXN0cyB0byB0aGUgZ2l2ZW4gc2VydmVyLCBwb3J0IG51bWJlciwKLQkgKiBhbmQgY29udGVudC4gUmV0dXJucyB0aGUgZXhpc3RpbmcgcG9ydCBudW1iZXIgaWYgdGhlIHBvcnQgaXMgbm90IGJlaW5nIG1vbml0b3JlZC4KLQkgKiAKLQkgKiBAcGFyYW0gc2VydmVyCi0JICogQHBhcmFtIHBvcnQKLQkgKiBAcGFyYW0gY29udGVudFR5cGUKLQkgKiBAcmV0dXJuIHRoZSBtb25pdG9yZWQgcG9ydCBudW1iZXIKLQkgKi8KLQlwdWJsaWMgaW50IGdldE1vbml0b3JlZFBvcnQoSVNlcnZlciBzZXJ2ZXIsIGludCBwb3J0LCBTdHJpbmcgY29udGVudFR5cGUpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL0lTdGFydHVwLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9JU3RhcnR1cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGRmMzI2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL0lTdGFydHVwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLaAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKLS8qKgotICogQW4gaW50ZXJmYWNlIGZvciB0aGUgc3RhcnR1cCBleHRlbnNpb24gcG9pbnQuCi0gKiBQbHVnLWlucyB0aGF0IHJlZ2lzdGVyIGEgc3RhcnR1cCBleHRlbnNpb24gd2lsbCBiZSBhY3RpdmF0ZWQgd2hlbiB0aGUgc2VydmVyCi0gKiBjb3JlIHBsdWctaW4gaW5pdGlhbGl6ZXMgYW5kIGhhdmUgYW4gb3Bwb3J0dW5pdHkgdG8gcnVuIGNvZGUgdGhhdCBjYW4ndCBiZQotICogaW1wbGVtZW50ZWQgdXNpbmcgdGhlIG5vcm1hbCBjb250cmlidXRpb24gbWVjaGFuaXNtcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBJU3RhcnR1cCB7Ci0JLyoqCi0JICogV2lsbCBiZSBjYWxsZWQgb24gc2VydmVyIGNvcmUgc3RhcnR1cC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydHVwKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvSW5zdGFsbGFibGVSdW50aW1lLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9JbnN0YWxsYWJsZVJ1bnRpbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQxYTc3YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9JbnN0YWxsYWJsZVJ1bnRpbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBJbnB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JU2l0ZVdpdGhNaXJyb3JzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklVUkxFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5TaXRlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuc3RhbmRhbG9uZS5JbnN0YWxsQ29tbWFuZDsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEluc3RhbGxhYmxlUnVudGltZSBpbXBsZW1lbnRzIElJbnN0YWxsYWJsZVJ1bnRpbWUgewotCXByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQ7Ci0KLQlwdWJsaWMgSW5zdGFsbGFibGVSdW50aW1lKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiB0aGUgaWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQl0cnkgewotCQkJcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJpZCIpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEZlYXR1cmVWZXJzaW9uKCkgewotCQl0cnkgewotCQkJcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJmZWF0dXJlVmVyc2lvbiIpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRGZWF0dXJlSWQoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImZlYXR1cmVJZCIpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRCdW5kbGVJZCgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZSgiYnVuZGxlSWQiKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UGF0aCgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZSgicGF0aCIpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRGcm9tU2l0ZSgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZSgiZmVhdHVyZVNpdGUiKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogQHNlZSBJSW5zdGFsbGFibGVSdW50aW1lI2luc3RhbGwoSVBhdGgpCi0JICovCi0JcHVibGljIHZvaWQgaW5zdGFsbChmaW5hbCBJUGF0aCBwYXRoKSB7Ci0JCUpvYiBpbnN0YWxsUnVudGltZUpvYiA9IG5ldyBKb2IoTWVzc2FnZXMuam9iSW5zdGFsbGluZ1J1bnRpbWUpIHsKLQkJCXB1YmxpYyBib29sZWFuIGJlbG9uZ3NUbyhPYmplY3QgZmFtaWx5KSB7Ci0JCQkJcmV0dXJuIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQuZXF1YWxzKGZhbWlseSk7Ci0JCQl9Ci0JCQkKLQkJCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQl0cnkgewotCQkJCQlpbnN0YWxsKHBhdGgsIG1vbml0b3IpOwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCQkJcmV0dXJuIGNlLmdldFN0YXR1cygpOwotCQkJCX0KLQkJCQkKLQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCX0KLQkJfTsKLQkJCi0JCWluc3RhbGxSdW50aW1lSm9iLnNjaGVkdWxlKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWlycm9yKFN0cmluZyBmcm9tU2l0ZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCS8vCSBpZiB0aGUgc2l0ZSBpcyBhIHNpdGUgY29udGFpbmluZyBtaXJyb3JzLCBzZXQgdGhlIGZyb21TaXRlIHRvIHRoZSBmaXJzdAotCQkvLyBtaXJyb3Igc2l0ZSBzaW5jZSBtYW55IG1pcnJvciBsaXN0IGdlbmVyYXRvcnMgd2lsbCBzb3J0IHRoZSBtaXJyb3JzIHRvIGNsb3Nlc3QKLQkJLy8gZ2VvZ3JhcGhpYyBsb2NhdGlvbgotCQlTdHJpbmcgbWlycm9yU2l0ZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlVUkwgc2l0ZVVSTCA9IG5ldyBVUkwoZnJvbVNpdGUpOwotCQkJSVNpdGUgc2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUoc2l0ZVVSTCwgbW9uaXRvcik7Ci0JCQlpZiAoc2l0ZSAhPSBudWxsICYmIHNpdGUgaW5zdGFuY2VvZiBJU2l0ZVdpdGhNaXJyb3JzKSB7Ci0JCQkJSVVSTEVudHJ5W10gdXJsRW50cmllcyA9ICgoSVNpdGVXaXRoTWlycm9ycykgc2l0ZSkuZ2V0TWlycm9yU2l0ZUVudHJpZXMoKTsKLQkJCQlpZiAodXJsRW50cmllcy5sZW5ndGggPiAwKQotCQkJCQltaXJyb3JTaXRlID0gdXJsRW50cmllc1swXS5nZXRVUkwoKS50b0V4dGVybmFsRm9ybSgpOwotCQkJfQotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIkNvdWxkIG5vdCBmaW5kIG1pcnJvciBzaXRlIiwgZSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIkNvdWxkIG5vdCBmaW5kIG1pcnJvciBzaXRlIiwgZSk7Ci0JCX0KLQkJCi0JCWlmIChtaXJyb3JTaXRlICE9IG51bGwpIAotCQkJcmV0dXJuIG1pcnJvclNpdGU7Ci0JCXJldHVybiBmcm9tU2l0ZTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSUluc3RhbGxhYmxlUnVudGltZSNpbnN0YWxsKElQYXRoLCBJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIGluc3RhbGwoSVBhdGggcGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBmZWF0dXJlSWQgPSBnZXRGZWF0dXJlSWQoKTsKLQkJU3RyaW5nIGZlYXR1cmVWZXJzaW9uID0gZ2V0RmVhdHVyZVZlcnNpb24oKTsKLQkJU3RyaW5nIGZyb21TaXRlID0gZ2V0RnJvbVNpdGUoKTsKLQkJCi0JCWlmIChmZWF0dXJlSWQgPT0gbnVsbCB8fCBmZWF0dXJlVmVyc2lvbiA9PSBudWxsIHx8IGZyb21TaXRlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQlmcm9tU2l0ZSA9IGdldE1pcnJvcihmcm9tU2l0ZSwgbW9uaXRvcik7Ci0JCQotCQkvLyBkb3dubG9hZCBhbmQgaW5zdGFsbCBwbHVnaW5zCi0JCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoZ2V0QnVuZGxlSWQoKSk7Ci0JCWlmIChidW5kbGUgPT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQltb25pdG9yLnNldFRhc2tOYW1lKCJJbnN0YWxsaW5nIGZlYXR1cmUiKTsKLQkJCQlJbnN0YWxsQ29tbWFuZCBjb21tYW5kID0gbmV3IEluc3RhbGxDb21tYW5kKGZlYXR1cmVJZCwgZmVhdHVyZVZlcnNpb24sIGZyb21TaXRlLCBudWxsLCAiZmFsc2UiKTsKLQkJCQljb21tYW5kLnJ1bihtb25pdG9yKTsKLQkJCQljb21tYW5kLmFwcGx5Q2hhbmdlc05vdygpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBpbnN0YWxsaW5nIGZlYXR1cmUiLCBlKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIHVuemlwIGZyb20gYnVuZGxlIGludG8gcGF0aAotCQl0cnkgewotCQkJYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzgxOTJdOwotCQkJYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKGdldEJ1bmRsZUlkKCkpOwotCQkJVVJMIHVybCA9IGJ1bmRsZS5nZXRFbnRyeShnZXRQYXRoKCkpOwotCQkJdXJsID0gUGxhdGZvcm0ucmVzb2x2ZSh1cmwpOwotCQkJSW5wdXRTdHJlYW0gaW4gPSB1cmwub3BlblN0cmVhbSgpOwotCQkJQnVmZmVyZWRJbnB1dFN0cmVhbSBiaW4gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShpbik7Ci0JCQlaaXBJbnB1dFN0cmVhbSB6aW4gPSBuZXcgWmlwSW5wdXRTdHJlYW0oYmluKTsKLQkJCVppcEVudHJ5IGVudHJ5ID0gemluLmdldE5leHRFbnRyeSgpOwotCQkJd2hpbGUgKGVudHJ5ICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgbmFtZSA9IGVudHJ5LmdldE5hbWUoKTsKLQkJCQltb25pdG9yLnNldFRhc2tOYW1lKCJVbnppcHBpbmc6ICIgKyBuYW1lKTsKLQkJCQkKLQkJCQlpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSkgewotCQkJCQlwYXRoLmFwcGVuZChuYW1lKS50b0ZpbGUoKS5ta2RpcnMoKTsKLQkJCQl9IGVsc2UgewotCQkJCQlGaWxlT3V0cHV0U3RyZWFtIGZvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShwYXRoLmFwcGVuZChuYW1lKS50b0ZpbGUoKSk7Ci0JCQkJCWludCByID0gemluLnJlYWQoYnVmKTsKLQkJCQkJd2hpbGUgKHIgPj0gMCkgewotCQkJCQkJZm91dC53cml0ZShidWYsIDAsIHIpOwotCQkJCQkJciA9IHppbi5yZWFkKGJ1Zik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJemluLmNsb3NlRW50cnkoKTsKLQkJCQllbnRyeSA9IHppbi5nZXROZXh0RW50cnkoKTsKLQkJCX0KLQkJCXppbi5jbG9zZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgaW5zdGFsbGluZyBmZWF0dXJlIiwgZSk7Ci0JCX0gCi0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJJbnN0YWxsYWJsZVJ1bnRpbWVbIiArIGdldElkKCkgKyAiXSI7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL0luc3RhbGxhYmxlU2VydmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9JbnN0YWxsYWJsZVNlcnZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzE2ZjZkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL0luc3RhbGxhYmxlU2VydmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5zdGFuZGFsb25lLkluc3RhbGxDb21tYW5kOwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEluc3RhbGxhYmxlU2VydmVyIGltcGxlbWVudHMgSUluc3RhbGxhYmxlU2VydmVyIHsKLQlwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50OwotCi0JcHVibGljIEluc3RhbGxhYmxlU2VydmVyKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiB0aGUgaWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQl0cnkgewotCQkJcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJpZCIpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBuYW1lCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQl0cnkgewotCQkJcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJuYW1lIik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGRlc2NyaXB0aW9uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZSgiZGVzY3JpcHRpb24iKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRWZW5kb3IoKSB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgdmVuZG9yID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoInZlbmRvciIpOwotCQkJaWYgKHZlbmRvciAhPSBudWxsKQotCQkJCXJldHVybiB2ZW5kb3I7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQlyZXR1cm4gTWVzc2FnZXMuZGVmYXVsdFZlbmRvcjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFZlcnNpb24oKSB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgdmVyc2lvbiA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ2ZXJzaW9uIik7Ci0JCQlpZiAodmVyc2lvbiAhPSBudWxsKQotCQkJCXJldHVybiB2ZXJzaW9uOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQkJcmV0dXJuIE1lc3NhZ2VzLmRlZmF1bHRWZXJzaW9uOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RmVhdHVyZVZlcnNpb24oKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImZlYXR1cmVWZXJzaW9uIik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEZlYXR1cmVJZCgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZSgiZmVhdHVyZUlkIik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEZyb21TaXRlKCkgewotCQl0cnkgewotCQkJcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJmZWF0dXJlU2l0ZSIpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElJbnN0YWxsYWJsZVNlcnZlciNpbnN0YWxsKElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgaW5zdGFsbChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGZlYXR1cmVJZCA9IGdldEZlYXR1cmVJZCgpOwotCQlTdHJpbmcgZmVhdHVyZVZlcnNpb24gPSBnZXRGZWF0dXJlVmVyc2lvbigpOwotCQlTdHJpbmcgZnJvbVNpdGUgPSBnZXRGcm9tU2l0ZSgpOwotCQkKLQkJaWYgKGZlYXR1cmVJZCA9PSBudWxsIHx8IGZlYXR1cmVWZXJzaW9uID09IG51bGwgfHwgZnJvbVNpdGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCWZyb21TaXRlID0gSW5zdGFsbGFibGVSdW50aW1lLmdldE1pcnJvcihmcm9tU2l0ZSwgbW9uaXRvcik7Ci0JCQotCQl0cnkgewotCQkJSW5zdGFsbENvbW1hbmQgY29tbWFuZCA9IG5ldyBJbnN0YWxsQ29tbWFuZChmZWF0dXJlSWQsIGZlYXR1cmVWZXJzaW9uLCBmcm9tU2l0ZSwgbnVsbCwgImZhbHNlIik7Ci0JCQljb21tYW5kLnJ1bihtb25pdG9yKTsKLQkJCS8vY29tbWFuZC5hcHBseUNoYW5nZXNOb3coKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGluc3RhbGxpbmcgZmVhdHVyZSIsIGUpOwotCQl9Ci0JCQotCQl0cnkgewotCQkJVGhyZWFkLnNsZWVwKDEwMDApOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIkluc3RhbGxhYmxlU2VydmVyWyIgKyBnZXRJZCgpICsgIiwgIiArIGdldE5hbWUoKSArICJdIjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvTGF1bmNoYWJsZUFkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL0xhdW5jaGFibGVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3ZTRlNTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvTGF1bmNoYWJsZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotoCogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLio7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgTGF1bmNoYWJsZUFkYXB0ZXIgaW1wbGVtZW50cyBJTGF1bmNoYWJsZUFkYXB0ZXIgewotCXByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQ7Ci0JcHJpdmF0ZSBMYXVuY2hhYmxlQWRhcHRlckRlbGVnYXRlIGRlbGVnYXRlOwotCi0JLyoqCi0JICogTGF1bmNoYWJsZUFkYXB0ZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCBhIGNvbmZpZ3VyYXRpb24gZWxlbWVudAotCSAqLwotCXB1YmxpYyBMYXVuY2hhYmxlQWRhcHRlcihJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcigpOwotCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGlkIG9mIHRoaXMgTGF1bmNoYWJsZUFkYXB0ZXIuCi0JICoKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImlkIik7Ci0JfQotCi0JcHVibGljIExhdW5jaGFibGVBZGFwdGVyRGVsZWdhdGUgZ2V0RGVsZWdhdGUoKSB7Ci0JCWlmIChkZWxlZ2F0ZSA9PSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWRlbGVnYXRlID0gKExhdW5jaGFibGVBZGFwdGVyRGVsZWdhdGUpIGVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsKLQkJCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IGNyZWF0ZSBkZWxlZ2F0ZSIgKyB0b1N0cmluZygpICsgIjogIiArIHQuZ2V0TWVzc2FnZSgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZGVsZWdhdGU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJTGF1bmNoYWJsZUFkYXB0ZXIjZ2V0TGF1bmNoYWJsZShJU2VydmVyLCBJTW9kdWxlQXJ0aWZhY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRMYXVuY2hhYmxlKElTZXJ2ZXIgc2VydmVyLCBJTW9kdWxlQXJ0aWZhY3Qgb2JqZWN0KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZ2V0RGVsZWdhdGUoKS5nZXRMYXVuY2hhYmxlKHNlcnZlciwgb2JqZWN0KTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGNhbGxpbmcgZGVsZWdhdGUgIiArIHRvU3RyaW5nKCkgKyAiOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJMYXVuY2hhYmxlQWRhcHRlclsiICsgZ2V0SWQoKSArICJdIjsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9NZXNzYWdlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNlN2IzMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi2gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLS8qKgotICogVHJhbnNsYXRlZCBtZXNzYWdlcy4KLSAqLwotcHVibGljIGNsYXNzIE1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwdWJsaXNoaW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yUnVudGltZU5hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JEdXBsaWNhdGVSdW50aW1lTmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvclNhdmluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckxvYWRpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JDYW5ub3RBZGRNb2R1bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVmYXVsdFZlbmRvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWZhdWx0VmVyc2lvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzYXZpbmdUYXNrOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhc2tQZXJmb3JtaW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlbGV0aW5nVGFzazsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWZhdWx0U2VydmVyUHJvamVjdE5hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVmYXVsdFJ1bnRpbWVOYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlZmF1bHRSdW50aW1lTmFtZTI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVmYXVsdFNlcnZlck5hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVmYXVsdFNlcnZlck5hbWUyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlZmF1bHRTZXJ2ZXJOYW1lMzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWZhdWx0U2VydmVyTmFtZTQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFza01vZGlmeU1vZHVsZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JXb3JraW5nQ29weVRpbWVzdGFtcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvclB1Ymxpc2hTdGFydGluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvclB1Ymxpc2hOb1J1bnRpbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JQdWJsaXNoTm9Db25maWd1cmF0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yTm9Db25maWd1cmF0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNhblB1Ymxpc2hPazsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwdWJsaXNoaW5nU3RhdHVzT2s7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHVibGlzaGluZ1N0YXR1c0luZm87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHVibGlzaGluZ1N0YXR1c1dhcm5pbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHVibGlzaGluZ1N0YXR1c0Vycm9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yUHVibGlzaGluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwdWJsaXNoaW5nU3RvcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwdWJsaXNoaW5nTW9kdWxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHB1Ymxpc2hlZE1vZHVsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvclN0YXJ0VGltZW91dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvclN0YXJ0RmFpbGVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yTW9kdWxlUmVzdGFydEZhaWxlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjYW5SZXN0YXJ0TW9kdWxlT2s7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JSZXN0YXJ0TW9kdWxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNhblN0YXJ0RXJyb3JTdGF0ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckxhdW5jaE1vZGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2FuU3RhcnRPazsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjYW5SZXN0YXJ0T2s7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JSZXN0YXJ0Tm90U3RhcnRlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvclN0b3BBbHJlYWR5U3RvcHBlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjYW5TdG9wT2s7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgbW9kdWxlVHlwZVVua25vd247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgam9iU3RhcnRpbmdTZXJ2ZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgam9iUmVzdGFydGluZ1NlcnZlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBqb2JVcGRhdGVTZXJ2ZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgam9iSW5zdGFsbGluZ1J1bnRpbWU7Ci0JCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhTZXJ2ZXJQbHVnaW4uUExVR0lOX0lEICsgIi5pbnRlcm5hbC5NZXNzYWdlcyIsIE1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvTWVzc2FnZXMucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL01lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyNWJiMDEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvTWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgLS0tLS0tLS0tLS0tLS0tIFRhc2tzIChwcm9ncmVzcyBtb25pdG9ycykgLS0tLS0tLS0tLS0tLS0tCi1zYXZpbmdUYXNrPVNhdmluZyB7MH0KLWRlbGV0aW5nVGFzaz1EZWxldGluZyB7MH0KLQotdGFza1BlcmZvcm1pbmc9UGVyZm9ybWluZyBUYXNrcwotdGFza01vZGlmeU1vZHVsZXM9QWRkaW5nIGFuZC9vciByZW1vdmluZyBwcm9qZWN0cy4KLQotcHVibGlzaGluZz1QdWJsaXNoaW5nIHRvIHswfS4uLgotcHVibGlzaGluZ1N0YXR1c09rPVB1Ymxpc2hpbmcgZmluaXNoZWQgc3VjY2Vzc2Z1bGx5Ci1wdWJsaXNoaW5nU3RhdHVzSW5mbz1QdWJsaXNoaW5nIGNvbXBsZXRlZCB3aXRoIGluZm9ybWF0aW9uCi1wdWJsaXNoaW5nU3RhdHVzV2FybmluZz1QdWJsaXNoaW5nIGNvbXBsZXRlZCB3aXRoIGEgd2FybmluZwotcHVibGlzaGluZ1N0YXR1c0Vycm9yPVB1Ymxpc2hpbmcgZmFpbGVkCi1wdWJsaXNoaW5nU3RvcD1EaXNjb25uZWN0aW5nIGZyb20gc2VydmVyCi0KLXB1Ymxpc2hpbmdNb2R1bGU9UHVibGlzaGluZzogezB9Ci1wdWJsaXNoZWRNb2R1bGU9ezB9IHB1Ymxpc2hlZCBzdWNjZXNzZnVsbHkKLQotam9iU3RhcnRpbmdTZXJ2ZXI9U3RhcnRpbmcgc2VydmVyIC0gezB9Ci1qb2JSZXN0YXJ0aW5nU2VydmVyPVJlc3RhcnRpbmcgc2VydmVyIC0gezB9Ci1qb2JVcGRhdGVTZXJ2ZXI9VXBkYXRpbmcgc3RhdHVzIGZvciB7MH0uLi4KLWpvYkluc3RhbGxpbmdSdW50aW1lPUluc3RhbGxpbmcgc2VydmVyIHJ1bnRpbWUKLQotIyAtLS0tLS0tLS0tLS0tLS0gTWlzYyBVSSAtLS0tLS0tLS0tLS0tLS0KLQotIyBFcnJvciBNZXNzYWdlcwotZXJyb3JQdWJsaXNoaW5nPUNvdWxkIG5vdCBwdWJsaXNoIHRvIHRoZSBzZXJ2ZXIuCi1lcnJvck5vQ29uZmlndXJhdGlvbj1UaGUgc2VydmVyIGhhcyBubyBjb25maWd1cmF0aW9uLgotZXJyb3JMb2FkaW5nPUVycm9yIGxvYWRpbmcgZnJvbSB7MH0uCi1lcnJvclNhdmluZz1Db3VsZCBub3Qgc2F2ZSB0byB7MH0uCi1lcnJvck1vZHVsZVJlc3RhcnRGYWlsZWQ9Q291bGQgbm90IHJlc3RhcnQgdGhlIG1vZHVsZS4KLWVycm9yV29ya2luZ0NvcHlUaW1lc3RhbXA9Q291bGQgbm90IHNhdmUgYmVjYXVzZSB0aGUgZmlsZSBoYXMgYmVlbiBtb2RpZmllZCBzaW5jZSB0aGUgc3RhcnQgb2YgZWRpdHRpbmcuCi1lcnJvclJ1bnRpbWVOYW1lPUVudGVyIGEgbmFtZSBmb3IgdGhlIHJ1bnRpbWUuCi1lcnJvckR1cGxpY2F0ZVJ1bnRpbWVOYW1lPU5hbWUgaXMgYWxyZWFkeSBpbiB1c2UuCi1lcnJvclN0YXJ0VGltZW91dD1UaW1lb3V0IHdhaXRpbmcgZm9yIHswfSB0byBzdGFydC4gU2VydmVyIGRpZCBub3Qgc3RhcnQgYWZ0ZXIgezF9cy4gCi1lcnJvclN0YXJ0RmFpbGVkPVNlcnZlciB7MH0gZmFpbGVkIHRvIHN0YXJ0LgotZXJyb3JDYW5ub3RBZGRNb2R1bGU9VGhlIHNlcnZlciBkb2VzIG5vdCBzdXBwb3J0IHZlcnNpb24gezF9IG9mIHRoZSB7MH0gc3BlY2lmaWNhdGlvbi4KLQotIyBEZWZhdWx0IHNlcnZlciBjcmVhdGlvbiBuYW1lcwotIyB7MH0gd2lsbCBiZSByZXBsYWNlZCBieSBhIG51bWJlciBpZiB0aGUgZ2l2ZW4gbmFtZSBpcyBhbHJlYWR5IGJlaW5nIHVzZWQKLWRlZmF1bHRTZXJ2ZXJQcm9qZWN0TmFtZT1TZXJ2ZXJzezB9Ci1kZWZhdWx0UnVudGltZU5hbWU9ezB9Ci1kZWZhdWx0UnVudGltZU5hbWUyPXswfSAoezF9KQotZGVmYXVsdFNlcnZlck5hbWU9ezB9IEAgezF9Ci1kZWZhdWx0U2VydmVyTmFtZTI9ezB9IEAgezF9ICh7Mn0pCi1kZWZhdWx0U2VydmVyTmFtZTM9ezB9Ci1kZWZhdWx0U2VydmVyTmFtZTQ9ezB9ICh7MX0pCi0KLSMgVXNlZCB3aGVuIGEgbmFtZSBjYW4ndCBiZSBmb3VuZAotZGVmYXVsdFZlbmRvcj1CYXNpYwotZGVmYXVsdFZlcnNpb249QmFzaWMKLW1vZHVsZVR5cGVVbmtub3duPVVua25vd24gbW9kdWxlCi0KLWNhblN0YXJ0T2s9VGhlIHNlcnZlciBjYW4gYmUgc3RhcnRlZC4KLWNhblN0b3BPaz1UaGUgc2VydmVyIGNhbiBiZSBzdG9wcGVkLgotY2FuUmVzdGFydE9rPVRoZSBzZXJ2ZXIgY2FuIGJlIHJlc3RhcnRlZC4KLWNhblB1Ymxpc2hPaz1UaGUgc2VydmVyIGNhbiBiZSBwdWJsaXNoZWQgdG8uCi1jYW5SZXN0YXJ0TW9kdWxlT2s9VGhlIG1vZHVsZSBjYW4gYmUgcmVzdGFydGVkLgotY2FuU3RhcnRFcnJvclN0YXRlPVRoZSBzZXJ2ZXIgY2Fubm90IGJlIHN0YXJ0ZWQgYmVjYXVzZSBpdCBpcyBjdXJyZW50IHN0YXJ0aW5nIG9yIHN0b3BwaW5nLgotZXJyb3JMYXVuY2hNb2RlPVRoZSBzZXJ2ZXIgZG9lcyBub3Qgc3VwcG9ydCB0aGUgZ2l2ZW4gbGF1bmNoIG1vZGUuCi1lcnJvclJlc3RhcnROb3RTdGFydGVkPUNhbm5vdCByZXN0YXJ0IHRoZSBzZXJ2ZXIgYmVjYXVzZSBpdCBpcyBub3QgY3VycmVudGx5IHJ1bm5pbmcuCi1lcnJvclB1Ymxpc2hTdGFydGluZz1DYW5ub3QgcHVibGlzaCB0byB0aGUgc2VydmVyIGJlY2F1c2UgaXQgaXMgY3VycmVudGx5IHN0YXJ0aW5nIG9yIHN0b3BwaW5nLgotZXJyb3JQdWJsaXNoTm9SdW50aW1lPUNhbm5vdCBwdWJsaXNoIHRvIHRoZSBzZXJ2ZXIgYmVjYXVzZSBpdCBpcyBtaXNzaW5nIGl0cyBydW50aW1lLgotZXJyb3JQdWJsaXNoTm9Db25maWd1cmF0aW9uPUNhbm5vdCBwdWJsaXNoIHRvIHRoZSBzZXJ2ZXIgYmVjYXVzZSB0aGUgY29uZmlndXJhdGlvbiBpcyBtaXNzaW5nLgotZXJyb3JTdG9wQWxyZWFkeVN0b3BwZWQ9VGhlIHNlcnZlciBjYW5ub3QgYmUgc3RvcHBlZCBiZWNhdXNlIGl0IGlzIGFscmVhZHkgc3RvcHBlZC4KLWVycm9yUmVzdGFydE1vZHVsZT1UaGUgbW9kdWxlIGNhbm5vdCBiZSByZXN0YXJ0ZWQuCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9Nb2R1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL01vZHVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWU0NTg2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL01vZHVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5Nb2R1bGVEZWxlZ2F0ZTsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2R1bGUgaW1wbGVtZW50cyBJTW9kdWxlIHsKLQlwcm90ZWN0ZWQgU3RyaW5nIGlkOwotCXByb3RlY3RlZCBTdHJpbmcgbmFtZTsKLQlwcm90ZWN0ZWQgTW9kdWxlRmFjdG9yeSBmYWN0b3J5OwotCXByb3RlY3RlZCBTdHJpbmcgdHlwZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIHZlcnNpb247Ci0JcHJvdGVjdGVkIElQcm9qZWN0IHByb2plY3Q7Ci0JcHJvdGVjdGVkIE1vZHVsZURlbGVnYXRlIGRlbGVnYXRlOwotCi0JLyoqCi0JICogTW9kdWxlIGNvbnN0cnVjdG9yLgotCSAqIAotCSAqIEBwYXJhbSBmYWN0b3J5Ci0JICogQHBhcmFtIGlkCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcGFyYW0gdHlwZQotCSAqIEBwYXJhbSB2ZXJzaW9uCi0JICogQHBhcmFtIHByb2plY3QKLQkgKi8KLQlwdWJsaWMgTW9kdWxlKE1vZHVsZUZhY3RvcnkgZmFjdG9yeSwgU3RyaW5nIGlkLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHR5cGUsIFN0cmluZyB2ZXJzaW9uLCBJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZmFjdG9yeSA9IGZhY3Rvcnk7Ci0JCXRoaXMucHJvamVjdCA9IHByb2plY3Q7Ci0JCXRoaXMudHlwZSA9IHR5cGU7Ci0JCXRoaXMudmVyc2lvbiA9IHZlcnNpb247Ci0JCXRoaXMuaWQgPSBpZDsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpZCBvZiB0aGlzIG1vZHVsZS4KLQkgKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBmYWN0b3J5LmdldElkKCkgKyAiOiIgKyBpZDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbnRlcm5hbCAocGFydGlhbCkgaWQgb2YgdGhpcyBtb2R1bGUuCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBpZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SW50ZXJuYWxJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHR5cGUgb2YgdGhpcyBtb2R1bGUuCi0JICogCi0JICogQHJldHVybiB0aGUgbW9kdWxlIHR5cGUKLQkgKi8KLQlwdWJsaWMgSU1vZHVsZVR5cGUgZ2V0TW9kdWxlVHlwZSgpIHsKLQkJcmV0dXJuIG5ldyBNb2R1bGVUeXBlKHR5cGUsIHZlcnNpb24pOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHdvcmtiZW5jaCBwcm9qZWN0IHRoYXQgdGhpcyBtb2R1bGUgaXMgY29udGFpbmVkIGluLAotCSAqIG9yIG51bGwgaWYgdGhlIG1vZHVsZSBpcyBvdXRzaWRlIG9mIHRoZSB3b3Jrc3BhY2UuCi0JICogCi0JICogQHJldHVybiB0aGUgcHJvamVjdCB0aGF0IHRoZSBtb2R1bGUgaXMgY29udGFpbmVkIGluCi0JICovCi0JcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0JCXJldHVybiBwcm9qZWN0OwotCX0KLQotCS8qCi0JICogQHNlZSBJTW9kdWxlI2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgPGNvZGU+TW9kdWxlRmFjdG9yeTwvY29kZT4gdGhhdCBjcmVhdGVkIHRoaXMgbW9kdWxlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1vZHVsZSBmYWN0b3J5IHRoYXQgY3JlYXRlZCB0aGlzIG1vZHVsZQotCSAqLwotCXB1YmxpYyBNb2R1bGVGYWN0b3J5IGdldE1vZHVsZUZhY3RvcnkoKSB7Ci0JCXJldHVybiBmYWN0b3J5OwotCX0KLQotCXByb3RlY3RlZCBNb2R1bGVEZWxlZ2F0ZSBnZXREZWxlZ2F0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKGRlbGVnYXRlICE9IG51bGwpCi0JCQlyZXR1cm4gZGVsZWdhdGU7Ci0JCQotCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCWlmIChkZWxlZ2F0ZSA9PSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJbG9uZyB0aW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJCWRlbGVnYXRlID0gZmFjdG9yeS5nZXREZWxlZ2F0ZShtb25pdG9yKS5nZXRNb2R1bGVEZWxlZ2F0ZSh0aGlzKTsKLQkJCQkJZGVsZWdhdGUuaW5pdGlhbGl6ZSh0aGlzKTsKLQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuUEVSRk9STUFOQ0UsICJNb2R1bGUuZ2V0RGVsZWdhdGUoKTogPCIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aW1lKSArICIgIiArIGZhY3RvcnkuZ2V0SWQoKSk7Ci0JCQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IGNyZWF0ZSBkZWxlZ2F0ZSAiICsgdG9TdHJpbmcoKSwgdCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBkZWxlZ2F0ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjaGlsZCBtb2R1bGVzIG9mIHRoaXMgbW9kdWxlLgotCSAqCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yCi0JICogQHJldHVybiBhIHBvc3NpYmx5IGVtcHR5IGFycmF5IG9mIG1vZHVsZXMKLQkgKi8KLQlwdWJsaWMgSU1vZHVsZVtdIGdldENoaWxkTW9kdWxlcyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBnZXREZWxlZ2F0ZShtb25pdG9yKS5nZXRDaGlsZE1vZHVsZXMoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGNhbGxpbmcgZGVsZWdhdGUgZ2V0Q2hpbGRNb2R1bGVzKCkgIiArIHRvU3RyaW5nKCksIGUpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhpcyBtb2R1bGUuCi0JICogPHA+Ci0JICogW2lzc3VlOiBDb25qZWN0dXJlOiBFYWNoIGRpZmZlcmVudCB0eXBlIG9mIG1vZHVsZSBwcmVzY3JpYmVzCi0JICogbGVnYWwgYXJyYW5nZW1lbnRzIG9mLCBhbmQgdGhlIHNpZ25pZmljYW5jZSBvZiwgdGhlIGZpbGVzIHdpdGhpbgotCSAqIGl0LiBUaGlzIHdvdWxkIGJlIHNwZWxsZWQgb3V0IGluIHRoZSBzcGVjIGZvciB0aGUgcGFydGljdWxhcgotCSAqIG1vZHVsZSB0eXBlcy4KLQkgKiBUaGlzIHZhbGlkYXRlIG9wZXJhdGlvbiBpcyBzdXBwb3NlIHRvIGNoZWNrIHRoZSBhY3R1YWwKLQkgKiBhcnJhbmdlbWVudCBvZiBmaWxlcyBpbiB0aGlzIG1vZHVsZSB0byBzZWUgd2hldGhlciB0aGV5Ci0JICogbWVldCBleHBlY3RhdGlvbnMuCi0JICogSXQncyBhbiBvcGVuIHF1ZXN0aW9uIGFzIHRvIGhvdyAic3RyZW51b3VzIiBhIGNoZWNrIHRoaXMKLQkgKiBpcy5dCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFtpc3N1ZTogT2xkIGNvbW1lbnQgc2FpZDogIklmIHRoZXJlIGlzIGFuIGVycm9yCi0JICogdGhhdCBzaG91bGQgYmxvY2sgdGhlIHNlcnZlciBmcm9tIHN0YXJ0aW5nIChlLmcuIG1ham9yIGVycm9ycykKLQkgKiBpdCBzaG91bGQgYmUgcmV0dXJuZWQgZnJvbSB0aGlzIG1ldGhvZC4gVGhpcyBtZXRob2QgY2FuIGFsc28gYmUgdXNlZCB0bwotCSAqIHJldHVybiB3YXJuaW5nIGZvciBzdWNoIHRoaW5ncyBhcyBhbiBvcGVuIChhbmQgZGlydHkpIGVkaXRvci4iXQotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBbaXNzdWU6IEFsbCBleGlzdGluZyBpbXBsZW1lbnRhdGlvbnMgb2YgdGhpcyByZXR1cm4gbnVsbCwKLQkgKiB3aGljaCBpcyBpbGxlZ2FsLl0KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogW2lzc3VlOiBPbGQgY29tbWVudCBzYWlkOiAiUmV0dXJucyBhbiBJU3RhdHVzIHRoYXQgaXMgdXNlZCB0byBkZXRlcm1pbmUgaWYgdGhpcyBvYmplY3QgY2FuCi0JICogYmUgcHVibGlzaGVkIHRvIHRoZSBzZXJ2ZXIuIiBTaW5jZSB0aGUgc2FtZSBtb2R1bGUgY2FuCi0JICogYmUgYXNzb2NpYXRlZCB3aXRoIGFueSBudW1iZXIgb2Ygc2VydmVycywgInRoZSBzZXJ2ZXIiIGlzCi0JICogaWxsLWRlZmluZWQuXQotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBbaXNzdWU6IE9sZCBjb21tZW50IHNhaWQ6ICJTaG91bGQgcmV0dXJuIGFuIGVycm9yIGlmIHRoZXJlCi0JICogaXMgYSBtYWpvciBwcm9ibGVtIHdpdGggdGhlIHJlc291cmNlcywgb3IgY2FuIGJlIHVzZWQgdG8KLQkgKiByZXR1cm4gd2FybmluZ3Mgb24gdW5zYXZlZCBmaWxlcywgZXRjLiIgSXQgaXMgdXN1YWxseQotCSAqIGRpZmZpY3VsdCBpbiBwcmluY2lwbGUgZm9yIGNvcmUtbGV2ZWwgaW5mcmFzdHJ1Y3R1cmUgdG8KLQkgKiBkZXRlY3Qgd2hldGhlciB0aGVyZSBhcmUgb3BlbiBlZGl0b3JzIHdpdGggdW5zYXZlZCBjaGFuZ2VzLl0KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vCi0JICogICAgcHJvZ3Jlc3MgcmVwb3J0aW5nIGlzIHJlcXVpcmVkCi0JICogQHJldHVybiBhIHN0YXR1cyBvYmplY3Qgd2l0aCBjb2RlIDxjb2RlPklTdGF0dXMuT0s8L2NvZGU+IGlmIHRoZSBnaXZlbgotCSAqICAgIG1vZHVsZSBpcyB2YWxpZCwgb3RoZXJ3aXNlIGEgc3RhdHVzIG9iamVjdCBpbmRpY2F0aW5nIHdoYXQgaXMKLQkgKiAgICB3cm9uZyB3aXRoIGl0Ci0JICovCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZ2V0RGVsZWdhdGUobW9uaXRvcikudmFsaWRhdGUoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGNhbGxpbmcgZGVsZWdhdGUgdmFsaWRhdGUoKSAiICsgdG9TdHJpbmcoKSwgZSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgSU1vZHVsZSNnZXRBZGFwdGVyKENsYXNzKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCWlmIChkZWxlZ2F0ZSAhPSBudWxsKSB7Ci0JCQlpZiAoYWRhcHRlci5pc0luc3RhbmNlKGRlbGVnYXRlKSkKLQkJCQlyZXR1cm4gZGVsZWdhdGU7Ci0JCX0KLQkJcmV0dXJuIFBsYXRmb3JtLmdldEFkYXB0ZXJNYW5hZ2VyKCkuZ2V0QWRhcHRlcih0aGlzLCBhZGFwdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElNb2R1bGUjbG9hZEFkYXB0ZXIoQ2xhc3MsIElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIE9iamVjdCBsb2FkQWRhcHRlcihDbGFzcyBhZGFwdGVyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJZ2V0RGVsZWdhdGUobW9uaXRvcik7Ci0JCWlmIChhZGFwdGVyLmlzSW5zdGFuY2UoZGVsZWdhdGUpKQotCQkJcmV0dXJuIGRlbGVnYXRlOwotCQlyZXR1cm4gUGxhdGZvcm0uZ2V0QWRhcHRlck1hbmFnZXIoKS5sb2FkQWRhcHRlcih0aGlzLCBhZGFwdGVyLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJaWYgKCEob2JqIGluc3RhbmNlb2YgSU1vZHVsZSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQlJTW9kdWxlIG0gPSAoSU1vZHVsZSkgb2JqOwotCQlpZiAoIWdldElkKCkuZXF1YWxzKG0uZ2V0SWQoKSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCS8vaWYgKCFwcm9qZWN0LmVxdWFscyhtLmdldFByb2plY3QoKSkpCi0JCS8vCXJldHVybiBmYWxzZTsKLQkJLy9pZiAoIWdldE1vZHVsZVR5cGUoKS5lcXVhbHMobS5nZXRNb2R1bGVUeXBlKCkpKQotCQkvLwlyZXR1cm4gZmFsc2U7Ci0JCQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gZ2V0SWQoKS5oYXNoQ29kZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdC4KLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIk1vZHVsZVsiICsgbmFtZSArICIsIiArIGdldElkKCkgKyAiXSI7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL01vZHVsZUFydGlmYWN0QWRhcHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvTW9kdWxlQXJ0aWZhY3RBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjYzRkOTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvTW9kdWxlQXJ0aWZhY3RBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGVBcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuTW9kdWxlQXJ0aWZhY3RBZGFwdGVyRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2R1bGVBcnRpZmFjdEFkYXB0ZXIgewotCXByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQ7Ci0JcHJpdmF0ZSBFeHByZXNzaW9uIGZDb250ZXh0dWFsTGF1bmNoRXhwciA9IG51bGw7Ci0JcHJpdmF0ZSBNb2R1bGVBcnRpZmFjdEFkYXB0ZXJEZWxlZ2F0ZSBkZWxlZ2F0ZTsKLQotCS8qKgotCSAqIE1vZHVsZUFydGlmYWN0QWRhcHRlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IGEgY29uZmlndXJhdGlvbiBlbGVtZW50Ci0JICovCi0JcHVibGljIE1vZHVsZUFydGlmYWN0QWRhcHRlcihJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcigpOwotCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGlkIG9mIHRoaXMgTW9kdWxlQXJ0aWZhY3RBZGFwdGVyLgotCSAqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJpZCIpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZWxhdGl2ZSBwcmlvcml0eSBvZiB0aGlzIGFkYXB0ZXIuCi0JICoKLQkgKiBAcmV0dXJuIGEgcHJpb3JpdHkKLQkgKi8KLQlwdWJsaWMgaW50IGdldFByaW9yaXR5KCkgewotCQl0cnkgewotCQkJcmV0dXJuIEludGVnZXIucGFyc2VJbnQoZWxlbWVudC5nZXRBdHRyaWJ1dGUoInByaW9yaXR5IikpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHBsdWdpbiB0aGF0IGxvYWRlZCB0aGlzIGNsYXNzIGhhcyBiZWVuIGxvYWRlZC4KLQkgKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGx1Z2luQWN0aXZhdGVkKCkgewotCQlTdHJpbmcgcGx1Z2luSWQgPSBlbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpLmdldE5hbWVzcGFjZSgpOwotCQlyZXR1cm4gUGxhdGZvcm0uZ2V0QnVuZGxlKHBsdWdpbklkKS5nZXRTdGF0ZSgpID09IEJ1bmRsZS5BQ1RJVkU7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYW4gZXhwcmVzc2lvbiB0aGF0IHJlcHJlc2VudHMgdGhlIGVuYWJsZW1lbnQgbG9naWMgZm9yIHRoZQotCSAqIGNvbnRleHR1YWwgbGF1bmNoIGVsZW1lbnQgb2YgdGhpcyBsYXVuY2ggc2hvcnRjdXQgZGVzY3JpcHRpb24gb3IKLQkgKiA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lLgotCSAqIEByZXR1cm4gYW4gZXZhbHVhdGFibGUgZXhwcmVzc2lvbiBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiB0aGUgY29uZmlndXJhdGlvbiBlbGVtZW50IGNhbid0IGJlCi0JICogIGNvbnZlcnRlZC4gUmVhc29ucyBpbmNsdWRlOiAoYSkgbm8gaGFuZGxlciBpcyBhdmFpbGFibGUgdG8KLQkgKiAgY29wZSB3aXRoIGEgY2VydGFpbiBjb25maWd1cmF0aW9uIGVsZW1lbnQgb3IgKGIpIHRoZSBYTUwKLQkgKiAgZXhwcmVzc2lvbiB0cmVlIGlzIG1hbGZvcm1lZC4KLQkgKi8KLQlwdWJsaWMgRXhwcmVzc2lvbiBnZXRDb250ZXh0dWFsTGF1bmNoRW5hYmxlbWVudEV4cHJlc3Npb24oKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChmQ29udGV4dHVhbExhdW5jaEV4cHIgPT0gbnVsbCkgewotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBlbGVtZW50LmdldENoaWxkcmVuKEV4cHJlc3Npb25UYWdOYW1lcy5FTkFCTEVNRU5UKTsKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBlbmFibGVtZW50ID0gZWxlbWVudHMubGVuZ3RoID4gMCA/IGVsZW1lbnRzWzBdIDogbnVsbDsgCi0KLQkJCWlmIChlbmFibGVtZW50ICE9IG51bGwpCi0JCQkJZkNvbnRleHR1YWxMYXVuY2hFeHByID0gRXhwcmVzc2lvbkNvbnZlcnRlci5nZXREZWZhdWx0KCkucGVyZm9ybShlbmFibGVtZW50KTsKLQkJfQotCQlyZXR1cm4gZkNvbnRleHR1YWxMYXVuY2hFeHByOwotCX0KLQkKLQkvKioKLQkgKiBFdmFsdWF0ZSB0aGUgZ2l2ZW4gZXhwcmVzc2lvbiB3aXRoaW4gdGhlIGdpdmVuIGNvbnRleHQgYW5kIHJldHVybgotCSAqIHRoZSByZXN1bHQuIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWZmIHJlc3VsdCBpcyBlaXRoZXIgVFJVRSBvciBOT1RfTE9BREVELgotCSAqIFRoaXMgYWxsb3dzIG9wdGltaXN0aWMgaW5jbHVzaW9uIG9mIHNob3J0Y3V0cyBiZWZvcmUgcGx1Z2lucyBhcmUgbG9hZGVkLgotCSAqIFJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGV4cCBpcyA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gZXhwIHRoZSBlbmFibGVtZW50IGV4cHJlc3Npb24gdG8gZXZhbHVhdGUgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAcGFyYW0gY29udGV4dCB0aGUgY29udGV4dCBvZiB0aGUgZXZhbHVhdGlvbi4gVXN1YWxseSwgdGhlCi0JICogIHVzZXIncyBzZWxlY3Rpb24uCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGV2YWx1YXRpbmcgdGhlIGV4cHJlc3Npb24KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBldmFsRW5hYmxlbWVudEV4cHJlc3Npb24oSUV2YWx1YXRpb25Db250ZXh0IGNvbnRleHQsIEV4cHJlc3Npb24gZXhwKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiAoZXhwICE9IG51bGwpID8gKChleHAuZXZhbHVhdGUoY29udGV4dCkpICE9IEV2YWx1YXRpb25SZXN1bHQuRkFMU0UpIDogZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIEByZXR1cm4gYW4gRXZhbHVhdGlvbiBjb250ZXh0IHdpdGggZGVmYXVsdCB2YXJpYWJsZSA9IHNlbGVjdGlvbgotCSAqLwotCS8qcHJvdGVjdGVkIElFdmFsdWF0aW9uQ29udGV4dCBjcmVhdGVDb250ZXh0KE9iamVjdCBvYmopIHsKLQkJTGlzdCBsaXN0ID0gbnVsbDsKLQkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBEZWJ1Z1VJUGx1Z2luLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQlpZiAod2luZG93ICE9IG51bGwpIHsKLQkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSB3aW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotCQkJaWYgKHBhZ2UgIT0gbnVsbCkgewotCQkJICAgIElXb3JrYmVuY2hQYXJ0IGFjdGl2ZVBhcnQgPSBwYWdlLmdldEFjdGl2ZVBhcnQoKTsKLQkJCSAgICBpZiAoYWN0aXZlUGFydCBpbnN0YW5jZW9mIElFZGl0b3JQYXJ0KSB7Ci0JCQkgICAgICAgIGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkgICAgICAgIGxpc3QuYWRkKCgoSUVkaXRvclBhcnQpYWN0aXZlUGFydCkuZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCQkgICAgfSBlbHNlIGlmIChhY3RpdmVQYXJ0ICE9IG51bGwpIHsKLQkJCSAgICAgICAgSVdvcmtiZW5jaFBhcnRTaXRlIHNpdGUgPSBhY3RpdmVQYXJ0LmdldFNpdGUoKTsKLQkJCSAgICAgICAgaWYgKHNpdGUgIT0gbnVsbCkgewotCSAgICAgICAgICAgICAgICAgICAgSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyID0gc2l0ZS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpOwotCSAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGlvblByb3ZpZGVyICE9IG51bGwpIHsKLQkgICAgICAgICAgICAgICAgICAgICAgICBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHNlbGVjdGlvblByb3ZpZGVyLmdldFNlbGVjdGlvbigpOwotCQkJCQkgICAgICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJCQkgICAgICAgICAgICBsaXN0ID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb24pLnRvTGlzdCgpOwotCQkJCQkgICAgICAgIH0KLQkgICAgICAgICAgICAgICAgICAgIH0KLQkJCSAgICAgICAgfQotCQkJICAgIH0KLQkJCX0KLQkJfQotCQkvLyBjcmVhdGUgYSBkZWZhdWx0IGV2YWx1YXRpb24gY29udGV4dCB3aXRoIGRlZmF1bHQgdmFyaWFibGUKLQkJLy8gb2YgdGhlIHVzZXIgc2VsZWN0aW9uIG9yIGVkaXRvciBpbnB1dAotCQlpZiAobGlzdCA9PSBudWxsKSB7Ci0JCSAgICBsaXN0ID0gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJfQotCQlJRXZhbHVhdGlvbkNvbnRleHQgY29udGV4dCA9IG5ldyBFdmFsdWF0aW9uQ29udGV4dChudWxsLCBsaXN0KTsKLQkJY29udGV4dC5hZGRWYXJpYWJsZSgic2VsZWN0aW9uIiwgbGlzdCk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCXJldHVybiBjb250ZXh0OwotCX0qLwotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIGVuYWJsZWQgZm9yIHRoZSBnaXZlbiBvYmplY3QuCi0JICogCi0JICogQHBhcmFtIG9iaiBhbiBvYmplY3QKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGVuYWJsZWQKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gaWYgYW55dGhpbmcgZ29lcyB3cm9uZwotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZChPYmplY3Qgb2JqKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlFdmFsdWF0aW9uQ29udGV4dCBjb250ZXh0ID0gbmV3IEV2YWx1YXRpb25Db250ZXh0KG51bGwsIG9iaik7Ci0JCWNvbnRleHQuYWRkVmFyaWFibGUoInNlbGVjdGlvbiIsIG9iaik7Ci0JCXJldHVybiBldmFsRW5hYmxlbWVudEV4cHJlc3Npb24oY29udGV4dCwgZ2V0Q29udGV4dHVhbExhdW5jaEVuYWJsZW1lbnRFeHByZXNzaW9uKCkpOwotCX0KLQotCXB1YmxpYyBNb2R1bGVBcnRpZmFjdEFkYXB0ZXJEZWxlZ2F0ZSBnZXREZWxlZ2F0ZSgpIHsKLQkJaWYgKGRlbGVnYXRlID09IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJZGVsZWdhdGUgPSAoTW9kdWxlQXJ0aWZhY3RBZGFwdGVyRGVsZWdhdGUpIGVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsKLQkJCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IGNyZWF0ZSBkZWxlZ2F0ZSIgKyB0b1N0cmluZygpICsgIjogIiArIHQuZ2V0TWVzc2FnZSgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZGVsZWdhdGU7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzRGVsZWdhdGVMb2FkZWQoKSB7Ci0JCXJldHVybiAoZGVsZWdhdGUgIT0gbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbW9kdWxlIGFydGlmYWN0LgotCSAqIAotCSAqIEBwYXJhbSBvYmogYW4gb2JqZWN0Ci0JICogQHJldHVybiB0aGUgbW9kdWxlIGFydGlmYWN0LCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBJTW9kdWxlQXJ0aWZhY3QgZ2V0TW9kdWxlQXJ0aWZhY3QoT2JqZWN0IG9iaikgewotCQl0cnkgewotCQkJcmV0dXJuIGdldERlbGVnYXRlKCkuZ2V0TW9kdWxlQXJ0aWZhY3Qob2JqKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGNhbGxpbmcgZGVsZWdhdGUgIiArIHRvU3RyaW5nKCkgKyAiOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiTW9kdWxlQXJ0aWZhY3RBZGFwdGVyWyIgKyBnZXRJZCgpICsgIl0iOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9Nb2R1bGVFdmVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvTW9kdWxlRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2EwZTg2OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9Nb2R1bGVFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotoCogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotLyoqCi0gKiBBbiBldmVudCBmaXJlZCB3aGVuIGEgbW9kdWxlIGNoYW5nZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2R1bGVFdmVudCB7Ci0JcHJpdmF0ZSBJTW9kdWxlIG1vZHVsZTsKLQlwcml2YXRlIGJvb2xlYW4gaXNDaGFuZ2VkOwotCXByaXZhdGUgSU1vZHVsZVtdIGFkZGVkOwotCXByaXZhdGUgSU1vZHVsZVtdIGNoYW5nZWQ7Ci0JcHJpdmF0ZSBJTW9kdWxlW10gcmVtb3ZlZDsKLQotCWNsYXNzIElNb2R1bGVBcnRpZmFjdCB7Ci0JCUlQYXRoIHBhdGg7Ci0JCWxvbmcgdGltZXN0YW1wOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBtb2R1bGUgZXZlbnQuCi0JICogCi0JICogQHBhcmFtIG1vZHVsZSB0aGUgbW9kdWxlIHRoYXQgaGFzIGJlZW4gY2hhbmdlZAotCSAqIEBwYXJhbSBpc0NoYW5nZWQgdHJ1ZSBpZiB0aGUgbW9kdWxlIGhhcyBjaGFuZ2VkCi0JICogQHBhcmFtIGFkZGVkIGFkZGVkIGNoaWxkIG1vZHVsZXMKLQkgKiBAcGFyYW0gY2hhbmdlZCBjaGFuZ2VkIGNoaWxkIG1vZHVsZXMKLQkgKiBAcGFyYW0gcmVtb3ZlZCByZW1vdmVkIGNoaWxkIG1vZHVsZXMKLQkgKi8KLQlwdWJsaWMgTW9kdWxlRXZlbnQoSU1vZHVsZSBtb2R1bGUsIGJvb2xlYW4gaXNDaGFuZ2VkLCBJTW9kdWxlW10gYWRkZWQsIElNb2R1bGVbXSBjaGFuZ2VkLCBJTW9kdWxlW10gcmVtb3ZlZCkgewotCQl0aGlzLm1vZHVsZSA9IG1vZHVsZTsKLQkJdGhpcy5pc0NoYW5nZWQgPSBpc0NoYW5nZWQ7Ci0JCXRoaXMuYWRkZWQgPSBhZGRlZDsKLQkJdGhpcy5jaGFuZ2VkID0gY2hhbmdlZDsKLQkJdGhpcy5yZW1vdmVkID0gcmVtb3ZlZDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtb2R1bGUgdGhhdCBoYXMgYmVlbiBjaGFuZ2VkLgotCSAqCi0JICogQHJldHVybiB0aGUgbW9kdWxlCi0JICovCi0JcHVibGljIElNb2R1bGUgZ2V0TW9kdWxlKCkgewotCQlyZXR1cm4gbW9kdWxlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIG1vZHVsZSdzIHNldHRpbmdzIGhhdmUgY2hhbmdlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjb250ZW50cyBoYXZlIGNoYW5nZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NoYW5nZWQoKSB7Ci0JCXJldHVybiBpc0NoYW5nZWQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbnkgY2hpbGQgbW9kdWxlcyB0aGF0IGhhdmUgYmVlbiBhZGRlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBhZGRlZCBjaGlsZCBtb2R1bGVzLCBvciBudWxsIGlmIG5vIG1vZHVsZXMgaGF2ZSBiZWVuIGFkZGVkCi0JICovCi0JcHVibGljIElNb2R1bGVbXSBnZXRBZGRlZENoaWxkTW9kdWxlcygpIHsKLQkJcmV0dXJuIGFkZGVkOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW55IGNoaWxkIG1vZHVsZXMgdGhhdCBoYXZlIGJlZW4gY2hhbmdlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjaGFuZ2VkIGNoaWxkIG1vZHVsZXMsIG9yIG51bGwgaWYgbm8gbW9kdWxlcyBoYXZlIGJlZW4gY2hhbmdlZAotCSAqLwotCXB1YmxpYyBJTW9kdWxlW10gZ2V0Q2hhbmdlZENoaWxkTW9kdWxlcygpIHsKLQkJcmV0dXJuIGNoYW5nZWQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbnkgY2hpbGQgbW9kdWxlcyB0aGF0IGhhdmUgYmVlbiByZW1vdmVkLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHJlbW92ZWQgY2hpbGQgbW9kdWxlcywgb3IgbnVsbCBpZiBubyBtb2R1bGVzIGhhdmUgYmVlbiByZW1vdmVkCi0JICovCi0JcHVibGljIElNb2R1bGVbXSBnZXRSZW1vdmVkQ2hpbGRNb2R1bGVzKCkgewotCQlyZXR1cm4gcmVtb3ZlZDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtb2R1bGUgYXJ0aWZhY3RzIHRoYXQgaGF2ZSBjaGFuZ2VkLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGNoYW5nZWQgbW9kdWxlIGFydGlmYWN0cwotCSAqLwotCXB1YmxpYyBJTW9kdWxlQXJ0aWZhY3RbXSBnZXRDaGFuZ2VkQXJ0aWZhY3RzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvTW9kdWxlRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvTW9kdWxlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmMxMjEyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL01vZHVsZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5JbnRlcm5hbEluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5Nb2R1bGVGYWN0b3J5RGVsZWdhdGU7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgTW9kdWxlRmFjdG9yeSBpbXBsZW1lbnRzIElPcmRlcmVkIHsKLQlwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50OwotCXB1YmxpYyBNb2R1bGVGYWN0b3J5RGVsZWdhdGUgZGVsZWdhdGU7Ci0JcHJpdmF0ZSBMaXN0IG1vZHVsZVR5cGVzOwotCQotCXByaXZhdGUgTGlzdCBtb2R1bGVzOwotCi0JLyoqCi0JICogTW9kdWxlRmFjdG9yeSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IGEgY29uZmlndXJhdGlvbiBlbGVtZW50Ci0JICovCi0JcHVibGljIE1vZHVsZUZhY3RvcnkoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpZCBvZiB0aGlzIGZhY3RvcnkuCi0JICoKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImlkIik7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGluZGV4IChvcmRlcmluZykgb2YgdGhpcyB0YXNrLgotCSAqCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldE9yZGVyKCkgewotCQl0cnkgewotCQkJcmV0dXJuIEludGVnZXIucGFyc2VJbnQoZWxlbWVudC5nZXRBdHRyaWJ1dGUoIm9yZGVyIikpOwotCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc3VwcG9ydGVkIG1vZHVsZSB0eXBlcy4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIG1vZHVsZSB0eXBlcwotCSAqLwotCXB1YmxpYyBJTW9kdWxlVHlwZVtdIGdldE1vZHVsZVR5cGVzKCkgewotCQlpZiAobW9kdWxlVHlwZXMgPT0gbnVsbCkKLQkJCW1vZHVsZVR5cGVzID0gU2VydmVyUGx1Z2luLmdldE1vZHVsZVR5cGVzKGVsZW1lbnQuZ2V0Q2hpbGRyZW4oIm1vZHVsZVR5cGUiKSk7Ci0KLQkJSU1vZHVsZVR5cGVbXSBtdCA9IG5ldyBJTW9kdWxlVHlwZVttb2R1bGVUeXBlcy5zaXplKCldOwotCQltb2R1bGVUeXBlcy50b0FycmF5KG10KTsKLQkJcmV0dXJuIG10OwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBtb2R1bGVzIGZhY3RvcnkgcHJvZHVjZXMgcHJvamVjdCBtb2R1bGVzLgotCSAqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQcm9qZWN0TW9kdWxlRmFjdG9yeSgpIHsKLQkJcmV0dXJuICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJwcm9qZWN0cyIpKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSU1vZHVsZUZhY3RvcnlEZWxlZ2F0ZSNnZXREZWxlZ2F0ZSgpCi0JICovCi0JcHVibGljIE1vZHVsZUZhY3RvcnlEZWxlZ2F0ZSBnZXREZWxlZ2F0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKGRlbGVnYXRlID09IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJZGVsZWdhdGUgPSAoTW9kdWxlRmFjdG9yeURlbGVnYXRlKSBlbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7Ci0JCQkJLy9kZWxlZ2F0ZS5pbml0aWFsaXplKHRoaXMpOwotCQkJCUludGVybmFsSW5pdGlhbGl6ZXIuaW5pdGlhbGl6ZU1vZHVsZUZhY3RvcnlEZWxlZ2F0ZShkZWxlZ2F0ZSwgdGhpcywgbW9uaXRvcik7Ci0JCQkJLy9SZXNvdXJjZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5hZGRNb2R1bGVGYWN0b3J5TGlzdGVuZXIoZGVsZWdhdGUpOwotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3QgY3JlYXRlIGRlbGVnYXRlICIgKyB0b1N0cmluZygpICsgIjogIiArIHQuZ2V0TWVzc2FnZSgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZGVsZWdhdGU7Ci0JfQotCi0JLyoKLQkgKiBAc2VlCi0JICovCi0JcHVibGljIElNb2R1bGUgZ2V0TW9kdWxlKFN0cmluZyBpZCkgewotCQlJTW9kdWxlW10gbW9kdWxlczIgPSBnZXRNb2R1bGVzKCk7Ci0JCWlmIChtb2R1bGVzMiAhPSBudWxsKSB7Ci0JCQlpbnQgc2l6ZSA9IG1vZHVsZXMyLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJTW9kdWxlIG1vZHVsZSA9IChNb2R1bGUpIG1vZHVsZXMyW2ldOwotCQkJCWlmIChpZC5lcXVhbHMobW9kdWxlLmdldEludGVybmFsSWQoKSkpCi0JCQkJCXJldHVybiBtb2R1bGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYXJNb2R1bGVDYWNoZSgpIHsKLQkJbW9kdWxlcyA9IG51bGw7Ci0JfQotCi0JLyoKLQkgKiBAc2VlCi0JICovCi0JcHVibGljIElNb2R1bGVbXSBnZXRNb2R1bGVzKCkgewotCQkvL1RyYWNlLnRyYWNlKFRyYWNlLkZJTkVSLCAiZ2V0TW9kdWxlcygpID4gIiArIHRoaXMpOwotCQlpZiAobW9kdWxlcyA9PSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCW1vZHVsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJSU1vZHVsZVtdIG1vZHVsZXMyID0gZ2V0RGVsZWdhdGUobnVsbCkuZ2V0TW9kdWxlcygpOwotCQkJCWlmIChtb2R1bGVzMiAhPSBudWxsKSB7Ci0JCQkJCWludCBzaXplID0gbW9kdWxlczIubGVuZ3RoOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLQkJCQkJCW1vZHVsZXMuYWRkKG1vZHVsZXMyW2ldKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGNhbGxpbmcgZGVsZWdhdGUgIiArIHRvU3RyaW5nKCkgKyAiOiAiICsgdC5nZXRNZXNzYWdlKCkpOwotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0JCQotCQkvL1RyYWNlLnRyYWNlKFRyYWNlLkZJTkVSLCAiZ2V0TW9kdWxlcygpIDwgIiArIHRoaXMpOwotCQkKLQkJSU1vZHVsZVtdIG0gPSBuZXcgSU1vZHVsZVttb2R1bGVzLnNpemUoKV07Ci0JCW1vZHVsZXMudG9BcnJheShtKTsKLQkJcmV0dXJuIG07Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdC4KLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIk1vZHVsZUZhY3RvcnlbIiArIGdldElkKCkgKyAiXSI7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL01vZHVsZUZhY3RvcnlFdmVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvTW9kdWxlRmFjdG9yeUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhYWY1NzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvTW9kdWxlRmFjdG9yeUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLaAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotLyoqCi0gKiBBbiBldmVudCBmaXJlZCB3aGVuIGEgbW9kdWxlIGZhY3RvcnkgY2hhbmdlcy4KLSAqLwotcHVibGljIGNsYXNzIE1vZHVsZUZhY3RvcnlFdmVudCB7Ci0JcHJvdGVjdGVkIElNb2R1bGVbXSBhZGRlZDsKLQlwcm90ZWN0ZWQgSU1vZHVsZVtdIHJlbW92ZWQ7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgZXZlbnQuCi0JICogCi0JICogQHBhcmFtIGFkZGVkIGFkZGVkIG1vZHVsZXMKLQkgKiBAcGFyYW0gcmVtb3ZlZCByZW1vdmVkIG1vZHVsZXMKLQkgKi8KLQlwdWJsaWMgTW9kdWxlRmFjdG9yeUV2ZW50KElNb2R1bGVbXSBhZGRlZCwgSU1vZHVsZVtdIHJlbW92ZWQpIHsKLQkJdGhpcy5hZGRlZCA9IGFkZGVkOwotCQl0aGlzLnJlbW92ZWQgPSByZW1vdmVkOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW55IG1vZHVsZXMgdGhhdCBoYXZlIGJlZW4gYWRkZWQuCi0JICogCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSU1vZHVsZVtdCi0JICovCi0JcHVibGljIElNb2R1bGVbXSBnZXRBZGRlZE1vZHVsZXMoKSB7Ci0JCXJldHVybiBhZGRlZDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFueSBtb2R1bGVzIHRoYXQgaGF2ZSBiZWVuIHJlbW92ZWQuCi0JICogCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSU1vZHVsZVtdCi0JICovCi0JcHVibGljIElNb2R1bGVbXSBnZXRSZW1vdmVkTW9kdWxlcygpIHsKLQkJcmV0dXJuIHJlbW92ZWQ7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL01vZHVsZUZpbGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL01vZHVsZUZpbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTVjNGUwMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9Nb2R1bGVGaWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi2gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklNb2R1bGVGaWxlOwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIE1vZHVsZUZpbGUgaW1wbGVtZW50cyBJTW9kdWxlRmlsZSB7Ci0JcHJvdGVjdGVkIElGaWxlIGZpbGU7Ci0JcHJvdGVjdGVkIEZpbGUgZmlsZTI7Ci0JcHJvdGVjdGVkIFN0cmluZyBuYW1lOwotCXByb3RlY3RlZCBJUGF0aCBwYXRoOwotCXByb3RlY3RlZCBsb25nIHN0YW1wID0gLTE7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgd29ya3NwYWNlIG1vZHVsZSBmaWxlIHdpdGggdGhlIGN1cnJlbnQgbW9kaWZpY2F0aW9uIHN0YW1wLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcGFyYW0gcGF0aAotCSAqLwotCXB1YmxpYyBNb2R1bGVGaWxlKElGaWxlIGZpbGUsIFN0cmluZyBuYW1lLCBJUGF0aCBwYXRoKSB7Ci0JCXRoaXMuZmlsZSA9IGZpbGU7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMucGF0aCA9IHBhdGg7Ci0JCWlmIChmaWxlICE9IG51bGwpCi0JCQlzdGFtcCA9IGZpbGUuZ2V0TW9kaWZpY2F0aW9uU3RhbXAoKSArIGZpbGUuZ2V0TG9jYWxUaW1lU3RhbXAoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGV4dGVybmFsIG1vZHVsZSBmaWxlIHdpdGggdGhlIGN1cnJlbnQgbW9kaWZpY2F0aW9uIHN0YW1wLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcGFyYW0gcGF0aAotCSAqLwotCXB1YmxpYyBNb2R1bGVGaWxlKEZpbGUgZmlsZSwgU3RyaW5nIG5hbWUsIElQYXRoIHBhdGgpIHsKLQkJdGhpcy5maWxlMiA9IGZpbGU7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMucGF0aCA9IHBhdGg7Ci0JCWlmIChmaWxlICE9IG51bGwpCi0JCQlzdGFtcCA9IGZpbGUyLmxhc3RNb2RpZmllZCgpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSB3b3Jrc3BhY2UgbW9kdWxlIGZpbGUgd2l0aCBhIHNwZWNpZmljIG1vZGlmaWNhdGlvbiBzdGFtcC4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZQotCSAqIEBwYXJhbSBuYW1lCi0JICogQHBhcmFtIHBhdGgKLQkgKiBAcGFyYW0gc3RhbXAKLQkgKiBAZGVwcmVjYXRlZCB1c2Ugb25lIG9mIHRoZSB0b3AgdHdvIGNvbnN0cnVjdG9ycyBpbnN0ZWFkCi0JICovCi0JcHVibGljIE1vZHVsZUZpbGUoSUZpbGUgZmlsZSwgU3RyaW5nIG5hbWUsIElQYXRoIHBhdGgsIGxvbmcgc3RhbXApIHsKLQkJdGhpcy5maWxlID0gZmlsZTsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5wYXRoID0gcGF0aDsKLQkJdGhpcy5zdGFtcCA9IHN0YW1wOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBtb2R1bGUgZmlsZSB3aXRoIGEgc3BlY2lmaWMgbW9kaWZpY2F0aW9uIHN0YW1wIGFuZCBubwotCSAqIGZpbGUgcmVmZXJlbmNlLgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogQHBhcmFtIHBhdGgKLQkgKiBAcGFyYW0gc3RhbXAKLQkgKi8KLQlwdWJsaWMgTW9kdWxlRmlsZShTdHJpbmcgbmFtZSwgSVBhdGggcGF0aCwgbG9uZyBzdGFtcCkgewotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLnBhdGggPSBwYXRoOwotCQl0aGlzLnN0YW1wID0gc3RhbXA7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklNb2R1bGVGaWxlI2dldE1vZGlmaWNhdGlvblN0YW1wKCkKLQkgKi8KLQlwdWJsaWMgbG9uZyBnZXRNb2RpZmljYXRpb25TdGFtcCgpIHsKLQkJcmV0dXJuIHN0YW1wOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5JTW9kdWxlUmVzb3VyY2UjZ2V0TW9kdWxlUmVsYXRpdmVQYXRoKCkKLQkgKi8KLQlwdWJsaWMgSVBhdGggZ2V0TW9kdWxlUmVsYXRpdmVQYXRoKCkgewotCQlyZXR1cm4gcGF0aDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSU1vZHVsZVJlc291cmNlI2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJaWYgKCEob2JqIGluc3RhbmNlb2YgSU1vZHVsZUZpbGUpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJSU1vZHVsZUZpbGUgbWYgPSAoSU1vZHVsZUZpbGUpIG9iajsKLQkJaWYgKCFuYW1lLmVxdWFscyhtZi5nZXROYW1lKCkpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoIXBhdGguZXF1YWxzKG1mLmdldE1vZHVsZVJlbGF0aXZlUGF0aCgpKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIG5hbWUuaGFzaENvZGUoKSAqIDM3ICsgcGF0aC5oYXNoQ29kZSgpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBjbCkgewotCQlpZiAoSUZpbGUuY2xhc3MuZXF1YWxzKGNsKSkKLQkJCXJldHVybiBmaWxlOwotCQlpZiAoRmlsZS5jbGFzcy5lcXVhbHMoY2wpKQotCQkJcmV0dXJuIGZpbGUyOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIk1vZHVsZUZpbGUgWyIgKyBuYW1lICsgIiwgIiArIHBhdGggKyAiLCAiICsgc3RhbXAgKyAiXSI7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL01vZHVsZUZvbGRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvTW9kdWxlRm9sZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxN2Y5NjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvTW9kdWxlRm9sZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi2gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5JTW9kdWxlRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5JTW9kdWxlUmVzb3VyY2U7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgTW9kdWxlRm9sZGVyIGltcGxlbWVudHMgSU1vZHVsZUZvbGRlciB7Ci0JcHJvdGVjdGVkIElDb250YWluZXIgY29udGFpbmVyOwotCXByb3RlY3RlZCBTdHJpbmcgbmFtZTsKLQlwcm90ZWN0ZWQgSVBhdGggcGF0aDsKLQlwcm90ZWN0ZWQgSU1vZHVsZVJlc291cmNlW10gbWVtYmVyczsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSB3b3Jrc3BhY2UgbW9kdWxlIGZvbGRlci4KLQkgKiAKLQkgKiBAcGFyYW0gY29udGFpbmVyCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcGFyYW0gcGF0aAotCSAqLwotCXB1YmxpYyBNb2R1bGVGb2xkZXIoSUNvbnRhaW5lciBjb250YWluZXIsIFN0cmluZyBuYW1lLCBJUGF0aCBwYXRoKSB7Ci0JCXRoaXMuY29udGFpbmVyID0gY29udGFpbmVyOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLnBhdGggPSBwYXRoOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSB3b3Jrc3BhY2UgbW9kdWxlIGZvbGRlciB3aXRoIG5vIGZvbGRlciByZWZlcmVuY2UuCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcGFyYW0gcGF0aAotCSAqLwotCXB1YmxpYyBNb2R1bGVGb2xkZXIoU3RyaW5nIG5hbWUsIElQYXRoIHBhdGgpIHsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5wYXRoID0gcGF0aDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBtZW1iZXJzIChjb250ZW50cykgb2YgdGhpcyBmb2xkZXIuCi0JICogCi0JICogQHBhcmFtIG1lbWJlcnMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNZW1iZXJzKElNb2R1bGVSZXNvdXJjZVtdIG1lbWJlcnMpIHsKLQkJdGhpcy5tZW1iZXJzID0gbWVtYmVyczsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSU1vZHVsZVJlc291cmNlI2dldE1vZHVsZVJlbGF0aXZlUGF0aCgpCi0JICovCi0JcHVibGljIElQYXRoIGdldE1vZHVsZVJlbGF0aXZlUGF0aCgpIHsKLQkJcmV0dXJuIHBhdGg7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklNb2R1bGVSZXNvdXJjZSNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5JTW9kdWxlRm9sZGVyI21lbWJlcnMoKQotCSAqLwotCXB1YmxpYyBJTW9kdWxlUmVzb3VyY2VbXSBtZW1iZXJzKCkgewotCQlyZXR1cm4gbWVtYmVyczsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlpZiAoIShvYmogaW5zdGFuY2VvZiBNb2R1bGVGb2xkZXIpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJTW9kdWxlRm9sZGVyIG1mID0gKE1vZHVsZUZvbGRlcikgb2JqOwotCQlpZiAoIW5hbWUuZXF1YWxzKG1mLm5hbWUpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoIXBhdGguZXF1YWxzKG1mLnBhdGgpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gbmFtZS5oYXNoQ29kZSgpICogMzcgKyBwYXRoLmhhc2hDb2RlKCk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGNsKSB7Ci0JCWlmIChJQ29udGFpbmVyLmNsYXNzLmVxdWFscyhjbCkgfHwgSUZvbGRlci5jbGFzcy5lcXVhbHMoY2wpKQotCQkJcmV0dXJuIGNvbnRhaW5lcjsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJNb2R1bGVGb2xkZXIgWyIgKyBuYW1lICsgIiwgIiArIHBhdGggKyAiXSI7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL01vZHVsZUtpbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL01vZHVsZUtpbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JkODE4NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9Nb2R1bGVLaW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgTW9kdWxlS2luZCB7Ci0JcHJvdGVjdGVkIFN0cmluZyBpZDsKLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWU7Ci0JCi0JcHVibGljIE1vZHVsZUtpbmQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuaWQgPSBjZS5nZXRBdHRyaWJ1dGUoImlkIik7Ci0JCXRoaXMubmFtZSA9IGNlLmdldEF0dHJpYnV0ZSgibmFtZSIpOwotCX0KLQkKLQlwdWJsaWMgTW9kdWxlS2luZChTdHJpbmcgaWQsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuaWQgPSBpZDsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJNb2R1bGVUeXBlWyIgKyBpZCArICIsICIgKyBuYW1lICsgIl0iOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9Nb2R1bGVQcm9wZXJ0aWVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9Nb2R1bGVQcm9wZXJ0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1NTU2MzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvTW9kdWxlUHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS4qOwotLyoqCi0gKiBIZWxwZXIgY2xhc3MgdGhhdCBzdG9yZXMgcHJlZmVyZW5jZSBpbmZvcm1hdGlvbiBmb3IgdGhlIHNlcnZlciB0b29scy4KLSAqLwotcHVibGljIGNsYXNzIE1vZHVsZVByb3BlcnRpZXMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RVTEVfREFUQV9GSUxFID0gIm1vZHVsZXMueG1sIjsKLQotCXByb3RlY3RlZCBzdGF0aWMgTW9kdWxlUHJvcGVydGllcyBpbnN0YW5jZTsKLQlwcm90ZWN0ZWQgTWFwIG1vZHVsZXM7Ci0KLQkvKioKLQkgKiBNb2R1bGVQcm9wZXJ0aWVzIGNvbnN0cnVjdG9yLgotCSAqLwotCXByb3RlY3RlZCBNb2R1bGVQcm9wZXJ0aWVzKCkgewotCQlzdXBlcigpOwotCQlsb2FkKCk7Ci0JCWluc3RhbmNlID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzdGF0aWMgaW5zdGFuY2UuCi0JICogCi0JICogQHJldHVybiBhIHN0YXRpYyBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgTW9kdWxlUHJvcGVydGllcyBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpCi0JCQluZXcgTW9kdWxlUHJvcGVydGllcygpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCQotCS8qKgotCSAqIExvYWQgdGhlIGRhdGEuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGxvYWQoKSB7Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIkxvYWRpbmcgbW9kdWxlIGluZm8iKTsKLQkJU3RyaW5nIGZpbGVuYW1lID0gU2VydmVyUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U3RhdGVMb2NhdGlvbigpLmFwcGVuZChNT0RVTEVfREFUQV9GSUxFKS50b09TU3RyaW5nKCk7Ci0JCW1vZHVsZXMgPSBuZXcgSGFzaE1hcCgpOwotCQkKLQkJdHJ5IHsKLQkJCUlNZW1lbnRvIG1lbWVudG8gPSBYTUxNZW1lbnRvLmxvYWRNZW1lbnRvKGZpbGVuYW1lKTsKLQkJCQotCQkJSU1lbWVudG9bXSBjaGlsZHJlbiA9IG1lbWVudG8uZ2V0Q2hpbGRyZW4oIm1vZHVsZSIpOwotCQkJaW50IHNpemUgPSBjaGlsZHJlbi5sZW5ndGg7Ci0JCQkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJU3RyaW5nIG1vZHVsZUlkID0gY2hpbGRyZW5baV0uZ2V0U3RyaW5nKCJtb2R1bGVJZCIpOwotCQkJCVN0cmluZyBzZXJ2ZXJJZCA9IGNoaWxkcmVuW2ldLmdldFN0cmluZygic2VydmVySWQiKTsKLQkJCQltb2R1bGVzLnB1dChtb2R1bGVJZCwgc2VydmVySWQpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIkNvdWxkIG5vdCBsb2FkIHNlcnZlcnM6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNhdmUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBmaWxlbmFtZSA9IFNlcnZlclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFN0YXRlTG9jYXRpb24oKS5hcHBlbmQoTU9EVUxFX0RBVEFfRklMRSkudG9PU1N0cmluZygpOwotCQkKLQkJdHJ5IHsKLQkJCVhNTE1lbWVudG8gbWVtZW50byA9IFhNTE1lbWVudG8uY3JlYXRlV3JpdGVSb290KCJtb2R1bGVzIik7Ci0KLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbW9kdWxlcy5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCVN0cmluZyBtb2R1bGVJZCA9IChTdHJpbmcpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlTdHJpbmcgc2VydmVySWQgPSAoU3RyaW5nKSBtb2R1bGVzLmdldChtb2R1bGVJZCk7Ci0KLQkJCQlJTWVtZW50byBjaGlsZCA9IG1lbWVudG8uY3JlYXRlQ2hpbGQoIm1vZHVsZSIpOwotCQkJCWNoaWxkLnB1dFN0cmluZygibW9kdWxlSWQiLCBtb2R1bGVJZCk7Ci0JCQkJY2hpbGQucHV0U3RyaW5nKCJzZXJ2ZXJJZCIsIHNlcnZlcklkKTsKLQkJCX0KLQotCQkJbWVtZW50by5zYXZlVG9GaWxlKGZpbGVuYW1lKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBzYXZlIHNlcnZlcnMiLCBlKTsKLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBTZXJ2ZXJDb3JlI2dldERlZmF1bHRTZXJ2ZXIoSU1vZHVsZSkKLQkgKi8KLQlwdWJsaWMgSVNlcnZlciBnZXREZWZhdWx0U2VydmVyKElNb2R1bGUgbW9kdWxlKSB7Ci0JCWlmIChtb2R1bGUgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJCi0JCVN0cmluZyBzZXJ2ZXJJZCA9IChTdHJpbmcpIG1vZHVsZXMuZ2V0KG1vZHVsZS5nZXRJZCgpKTsKLQkJaWYgKHNlcnZlcklkID09IG51bGwgfHwgc2VydmVySWQubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBudWxsOwotCQkKLQkJcmV0dXJuIFNlcnZlckNvcmUuZmluZFNlcnZlcihzZXJ2ZXJJZCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIFNlcnZlckNvcmUjc2V0RGVmYXVsdFNlcnZlcihJTW9kdWxlLCBJU2VydmVyLCBJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRTZXJ2ZXIoSU1vZHVsZSBtb2R1bGUsIElTZXJ2ZXIgc2VydmVyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKG1vZHVsZSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQkKLQkJU3RyaW5nIG5ld1NlcnZlcklkID0gbnVsbDsKLQkJaWYgKHNlcnZlciAhPSBudWxsKQotCQkJbmV3U2VydmVySWQgPSBzZXJ2ZXIuZ2V0SWQoKTsKLQkJCi0JCVN0cmluZyBzZXJ2ZXJJZCA9IChTdHJpbmcpIG1vZHVsZXMuZ2V0KG1vZHVsZS5nZXRJZCgpKTsKLQkJaWYgKHNlcnZlcklkID09IG51bGwgJiYgbmV3U2VydmVySWQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKHNlcnZlcklkICE9IG51bGwgJiYgc2VydmVySWQuZXF1YWxzKG5ld1NlcnZlcklkKSkKLQkJCXJldHVybjsKLQkJCi0JCW1vZHVsZXMucHV0KG1vZHVsZS5nZXRJZCgpLCBuZXdTZXJ2ZXJJZCk7Ci0JCXNhdmUobW9uaXRvcik7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJNb2R1bGVQcm9wZXJ0aWVzW10iOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9Nb2R1bGVQdWJsaXNoSW5mby5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvTW9kdWxlUHVibGlzaEluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTlhZTM0NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9Nb2R1bGVQdWJsaXNoSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotoCogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5JTW9kdWxlRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSU1vZHVsZUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSU1vZHVsZVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5JTW9kdWxlUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuTW9kdWxlRGVsZWdhdGU7Ci0vKioKLSAqIFB1Ymxpc2ggaW5mb3JtYXRpb24gZm9yIGEgc3BlY2lmaWMgbW9kdWxlIG9uIGEgc3BlY2lmaWMgc2VydmVyLgotICovCi1wdWJsaWMgY2xhc3MgTW9kdWxlUHVibGlzaEluZm8gewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RVTEVfSUQgPSAibW9kdWxlLWlkcyI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUUgPSAibmFtZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1PRFVMRV9UWVBFX0lEID0gIm1vZHVsZS10eXBlLWlkIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9EVUxFX1RZUEVfVkVSU0lPTiA9ICJtb2R1bGUtdHlwZS12ZXJzaW9uIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFUSCA9ICJwYXRoIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBTVAgPSAic3RhbXAiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFID0gImZpbGUiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT0xERVIgPSAiZm9sZGVyIjsKLQotCXByaXZhdGUgU3RyaW5nIG1vZHVsZUlkOwotCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JcHJpdmF0ZSBJTW9kdWxlUmVzb3VyY2VbXSByZXNvdXJjZXMgPSBuZXcgSU1vZHVsZVJlc291cmNlWzBdOwotCXByaXZhdGUgSU1vZHVsZVR5cGUgbW9kdWxlVHlwZTsKLQotCXByaXZhdGUgYm9vbGVhbiB1c2VDYWNoZTsKLQlwcml2YXRlIElNb2R1bGVSZXNvdXJjZVtdIGN1cnJlbnRSZXNvdXJjZXMgPSBudWxsOwotCXByaXZhdGUgSU1vZHVsZVJlc291cmNlRGVsdGFbXSBkZWx0YSA9IG51bGw7Ci0JcHJpdmF0ZSBib29sZWFuIGhhc0RlbHRhOwotCi0JLyoqCi0JICogTW9kdWxlUHVibGlzaEluZm8gY29uc3RydWN0b3IuCi0JICogCi0JICogQHBhcmFtIG1vZHVsZUlkIGEgbW9kdWxlIGlkCi0JICogQHBhcmFtIG5hbWUgdGhlIG1vZHVsZSdzIG5hbWUKLQkgKiBAcGFyYW0gbW9kdWxlVHlwZSB0aGUgbW9kdWxlIHR5cGUKLQkgKi8KLQlwdWJsaWMgTW9kdWxlUHVibGlzaEluZm8oU3RyaW5nIG1vZHVsZUlkLCBTdHJpbmcgbmFtZSwgSU1vZHVsZVR5cGUgbW9kdWxlVHlwZSkgewotCQlzdXBlcigpOwotCi0JCXRoaXMubW9kdWxlSWQgPSBtb2R1bGVJZDsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5tb2R1bGVUeXBlID0gbW9kdWxlVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBNb2R1bGVQdWJsaXNoSW5mbyBjb25zdHJ1Y3Rvci4KLQkgKiAKLQkgKiBAcGFyYW0gbWVtZW50byBhIG1lbWVudG8KLQkgKi8KLQlwdWJsaWMgTW9kdWxlUHVibGlzaEluZm8oSU1lbWVudG8gbWVtZW50bykgewotCQlzdXBlcigpOwotCQkKLQkJbG9hZChtZW1lbnRvKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE1vZHVsZUlkKCkgewotCQlyZXR1cm4gbW9kdWxlSWQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQlwdWJsaWMgSU1vZHVsZVR5cGUgZ2V0TW9kdWxlVHlwZSgpIHsKLQkJcmV0dXJuIG1vZHVsZVR5cGU7Ci0JfQotCi0JcHVibGljIElNb2R1bGVSZXNvdXJjZVtdIGdldFJlc291cmNlcygpIHsKLQkJcmV0dXJuIHJlc291cmNlczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZXMoSU1vZHVsZVJlc291cmNlW10gcmVzKSB7Ci0JCXJlc291cmNlcyA9IHJlczsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsb2FkKElNZW1lbnRvIG1lbWVudG8pIHsKLQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiTG9hZGluZyBtb2R1bGUgcHVibGlzaCBpbmZvIGZvcjogIiArIG1lbWVudG8pOwotCQotCQl0cnkgewotCQkJbW9kdWxlSWQgPSBtZW1lbnRvLmdldFN0cmluZyhNT0RVTEVfSUQpOwotCQkJbmFtZSA9IG1lbWVudG8uZ2V0U3RyaW5nKE5BTUUpOwotCQkJU3RyaW5nIG10ID0gbWVtZW50by5nZXRTdHJpbmcoTU9EVUxFX1RZUEVfSUQpOwotCQkJU3RyaW5nIG12ID0gbWVtZW50by5nZXRTdHJpbmcoTU9EVUxFX1RZUEVfVkVSU0lPTik7Ci0JCQlpZiAobXQgIT0gbnVsbCAmJiBtdC5sZW5ndGgoKSA+IDApCi0JCQkJbW9kdWxlVHlwZSA9IG5ldyBNb2R1bGVUeXBlKG10LCBtdik7Ci0JCi0JCQlyZXNvdXJjZXMgPSBsb2FkUmVzb3VyY2UobWVtZW50byk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiQ291bGQgbm90IGxvYWQgbW9kdWxlIHB1Ymxpc2ggaW5mbyBpbmZvcm1hdGlvbjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBJTW9kdWxlUmVzb3VyY2VbXSBsb2FkUmVzb3VyY2UoSU1lbWVudG8gbWVtZW50bykgewotCQlpZiAobWVtZW50byA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBJTW9kdWxlUmVzb3VyY2VbMF07Ci0JCQotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KDUpOwotCQkKLQkJLy8gbG9hZCBmaWxlcwotCQlJTWVtZW50b1tdIGNoaWxkcmVuID0gbWVtZW50by5nZXRDaGlsZHJlbihGSUxFKTsKLQkJaWYgKGNoaWxkcmVuICE9IG51bGwpIHsKLQkJCWludCBzaXplID0gY2hpbGRyZW4ubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlTdHJpbmcgbmFtZTIgPSBjaGlsZHJlbltpXS5nZXRTdHJpbmcoTkFNRSk7Ci0JCQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKGNoaWxkcmVuW2ldLmdldFN0cmluZyhQQVRIKSk7Ci0JCQkJbG9uZyBzdGFtcCA9IExvbmcucGFyc2VMb25nKGNoaWxkcmVuW2ldLmdldFN0cmluZyhTVEFNUCkpOwotCQkJCU1vZHVsZUZpbGUgZmlsZSA9IG5ldyBNb2R1bGVGaWxlKG5hbWUyLCBwYXRoLCBzdGFtcCk7Ci0JCQkJbGlzdC5hZGQoZmlsZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIGxvYWQgZm9sZGVycwotCQljaGlsZHJlbiA9IG1lbWVudG8uZ2V0Q2hpbGRyZW4oRk9MREVSKTsKLQkJaWYgKGNoaWxkcmVuICE9IG51bGwpIHsKLQkJCWludCBzaXplID0gY2hpbGRyZW4ubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlTdHJpbmcgbmFtZTIgPSBjaGlsZHJlbltpXS5nZXRTdHJpbmcoTkFNRSk7Ci0JCQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKGNoaWxkcmVuW2ldLmdldFN0cmluZyhQQVRIKSk7Ci0JCQkJTW9kdWxlRm9sZGVyIGZvbGRlciA9IG5ldyBNb2R1bGVGb2xkZXIobnVsbCwgbmFtZTIsIHBhdGgpOwotCQkJCWZvbGRlci5zZXRNZW1iZXJzKGxvYWRSZXNvdXJjZShjaGlsZHJlbltpXSkpOwotCQkJCWxpc3QuYWRkKGZvbGRlcik7Ci0JCQl9Ci0JCX0KLQkJCi0JCUlNb2R1bGVSZXNvdXJjZVtdIHJlc291cmNlczIgPSBuZXcgSU1vZHVsZVJlc291cmNlW2xpc3Quc2l6ZSgpXTsKLQkJbGlzdC50b0FycmF5KHJlc291cmNlczIpOwotCQlyZXR1cm4gcmVzb3VyY2VzMjsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzYXZlKElNZW1lbnRvIG1lbWVudG8pIHsKLQkJdHJ5IHsKLQkJCW1lbWVudG8ucHV0U3RyaW5nKE1PRFVMRV9JRCwgbW9kdWxlSWQpOwotCQkJaWYgKG5hbWUgIT0gbnVsbCkKLQkJCQltZW1lbnRvLnB1dFN0cmluZyhOQU1FLCBuYW1lKTsKLQkJCQotCQkJaWYgKG1vZHVsZVR5cGUgIT0gbnVsbCkgewotCQkJCW1lbWVudG8ucHV0U3RyaW5nKE1PRFVMRV9UWVBFX0lELCBtb2R1bGVUeXBlLmdldElkKCkpOwotCQkJCW1lbWVudG8ucHV0U3RyaW5nKE1PRFVMRV9UWVBFX1ZFUlNJT04sIG1vZHVsZVR5cGUuZ2V0VmVyc2lvbigpKTsKLQkJCX0KLQkJCQotCQkJc2F2ZVJlc291cmNlKG1lbWVudG8sIHJlc291cmNlcyk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3Qgc2F2ZSBtb2R1bGUgcHVibGlzaCBpbmZvIiwgZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzYXZlUmVzb3VyY2UoSU1lbWVudG8gbWVtZW50bywgSU1vZHVsZVJlc291cmNlW10gcmVzb3VyY2VzMikgewotCQlpZiAocmVzb3VyY2VzMiA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpbnQgc2l6ZSA9IHJlc291cmNlczIubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJaWYgKHJlc291cmNlczJbaV0gaW5zdGFuY2VvZiBJTW9kdWxlRmlsZSkgewotCQkJCUlNb2R1bGVGaWxlIGZpbGUgPSAoSU1vZHVsZUZpbGUpIHJlc291cmNlczJbaV07Ci0JCQkJSU1lbWVudG8gY2hpbGQgPSBtZW1lbnRvLmNyZWF0ZUNoaWxkKEZJTEUpOwotCQkJCWNoaWxkLnB1dFN0cmluZyhOQU1FLCBmaWxlLmdldE5hbWUoKSk7Ci0JCQkJY2hpbGQucHV0U3RyaW5nKFBBVEgsIGZpbGUuZ2V0TW9kdWxlUmVsYXRpdmVQYXRoKCkudG9Qb3J0YWJsZVN0cmluZygpKTsKLQkJCQljaGlsZC5wdXRTdHJpbmcoU1RBTVAsICIiICsgZmlsZS5nZXRNb2RpZmljYXRpb25TdGFtcCgpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJSU1vZHVsZUZvbGRlciBmb2xkZXIgPSAoSU1vZHVsZUZvbGRlcikgcmVzb3VyY2VzMltpXTsKLQkJCQlJTWVtZW50byBjaGlsZCA9IG1lbWVudG8uY3JlYXRlQ2hpbGQoRk9MREVSKTsKLQkJCQljaGlsZC5wdXRTdHJpbmcoTkFNRSwgZm9sZGVyLmdldE5hbWUoKSk7Ci0JCQkJY2hpbGQucHV0U3RyaW5nKFBBVEgsIGZvbGRlci5nZXRNb2R1bGVSZWxhdGl2ZVBhdGgoKS50b1BvcnRhYmxlU3RyaW5nKCkpOwotCQkJCUlNb2R1bGVSZXNvdXJjZVtdIHJlc291cmNlczMgPSBmb2xkZXIubWVtYmVycygpOwotCQkJCXNhdmVSZXNvdXJjZShjaGlsZCwgcmVzb3VyY2VzMyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdGFydCB1c2luZyB0aGUgbW9kdWxlIGNhY2hlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHN0YXJ0Q2FjaGluZygpIHsKLQkJdXNlQ2FjaGUgPSB0cnVlOwotCQljdXJyZW50UmVzb3VyY2VzID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBGaWxsIHRoZSBtb2R1bGUgY2FjaGUuCi0JICogCi0JICogQHBhcmFtIG1vZHVsZQotCSAqLwotCXByaXZhdGUgdm9pZCBmaWxsQ2FjaGUoSU1vZHVsZVtdIG1vZHVsZSkgewotCQlpZiAoY3VycmVudFJlc291cmNlcyAhPSBudWxsKQotCQkJcmV0dXJuOwotCQl0cnkgewotCQkJaW50IHNpemUgPSBtb2R1bGUubGVuZ3RoOwotCQkJTW9kdWxlRGVsZWdhdGUgcG0gPSAoTW9kdWxlRGVsZWdhdGUpIG1vZHVsZVtzaXplIC0gMV0ubG9hZEFkYXB0ZXIoTW9kdWxlRGVsZWdhdGUuY2xhc3MsIG51bGwpOwotCQkJaWYgKHBtICE9IG51bGwpCi0JCQkJY3VycmVudFJlc291cmNlcyA9IHBtLm1lbWJlcnMoKTsKLQkJCWVsc2UKLQkJCQljdXJyZW50UmVzb3VyY2VzID0gbmV3IElNb2R1bGVSZXNvdXJjZVswXTsKLQkJCQotCQkJZGVsdGEgPSBTZXJ2ZXJQdWJsaXNoSW5mby5nZXREZWx0YShyZXNvdXJjZXMsIGN1cnJlbnRSZXNvdXJjZXMpOwotCQkJaGFzRGVsdGEgPSAoZGVsdGEgIT0gbnVsbCAmJiBkZWx0YS5sZW5ndGggPiAwKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIkNvdWxkbid0IGZpbGwgcHVibGlzaCBjYWNoZSBmb3IgIiArIG1vZHVsZSk7Ci0JCX0KLQkJaWYgKGRlbHRhID09IG51bGwpCi0JCQlkZWx0YSA9IG5ldyBJTW9kdWxlUmVzb3VyY2VEZWx0YVswXTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjbGVhckNhY2hlKCkgewotCQl1c2VDYWNoZSA9IGZhbHNlOwotCQljdXJyZW50UmVzb3VyY2VzID0gbnVsbDsKLQkJZGVsdGEgPSBudWxsOwotCX0KLQotCXByb3RlY3RlZCBJTW9kdWxlUmVzb3VyY2VbXSBnZXRNb2R1bGVSZXNvdXJjZXMoSU1vZHVsZVtdIG1vZHVsZSkgewotCQlpZiAobW9kdWxlID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IElNb2R1bGVSZXNvdXJjZVswXTsKLQkJCi0JCWlmICh1c2VDYWNoZSkgewotCQkJZmlsbENhY2hlKG1vZHVsZSk7Ci0JCQlyZXR1cm4gY3VycmVudFJlc291cmNlczsKLQkJfQotCQkKLQkJaW50IHNpemUgPSBtb2R1bGUubGVuZ3RoOwotCQlNb2R1bGVEZWxlZ2F0ZSBwbSA9IChNb2R1bGVEZWxlZ2F0ZSkgbW9kdWxlW3NpemUgLSAxXS5sb2FkQWRhcHRlcihNb2R1bGVEZWxlZ2F0ZS5jbGFzcywgbnVsbCk7Ci0JCXRyeSB7Ci0JCQlpZiAocG0gIT0gbnVsbCkKLQkJCQlyZXR1cm4gcG0ubWVtYmVycygpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQlyZXR1cm4gbmV3IElNb2R1bGVSZXNvdXJjZVswXTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSU1vZHVsZVJlc291cmNlRGVsdGFbXSBnZXREZWx0YShJTW9kdWxlW10gbW9kdWxlKSB7Ci0JCWlmIChtb2R1bGUgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgSU1vZHVsZVJlc291cmNlRGVsdGFbMF07Ci0JCQotCQlpZiAodXNlQ2FjaGUpIHsKLQkJCWZpbGxDYWNoZShtb2R1bGUpOwotCQkJcmV0dXJuIGRlbHRhOwotCQl9Ci0JCQotCQlpbnQgc2l6ZSA9IG1vZHVsZS5sZW5ndGg7Ci0JCU1vZHVsZURlbGVnYXRlIHBtID0gKE1vZHVsZURlbGVnYXRlKSBtb2R1bGVbc2l6ZSAtIDFdLmxvYWRBZGFwdGVyKE1vZHVsZURlbGVnYXRlLmNsYXNzLCBudWxsKTsKLQkJSU1vZHVsZVJlc291cmNlW10gcmVzb3VyY2VzMiA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpZiAocG0gIT0gbnVsbCkKLQkJCQlyZXNvdXJjZXMyID0gcG0ubWVtYmVycygpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQlpZiAocmVzb3VyY2VzMiA9PSBudWxsKQotCQkJcmVzb3VyY2VzMiA9IG5ldyBJTW9kdWxlUmVzb3VyY2VbMF07Ci0JCXJldHVybiBTZXJ2ZXJQdWJsaXNoSW5mby5nZXREZWx0YShnZXRSZXNvdXJjZXMoKSwgcmVzb3VyY2VzMik7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzRGVsdGEoSU1vZHVsZVtdIG1vZHVsZSkgewotCQlpZiAobW9kdWxlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQlpZiAodXNlQ2FjaGUpIHsKLQkJCWZpbGxDYWNoZShtb2R1bGUpOwotCQkJcmV0dXJuIGhhc0RlbHRhOwotCQl9Ci0JCQotCQlpbnQgc2l6ZSA9IG1vZHVsZS5sZW5ndGg7Ci0JCU1vZHVsZURlbGVnYXRlIHBtID0gKE1vZHVsZURlbGVnYXRlKSBtb2R1bGVbc2l6ZSAtIDFdLmxvYWRBZGFwdGVyKE1vZHVsZURlbGVnYXRlLmNsYXNzLCBudWxsKTsKLQkJSU1vZHVsZVJlc291cmNlW10gcmVzb3VyY2VzMiA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpZiAocG0gIT0gbnVsbCkKLQkJCQlyZXNvdXJjZXMyID0gcG0ubWVtYmVycygpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQlpZiAocmVzb3VyY2VzMiA9PSBudWxsKQotCQkJcmVzb3VyY2VzMiA9IG5ldyBJTW9kdWxlUmVzb3VyY2VbMF07Ci0JCXJldHVybiBTZXJ2ZXJQdWJsaXNoSW5mby5oYXNEZWx0YShnZXRSZXNvdXJjZXMoKSwgcmVzb3VyY2VzMik7Ci0JfQotCi0JcHVibGljIHZvaWQgZmlsbChJTW9kdWxlW10gbW9kdWxlKSB7Ci0JCWlmIChtb2R1bGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCWlmICh1c2VDYWNoZSkgewotCQkJZmlsbENhY2hlKG1vZHVsZSk7Ci0JCQlzZXRSZXNvdXJjZXMoY3VycmVudFJlc291cmNlcyk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWludCBzaXplID0gbW9kdWxlLmxlbmd0aDsKLQkJTW9kdWxlRGVsZWdhdGUgcG0gPSAoTW9kdWxlRGVsZWdhdGUpIG1vZHVsZVtzaXplIC0gMV0ubG9hZEFkYXB0ZXIoTW9kdWxlRGVsZWdhdGUuY2xhc3MsIG51bGwpOwotCQl0cnkgewotCQkJaWYgKHBtICE9IG51bGwpCi0JCQkJc2V0UmVzb3VyY2VzKHBtLm1lbWJlcnMoKSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJNb2R1bGVQdWJsaXNoSW5mbyBbIiArIG1vZHVsZUlkICsgIl0iOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9Nb2R1bGVSZXNvdXJjZURlbHRhLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9Nb2R1bGVSZXNvdXJjZURlbHRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0NzljNzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvTW9kdWxlUmVzb3VyY2VEZWx0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi2gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklNb2R1bGVSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSU1vZHVsZVJlc291cmNlRGVsdGE7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgTW9kdWxlUmVzb3VyY2VEZWx0YSBpbXBsZW1lbnRzIElNb2R1bGVSZXNvdXJjZURlbHRhIHsKLQlwcm90ZWN0ZWQgSU1vZHVsZVJlc291cmNlIHJlc291cmNlOwotCXByb3RlY3RlZCBpbnQga2luZDsKLQkKLQlwcm90ZWN0ZWQgSU1vZHVsZVJlc291cmNlRGVsdGFbXSBjaGlsZHJlbjsKLQotCXB1YmxpYyBNb2R1bGVSZXNvdXJjZURlbHRhKElNb2R1bGVSZXNvdXJjZSByZXNvdXJjZSwgaW50IGtpbmQpIHsKLQkJdGhpcy5yZXNvdXJjZSA9IHJlc291cmNlOwotCQl0aGlzLmtpbmQgPSBraW5kOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRDaGlsZHJlbihJTW9kdWxlUmVzb3VyY2VEZWx0YVtdIGNoaWxkcmVuKSB7Ci0JCXRoaXMuY2hpbGRyZW4gPSBjaGlsZHJlbjsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSU1vZHVsZVJlc291cmNlI2dldE1vZHVsZVJlbGF0aXZlUGF0aCgpCi0JICovCi0JcHVibGljIElQYXRoIGdldE1vZHVsZVJlbGF0aXZlUGF0aCgpIHsKLQkJcmV0dXJuIHJlc291cmNlLmdldE1vZHVsZVJlbGF0aXZlUGF0aCgpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5JTW9kdWxlUmVzb3VyY2VEZWx0YSNnZXRNb2R1bGVSZXNvdXJjZSgpCi0JICovCi0JcHVibGljIElNb2R1bGVSZXNvdXJjZSBnZXRNb2R1bGVSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIHJlc291cmNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5JTW9kdWxlUmVzb3VyY2VEZWx0YSNnZXRLaW5kKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldEtpbmQoKSB7Ci0JCXJldHVybiBraW5kOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5JTW9kdWxlUmVzb3VyY2VEZWx0YSNnZXRBZmZlY3RlZENoaWxkcmVuKCkKLQkgKi8KLQlwdWJsaWMgSU1vZHVsZVJlc291cmNlRGVsdGFbXSBnZXRBZmZlY3RlZENoaWxkcmVuKCkgewotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJNb2R1bGVSZXNvdXJjZURlbHRhIFsiICsgcmVzb3VyY2UgKyAiLCAiICsga2luZCArICJdIjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdHJhY2UoU3RyaW5nIGluZGVudCkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oaW5kZW50ICsgdG9TdHJpbmcoKSk7Ci0JCWlmIChjaGlsZHJlbiAhPSBudWxsKSB7Ci0JCQlpbnQgc2l6ZSA9IGNoaWxkcmVuLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJKChNb2R1bGVSZXNvdXJjZURlbHRhKWNoaWxkcmVuW2ldKS50cmFjZShpbmRlbnQgKyAiICAiKTsKLQkJCX0KLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9Nb2R1bGVUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9Nb2R1bGVUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzZjAyODEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvTW9kdWxlVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlVHlwZTsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2R1bGVUeXBlIGltcGxlbWVudHMgSU1vZHVsZVR5cGUgewotCXByb3RlY3RlZCBTdHJpbmcgaWQ7Ci0JcHJvdGVjdGVkIFN0cmluZyB2ZXJzaW9uOwotCQotCS8vCWNhY2hlZCBjb3B5IG9mIGFsbCBtb2R1bGUgdHlwZXMKLQlwcml2YXRlIHN0YXRpYyBMaXN0IG1vZHVsZVR5cGVzOwotCQotCXB1YmxpYyBNb2R1bGVUeXBlKFN0cmluZyBpZCwgU3RyaW5nIHZlcnNpb24pIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5pZCA9IGlkOwotCQl0aGlzLnZlcnNpb24gPSB2ZXJzaW9uOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlNb2R1bGVLaW5kIG10ID0gZmluZE1vZHVsZVR5cGUoaWQpOwotCQlpZiAobXQgIT0gbnVsbCkKLQkJCXJldHVybiBtdC5nZXROYW1lKCk7Ci0JCXJldHVybiBNZXNzYWdlcy5tb2R1bGVUeXBlVW5rbm93bjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFZlcnNpb24oKSB7Ci0JCXJldHVybiB2ZXJzaW9uOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGFsbCBrbm93biBtb2R1bGUgdHlwZXMuCi0JICogPHA+Ci0JICogQSBuZXcgYXJyYXkgaXMgcmV0dXJuZWQgb24gZWFjaCBjYWxsLCBzbyBjbGllbnRzIG1heSBzdG9yZSBvciBtb2RpZnkgdGhlIHJlc3VsdC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiB0aGUgYXJyYXkgb2YgbW9kdWxlIHR5cGVzIHtAbGluayBJTW9kdWxlVHlwZX0KLQkgKi8KLQkvKnB1YmxpYyBzdGF0aWMgSU1vZHVsZVR5cGVbXSBnZXRNb2R1bGVUeXBlcygpIHsKLQkJaWYgKG1vZHVsZVR5cGVzID09IG51bGwpCi0JCQlsb2FkTW9kdWxlVHlwZXMoKTsKLQkJCi0JCUlNb2R1bGVUeXBlW10gbXQgPSBuZXcgSU1vZHVsZVR5cGVbbW9kdWxlVHlwZXMuc2l6ZSgpXTsKLQkJbW9kdWxlVHlwZXMudG9BcnJheShtdCk7Ci0JCXJldHVybiBtdDsKLQl9Ki8KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1vZHVsZSB0eXBlIHdpdGggdGhlIGdpdmVuIGlkLCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIGlmIG5vbmUuIFRoaXMgY29udmVuaWVuY2UgbWV0aG9kIHNlYXJjaGVzIHRoZSBsaXN0IG9mIGtub3duCi0JICogbW9kdWxlIHR5cGVzIGZvciB0aGUgb25lIGEgbWF0Y2hpbmcKLQkgKiBtb2R1bGUgdHlwZSBpZCAoe0BsaW5rIE1vZHVsZVR5cGUjZ2V0SWQoKX0pLiBUaGUgaWQgbWF5IG5vdCBiZSBudWxsLgotCSAqCi0JICogQHBhcmFtIGlkIHRoZSBtb2R1bGUgdHlwZSBpZAotCSAqIEByZXR1cm4gdGhlIG1vZHVsZSB0eXBlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBubyBtb2R1bGUgdHlwZQotCSAqIHdpdGggdGhlIGdpdmVuIGlkCi0JICovCi0JcHVibGljIHN0YXRpYyBNb2R1bGVLaW5kIGZpbmRNb2R1bGVUeXBlKFN0cmluZyBpZCkgewotCQlpZiAoaWQgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQotCQlpZiAobW9kdWxlVHlwZXMgPT0gbnVsbCkKLQkJCWxvYWRNb2R1bGVUeXBlcygpOwotCQkKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBtb2R1bGVUeXBlcy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlNb2R1bGVLaW5kIG1vZHVsZVR5cGUgPSAoTW9kdWxlS2luZCkgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKGlkLmVxdWFscyhtb2R1bGVUeXBlLmdldElkKCkpKQotCQkJCXJldHVybiBtb2R1bGVUeXBlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBMb2FkIHRoZSBtb2R1bGUgdHlwZXMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgbG9hZE1vZHVsZVR5cGVzKCkgewotCQlpZiAobW9kdWxlVHlwZXMgIT0gbnVsbCkKLQkJCXJldHVybjsKLQkJVHJhY2UudHJhY2UoVHJhY2UuRVhURU5TSU9OX1BPSU5ULCAiLT4tIExvYWRpbmcgLm1vZHVsZVR5cGVzIGV4dGVuc2lvbiBwb2ludCAtPi0iKTsKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2YgPSByZWdpc3RyeS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgIm1vZHVsZVR5cGVzIik7Ci0KLQkJaW50IHNpemUgPSBjZi5sZW5ndGg7Ci0JCW1vZHVsZVR5cGVzID0gbmV3IEFycmF5TGlzdChzaXplKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJTW9kdWxlS2luZCBtb2R1bGVUeXBlID0gbmV3IE1vZHVsZUtpbmQoY2ZbaV0pOwotCQkJCW1vZHVsZVR5cGVzLmFkZChtb2R1bGVUeXBlKTsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5FWFRFTlNJT05fUE9JTlQsICIgIExvYWRlZCBtb2R1bGVUeXBlOiAiICsgY2ZbaV0uZ2V0QXR0cmlidXRlKCJpZCIpKTsKLQkJCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiICBDb3VsZCBub3QgbG9hZCBtb2R1bGVUeXBlOiAiICsgY2ZbaV0uZ2V0QXR0cmlidXRlKCJpZCIpLCB0KTsKLQkJCX0KLQkJfQotCQkKLQkJVHJhY2UudHJhY2UoVHJhY2UuRVhURU5TSU9OX1BPSU5ULCAiLTwtIERvbmUgbG9hZGluZyAubW9kdWxlVHlwZXMgZXh0ZW5zaW9uIHBvaW50IC08LSIpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiTW9kdWxlVHlwZVsiICsgaWQgKyAiLCAiICsgdmVyc2lvbiArICJdIjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvUHJvZ3Jlc3NVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9Qcm9ncmVzc1V0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTIxMGQxYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9Qcm9ncmVzc1V0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci0vKioKLSAqIFByb2dyZXNzIE1vbml0b3IgdXRpbGl0eS4KLSAqLwotcHVibGljIGNsYXNzIFByb2dyZXNzVXRpbCB7Ci0JLyoqCi0JICogUHJvZ3Jlc3NVdGlsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHJpdmF0ZSBQcm9ncmVzc1V0aWwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgdmFsaWQgcHJvZ3Jlc3MgbW9uaXRvci4KLQkgKgotCSAqIEBwYXJhbSBtb25pdG9yIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb2dyZXNzTW9uaXRvciBnZXRNb25pdG9yRm9yKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAobW9uaXRvciA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCXJldHVybiBtb25pdG9yOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHN1Yi1wcm9ncmVzcyBtb25pdG9yIHdpdGggdGhlIGdpdmVuIGFtb3VudCBvbiB0aGUKLQkgKiBjdXJyZW50IHByb2dyZXNzIG1vbml0b3IuCi0JICoKLQkgKiBAcGFyYW0gbW9uaXRvciBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcgotCSAqIEBwYXJhbSB0aWNrcyBpbnQKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvZ3Jlc3NNb25pdG9yIGdldFN1Yk1vbml0b3JGb3IoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBpbnQgdGlja3MpIHsKLQkJaWYgKG1vbml0b3IgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQlpZiAobW9uaXRvciBpbnN0YW5jZW9mIE51bGxQcm9ncmVzc01vbml0b3IpCi0JCQlyZXR1cm4gbW9uaXRvcjsKLQkJcmV0dXJuIG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgdGlja3MpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHN1Yi1wcm9ncmVzcyBtb25pdG9yIHdpdGggdGhlIGdpdmVuIGFtb3VudCBvbiB0aGUKLQkgKiBjdXJyZW50IHByb2dyZXNzIG1vbml0b3IuCi0JICoKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IKLQkgKiBAcGFyYW0gdGlja3MgdGhlIG51bWJlciBvZiB0aWNrcwotCSAqIEBwYXJhbSBzdHlsZSBhIHN0eWxlCi0JICogQHJldHVybiBhIHByb2dyZXNzIG1vbml0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQcm9ncmVzc01vbml0b3IgZ2V0U3ViTW9uaXRvckZvcihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIGludCB0aWNrcywgaW50IHN0eWxlKSB7Ci0JCWlmIChtb25pdG9yID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJaWYgKG1vbml0b3IgaW5zdGFuY2VvZiBOdWxsUHJvZ3Jlc3NNb25pdG9yKQotCQkJcmV0dXJuIG1vbml0b3I7Ci0JCXJldHVybiBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIHRpY2tzLCBzdHlsZSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1Byb2plY3RQcm9wZXJ0aWVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9Qcm9qZWN0UHJvcGVydGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODMxMGI0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1Byb2plY3RQcm9wZXJ0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZTsKLS8qKgotICogSGVscGVyIGNsYXNzIHRoYXQgc3RvcmVzIHByZWZlcmVuY2UgaW5mb3JtYXRpb24gZm9yIHRoZSBzZXJ2ZXIgdG9vbHMuCi0gKiAKLSAqIFRPRE86IEN1cnJlbnRseSB0aGlzIGNsYXNzIGFsd2F5cyByZWFkcyBmcm9tIGRpc2suIEl0IHNob3VsZCBjYWNoZSB0aGUgZmlsZQotICogYW5kIGhhdmUgYSByZXNvdXJjZSBsaXN0ZW5lci4KLSAqLwotcHVibGljIGNsYXNzIFByb2plY3RQcm9wZXJ0aWVzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9GT0xERVIgPSAiLnNldHRpbmdzIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9GSUxFID0gIm9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5wcmVmcyI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZFUl9QUk9KRUNUX1BSRUYgPSAib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmlzU2VydmVyUHJvamVjdCI7Ci0KLQlwcm90ZWN0ZWQgSVByb2plY3QgcHJvamVjdDsKLQotCXByb3RlY3RlZCBib29sZWFuIHNlcnZlclByb2plY3QgPSBmYWxzZTsKLQotCS8qKgotCSAqIFByb2plY3RQcm9wZXJ0aWVzIGNvbnN0cnVjdG9yLgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0IGEgcHJvamVjdAotCSAqLwotCXB1YmxpYyBQcm9qZWN0UHJvcGVydGllcyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMucHJvamVjdCA9IHByb2plY3Q7Ci0JfQotCi0JLyoqCi0JICogTG9hZCB0aGUgcHJlZmVyZW5jZXMuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGxvYWRQcmVmZXJlbmNlcygpIHsKLQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiTG9hZGluZyBwcm9qZWN0IHByZWZlcmVuY2VzOiAiICsgcHJvamVjdCk7Ci0JCQotCQlpZiAoIXByb2plY3QuaXNBY2Nlc3NpYmxlKCkpCi0JCQlyZXR1cm47Ci0JCQotCQlJbnB1dFN0cmVhbSBpbiA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlJRmlsZSBmaWxlID0gcHJvamVjdC5nZXRGb2xkZXIoUFJFRkVSRU5DRV9GT0xERVIpLmdldEZpbGUoUFJFRkVSRU5DRV9GSUxFKTsKLQkJCWlmIChmaWxlID09IG51bGwgfHwgIWZpbGUuaXNBY2Nlc3NpYmxlKCkpCi0JCQkJcmV0dXJuOwotCQkJCi0JCQlpbiA9IGZpbGUuZ2V0Q29udGVudHMoKTsKLQkJCVByb3BlcnRpZXMgcCA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCQlwLmxvYWQoaW4pOwotCQkJCi0JCQlTdHJpbmcgcyA9IHAuZ2V0UHJvcGVydHkoU0VSVkVSX1BST0pFQ1RfUFJFRik7Ci0JCQlpZiAocyAhPSBudWxsICYmICJ0cnVlIi5lcXVhbHMocykpCi0JCQkJc2VydmVyUHJvamVjdCA9IHRydWU7Ci0JCQllbHNlCi0JCQkJc2VydmVyUHJvamVjdCA9IGZhbHNlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IGxvYWQgcHJlZmVyZW5jZXM6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCWlmIChpbiAhPSBudWxsKQotCQkJCQlpbi5jbG9zZSgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBpZ25vcmUKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzYXZlUHJlZmVyZW5jZXMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwgfHwgIXByb2plY3QuaXNBY2Nlc3NpYmxlKCkpCi0JCQlyZXR1cm47Ci0JCQotCQlJRm9sZGVyIGZvbGRlciA9IHByb2plY3QuZ2V0Rm9sZGVyKFBSRUZFUkVOQ0VfRk9MREVSKTsKLQkJaWYgKCFmb2xkZXIuZXhpc3RzKCkpCi0JCQlmb2xkZXIuY3JlYXRlKHRydWUsIHRydWUsIG1vbml0b3IpOwotCQkKLQkJSUZpbGUgZmlsZSA9IHByb2plY3QuZ2V0Rm9sZGVyKFBSRUZFUkVOQ0VfRk9MREVSKS5nZXRGaWxlKFBSRUZFUkVOQ0VfRklMRSk7Ci0JCQotCQlpZiAoZmlsZS5leGlzdHMoKSAmJiBmaWxlLmlzUmVhZE9ubHkoKSkgewotCQkJSVN0YXR1cyBzdGF0dXMgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkudmFsaWRhdGVFZGl0KG5ldyBJRmlsZVtdIHsgZmlsZSB9LCBudWxsKTsKLQkJCWlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKQotCQkJCS8vIGRpZG4ndCB3b3JrIG9yIG5vdCB1bmRlciBzb3VyY2UgY29udHJvbAotCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKHN0YXR1cyk7Ci0JCX0KLQkJCi0JCVByb3BlcnRpZXMgcCA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCXAucHV0KCJlY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb24iLCAiMSIpOwotCQlpZiAoc2VydmVyUHJvamVjdCkKLQkJCXAucHV0KFNFUlZFUl9QUk9KRUNUX1BSRUYsICJ0cnVlIik7Ci0JCWVsc2UKLQkJCXAucHV0KFNFUlZFUl9QUk9KRUNUX1BSRUYsICJmYWxzZSIpOwotCQkKLQkJSW5wdXRTdHJlYW0gaW4gPSBudWxsOwotCQl0cnkgewotCQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJCXAuc3RvcmUob3V0LCBudWxsKTsKLQkJCi0JCQlpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvdXQudG9CeXRlQXJyYXkoKSk7Ci0JCQkKLQkJCWlmIChmaWxlLmV4aXN0cygpKQotCQkJCWZpbGUuc2V0Q29udGVudHMoaW4sIHRydWUsIHRydWUsIG1vbml0b3IpOwotCQkJZWxzZQotCQkJCWZpbGUuY3JlYXRlKGluLCB0cnVlLCBtb25pdG9yKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgIiIsIGUpKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJaW4uY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHJ1bnRpbWUgdGFyZ2V0IHR5cGUgZm9yIHRoZSBnaXZlbiBwcm9qZWN0LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHJ1bnRpbWUgdGFyZ2V0Ci0JICovCi0JcHVibGljIElSdW50aW1lIGdldFJ1bnRpbWVUYXJnZXQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBwcm9qZWN0IGNhbiBjb250YWluIHNlcnZlciBhcnRpZmFjdHMsIGFuZAotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIHByb2plY3QgY2FuIGNvbnRhaW4gc2VydmVyIGFydGlmYWN0cywgYW5kCi0JICogICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2VydmVyUHJvamVjdCgpIHsKLQkJbG9hZFByZWZlcmVuY2VzKCk7Ci0JCXJldHVybiBzZXJ2ZXJQcm9qZWN0OwotCX0KLQotCS8qKgotCSAqIFNldHMgd2hldGhlciB0aGUgcHJvamVjdCBjYW4gY29udGFpbiBzZXJ2ZXIgcmVzb3VyY2VzLgotCSAqIAotCSAqIEBwYXJhbSBiIDxjb2RlPnRydWU8L2NvZGU+IHRvIGFsbG93IHRoZSBwcm9qZWN0IHRvIGNvbnRhaW4gc2VydmVyCi0JICogICAgcmVzb3VyY2VzLCBvciA8Y29kZT5mYWxzZTwvY29kZT4gdG8gbm90IGFsbG93IHRoZSBwcm9qZWN0IHRvIGNvbnRhaW4KLQkgKiAgICBzZXJ2ZXJzCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHByb2JsZW0gc2V0dGluZyB0aGUgc2VydmVyIHByb2plY3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJQcm9qZWN0KGJvb2xlYW4gYiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWxvYWRQcmVmZXJlbmNlcygpOwotCQlzZXJ2ZXJQcm9qZWN0ID0gYjsKLQkJc2F2ZVByZWZlcmVuY2VzKG1vbml0b3IpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiUHJvamVjdFByb3BlcnRpZXNbIiArIHByb2plY3QgKyAiXSI7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1B1Ymxpc2hJbmZvLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9QdWJsaXNoSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGM2ODg2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1B1Ymxpc2hJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi2gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotLyoqCi0gKiBIZWxwZXIgdG8gb2J0YWluIGFuZCBzdG9yZSB0aGUgZ2xvYmFsIHB1Ymxpc2ggaW5mb3JtYXRpb24uCi0gKiAod2hhdCBmaWxlcyB3ZXJlIHB1Ymxpc2hlZCBhbmQgd2hlbikgRGVsZWdhdGVzIHRvIFB1Ymxpc2hTdGF0ZQotICogZm9yIGFsbCBzZXJ2ZXIgc3BlY2lmaWMgcHVibGlzaGluZyBpbmZvcm1hdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIFB1Ymxpc2hJbmZvIHsKLQlwcm90ZWN0ZWQgc3RhdGljIFB1Ymxpc2hJbmZvIGluc3RhbmNlOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElTSF9ESVIgPSAicHVibGlzaCI7Ci0KLQkvLyBtYXAgb2Ygc2VydmVyIGlkcyB0byBTdHJpbmdzIG9mIGZpbGVuYW1lIGNvbnRhaW5pbmcgcHVibGlzaCBkYXRhCi0JcHJvdGVjdGVkIE1hcCBzZXJ2ZXJJZFRvUGF0aDsKLQotCS8vIG1hcCBvZiBsb2FkZWQgc2VydmVySWRzIHRvIHB1Ymxpc2ggaW5mbwotCXByb3RlY3RlZCBNYXAgc2VydmVySWRUb1B1Ymxpc2hJbmZvOwotCi0JLyoqCi0JICogUHVibGlzaEluZm8gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwcml2YXRlIFB1Ymxpc2hJbmZvKCkgewotCQlzdXBlcigpOwotCQotCQlzZXJ2ZXJJZFRvUGF0aCA9IG5ldyBIYXNoTWFwKCk7Ci0JCXNlcnZlcklkVG9QdWJsaXNoSW5mbyA9IG5ldyBIYXNoTWFwKCk7Ci0JCWxvYWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHB1Ymxpc2ggaW5mby4KLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5QdWJsaXNoSW5mbwotCSAqLwotCXB1YmxpYyBzdGF0aWMgUHVibGlzaEluZm8gZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKQotCQkJaW5zdGFuY2UgPSBuZXcgUHVibGlzaEluZm8oKTsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcHVibGlzaCBzdGF0ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5QdWJsaXNoU3RhdGUKLQkgKiBAcGFyYW0gc2VydmVyIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyCi0JICovCi0JcHVibGljIFNlcnZlclB1Ymxpc2hJbmZvIGdldFNlcnZlclB1Ymxpc2hJbmZvKElTZXJ2ZXIgc2VydmVyKSB7Ci0JCS8vIGhhdmUgd2UgdHJpZWQgbG9hZGluZyB5ZXQ/Ci0JCVN0cmluZyBzZXJ2ZXJJZCA9IHNlcnZlci5nZXRJZCgpOwotCQlpZiAoc2VydmVySWRUb1BhdGguY29udGFpbnNLZXkoc2VydmVySWQpKSB7Ci0JCQlpZiAoIXNlcnZlcklkVG9QdWJsaXNoSW5mby5jb250YWluc0tleShzZXJ2ZXJJZCkpIHsKLQkJCQlTdHJpbmcgcGFydGlhbFBhdGggPSAoU3RyaW5nKSBzZXJ2ZXJJZFRvUGF0aC5nZXQoc2VydmVySWQpOwotCQkJCUlQYXRoIHBhdGggPSBTZXJ2ZXJQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRTdGF0ZUxvY2F0aW9uKCkuYXBwZW5kKFBVQkxJU0hfRElSKS5hcHBlbmQocGFydGlhbFBhdGgpOwotCQkJCVNlcnZlclB1Ymxpc2hJbmZvIHNwaSA9IG5ldyBTZXJ2ZXJQdWJsaXNoSW5mbyhwYXRoKTsKLQkJCQlzZXJ2ZXJJZFRvUHVibGlzaEluZm8ucHV0KHNlcnZlcklkLCBzcGkpOwotCQkJCXJldHVybiBzcGk7Ci0JCQl9Ci0JCQkvLyBhbHJlYWR5IGxvYWRlZAotCQkJcmV0dXJuIChTZXJ2ZXJQdWJsaXNoSW5mbykgc2VydmVySWRUb1B1Ymxpc2hJbmZvLmdldChzZXJ2ZXJJZCk7IAotCQl9Ci0JCQotCQkvLyBmaXJzdCB0aW1lIHNlcnZlciBpcyBiZWluZyB1c2VkCi0JCUlQYXRoIHBhdGggPSBTZXJ2ZXJQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRTdGF0ZUxvY2F0aW9uKCkuYXBwZW5kKFBVQkxJU0hfRElSKTsKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUocGF0aC50b09TU3RyaW5nKCkpOwotCQlpZiAoIWZpbGUuZXhpc3RzKCkpCi0JCQlmaWxlLm1rZGlyKCk7Ci0KLQkJZmlsZSA9IG51bGw7Ci0JCWludCBpID0gMDsKLQkJU3RyaW5nIHBhcnRpYWxQYXRoID0gbnVsbDsKLQkJd2hpbGUgKGZpbGUgPT0gbnVsbCB8fCBmaWxlLmV4aXN0cygpKSB7Ci0JCQlwYXJ0aWFsUGF0aCA9ICJwdWJsaXNoIiArIGkgKyAiLnhtbCI7Ci0JCQlwYXRoID0gU2VydmVyUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U3RhdGVMb2NhdGlvbigpLmFwcGVuZChQVUJMSVNIX0RJUikuYXBwZW5kKHBhcnRpYWxQYXRoKTsKLQkJCWlmIChzZXJ2ZXJJZFRvUGF0aC5nZXQocGFydGlhbFBhdGgpID09IG51bGwpCi0JCQkJZmlsZSA9IG5ldyBGaWxlKHBhdGgudG9PU1N0cmluZygpKTsKLQkJCWkrKzsKLQkJfQotCQkKLQkJU2VydmVyUHVibGlzaEluZm8gc3BpID0gbmV3IFNlcnZlclB1Ymxpc2hJbmZvKHBhdGgpOwotCQlzZXJ2ZXJJZFRvUGF0aC5wdXQoc2VydmVySWQsIHBhcnRpYWxQYXRoKTsKLQkJc2VydmVySWRUb1B1Ymxpc2hJbmZvLnB1dChzZXJ2ZXJJZCwgc3BpKTsKLQkJc2F2ZSgpOwotCQlyZXR1cm4gc3BpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxvYWQoKSB7Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIkxvYWRpbmcgcHVibGlzaCBpbmZvIik7Ci0JCVN0cmluZyBmaWxlbmFtZSA9IFNlcnZlclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFN0YXRlTG9jYXRpb24oKS5hcHBlbmQoInB1Ymxpc2gueG1sIikudG9PU1N0cmluZygpOwotCQotCQl0cnkgewotCQkJSU1lbWVudG8gbWVtZW50byA9IFhNTE1lbWVudG8ubG9hZE1lbWVudG8oZmlsZW5hbWUpOwotCQotCQkJSU1lbWVudG9bXSBzZXJ2ZXJDaGlsZCA9IG1lbWVudG8uZ2V0Q2hpbGRyZW4oInNlcnZlciIpOwotCQkJaW50IHNpemUgPSBzZXJ2ZXJDaGlsZC5sZW5ndGg7Ci0JCQlzZXJ2ZXJJZFRvUGF0aCA9IG5ldyBIYXNoTWFwKHNpemUgKyAyKTsKLQkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJU3RyaW5nIGlkID0gc2VydmVyQ2hpbGRbaV0uZ2V0U3RyaW5nKCJpZCIpOwotCQkJCVN0cmluZyBwYXJ0aWFsUGF0aCA9IHNlcnZlckNoaWxkW2ldLmdldFN0cmluZygicGF0aCIpOwotCQkJCXNlcnZlcklkVG9QYXRoLnB1dChpZCwgcGFydGlhbFBhdGgpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIkNvdWxkIG5vdCBsb2FkIGdsb2JhbCBwdWJsaXNoIGluZm86ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzYXZlKCkgewotCQlTdHJpbmcgZmlsZW5hbWUgPSBTZXJ2ZXJQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRTdGF0ZUxvY2F0aW9uKCkuYXBwZW5kKCJwdWJsaXNoLnhtbCIpLnRvT1NTdHJpbmcoKTsKLQkKLQkJdHJ5IHsKLQkJCVhNTE1lbWVudG8gbWVtZW50byA9IFhNTE1lbWVudG8uY3JlYXRlV3JpdGVSb290KCJwdWJsaXNoLWluZm8iKTsKLQkKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gc2VydmVySWRUb1BhdGgua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlTdHJpbmcgc2VydmVySWQgPSAoU3RyaW5nKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJU3RyaW5nIHBhcnRpYWxQYXRoID0gKFN0cmluZykgc2VydmVySWRUb1BhdGguZ2V0KHNlcnZlcklkKTsKLQkKLQkJCQlJTWVtZW50byBzZXJ2ZXIgPSBtZW1lbnRvLmNyZWF0ZUNoaWxkKCJzZXJ2ZXIiKTsKLQkJCQlzZXJ2ZXIucHV0U3RyaW5nKCJpZCIsIHNlcnZlcklkKTsKLQkJCQlzZXJ2ZXIucHV0U3RyaW5nKCJwYXRoIiwgcGFydGlhbFBhdGgpOwotCQkJfQotCQotCQkJbWVtZW50by5zYXZlVG9GaWxlKGZpbGVuYW1lKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBzYXZlIGdsb2JhbCBwdWJsaXNoIGluZm8iLCBlKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9QdWJsaXNoU2VydmVySm9iLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9QdWJsaXNoU2VydmVySm9iLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyZmQ5YzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvUHVibGlzaFNlcnZlckpvYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotoCogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlUnVsZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklTY2hlZHVsaW5nUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5NdWx0aVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLS8qKgotICogSm9iIHRvIHB1Ymxpc2ggdG8gYSBwYXJ0aWN1bGFyIHNlcnZlci4KLSAqLwotcHVibGljIGNsYXNzIFB1Ymxpc2hTZXJ2ZXJKb2IgZXh0ZW5kcyBDaGFpbmVkSm9iIHsKLQlwcm90ZWN0ZWQgaW50IGtpbmQ7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gY2hlY2s7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgcHVibGlzaGluZyBqb2IuCi0JICogCi0JICogQHBhcmFtIHNlcnZlciB0aGUgc2VydmVyIHRvIHB1Ymxpc2ggdG8KLQkgKiBAcGFyYW0ga2luZCB0aGUga2luZCBvZiBwdWJsaXNoCi0JICogQHBhcmFtIGNoZWNrCi0JICovCi0JcHVibGljIFB1Ymxpc2hTZXJ2ZXJKb2IoSVNlcnZlciBzZXJ2ZXIsIGludCBraW5kLCBib29sZWFuIGNoZWNrKSB7Ci0JCXN1cGVyKE5MUy5iaW5kKE1lc3NhZ2VzLnB1Ymxpc2hpbmcsIHNlcnZlci5nZXROYW1lKCkpLCBzZXJ2ZXIpOwotCQl0aGlzLmtpbmQgPSBraW5kOwotCQl0aGlzLmNoZWNrID0gY2hlY2s7Ci0JCQotCQlJUmVzb3VyY2VSdWxlRmFjdG9yeSBydWxlRmFjdG9yeSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSdWxlRmFjdG9yeSgpOwotCQkKLQkJLy8gMTAyMjI3IC0gbG9jayBlbnRpcmUgd29ya3NwYWNlIGR1cmluZyBwdWJsaXNoCi0JCS8vIFRPRE8gd2lsbCBoYXZlIHRvIHJldmlzaXQgcG9zdCAwLjcgdG8gZGV0ZXJtaW5lIGlmIHRoZXJlIGlzIGEgYmV0dGVyIHdheSB0bwotCQkvLyBkbyB0aGlzLCBzaW5jZSBpdCB3b3VsZCBiZSBwcmVmZXJyYWJsZSBub3QgdG8gbG9jayB0aGUgZW50aXJlIHdvcmtzcGFjZSwgYW5kCi0JCS8vIHRoZXJlZm9yZSBhbGxvdyBtdWx0aXBsZSBzZXJ2ZXJzIHRvIHB1Ymxpc2ggYXQgb25jZQotCQkKLQkJLy8gZmluZCBhbGwgcHJvamVjdHMgdGhhdCBtb2R1bGVzIGFyZSBpbgotCQkvKkxpc3QgcHJvamVjdExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gKChTZXJ2ZXIpc2VydmVyKS5nZXRBbGxNb2R1bGVzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJSU1vZHVsZVtdIG1vZHVsZXMgPSAoSU1vZHVsZVtdKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gbW9kdWxlc1ttb2R1bGVzLmxlbmd0aCAtIDFdLmdldFByb2plY3QoKTsKLQkJCWlmIChwcm9qZWN0ICE9IG51bGwgJiYgIXByb2plY3RMaXN0LmNvbnRhaW5zKHByb2plY3QpKQotCQkJCXByb2plY3RMaXN0LmFkZChwcm9qZWN0KTsKLQkJfQotCQkKLQkJLy8gYWRkIGRlcGVuZGFudCBwcm9qZWN0cwotCQlpdGVyYXRvciA9IHByb2plY3RMaXN0Lml0ZXJhdG9yKCk7Ci0JCUxpc3QgZGVwUHJvamVjdExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7IC8vIHVzZSB0byBhdm9pZCBjb25jdXJyZW50IG1vZGlmaWNhdGlvbgotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQl0cnkgewotCQkJCUlQcm9qZWN0W10gcmVmcyA9IHByb2plY3QuZ2V0RGVzY3JpcHRpb24oKS5nZXRSZWZlcmVuY2VkUHJvamVjdHMoKTsKLQkJCQlpZiAocmVmcyAhPSBudWxsKSB7Ci0JCQkJCWludCBzaXplID0gcmVmcy5sZW5ndGg7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotCQkJCQkJaWYgKHJlZnNbaV0gIT0gbnVsbCAmJiAhcHJvamVjdExpc3QuY29udGFpbnMocmVmc1tpXSkgJiYgIWRlcFByb2plY3RMaXN0LmNvbnRhaW5zKHJlZnNbaV0pKQotCQkJCQkJCWRlcFByb2plY3RMaXN0LmFkZChyZWZzW2ldKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIkNvdWxkIG5vdCBjb21wdXRlIHJlZmVyZW5jZWQgcHJvamVjdHMiLCBjZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCWl0ZXJhdG9yID0gZGVwUHJvamVjdExpc3QuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJcHJvamVjdExpc3QuYWRkKGl0ZXJhdG9yLm5leHQoKSk7Ci0JCX0KLQkJCi0JCS8vIGNvbWJpbmUgYW5kIGJ1aWxkIGFsbCB0aGUgcnVsZXMKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpdGVyYXRvciA9IHByb2plY3RMaXN0Lml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCUlTY2hlZHVsaW5nUnVsZSBydWxlID0gcnVsZUZhY3RvcnkuY3JlYXRlUnVsZShwcm9qZWN0KTsKLQkJCWlmIChydWxlICE9IG51bGwgJiYgIWxpc3QuY29udGFpbnMocnVsZSkpCi0JCQkJbGlzdC5hZGQocnVsZSk7Ci0JCQkKLQkJCXJ1bGUgPSBydWxlRmFjdG9yeS5tb2RpZnlSdWxlKHByb2plY3QpOwotCQkJaWYgKHJ1bGUgIT0gbnVsbCAmJiAhbGlzdC5jb250YWlucyhydWxlKSkKLQkJCQlsaXN0LmFkZChydWxlKTsKLQkJCQotCQkJcnVsZSA9IHJ1bGVGYWN0b3J5LnZhbGlkYXRlRWRpdFJ1bGUobmV3IElSZXNvdXJjZVtdIHsgcHJvamVjdCB9KTsKLQkJCWlmIChydWxlICE9IG51bGwgJiYgIWxpc3QuY29udGFpbnMocnVsZSkpCi0JCQkJbGlzdC5hZGQocnVsZSk7Ci0JCQkKLQkJCXJ1bGUgPSBydWxlRmFjdG9yeS5tYXJrZXJSdWxlKHByb2plY3QpOwotCQkJaWYgKHJ1bGUgIT0gbnVsbCAmJiAhbGlzdC5jb250YWlucyhydWxlKSkKLQkJCQlsaXN0LmFkZChydWxlKTsKLQkJCQotCQkJcnVsZSA9IHJ1bGVGYWN0b3J5LnJlZnJlc2hSdWxlKHByb2plY3QpOwotCQkJaWYgKHJ1bGUgIT0gbnVsbCAmJiAhbGlzdC5jb250YWlucyhydWxlKSkKLQkJCQlsaXN0LmFkZChydWxlKTsKLQkJfQotCQkKLQkJaW50IHNpemUgPSBsaXN0LnNpemUoKTsKLQkJSVNjaGVkdWxpbmdSdWxlW10gcnVsZXMgPSBuZXcgSVNjaGVkdWxpbmdSdWxlW3NpemUgKyAxXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCi0JCQlydWxlc1tpXSA9IChJU2NoZWR1bGluZ1J1bGUpIGxpc3QuZ2V0KGkpOwotCQkKLQkJcnVsZXNbc2l6ZV0gPSBuZXcgU2VydmVyU2NoZWR1bGluZ1J1bGUoc2VydmVyKTsqLwotCQkKLQkJSVNjaGVkdWxpbmdSdWxlW10gcnVsZXMgPSBuZXcgSVNjaGVkdWxpbmdSdWxlWzJdOwotCQlydWxlc1swXSA9IHJ1bGVGYWN0b3J5LmNyZWF0ZVJ1bGUoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSk7Ci0JCXJ1bGVzWzFdID0gbmV3IFNlcnZlclNjaGVkdWxpbmdSdWxlKHNlcnZlcik7Ci0JCQotCQlzZXRSdWxlKE11bHRpUnVsZS5jb21iaW5lKHJ1bGVzKSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IHB1Ymxpc2hpbmcgam9iLgotCSAqIAotCSAqIEBwYXJhbSBzZXJ2ZXIgdGhlIHNlcnZlciB0byBwdWJsaXNoIHRvCi0JICovCi0JcHVibGljIFB1Ymxpc2hTZXJ2ZXJKb2IoSVNlcnZlciBzZXJ2ZXIpIHsKLQkJdGhpcyhzZXJ2ZXIsIElTZXJ2ZXIuUFVCTElTSF9JTkNSRU1FTlRBTCwgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2Ijc2hvdWxkUnVuKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRSdW4oKSB7Ci0JCWlmICghc3VwZXIuc2hvdWxkUnVuKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQlpZiAoIWNoZWNrKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBTZXJ2ZXJQcmVmZXJlbmNlcy5nZXRJbnN0YW5jZSgpLmlzQXV0b1B1Ymxpc2hpbmcoKSAmJiAoKFNlcnZlcilnZXRTZXJ2ZXIoKSkuc2hvdWxkUHVibGlzaCgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iI3J1bihJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJcmV0dXJuIGdldFNlcnZlcigpLnB1Ymxpc2goa2luZCwgbW9uaXRvcik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1B1Ymxpc2hUYXNrLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9QdWJsaXNoVGFzay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzlmYmQ1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1B1Ymxpc2hUYXNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuKjsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBQdWJsaXNoVGFzayBpbXBsZW1lbnRzIElQdWJsaXNoVGFzayB7Ci0JcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudDsKLQlwcml2YXRlIFB1Ymxpc2hUYXNrRGVsZWdhdGUgZGVsZWdhdGU7Ci0KLQkvKioKLQkgKiBQdWJsaXNoVGFzayBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IGEgY29uZmlndXJhdGlvbiBlbGVtZW50IAotCSAqLwotCXB1YmxpYyBQdWJsaXNoVGFzayhJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcigpOwotCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCX0KLQotCS8qCi0JICogQHNlZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZSgiaWQiKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0VHlwZUlkcygpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBTZXJ2ZXJQbHVnaW4udG9rZW5pemUoZWxlbWVudC5nZXRBdHRyaWJ1dGUoInR5cGVJZHMiKSwgIiwiKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlCi0JICovCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHNUeXBlKFN0cmluZyBpZCkgewotCQlyZXR1cm4gU2VydmVyUGx1Z2luLnN1cHBvcnRzVHlwZShnZXRUeXBlSWRzKCksIGlkKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVB1Ymxpc2hUYXNrI2dldERlbGVnYXRlKCkKLQkgKi8KLQlwdWJsaWMgUHVibGlzaFRhc2tEZWxlZ2F0ZSBnZXREZWxlZ2F0ZSgpIHsKLQkJaWYgKGRlbGVnYXRlID09IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJZGVsZWdhdGUgPSAoUHVibGlzaFRhc2tEZWxlZ2F0ZSkgZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJjbGFzcyIpOwotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3QgY3JlYXRlIGRlbGVnYXRlIiArIHRvU3RyaW5nKCkgKyAiOiAiICsgdC5nZXRNZXNzYWdlKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBkZWxlZ2F0ZTsKLQl9Ci0JCi0JLyoKLQkgKiBAc2VlCi0JICovCi0JcHVibGljIFB1Ymxpc2hPcGVyYXRpb25bXSBnZXRUYXNrcyhJU2VydmVyIHNlcnZlciwgTGlzdCBtb2R1bGVzKSB7Ci0JCXRyeSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJUYXNrLmluaXQgIiArIHRoaXMpOwotCQkJUHVibGlzaE9wZXJhdGlvbltdIHBvID0gZ2V0RGVsZWdhdGUoKS5nZXRUYXNrcyhzZXJ2ZXIsIG1vZHVsZXMpOwotCQkJaWYgKHBvICE9IG51bGwpCi0JCQkJcmV0dXJuIHBvOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgY2FsbGluZyBkZWxlZ2F0ZSAiICsgdG9TdHJpbmcoKSArICI6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBQdWJsaXNoT3BlcmF0aW9uWzBdOwotCX0KLQotCS8qCi0JICogQHNlZQotCSAqLwotCXB1YmxpYyBQdWJsaXNoT3BlcmF0aW9uW10gZ2V0VGFza3MoSVNlcnZlciBzZXJ2ZXIsIGludCBraW5kLCBMaXN0IG1vZHVsZXMsIExpc3Qga2luZExpc3QpIHsKLQkJdHJ5IHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIlRhc2suaW5pdCAiICsgdGhpcyk7Ci0JCQlQdWJsaXNoT3BlcmF0aW9uW10gcG8gPSBnZXREZWxlZ2F0ZSgpLmdldFRhc2tzKHNlcnZlciwga2luZCwgbW9kdWxlcywga2luZExpc3QpOwotCQkJaWYgKHBvICE9IG51bGwpCi0JCQkJcmV0dXJuIHBvOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgY2FsbGluZyBkZWxlZ2F0ZSAiICsgdG9TdHJpbmcoKSArICI6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBQdWJsaXNoT3BlcmF0aW9uWzBdOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdC4KLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIlB1Ymxpc2hUYXNrWyIgKyBnZXRJZCgpICsgIl0iOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9SZXNvdXJjZU1hbmFnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1Jlc291cmNlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2ZkN2MzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1Jlc291cmNlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLlNlcnZlckRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsLlByb2plY3RNb2R1bGVGYWN0b3J5RGVsZWdhdGU7Ci0vKioKLSAqIFJlc291cmNlTWFuYWdlciBoYW5kbGVzIHRoZSBtYXBwaW5ncyBiZXR3ZWVuIHJlc291cmNlcwotICogYW5kIHNlcnZlcnMgb3Igc2VydmVyIGNvbmZpZ3VyYXRpb25zLCBhbmQgY3JlYXRlcwotICogbm90aWZpY2F0aW9uIG9mIHNlcnZlcnMgb3Igc2VydmVyIGNvbmZpZ3VyYXRpb25zCi0gKiBiZWluZyBhZGRlZCBhbmQgcmVtb3ZlZC4KLSAqIAotICogPHA+U2VydmVycyBhbmQgc2VydmVyIGNvbmZpZ3VyYXRpb25zIG1heSBiZSBhIHNpbmdsZQotICogcmVzb3VyY2UsIG9yIHRoZXkgbWF5IGJlIGEgZm9sZGVyIHRoYXQgY29udGFpbnMgYSBncm91cAotICogb2YgZmlsZXMuIEZvbGRlci1yZXNvdXJjZSBtYXkgbm90IGNvbnRhaW4gb3RoZXIgc2VydmVycwotICogb3IgY29uZmlndXJhdGlvbnMuPC9wPgotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VNYW5hZ2VyIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVkVSX0RBVEFfRklMRSA9ICJzZXJ2ZXJzLnhtbCI7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBFVkVOVF9BRERFRCA9IDA7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBFVkVOVF9DSEFOR0VEID0gMTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIEVWRU5UX1JFTU9WRUQgPSAyOwotCi0JcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VNYW5hZ2VyIGluc3RhbmNlOwotCi0JLy8gY3VycmVudGx5IGFjdGl2ZSBydW50aW1lcyBhbmQgc2VydmVycwotCXByb3RlY3RlZCBMaXN0IHJ1bnRpbWVzOwotCXByb3RlY3RlZCBMaXN0IHNlcnZlcnM7Ci0JcHJvdGVjdGVkIElSdW50aW1lIGRlZmF1bHRSdW50aW1lOwotCi0JLy8gbGlmZWN5Y2xlIGxpc3RlbmVycwotCXByb3RlY3RlZCB0cmFuc2llbnQgTGlzdCBydW50aW1lTGlzdGVuZXJzOwotCXByb3RlY3RlZCB0cmFuc2llbnQgTGlzdCBzZXJ2ZXJMaXN0ZW5lcnM7Ci0JCi0JLy8gY2FjaGUgZm9yIGRpc3Bvc2luZyBzZXJ2ZXJzICYgcnVudGltZXMKLQlwcm90ZWN0ZWQgTGlzdCBhY3RpdmVCdW5kbGVzOwotCi0JLy8gcmVzb3VyY2UgY2hhbmdlIGxpc3RlbmVycwotCXByaXZhdGUgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIgcmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLQlwcml2YXRlIFByZWZlcmVuY2VzLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHBjbDsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpZ25vcmVQcmVmZXJlbmNlQ2hhbmdlcyA9IGZhbHNlOwotCi0JLyoqCi0JICogU2VydmVyIHJlc291cmNlIGNoYW5nZSBsaXN0ZW5lci4KLQkgKiAKLQkgKiBSZXNvdXJjZSBsaXN0ZW5lciAtIHRyYWNrcyBjaGFuZ2VzIG9uIHNlcnZlciByZXNvdXJjZXMgc28gdGhhdAotCSAqIHdlIGNhbiByZWxvYWQvZHJvcCBzZXJ2ZXIgaW5zdGFuY2VzIGFuZCBjb25maWd1cmF0aW9ucyB0aGF0Ci0JICogbWF5IGNoYW5nZSBvdXRzaWRlIG9mIG91ciBjb250cm9sLgotCSAqIExpc3RlbnMgZm9yIHR3byB0eXBlcyBvZiBjaGFuZ2VzOgotCSAqIDEuIFNlcnZlcnMgb3IgY29uZmlndXJhdGlvbnMgYmVpbmcgYWRkZWQgb3IgcmVtb3ZlZAotCSAqICAgIGZyb20gdGhlaXIgcmVzcGVjdGl2ZSBmb2xkZXJzLiAoaW4gdGhlIGZ1dHVyZSwgaW5jbHVkaW5nCi0JICogICAgdGhlIGFkZGl0aW9uIG9yIHJlbW92YWwgb2YgYSBmdWxsIHNlcnZlciBwcm9qZWN0LCB3aGljaAotCSAqICAgIHdlIGN1cnJlbnRseSBjYW4ndCBsaXN0ZW4gZm9yIGJlY2F1c2UgdGhlcmUgaXMgbm8gbmF0dXJlCi0JICogICAgYXR0YWNoZWQgdG8gdGhlIHByb2plY3QgYXQgdGhpcyBwb2ludCAtIE9USSBkZWZlY3QpCi0JICogMi4gUHJvamVjdHMgYmVpbmcgZGVsZXRlZC4KLQkgKi8KLQlwdWJsaWMgY2xhc3MgU2VydmVyUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciBpbXBsZW1lbnRzIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIHsKLQkJLyoqCi0JCSAqIENyZWF0ZSBhIG5ldyBTZXJ2ZXJSZXNvdXJjZUNoYW5nZUxpc3RlbmVyLgotCQkgKi8KLQkJcHVibGljIFNlcnZlclJlc291cmNlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIExpc3RlbiBmb3IgcHJvamVjdHMgYmVpbmcgYWRkZWQgb3IgcmVtb3ZlZCBhbmQgYWN0IGFjY29yZGluZ2x5LgotCQkgKgotCQkgKiBAcGFyYW0gZXZlbnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQKLQkJICovCi0JCXB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgewotCQkJSVJlc291cmNlRGVsdGEgZGVsdGEgPSBldmVudC5nZXREZWx0YSgpOwotCQkJaWYgKGRlbHRhID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQotCQkJVHJhY2UudHJhY2UoVHJhY2UuUkVTT1VSQ0VTLCAiLT4tIFNlcnZlclJlc291cmNlQ2hhbmdlTGlzdGVuZXIgcmVzcG9uZGluZyB0byByZXNvdXJjZSBjaGFuZ2U6ICIgKyBldmVudC5nZXRUeXBlKCkgKyAiIC0+LSIpOwotCQkJSVJlc291cmNlRGVsdGFbXSBjaGlsZHJlbiA9IGRlbHRhLmdldEFmZmVjdGVkQ2hpbGRyZW4oKTsKLQkJCWlmIChjaGlsZHJlbiAhPSBudWxsKSB7Ci0JCQkJaW50IHNpemUgPSBjaGlsZHJlbi5sZW5ndGg7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQkJSVJlc291cmNlIHJlc291cmNlID0gY2hpbGRyZW5baV0uZ2V0UmVzb3VyY2UoKTsKLQkJCQkJaWYgKHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UgaW5zdGFuY2VvZiBJUHJvamVjdCkgewotCQkJCQkJcHJvamVjdENoYW5nZWQoKElQcm9qZWN0KSByZXNvdXJjZSwgY2hpbGRyZW5baV0pOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJCi0JCQkvLyBzZWFyY2ggZm9yIGNoYW5nZXMgdG8gYW55IHByb2plY3QgdXNpbmcgYSB2aXNpdG9yCi0JCQl0cnkgewotCQkJCWRlbHRhLmFjY2VwdChuZXcgSVJlc291cmNlRGVsdGFWaXNpdG9yKCkgewotCQkJCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VEZWx0YSB2aXNpdG9yRGVsdGEpIHsKLQkJCQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IHZpc2l0b3JEZWx0YS5nZXRSZXNvdXJjZSgpOwotCi0JCQkJCQkvLyBvbmx5IHJlc3BvbmQgdG8gcHJvamVjdCBjaGFuZ2VzCi0JCQkJCQlpZiAocmVzb3VyY2UgIT0gbnVsbCAmJiByZXNvdXJjZSBpbnN0YW5jZW9mIElQcm9qZWN0KSB7Ci0JCQkJCQkJcHVibGlzaEhhbmRsZVByb2plY3RDaGFuZ2UodmlzaXRvckRlbHRhKTsKLQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciByZXNwb25kaW5nIHRvIHJlc291cmNlIGNoYW5nZSIsIGUpOwotCQkJfQotCQkJCi0JCQlUcmFjZS50cmFjZShUcmFjZS5SRVNPVVJDRVMsICItPC0gRG9uZSBTZXJ2ZXJSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIHJlc3BvbmRpbmcgdG8gcmVzb3VyY2UgY2hhbmdlIC08LSIpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJlYWN0IHRvIGEgY2hhbmdlIHdpdGhpbiBhIHBvc3NpYmxlIHNlcnZlciBwcm9qZWN0LgotCQkgKgotCQkgKiBAcGFyYW0gZGVsdGEgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGEKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIHByb2plY3RDaGFuZ2VkKElQcm9qZWN0IHByb2plY3QsIElSZXNvdXJjZURlbHRhIGRlbHRhKSB7Ci0JCQlpZiAoIVNlcnZlclBsdWdpbi5nZXRQcm9qZWN0UHJvcGVydGllcyhwcm9qZWN0KS5pc1NlcnZlclByb2plY3QoKSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlJFU09VUkNFUywgIk5vdCBhIHNlcnZlciBwcm9qZWN0OiAiICsgcHJvamVjdC5nZXROYW1lKCkpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCQotCQkJSVJlc291cmNlRGVsdGFbXSBjaGlsZHJlbiA9IGRlbHRhLmdldEFmZmVjdGVkQ2hpbGRyZW4oKTsKLQkKLQkJCWludCBzaXplID0gY2hpbGRyZW4ubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlJUmVzb3VyY2VEZWx0YSBjaGlsZCA9IGNoaWxkcmVuW2ldOwotCi0JCQkJLy8gbG9vayBmb3Igc2VydmVycyBhbmQgc2VydmVyIGNvbmZpZ3VyYXRpb25zCi0JCQkJdHJ5IHsKLQkJCQkJY2hpbGQuYWNjZXB0KG5ldyBJUmVzb3VyY2VEZWx0YVZpc2l0b3IoKSB7Ci0JCQkJCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VEZWx0YSBkZWx0YTIpIHsKLQkJCQkJCQlyZXR1cm4gaGFuZGxlUmVzb3VyY2VEZWx0YShkZWx0YTIpOwotCQkJCQkJfQotCQkJCQl9KTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciByZXNwb25kaW5nIHRvIHJlc291cmNlIGNoYW5nZSIsIGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgTGlzdCBtb2R1bGVTZXJ2ZXJFdmVudEhhbmRsZXJzOwotCXByb3RlY3RlZCBMaXN0IG1vZHVsZVNlcnZlckV2ZW50SGFuZGxlckluZGV4ZXM7Ci0KLQkvKioKLQkgKiBDYW5ub3QgZGlyZWN0bHkgY3JlYXRlIGEgUmVzb3VyY2VNYW5hZ2VyLiBVc2UKLQkgKiBTZXJ2ZXJzQ29yZS5nZXRSZXNvdXJjZU1hbmFnZXIoKS4KLQkgKi8KLQlwcml2YXRlIFJlc291cmNlTWFuYWdlcigpIHsKLQkJc3VwZXIoKTsKLQkJaW5zdGFuY2UgPSB0aGlzOwotCQkKLQkJaW5pdCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXQoKSB7Ci0JCXNlcnZlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWFjdGl2ZUJ1bmRsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWxvYWRSdW50aW1lc0xpc3QoKTsKLQkJbG9hZFNlcnZlcnNMaXN0KCk7Ci0JCQotCQlwY2wgPSBuZXcgUHJlZmVyZW5jZXMuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcmVmZXJlbmNlcy5Qcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGlnbm9yZVByZWZlcmVuY2VDaGFuZ2VzKQotCQkJCQlyZXR1cm47Ci0JCQkJU3RyaW5nIHByb3BlcnR5ID0gZXZlbnQuZ2V0UHJvcGVydHkoKTsKLQkJCQlpZiAocHJvcGVydHkuZXF1YWxzKCJydW50aW1lcyIpKSB7Ci0JCQkJCWxvYWRSdW50aW1lc0xpc3QoKTsKLQkJCQkJc2F2ZVJ1bnRpbWVzTGlzdCgpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQkJCi0JCVNlcnZlclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwY2wpOwotCQkKLQkJcmVzb2x2ZVNlcnZlcnMoKTsKLQkJCi0JCS8vIGtlZXAgdHJhY2sgb2YgZnV0dXJlIGNoYW5nZXMgdG8gdGhlIGZpbGUgc3lzdGVtCi0JCXJlc291cmNlQ2hhbmdlTGlzdGVuZXIgPSBuZXcgU2VydmVyUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcigpOwotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihyZXNvdXJjZUNoYW5nZUxpc3RlbmVyLCBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0NIQU5HRSB8IElSZXNvdXJjZUNoYW5nZUV2ZW50LlBSRV9DTE9TRSB8IElSZXNvdXJjZUNoYW5nZUV2ZW50LlBSRV9ERUxFVEUpOwotCQkKLQkJLypjb25maWd1cmF0aW9uTGlzdGVuZXIgPSBuZXcgSVNlcnZlckNvbmZpZ3VyYXRpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNoaWxkUHJvamVjdENoYW5nZShJU2VydmVyQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7Ci0JCQkJaGFuZGxlQ29uZmlndXJhdGlvbkNoaWxkUHJvamVjdHNDaGFuZ2UoY29uZmlndXJhdGlvbik7Ci0JCQl9Ci0JCX07Ki8KLQkJCi0JCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVSLCAiTG9hZGluZyB3b3Jrc3BhY2Ugc2VydmVycyBhbmQgc2VydmVyIGNvbmZpZ3VyYXRpb25zIik7Ci0JCUlQcm9qZWN0W10gcHJvamVjdHMgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3RzKCk7Ci0JCWlmIChwcm9qZWN0cyAhPSBudWxsKSB7Ci0JCQlpbnQgc2l6ZSA9IHByb2plY3RzLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJaWYgKFNlcnZlclBsdWdpbi5nZXRQcm9qZWN0UHJvcGVydGllcyhwcm9qZWN0c1tpXSkuaXNTZXJ2ZXJQcm9qZWN0KCkpCi0JCQkJCWxvYWRGcm9tUHJvamVjdChwcm9qZWN0c1tpXSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCWFkZFNlcnZlckxpZmVjeWNsZUxpc3RlbmVyKFNlcnZlckxpc3RlbmVyLmdldEluc3RhbmNlKCkpOwotCX0KLQkKLQkvKioKLQkgKiBMb2FkIGFsbCBvZiB0aGUgc2VydmVycyBhbmQgc2VydmVyIGNvbmZpZ3VyYXRpb25zIGZyb20gdGhlIGdpdmVuIHByb2plY3QuCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGxvYWRGcm9tUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVSLCAiSW5pdGlhbCBzZXJ2ZXIgcmVzb3VyY2UgbG9hZCBmb3IgIiArIHByb2plY3QuZ2V0TmFtZSgpLCBudWxsKTsKLQkJZmluYWwgUmVzb3VyY2VNYW5hZ2VyIHJtID0gUmVzb3VyY2VNYW5hZ2VyLmdldEluc3RhbmNlKCk7Ci0JCi0JCXRyeSB7Ci0JCQlwcm9qZWN0LmFjY2VwdChuZXcgSVJlc291cmNlUHJveHlWaXNpdG9yKCkgewotCQkJCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZVByb3h5IHByb3h5KSB7Ci0JCQkJCWlmIChwcm94eS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUgJiYKLQkJCQkJCVNlcnZlci5GSUxFX0VYVEVOU0lPTi5lcXVhbHMoZ2V0RmlsZUV4dGVuc2lvbihwcm94eS5nZXROYW1lKCkpKSkgewotCQkJCQkJCUlGaWxlIGZpbGUgPSAoSUZpbGUpIHByb3h5LnJlcXVlc3RSZXNvdXJjZSgpOwotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCXJtLmhhbmRsZU5ld0ZpbGUoZmlsZSwgbnVsbCk7Ci0JCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgZHVyaW5nIGluaXRpYWwgc2VydmVyIHJlc291cmNlIGxvYWQiLCBlKTsKLQkJCQkJCQl9Ci0JCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJfQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9LCAwKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBsb2FkIHNlcnZlciBwcm9qZWN0ICIgKyBwcm9qZWN0LmdldE5hbWUoKSwgZSk7Ci0JCX0KLQl9Ci0JCQotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGdldEZpbGVFeHRlbnNpb24oU3RyaW5nIG5hbWUpIHsKLQkJaW50IGluZGV4ID0gbmFtZS5sYXN0SW5kZXhPZignLicpOwotCQlpZiAoaW5kZXggPT0gLTEpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKGluZGV4ID09IChuYW1lLmxlbmd0aCgpIC0gMSkpCi0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIG5hbWUuc3Vic3RyaW5nKGluZGV4ICsgMSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZU1hbmFnZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKQotCQkJbmV3IFJlc291cmNlTWFuYWdlcigpOwotCi0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2h1dGRvd24oKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkKLQkJdHJ5IHsKLQkJCWluc3RhbmNlLnNodXRkb3duSW1wbCgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgZHVyaW5nIHNodXRkb3duIiwgZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0FjdGl2ZUJ1bmRsZShTdHJpbmcgYnVuZGxlSWQpIHsKLQkJcmV0dXJuIGFjdGl2ZUJ1bmRsZXMuY29udGFpbnMoYnVuZGxlSWQpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNodXRkb3duQnVuZGxlKFN0cmluZyBpZCkgewotCQkvLyBkaXNwb3NlIHNlcnZlcnMKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBzZXJ2ZXJzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVNlcnZlciBzZXJ2ZXIgPSAoU2VydmVyKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQl0cnkgewotCQkJCVNlcnZlclR5cGUgc2VydmVyVHlwZSA9IChTZXJ2ZXJUeXBlKSBzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpOwotCQkJCWlmIChpZC5lcXVhbHMoc2VydmVyVHlwZS5nZXROYW1lc3BhY2UoKSkpIHsKLQkJCQkJLy9zZXJ2ZXIuc3RvcCh0cnVlKTsKLQkJCQkJc2VydmVyLmRpc3Bvc2UoKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJFcnJvciBkaXNwb3Npbmcgc2VydmVyIiwgZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIGRpc3Bvc2UgcnVudGltZXMKLQkJaXRlcmF0b3IgPSBydW50aW1lcy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlSdW50aW1lIHJ1bnRpbWUgPSAoUnVudGltZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJdHJ5IHsKLQkJCQlSdW50aW1lVHlwZSBydW50aW1lVHlwZSA9IChSdW50aW1lVHlwZSkgcnVudGltZS5nZXRSdW50aW1lVHlwZSgpOwotCQkJCWlmIChpZC5lcXVhbHMocnVudGltZVR5cGUuZ2V0TmFtZXNwYWNlKCkpKSB7Ci0JCQkJCXJ1bnRpbWUuZGlzcG9zZSgpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIkVycm9yIGRpc3Bvc2luZyBzZXJ2ZXIiLCBlKTsKLQkJCX0KLQkJfQotCQl0cnkgewotCQkJVGhyZWFkLnNsZWVwKDEwMDApOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2h1dGRvd25JbXBsKCkgewotCQlJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQkJaWYgKHdvcmtzcGFjZSAhPSBudWxsKQotCQkJd29ya3NwYWNlLnJlbW92ZVJlc291cmNlQ2hhbmdlTGlzdGVuZXIocmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcik7Ci0JCQotCQlTZXJ2ZXJQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIocGNsKTsKLQkJCi0JCXJlbW92ZVNlcnZlckxpZmVjeWNsZUxpc3RlbmVyKFNlcnZlckxpc3RlbmVyLmdldEluc3RhbmNlKCkpOwotCX0KLQotCS8qCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgYWRkUnVudGltZUxpZmVjeWNsZUxpc3RlbmVyKElSdW50aW1lTGlmZWN5Y2xlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJVHJhY2UudHJhY2UoVHJhY2UuTElTVEVORVJTLCAiQWRkaW5nIHNlcnZlciByZXNvdXJjZSBsaXN0ZW5lciAiICsgbGlzdGVuZXIgKyAiIHRvICIgKyB0aGlzKTsKLQkKLQkJaWYgKHJ1bnRpbWVMaXN0ZW5lcnMgPT0gbnVsbCkKLQkJCXJ1bnRpbWVMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0KDMpOwotCQlydW50aW1lTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JfQotCQotCS8qCi0JICoKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVSdW50aW1lTGlmZWN5Y2xlTGlzdGVuZXIoSVJ1bnRpbWVMaWZlY3ljbGVMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlUcmFjZS50cmFjZShUcmFjZS5MSVNURU5FUlMsICJSZW1vdmluZyBzZXJ2ZXIgcmVzb3VyY2UgbGlzdGVuZXIgIiArIGxpc3RlbmVyICsgIiBmcm9tICIgKyB0aGlzKTsKLQkKLQkJaWYgKHJ1bnRpbWVMaXN0ZW5lcnMgIT0gbnVsbCkKLQkJCXJ1bnRpbWVMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQl9Ci0JCi0JLyoKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRTZXJ2ZXJMaWZlY3ljbGVMaXN0ZW5lcihJU2VydmVyTGlmZWN5Y2xlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJVHJhY2UudHJhY2UoVHJhY2UuTElTVEVORVJTLCAiQWRkaW5nIHNlcnZlciByZXNvdXJjZSBsaXN0ZW5lciAiICsgbGlzdGVuZXIgKyAiIHRvICIgKyB0aGlzKTsKLQkKLQkJaWYgKHNlcnZlckxpc3RlbmVycyA9PSBudWxsKQotCQkJc2VydmVyTGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdCgzKTsKLQkJc2VydmVyTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JfQotCQotCS8qCi0JICoKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVTZXJ2ZXJMaWZlY3ljbGVMaXN0ZW5lcihJU2VydmVyTGlmZWN5Y2xlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJVHJhY2UudHJhY2UoVHJhY2UuTElTVEVORVJTLCAiUmVtb3Zpbmcgc2VydmVyIHJlc291cmNlIGxpc3RlbmVyICIgKyBsaXN0ZW5lciArICIgZnJvbSAiICsgdGhpcyk7Ci0JCi0JCWlmIChzZXJ2ZXJMaXN0ZW5lcnMgIT0gbnVsbCkKLQkJCXNlcnZlckxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCX0KLQkKLQkvKioKLQkgKiBEZXJlZ2lzdGVyIGFuIGV4aXN0aW5nIHJ1bnRpbWUuCi0JICoKLQkgKiBAcGFyYW0gcnVudGltZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRlcmVnaXN0ZXJSdW50aW1lKElSdW50aW1lIHJ1bnRpbWUpIHsKLQkJaWYgKHJ1bnRpbWUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlUcmFjZS50cmFjZShUcmFjZS5SRVNPVVJDRVMsICJEZXJlZ2lzdGVyaW5nIHJ1bnRpbWU6ICIgKyBydW50aW1lLmdldE5hbWUoKSk7Ci0JCWlmIChydW50aW1lLmVxdWFscyhnZXREZWZhdWx0UnVudGltZSgpKSkKLQkJCXNldERlZmF1bHRSdW50aW1lKG51bGwpOwotCi0JCSgoUnVudGltZSlydW50aW1lKS5kaXNwb3NlKCk7Ci0JCWZpcmVSdW50aW1lRXZlbnQocnVudGltZSwgRVZFTlRfUkVNT1ZFRCk7Ci0JCXJ1bnRpbWVzLnJlbW92ZShydW50aW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBEZXJlZ2lzdGVyIGFuIGV4aXN0aW5nIHNlcnZlciByZXNvdXJjZS4KLQkgKgotCSAqIEBwYXJhbSBzZXJ2ZXIKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkZXJlZ2lzdGVyU2VydmVyKElTZXJ2ZXIgc2VydmVyKSB7Ci0JCWlmIChzZXJ2ZXIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlUcmFjZS50cmFjZShUcmFjZS5SRVNPVVJDRVMsICJEZXJlZ2lzdGVyaW5nIHNlcnZlcjogIiArIHNlcnZlci5nZXROYW1lKCkpOwotCQkKLQkJKChTZXJ2ZXIpIHNlcnZlcikuZGVsZXRlTGF1bmNoQ29uZmlndXJhdGlvbnMoKTsKLQkJU2VydmVyUGx1Z2luLmdldEluc3RhbmNlKCkucmVtb3ZlVGVtcERpcmVjdG9yeShzZXJ2ZXIuZ2V0SWQoKSk7Ci0KLQkJKChTZXJ2ZXIpc2VydmVyKS5kaXNwb3NlKCk7Ci0JCWZpcmVTZXJ2ZXJFdmVudChzZXJ2ZXIsIEVWRU5UX1JFTU9WRUQpOwotCQlzZXJ2ZXJzLnJlbW92ZShzZXJ2ZXIpOwotCX0KLQotCS8qKgotCSAqIEZpcmUgYSBydW50aW1lIGV2ZW50LgotCSAqLwotCXByaXZhdGUgdm9pZCBmaXJlUnVudGltZUV2ZW50KGZpbmFsIElSdW50aW1lIHJ1bnRpbWUsIGJ5dGUgYikgewotCQlUcmFjZS50cmFjZShUcmFjZS5MSVNURU5FUlMsICItPi0gRmlyaW5nIHJ1bnRpbWUgZXZlbnQ6ICIgKyBydW50aW1lLmdldE5hbWUoKSArICIgLT4tIik7Ci0JCQotCQlpZiAocnVudGltZUxpc3RlbmVycyA9PSBudWxsIHx8IHJ1bnRpbWVMaXN0ZW5lcnMuaXNFbXB0eSgpKQotCQkJcmV0dXJuOwotCQotCQlpbnQgc2l6ZSA9IHJ1bnRpbWVMaXN0ZW5lcnMuc2l6ZSgpOwotCQlJUnVudGltZUxpZmVjeWNsZUxpc3RlbmVyW10gc3JsID0gbmV3IElSdW50aW1lTGlmZWN5Y2xlTGlzdGVuZXJbc2l6ZV07Ci0JCXJ1bnRpbWVMaXN0ZW5lcnMudG9BcnJheShzcmwpOwotCQotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuTElTVEVORVJTLCAiICBGaXJpbmcgcnVudGltZSBldmVudCB0byAiICsgc3JsW2ldKTsKLQkJCXRyeSB7Ci0JCQkJaWYgKGIgPT0gRVZFTlRfQURERUQpCi0JCQkJCXNybFtpXS5ydW50aW1lQWRkZWQocnVudGltZSk7Ci0JCQkJZWxzZSBpZiAoYiA9PSBFVkVOVF9DSEFOR0VEKQotCQkJCQlzcmxbaV0ucnVudGltZUNoYW5nZWQocnVudGltZSk7Ci0JCQkJZWxzZQotCQkJCQlzcmxbaV0ucnVudGltZVJlbW92ZWQocnVudGltZSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIiAgRXJyb3IgZmlyaW5nIHJ1bnRpbWUgZXZlbnQgdG8gIiArIHNybFtpXSwgZSk7Ci0JCQl9Ci0JCX0KLQkJVHJhY2UudHJhY2UoVHJhY2UuTElTVEVORVJTLCAiLTwtIERvbmUgZmlyaW5nIHJ1bnRpbWUgZXZlbnQgLTwtIik7Ci0JfQotCi0JLyoqCi0JICogRmlyZSBhIHNlcnZlciBldmVudC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZmlyZVNlcnZlckV2ZW50KGZpbmFsIElTZXJ2ZXIgc2VydmVyLCBieXRlIGIpIHsKLQkJVHJhY2UudHJhY2UoVHJhY2UuTElTVEVORVJTLCAiLT4tIEZpcmluZyBzZXJ2ZXIgZXZlbnQ6ICIgKyBzZXJ2ZXIuZ2V0TmFtZSgpICsgIiAtPi0iKTsKLQkJCi0JCWlmIChzZXJ2ZXJMaXN0ZW5lcnMgPT0gbnVsbCB8fCBzZXJ2ZXJMaXN0ZW5lcnMuaXNFbXB0eSgpKQotCQkJcmV0dXJuOwotCQotCQlpbnQgc2l6ZSA9IHNlcnZlckxpc3RlbmVycy5zaXplKCk7Ci0JCUlTZXJ2ZXJMaWZlY3ljbGVMaXN0ZW5lcltdIHNybCA9IG5ldyBJU2VydmVyTGlmZWN5Y2xlTGlzdGVuZXJbc2l6ZV07Ci0JCXNlcnZlckxpc3RlbmVycy50b0FycmF5KHNybCk7Ci0JCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5MSVNURU5FUlMsICIgIEZpcmluZyBzZXJ2ZXIgZXZlbnQgdG8gIiArIHNybFtpXSk7Ci0JCQl0cnkgewotCQkJCWlmIChiID09IEVWRU5UX0FEREVEKQotCQkJCQlzcmxbaV0uc2VydmVyQWRkZWQoc2VydmVyKTsKLQkJCQllbHNlIGlmIChiID09IEVWRU5UX0NIQU5HRUQpCi0JCQkJCXNybFtpXS5zZXJ2ZXJDaGFuZ2VkKHNlcnZlcik7Ci0JCQkJZWxzZQotCQkJCQlzcmxbaV0uc2VydmVyUmVtb3ZlZChzZXJ2ZXIpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICIgIEVycm9yIGZpcmluZyBzZXJ2ZXIgZXZlbnQgdG8gIiArIHNybFtpXSwgZSk7Ci0JCQl9Ci0JCX0KLQkJVHJhY2UudHJhY2UoVHJhY2UuTElTVEVORVJTLCAiLTwtIERvbmUgZmlyaW5nIHNlcnZlciBldmVudCAtPC0iKTsKLQl9CQotCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZVJ1bnRpbWVzTGlzdCgpIHsKLQkJdHJ5IHsKLQkJCWlnbm9yZVByZWZlcmVuY2VDaGFuZ2VzID0gdHJ1ZTsKLQkJCVhNTE1lbWVudG8gbWVtZW50byA9IFhNTE1lbWVudG8uY3JlYXRlV3JpdGVSb290KCJydW50aW1lcyIpOwotCQkJCi0JCQlpZiAoZGVmYXVsdFJ1bnRpbWUgIT0gbnVsbCkgewotCQkJCWludCBpbmQgPSBydW50aW1lcy5pbmRleE9mKGRlZmF1bHRSdW50aW1lKTsKLQkJCQlpZiAoaW5kID49IDApCi0JCQkJCW1lbWVudG8ucHV0U3RyaW5nKCJkZWZhdWx0IiwgaW5kICsgIiIpOwotCQkJfQotCi0JCQlJdGVyYXRvciBpdGVyYXRvciA9IHJ1bnRpbWVzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJUnVudGltZSBydW50aW1lID0gKFJ1bnRpbWUpIGl0ZXJhdG9yLm5leHQoKTsKLQotCQkJCUlNZW1lbnRvIGNoaWxkID0gbWVtZW50by5jcmVhdGVDaGlsZCgicnVudGltZSIpOwotCQkJCXJ1bnRpbWUuc2F2ZShjaGlsZCk7Ci0JCQl9Ci0KLQkJCVN0cmluZyB4bWxTdHJpbmcgPSBtZW1lbnRvLnNhdmVUb1N0cmluZygpOwotCQkJUHJlZmVyZW5jZXMgcHJlZnMgPSBTZXJ2ZXJQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQkJcHJlZnMuc2V0VmFsdWUoInJ1bnRpbWVzIiwgeG1sU3RyaW5nKTsKLQkJCVNlcnZlclBsdWdpbi5nZXRJbnN0YW5jZSgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IHNhdmUgcnVudGltZXMiLCBlKTsKLQkJfQotCQlpZ25vcmVQcmVmZXJlbmNlQ2hhbmdlcyA9IGZhbHNlOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzYXZlU2VydmVyc0xpc3QoKSB7Ci0JCVN0cmluZyBmaWxlbmFtZSA9IFNlcnZlclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFN0YXRlTG9jYXRpb24oKS5hcHBlbmQoU0VSVkVSX0RBVEFfRklMRSkudG9PU1N0cmluZygpOwotCQkKLQkJdHJ5IHsKLQkJCVhNTE1lbWVudG8gbWVtZW50byA9IFhNTE1lbWVudG8uY3JlYXRlV3JpdGVSb290KCJzZXJ2ZXJzIik7Ci0KLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gc2VydmVycy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCVNlcnZlciBzZXJ2ZXIgPSAoU2VydmVyKSBpdGVyYXRvci5uZXh0KCk7Ci0KLQkJCQlJTWVtZW50byBjaGlsZCA9IG1lbWVudG8uY3JlYXRlQ2hpbGQoInNlcnZlciIpOwotCQkJCXNlcnZlci5zYXZlKGNoaWxkKTsKLQkJCX0KLQotCQkJbWVtZW50by5zYXZlVG9GaWxlKGZpbGVuYW1lKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBzYXZlIHNlcnZlcnMiLCBlKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBsb2FkUnVudGltZXNMaXN0KCkgewotCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJMb2FkaW5nIHJ1bnRpbWUgaW5mbyIpOwotCQlQcmVmZXJlbmNlcyBwcmVmcyA9IFNlcnZlclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCVN0cmluZyB4bWxTdHJpbmcgPSBwcmVmcy5nZXRTdHJpbmcoInJ1bnRpbWVzIik7Ci0JCQotCQlydW50aW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKHhtbFN0cmluZyAhPSBudWxsICYmIHhtbFN0cmluZy5sZW5ndGgoKSA+IDApIHsKLQkJCXRyeSB7Ci0JCQkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gaW4gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oeG1sU3RyaW5nLmdldEJ5dGVzKCJVVEYtOCIpKTsKLQkJCQlJTWVtZW50byBtZW1lbnRvID0gWE1MTWVtZW50by5sb2FkTWVtZW50byhpbik7Ci0JCQotCQkJCUlNZW1lbnRvW10gY2hpbGRyZW4gPSBtZW1lbnRvLmdldENoaWxkcmVuKCJydW50aW1lIik7Ci0JCQkJaW50IHNpemUgPSBjaGlsZHJlbi5sZW5ndGg7Ci0JCQkJCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQkJUnVudGltZSBydW50aW1lID0gbmV3IFJ1bnRpbWUobnVsbCk7Ci0JCQkJCXJ1bnRpbWUubG9hZEZyb21NZW1lbnRvKGNoaWxkcmVuW2ldLCBudWxsKTsKLQkJCQkJcnVudGltZXMuYWRkKHJ1bnRpbWUpOwotCQkJCX0KLQkJCQkKLQkJCQlTdHJpbmcgcyA9IG1lbWVudG8uZ2V0U3RyaW5nKCJkZWZhdWx0Iik7Ci0JCQkJdHJ5IHsKLQkJCQkJaW50IGluZCA9IEludGVnZXIucGFyc2VJbnQocyk7Ci0JCQkJCWRlZmF1bHRSdW50aW1lID0gKElSdW50aW1lKSBydW50aW1lcy5nZXQoaW5kKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkJLy8gaWdub3JlCi0JCQkJfQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiQ291bGQgbm90IGxvYWQgcnVudGltZXM6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgbG9hZFNlcnZlcnNMaXN0KCkgewotCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJMb2FkaW5nIHNlcnZlciBpbmZvIik7Ci0JCVN0cmluZyBmaWxlbmFtZSA9IFNlcnZlclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFN0YXRlTG9jYXRpb24oKS5hcHBlbmQoU0VSVkVSX0RBVEFfRklMRSkudG9PU1N0cmluZygpOwotCQkKLQkJdHJ5IHsKLQkJCUlNZW1lbnRvIG1lbWVudG8gPSBYTUxNZW1lbnRvLmxvYWRNZW1lbnRvKGZpbGVuYW1lKTsKLQkJCQotCQkJSU1lbWVudG9bXSBjaGlsZHJlbiA9IG1lbWVudG8uZ2V0Q2hpbGRyZW4oInNlcnZlciIpOwotCQkJaW50IHNpemUgPSBjaGlsZHJlbi5sZW5ndGg7Ci0JCQkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJU2VydmVyIHNlcnZlciA9IG5ldyBTZXJ2ZXIobnVsbCk7Ci0JCQkJc2VydmVyLmxvYWRGcm9tTWVtZW50byhjaGlsZHJlbltpXSwgbnVsbCk7Ci0JCQkJc2VydmVycy5hZGQoc2VydmVyKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJDb3VsZCBub3QgbG9hZCBzZXJ2ZXJzOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCQotCQlpZiAoU2VydmVyUHJlZmVyZW5jZXMuZ2V0SW5zdGFuY2UoKS5pc1N5bmNPblN0YXJ0dXAoKSkgewotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBzZXJ2ZXJzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJSVNlcnZlciBzZXJ2ZXIgPSAoSVNlcnZlcikgaXRlcmF0b3IubmV4dCgpOwotCQkJCVVwZGF0ZVNlcnZlckpvYiBqb2IgPSBuZXcgVXBkYXRlU2VydmVySm9iKHNlcnZlcik7Ci0JCQkJam9iLnNjaGVkdWxlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkUnVudGltZShJUnVudGltZSBydW50aW1lKSB7Ci0JCWlmIChydW50aW1lID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmICghcnVudGltZXMuY29udGFpbnMocnVudGltZSkpCi0JCQlyZWdpc3RlclJ1bnRpbWUocnVudGltZSk7Ci0JCWVsc2UKLQkJCWZpcmVSdW50aW1lRXZlbnQocnVudGltZSwgRVZFTlRfQ0hBTkdFRCk7Ci0JCXNhdmVSdW50aW1lc0xpc3QoKTsKLQkJcmVzb2x2ZVNlcnZlcnMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVSdW50aW1lKElSdW50aW1lIHJ1bnRpbWUpIHsKLQkJaWYgKHJ1bnRpbWVzLmNvbnRhaW5zKHJ1bnRpbWUpKSB7Ci0JCQlkZXJlZ2lzdGVyUnVudGltZShydW50aW1lKTsKLQkJCXNhdmVSdW50aW1lc0xpc3QoKTsKLQkJCXJlc29sdmVTZXJ2ZXJzKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTZXJ2ZXIoSVNlcnZlciBzZXJ2ZXIpIHsKLQkJaWYgKCFzZXJ2ZXJzLmNvbnRhaW5zKHNlcnZlcikpCi0JCQlyZWdpc3RlclNlcnZlcihzZXJ2ZXIpOwotCQllbHNlCi0JCQlmaXJlU2VydmVyRXZlbnQoc2VydmVyLCBFVkVOVF9DSEFOR0VEKTsKLQkJc2F2ZVNlcnZlcnNMaXN0KCk7Ci0JCXJlc29sdmVTZXJ2ZXJzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU2VydmVyKElTZXJ2ZXIgc2VydmVyKSB7Ci0JCWlmIChzZXJ2ZXJzLmNvbnRhaW5zKHNlcnZlcikpIHsKLQkJCWRlcmVnaXN0ZXJTZXJ2ZXIoc2VydmVyKTsKLQkJCXNhdmVTZXJ2ZXJzTGlzdCgpOwotCQkJcmVzb2x2ZVNlcnZlcnMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgYWxsIHJ1bnRpbWVzLgotCSAqCi0JICogQHJldHVybiBhbiBhcnJheSBvZiBydW50aW1lcwotCSAqLwotCXB1YmxpYyBJUnVudGltZVtdIGdldFJ1bnRpbWVzKCkgewotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KHJ1bnRpbWVzKTsKLQkJCi0JCWlmIChkZWZhdWx0UnVudGltZSAhPSBudWxsICYmIGxpc3QuY29udGFpbnMoZGVmYXVsdFJ1bnRpbWUpKSB7Ci0JCQlsaXN0LnJlbW92ZShkZWZhdWx0UnVudGltZSk7Ci0JCQlsaXN0LmFkZCgwLCBkZWZhdWx0UnVudGltZSk7Ci0JCX0KLQkJCi0JCUlSdW50aW1lW10gciA9IG5ldyBJUnVudGltZVtsaXN0LnNpemUoKV07Ci0JCWxpc3QudG9BcnJheShyKTsKLQkJcmV0dXJuIHI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcnVudGltZSB3aXRoIHRoZSBnaXZlbiBpZC4KLQkgKiAKLQkgKiBAcGFyYW0gaWQgYSBydW50aW1lIGlkCi0JICogQHJldHVybiBJUnVudGltZQotCSAqLwotCXB1YmxpYyBJUnVudGltZSBnZXRSdW50aW1lKFN0cmluZyBpZCkgewotCQlpZiAoaWQgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQotCQlJdGVyYXRvciBpdGVyYXRvciA9IHJ1bnRpbWVzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCUlSdW50aW1lIHJ1bnRpbWUgPSAoSVJ1bnRpbWUpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChydW50aW1lLmdldElkKCkuZXF1YWxzKGlkKSkKLQkJCQlyZXR1cm4gcnVudGltZTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGVmYXVsdCBydW50aW1lLiBUZXN0IEFQSSAtIGRvIG5vdCB1c2UuCi0JICoKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHVibGljIElSdW50aW1lIGdldERlZmF1bHRSdW50aW1lKCkgewotCQlyZXR1cm4gZGVmYXVsdFJ1bnRpbWU7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIGRlZmF1bHQgcnVudGltZS4gVGVzdCBBUEkgLSBkbyBub3QgdXNlLgotCSAqIAotCSAqIEBwYXJhbSBydW50aW1lIGEgcnVudGltZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRSdW50aW1lKElSdW50aW1lIHJ1bnRpbWUpIHsKLQkJZGVmYXVsdFJ1bnRpbWUgPSBydW50aW1lOwotCQlzYXZlUnVudGltZXNMaXN0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzb2x2ZVJ1bnRpbWVzKCkgewotCQlJdGVyYXRvciBpdGVyYXRvciA9IHJ1bnRpbWVzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVJ1bnRpbWUgcnVudGltZSA9IChSdW50aW1lKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlydW50aW1lLnJlc29sdmUoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlc29sdmVTZXJ2ZXJzKCkgewotCQlJdGVyYXRvciBpdGVyYXRvciA9IHNlcnZlcnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJU2VydmVyIHNlcnZlciA9IChTZXJ2ZXIpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCXNlcnZlci5yZXNvbHZlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGFycmF5IGNvbnRhaW5pbmcgYWxsIHNlcnZlcnMuCi0JICoKLQkgKiBAcmV0dXJuIGFuIGFycmF5IGNvbnRhaW5pbmcgYWxsIHNlcnZlcnMKLQkgKi8KLQlwdWJsaWMgSVNlcnZlcltdIGdldFNlcnZlcnMoKSB7Ci0JCUlTZXJ2ZXJbXSBzZXJ2ZXJzMiA9IG5ldyBJU2VydmVyW3NlcnZlcnMuc2l6ZSgpXTsKLQkJc2VydmVycy50b0FycmF5KHNlcnZlcnMyKTsKLQkJCi0JCUFycmF5cy5zb3J0KHNlcnZlcnMyLCBuZXcgQ29tcGFyYXRvcigpIHsKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgewotCQkJCUlTZXJ2ZXIgYSA9IChJU2VydmVyKSBvMTsKLQkJCQlJU2VydmVyIGIgPSAoSVNlcnZlcikgbzI7Ci0JCQkJcmV0dXJuIGEuZ2V0TmFtZSgpLmNvbXBhcmVUb0lnbm9yZUNhc2UoYi5nZXROYW1lKCkpOwotCQkJfQotCQl9KTsKLQkJCi0JCXJldHVybiBzZXJ2ZXJzMjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZXJ2ZXIgd2l0aCB0aGUgZ2l2ZW4gaWQuCi0JICogCi0JICogQHBhcmFtIGlkIGEgc2VydmVyIGlkCi0JICogQHJldHVybiBhIHNlcnZlcgotCSAqLwotCXB1YmxpYyBJU2VydmVyIGdldFNlcnZlcihTdHJpbmcgaWQpIHsKLQkJaWYgKGlkID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gc2VydmVycy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlTZXJ2ZXIgc2VydmVyID0gKFNlcnZlcikgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKGlkLmVxdWFscyhzZXJ2ZXIuZ2V0SWQoKSkpCi0JCQkJcmV0dXJuIHNlcnZlcjsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHJlc291cmNlIGNoYW5nZSB3YXMgaGFuZGxlZC4KLQkgKgotCSAqIEBwYXJhbSBkZWx0YSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YQotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhhbmRsZVJlc291cmNlRGVsdGEoSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKLQkJaW50IGtpbmQgPSBkZWx0YS5nZXRLaW5kKCk7Ci0JCWludCBmbGFncyA9IGRlbHRhLmdldEZsYWdzKCk7Ci0JCUlSZXNvdXJjZSByZXNvdXJjZTIgPSBkZWx0YS5nZXRSZXNvdXJjZSgpOwotCQkKLQkJLy8gaWdub3JlIG1hcmtlcnMKLQkJaWYgKGtpbmQgPT0gSVJlc291cmNlRGVsdGEuQ0hBTkdFRCAmJiAoZmxhZ3MgJiBJUmVzb3VyY2VEZWx0YS5NQVJLRVJTKSAhPSAwKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJVHJhY2UudHJhY2UoVHJhY2UuUkVTT1VSQ0VTLCAiUmVzb3VyY2UgY2hhbmdlZDogIiArIHJlc291cmNlMiArICIgIiArIGtpbmQpOwotCQkKLQkJaWYgKHJlc291cmNlMiBpbnN0YW5jZW9mIElGaWxlKSB7Ci0JCQlJRmlsZSBmaWxlID0gKElGaWxlKSByZXNvdXJjZTI7Ci0JCQlpZiAoU2VydmVyLkZJTEVfRVhURU5TSU9OLmVxdWFscyhmaWxlLmdldEZpbGVFeHRlbnNpb24oKSkpIHsKLQkJCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgPSBudWxsOwotCQkJCWlmICgoZmxhZ3MgJiBJUmVzb3VyY2VEZWx0YS5NT1ZFRF9GUk9NKSAhPSAwIHx8IChmbGFncyAmIElSZXNvdXJjZURlbHRhLk1PVkVEX1RPKSAhPSAwKQotCQkJCQloYW5kbGVNb3ZlZEZpbGUoZmlsZSwgZGVsdGEsIG1vbml0b3IpOwotCQkJCWVsc2UgaWYgKGtpbmQgPT0gSVJlc291cmNlRGVsdGEuQURERUQpCi0JCQkJCWhhbmRsZU5ld0ZpbGUoZmlsZSwgbW9uaXRvcik7Ci0JCQkJZWxzZSBpZiAoa2luZCA9PSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEKQotCQkJCQloYW5kbGVSZW1vdmVkRmlsZShmaWxlKTsKLQkJCQllbHNlCi0JCQkJCWhhbmRsZUNoYW5nZWRGaWxlKGZpbGUsIG1vbml0b3IpOwotCQkJCWlmIChtb25pdG9yICE9IG51bGwpCi0JCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCUlGb2xkZXIgZm9sZGVyID0gKElGb2xkZXIpIHJlc291cmNlMjsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBzZXJ2ZXJzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCUlTZXJ2ZXIgc2VydmVyID0gKElTZXJ2ZXIpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpLmhhc1NlcnZlckNvbmZpZ3VyYXRpb24oKSAmJiBmb2xkZXIuZXF1YWxzKHNlcnZlci5nZXRTZXJ2ZXJDb25maWd1cmF0aW9uKCkpCi0JCQkJCSYmIHNlcnZlci5nZXRBZGFwdGVyKFNlcnZlckRlbGVnYXRlLmNsYXNzKSAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJKChTZXJ2ZXIpc2VydmVyKS5nZXREZWxlZ2F0ZShudWxsKS5jb25maWd1cmF0aW9uQ2hhbmdlZCgpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJTZXJ2ZXIgZmFpbGVkIG9uIGNvbmZpZ3VyYXRpb24gY2hhbmdlIik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwcm90ZWN0ZWQgSVNlcnZlciBsb2FkU2VydmVyKElGaWxlIGZpbGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlTZXJ2ZXIgc2VydmVyID0gbmV3IFNlcnZlcihmaWxlKTsKLQkJc2VydmVyLmxvYWRGcm9tRmlsZShtb25pdG9yKTsKLQkJcmV0dXJuIHNlcnZlcjsKLQl9Ci0JCi0JLyoqCi0JICogVHJpZXMgdG8gbG9hZCBhIG5ldyBzZXJ2ZXIgcmVzb3VyY2UgZnJvbSB0aGUgZ2l2ZW4gcmVzb3VyY2UuCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBsb2FkIGFuZCByZWdpc3RlciB3ZXJlIHN1Y2Nlc3NmdWwuCi0JICoKLQkgKiBAcGFyYW0gZmlsZQotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFuZGxlTmV3RmlsZShJRmlsZSBmaWxlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJVHJhY2UudHJhY2UoVHJhY2UuUkVTT1VSQ0VTLCAiaGFuZGxlTmV3RmlsZTogIiArIGZpbGUpOwotCQltb25pdG9yID0gUHJvZ3Jlc3NVdGlsLmdldE1vbml0b3JGb3IobW9uaXRvcik7Ci0JCW1vbml0b3IuYmVnaW5UYXNrKCIiLCAyMDAwKTsKLQkJCi0JCS8vIHRyeSBsb2FkaW5nIGEgc2VydmVyCi0JCWlmIChmaWxlLmdldEZpbGVFeHRlbnNpb24oKS5lcXVhbHMoU2VydmVyLkZJTEVfRVhURU5TSU9OKSkgewotCQkJdHJ5IHsKLQkJCQlJU2VydmVyIHNlcnZlciA9IGxvYWRTZXJ2ZXIoZmlsZSwgUHJvZ3Jlc3NVdGlsLmdldFN1Yk1vbml0b3JGb3IobW9uaXRvciwgMTAwMCkpOwotCQkJCWlmIChzZXJ2ZXIgIT0gbnVsbCkgewotCQkJCQlpZiAoZ2V0U2VydmVyKHNlcnZlci5nZXRJZCgpKSA9PSBudWxsKQotCQkJCQkJcmVnaXN0ZXJTZXJ2ZXIoc2VydmVyKTsKLQkJCQkJbW9uaXRvci5kb25lKCk7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgbG9hZGluZyBzZXJ2ZXIiLCBlKTsKLQkJCX0KLQkJfQotCQkKLQkJbW9uaXRvci5kb25lKCk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBUcmllcyB0byBsb2FkIGEgbmV3IHNlcnZlciByZXNvdXJjZSBmcm9tIHRoZSBnaXZlbiByZXNvdXJjZS4KLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGxvYWQgYW5kIHJlZ2lzdGVyIHdlcmUgc3VjY2Vzc2Z1bC4KLQkgKgotCSAqIEBwYXJhbSBmaWxlCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYW5kbGVNb3ZlZEZpbGUoSUZpbGUgZmlsZSwgSVJlc291cmNlRGVsdGEgZGVsdGEsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlUcmFjZS50cmFjZShUcmFjZS5SRVNPVVJDRVMsICJoYW5kbGVNb3ZlZEZpbGU6ICIgKyBmaWxlKTsKLQkJbW9uaXRvciA9IFByb2dyZXNzVXRpbC5nZXRNb25pdG9yRm9yKG1vbml0b3IpOwotCQltb25pdG9yLmJlZ2luVGFzaygiIiwgMjAwMCk7Ci0JCQotCQlJUGF0aCBmcm9tUGF0aCA9IGRlbHRhLmdldE1vdmVkRnJvbVBhdGgoKTsKLQkJaWYgKGZyb21QYXRoICE9IG51bGwpIHsKLQkJCUlGaWxlIGZyb21GaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKGZyb21QYXRoKTsKLQkJCWlmIChTZXJ2ZXJQbHVnaW4uZ2V0UHJvamVjdFByb3BlcnRpZXMoZnJvbUZpbGUuZ2V0UHJvamVjdCgpKS5pc1NlcnZlclByb2plY3QoKSkgewotCQkJCVNlcnZlciBzZXJ2ZXIgPSAoU2VydmVyKSBmaW5kU2VydmVyKGZyb21GaWxlKTsKLQkJCQlpZiAoc2VydmVyICE9IG51bGwpCi0JCQkJCXNlcnZlci5maWxlID0gZmlsZTsKLQkJCX0gZWxzZSB7Ci0JCQkJaGFuZGxlTmV3RmlsZShmaWxlLCBtb25pdG9yKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCUlQYXRoIHRvUGF0aCA9IGRlbHRhLmdldE1vdmVkVG9QYXRoKCk7Ci0JCQlJRmlsZSB0b0ZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUodG9QYXRoKTsKLQkJCWlmIChTZXJ2ZXJQbHVnaW4uZ2V0UHJvamVjdFByb3BlcnRpZXModG9GaWxlLmdldFByb2plY3QoKSkuaXNTZXJ2ZXJQcm9qZWN0KCkpIHsKLQkJCQlTZXJ2ZXIgc2VydmVyID0gKFNlcnZlcikgZmluZFNlcnZlcihmaWxlKTsKLQkJCQlpZiAoc2VydmVyICE9IG51bGwpCi0JCQkJCXNlcnZlci5maWxlID0gdG9GaWxlOwotCQkJfSBlbHNlIHsKLQkJCQloYW5kbGVSZW1vdmVkRmlsZShmaWxlKTsKLQkJCX0KLQkJfQotCQkKLQkJbW9uaXRvci5kb25lKCk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZXJ2ZXIgdGhhdCBjYW1lIGZyb20gdGhlIGdpdmVuIGZpbGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogaWYgbm9uZS4gVGhpcyBjb252ZW5pZW5jZSBtZXRob2Qgc2VhcmNoZXMgdGhlIGxpc3Qgb2Yga25vd24KLQkgKiBzZXJ2ZXJzICh7QGxpbmsgI2dldFNlcnZlcnMoKX0pIGZvciB0aGUgb25lIHdpdGggYSBtYXRjaGluZwotCSAqIGxvY2F0aW9uICh7QGxpbmsgU2VydmVyI2dldEZpbGUoKX0pLiBUaGUgZmlsZSBtYXkgbm90IGJlIG51bGwuCi0JICoKLQkgKiBAcGFyYW0gZmlsZSBhIHNlcnZlciBmaWxlCi0JICogQHJldHVybiB0aGUgc2VydmVyIGluc3RhbmNlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiAKLQkgKiAgICB0aGVyZSBpcyBubyBzZXJ2ZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBmaWxlCi0JICovCi0JcHVibGljIHN0YXRpYyBJU2VydmVyIGZpbmRTZXJ2ZXIoSUZpbGUgZmlsZSkgewotCQlpZiAoZmlsZSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQkKLQkJSVNlcnZlcltdIHNlcnZlcnMgPSBTZXJ2ZXJDb3JlLmdldFNlcnZlcnMoKTsKLQkJaWYgKHNlcnZlcnMgIT0gbnVsbCkgewotCQkJaW50IHNpemUgPSBzZXJ2ZXJzLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJaWYgKGZpbGUuZXF1YWxzKCgoU2VydmVyKXNlcnZlcnNbaV0pLmdldEZpbGUoKSkpCi0JCQkJCXJldHVybiBzZXJ2ZXJzW2ldOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFRyaWVzIHRvIGhhbmRsZSBhIHJlc291cmNlIGNoYW5nZS4gUmV0dXJucyB0cnVlIGlmIHRoZSByZWxvYWQKLQkgKiB3YXMgc3VjY2Vzc2Z1bC4KLQkgKgotCSAqIEBwYXJhbSBmaWxlIGEgZmlsZQotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFuZGxlQ2hhbmdlZEZpbGUoSUZpbGUgZmlsZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLlJFU09VUkNFUywgImhhbmRsZUNoYW5nZWRGaWxlOiAiICsgZmlsZSk7Ci0JCW1vbml0b3IgPSBQcm9ncmVzc1V0aWwuZ2V0TW9uaXRvckZvcihtb25pdG9yKTsKLQkJbW9uaXRvci5iZWdpblRhc2soIiIsIDEwMDApOwotCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCi0JCUlTZXJ2ZXIgc2VydmVyID0gZmluZFNlcnZlcihmaWxlKTsKLQkJaWYgKHNlcnZlciAhPSBudWxsKSB7Ci0JCQlmb3VuZCA9IHRydWU7Ci0JCQl0cnkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlJFU09VUkNFUywgIlJlbG9hZGluZyBzZXJ2ZXI6ICIgKyBzZXJ2ZXIpOwotCQkJCSgoU2VydmVyKSBzZXJ2ZXIpLmxvYWRGcm9tRmlsZShtb25pdG9yKTsKLQkJCQlmaXJlU2VydmVyRXZlbnQoc2VydmVyLCBFVkVOVF9DSEFOR0VEKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgcmVsb2FkaW5nIHNlcnZlciAiICsgc2VydmVyLmdldE5hbWUoKSArICIgZnJvbSAiICsgZmlsZSArICI6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCQkJZGVyZWdpc3RlclNlcnZlcihzZXJ2ZXIpOwotCQkJfQotCQl9IGVsc2UKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlJFU09VUkNFUywgIk5vIHNlcnZlciBmb3VuZCBhdDogIiArIGZpbGUpOwotCQkKLQkJbW9uaXRvci5kb25lKCk7Ci0JCXJldHVybiBmb3VuZDsKLQl9Ci0KLQkvKioKLQkgKiBUcmllcyB0byByZW1vdmUgYSBjdXJyZW50IHJlc291cmNlLiBSZXR1cm5zIHRydWUgaWYgdGhlCi0JICogZGVyZWdpc3RlcmluZyB3YXMgc3VjY2Vzc2Z1bC4KLQkgKgotCSAqIEBwYXJhbSBmaWxlIGEgZmlsZQotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhhbmRsZVJlbW92ZWRGaWxlKElGaWxlIGZpbGUpIHsKLQkJVHJhY2UudHJhY2UoVHJhY2UuUkVTT1VSQ0VTLCAiaGFuZGxlUmVtb3ZlZEZpbGU6ICIgKyBmaWxlKTsKLQkJCi0JCUlTZXJ2ZXIgc2VydmVyID0gZmluZFNlcnZlcihmaWxlKTsKLQkJaWYgKHNlcnZlciAhPSBudWxsKSB7Ci0JCQlkZXJlZ2lzdGVyU2VydmVyKHNlcnZlcik7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJVHJhY2UudHJhY2UoVHJhY2UuUkVTT1VSQ0VTLCAiTm8gc2VydmVyIGZvdW5kIGF0OiAiICsgZmlsZSk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBBIHByb2plY3QgaGFzIGNoYW5nZWQuIElmIHRoaXMgaXMgYW4gYWRkIG9yIHJlbW92ZSwgY2hlY2sKLQkgKiB0byBzZWUgaWYgaXQgaXMgcGFydCBvZiBhIGN1cnJlbnQgc2VydmVyIGNvbmZpZ3VyYXRpb24uCi0JICoKLQkgKiBAcGFyYW0gZGVsdGEgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGEKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwdWJsaXNoSGFuZGxlUHJvamVjdENoYW5nZShJUmVzb3VyY2VEZWx0YSBkZWx0YSkgewotCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICI+IHB1Ymxpc2hIYW5kbGVQcm9qZWN0Q2hhbmdlICIgKyBkZWx0YS5nZXRSZXNvdXJjZSgpKTsKLQkJSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkgZGVsdGEuZ2V0UmVzb3VyY2UoKTsKLQkJCi0JCWlmIChwcm9qZWN0ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQlpZiAoIWRlbHRhQ29udGFpbnNDaGFuZ2VkRmlsZXMoZGVsdGEpKQotCQkJcmV0dXJuOwotCQkKLQkJLy8gcHJvY2VzcyBtb2R1bGUgY2hhbmdlcwotCQlQcm9qZWN0TW9kdWxlRmFjdG9yeURlbGVnYXRlLmhhbmRsZUdsb2JhbFByb2plY3RDaGFuZ2UocHJvamVjdCwgZGVsdGEpOwotCQkKLQkJZmluYWwgSU1vZHVsZSBtb2R1bGUgPSBTZXJ2ZXJVdGlsLmdldE1vZHVsZShwcm9qZWN0KTsKLQkJaWYgKG1vZHVsZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkKLQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiLSBwdWJsaXNoSGFuZGxlUHJvamVjdENoYW5nZSIpOwotCQkKLQkJSVNlcnZlcltdIHNlcnZlcnMyID0gZ2V0U2VydmVycygpOwotCQlpZiAoc2VydmVyczIgIT0gbnVsbCkgewotCQkJaW50IHNpemUgPSBzZXJ2ZXJzMi5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJaWYgKHNlcnZlcnMyW2ldLmdldEFkYXB0ZXIoU2VydmVyRGVsZWdhdGUuY2xhc3MpICE9IG51bGwpCi0JCQkJKChTZXJ2ZXIpIHNlcnZlcnMyW2ldKS5oYW5kbGVNb2R1bGVQcm9qZWN0Q2hhbmdlKG1vZHVsZSk7Ci0JCQl9Ci0JCX0KLQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiPCBwdWJsaXNoSGFuZGxlUHJvamVjdENoYW5nZSIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYXQgbGVhc3Qgb25lIGZpbGUgaW4gdGhlIGRlbHRhIGlzIGNoYW5nZWQsCi0JICogYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0JICogCi0JICogQHBhcmFtIGRlbHRhIGEgcmVzb3VyY2UgZGVsdGEKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGF0IGxlYXN0IG9uZSBmaWxlIGluIHRoZSBkZWx0YSBpcyBjaGFuZ2VkLAotCSAqICAgIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGRlbHRhQ29udGFpbnNDaGFuZ2VkRmlsZXMoSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKLQkJY2xhc3MgVGVtcCB7Ci0JCQlib29sZWFuIGIgPSBmYWxzZTsKLQkJfQotCQlmaW5hbCBUZW1wIHQgPSBuZXcgVGVtcCgpOwotCQl0cnkgewotCQkJZGVsdGEuYWNjZXB0KG5ldyBJUmVzb3VyY2VEZWx0YVZpc2l0b3IoKSB7Ci0JCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlRGVsdGEgZGVsdGEyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkJCWlmICh0LmIpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCS8vVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCBkZWx0YTIuZ2V0UmVzb3VyY2UoKSArICIgICIgKyBkZWx0YTIuZ2V0S2luZCgpICsgIiAiICsgZGVsdGEyLmdldEZsYWdzKCkpOwotCQkJCQlpZiAoZGVsdGEyLmdldEtpbmQoKSA9PSBJUmVzb3VyY2VEZWx0YS5OT19DSEFOR0UpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCWlmIChkZWx0YTIuZ2V0UmVzb3VyY2UoKSBpbnN0YW5jZW9mIElGaWxlKSB7Ci0JCQkJCQlpZiAoZGVsdGEyLmdldEtpbmQoKSA9PSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VECi0JCQkJCQkJJiYgKGRlbHRhMi5nZXRGbGFncygpICYgSVJlc291cmNlRGVsdGEuQ09OVEVOVCkgPT0gMAotCQkJCQkJCSYmIChkZWx0YTIuZ2V0RmxhZ3MoKSAmIElSZXNvdXJjZURlbHRhLlJFUExBQ0VEKSA9PSAwCi0JCQkJCQkJJiYgKGRlbHRhMi5nZXRGbGFncygpICYgSVJlc291cmNlRGVsdGEuU1lOQykgPT0gMCkKLQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCS8vaWYgKGRlbHRhMi5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuQ0hBTkdFRCkgeyAvLyAmJiBkZWx0YTIuZ2V0QWZmZWN0ZWRDaGlsZHJlbigpLmxlbmd0aCA9PSAwKSB7Ci0JCQkJCQl0LmIgPSB0cnVlOwotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJCS8vcmV0dXJuIHRydWU7Ci0JCQkJCQkvL30KLQkJCQkJfQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9KTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCS8vVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiRGVsdGEgY29udGFpbnMgY2hhbmdlOiAiICsgdC5iKTsKLQkJcmV0dXJuIHQuYjsKLQl9Ci0KLQkvKioKLQkgKiBSZWdpc3RlcnMgYSBuZXcgcnVudGltZS4KLQkgKgotCSAqIEBwYXJhbSBydW50aW1lIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZ2lzdGVyUnVudGltZShJUnVudGltZSBydW50aW1lKSB7Ci0JCWlmIChydW50aW1lID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCi0JCVRyYWNlLnRyYWNlKFRyYWNlLlJFU09VUkNFUywgIlJlZ2lzdGVyaW5nIHJ1bnRpbWU6ICIgKyBydW50aW1lLmdldE5hbWUoKSk7Ci0JCi0JCXJ1bnRpbWVzLmFkZChydW50aW1lKTsKLQkJZmlyZVJ1bnRpbWVFdmVudChydW50aW1lLCBFVkVOVF9BRERFRCk7Ci0JCQotCQlSdW50aW1lVHlwZSBydW50aW1lVHlwZSA9IChSdW50aW1lVHlwZSkgcnVudGltZS5nZXRSdW50aW1lVHlwZSgpOwotCQlTdHJpbmcgYnVuZGxlSWQgPSBydW50aW1lVHlwZS5nZXROYW1lc3BhY2UoKTsKLQkJaWYgKCFhY3RpdmVCdW5kbGVzLmNvbnRhaW5zKGJ1bmRsZUlkKSkKLQkJCWFjdGl2ZUJ1bmRsZXMuYWRkKGJ1bmRsZUlkKTsKLQl9Ci0KLQkvKioKLQkgKiBSZWdpc3RlcnMgYSBuZXcgc2VydmVyLgotCSAqCi0JICogQHBhcmFtIHNlcnZlciBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZ2lzdGVyU2VydmVyKElTZXJ2ZXIgc2VydmVyKSB7Ci0JCWlmIChzZXJ2ZXIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkKLQkJVHJhY2UudHJhY2UoVHJhY2UuUkVTT1VSQ0VTLCAiUmVnaXN0ZXJpbmcgc2VydmVyOiAiICsgc2VydmVyLmdldE5hbWUoKSk7Ci0JCi0JCXNlcnZlcnMuYWRkKHNlcnZlcik7Ci0JCWZpcmVTZXJ2ZXJFdmVudChzZXJ2ZXIsIEVWRU5UX0FEREVEKTsKLQkJCi0JCVNlcnZlclR5cGUgc2VydmVyVHlwZSA9IChTZXJ2ZXJUeXBlKSBzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpOwotCQlTdHJpbmcgYnVuZGxlSWQgPSBzZXJ2ZXJUeXBlLmdldE5hbWVzcGFjZSgpOwotCQlpZiAoIWFjdGl2ZUJ1bmRsZXMuY29udGFpbnMoYnVuZGxlSWQpKQotCQkJYWN0aXZlQnVuZGxlcy5hZGQoYnVuZGxlSWQpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGZpcmVNb2R1bGVTZXJ2ZXJFdmVudChNb2R1bGVGYWN0b3J5RXZlbnRbXSBmYWN0b3J5RXZlbnRzLCBNb2R1bGVFdmVudFtdIGV2ZW50cykgewotCQkvLyBkbyBub3RoaW5nCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1Jlc3RhcnRTZXJ2ZXJKb2IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1Jlc3RhcnRTZXJ2ZXJKb2IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk5ZDNlYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9SZXN0YXJ0U2VydmVySm9iLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLaAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXIuSU9wZXJhdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5TZXJ2ZXJTY2hlZHVsaW5nUnVsZTsKLS8qKgotICogQSBqb2IgZm9yIHJlc3RhcnRpbmcgYSBzZXJ2ZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXN0YXJ0U2VydmVySm9iIGV4dGVuZHMgQ2hhaW5lZEpvYiB7Ci0JcHJvdGVjdGVkIFN0cmluZyBsYXVuY2hNb2RlOwotCXByb3RlY3RlZCBib29sZWFuIGlzUmVzdGFydENvbXBsZXRlZCA9IGZhbHNlOwotCXByb3RlY3RlZCBJU3RhdHVzIHJlc3VsdFN0YXR1czsKLQotCXB1YmxpYyBSZXN0YXJ0U2VydmVySm9iKElTZXJ2ZXIgc2VydmVyLCBTdHJpbmcgbGF1bmNoTW9kZSkgewotCQlzdXBlcihOTFMuYmluZChNZXNzYWdlcy5qb2JSZXN0YXJ0aW5nU2VydmVyLCBzZXJ2ZXIuZ2V0TmFtZSgpKSwgc2VydmVyKTsKLQkJdGhpcy5sYXVuY2hNb2RlID0gbGF1bmNoTW9kZTsKLQkJc2V0UnVsZShuZXcgU2VydmVyU2NoZWR1bGluZ1J1bGUoc2VydmVyKSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5pbnRlcm5hbC5qb2JzLkludGVybmFsSm9iI3J1bihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCUlPcGVyYXRpb25MaXN0ZW5lciBsaXN0ZW5lcjIgPSBuZXcgSU9wZXJhdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgZG9uZShJU3RhdHVzIHJlc3VsdCkgewotCQkJCWlzUmVzdGFydENvbXBsZXRlZCA9IHRydWU7Ci0JCQkJcmVzdWx0U3RhdHVzID0gcmVzdWx0OwotCQkJfQotCQl9OwotCQlnZXRTZXJ2ZXIoKS5yZXN0YXJ0KGxhdW5jaE1vZGUsIGxpc3RlbmVyMik7Ci0JCQotCQkvLyBibG9jayB1dGlsIHRoZSByZXN0YXJ0IGlzIGNvbXBsZXRlZAotCQl3aGlsZSAoIWlzUmVzdGFydENvbXBsZXRlZCkgewotCQkJdHJ5IHsKLQkJCQlUaHJlYWQuc2xlZXAoMjUwKTsKLQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBEbyBub3RoaW5nLgotCQkJfQotCQl9Ci0JCQotCQlpZiAocmVzdWx0U3RhdHVzICE9IG51bGwpCi0JCQlyZXR1cm4gcmVzdWx0U3RhdHVzOwotCQkKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1J1bnRpbWUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1J1bnRpbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE0ZmNmZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9SdW50aW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi2gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSW50ZXJuYWxJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuUnVudGltZURlbGVnYXRlOwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFJ1bnRpbWUgZXh0ZW5kcyBCYXNlIGltcGxlbWVudHMgSVJ1bnRpbWUgewotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfUlVOVElNRV9UWVBFX0lEID0gInJ1bnRpbWUtdHlwZS1pZCI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9MT0NBVElPTiA9ICJsb2NhdGlvbiI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9URVNUX0VOVklST05NRU5UID0gInRlc3QtZW52aXJvbm1lbnQiOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfU1RVQiA9ICJzdHViIjsKLQotCXByb3RlY3RlZCBJUnVudGltZVR5cGUgcnVudGltZVR5cGU7Ci0JcHJvdGVjdGVkIFJ1bnRpbWVEZWxlZ2F0ZSBkZWxlZ2F0ZTsKLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBydW50aW1lLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICovCi0JcHVibGljIFJ1bnRpbWUoSUZpbGUgZmlsZSkgewotCQlzdXBlcihmaWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgcnVudGltZS4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZQotCSAqIEBwYXJhbSBpZAotCSAqIEBwYXJhbSBydW50aW1lVHlwZQotCSAqLwotCXB1YmxpYyBSdW50aW1lKElGaWxlIGZpbGUsIFN0cmluZyBpZCwgSVJ1bnRpbWVUeXBlIHJ1bnRpbWVUeXBlKSB7Ci0JCXN1cGVyKGZpbGUsIGlkKTsKLQkJdGhpcy5ydW50aW1lVHlwZSA9IHJ1bnRpbWVUeXBlOwotCQltYXAucHV0KFBST1BfTkFNRSwgcnVudGltZVR5cGUuZ2V0TmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElSdW50aW1lI2dldFJ1bnRpbWVUeXBlKCkKLQkgKi8KLQlwdWJsaWMgSVJ1bnRpbWVUeXBlIGdldFJ1bnRpbWVUeXBlKCkgewotCQlyZXR1cm4gcnVudGltZVR5cGU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJUnVudGltZSN2YWxpZGF0ZShJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQl0cnkgewotCQkJcmV0dXJuIGdldERlbGVnYXRlKG1vbml0b3IpLnZhbGlkYXRlKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBjYWxsaW5nIGRlbGVnYXRlIHZhbGlkYXRlKCkgIiArIHRvU3RyaW5nKCksIGUpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgUnVudGltZURlbGVnYXRlIGdldERlbGVnYXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAoZGVsZWdhdGUgIT0gbnVsbCkKLQkJCXJldHVybiBkZWxlZ2F0ZTsKLQkJCi0JCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJaWYgKGRlbGVnYXRlID09IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlsb25nIHRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQkJZGVsZWdhdGUgPSAoKFJ1bnRpbWVUeXBlKSBydW50aW1lVHlwZSkuY3JlYXRlUnVudGltZURlbGVnYXRlKCk7Ci0JCQkJCUludGVybmFsSW5pdGlhbGl6ZXIuaW5pdGlhbGl6ZVJ1bnRpbWVEZWxlZ2F0ZShkZWxlZ2F0ZSwgdGhpcywgbW9uaXRvcik7Ci0JCQkJCS8vZGVsZWdhdGUuaW5pdGlhbGl6ZSh0aGlzKTsKLQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuUEVSRk9STUFOQ0UsICJSdW50aW1lLmdldERlbGVnYXRlKCk6IDwiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGltZSkgKyAiPiAiICsgZ2V0UnVudGltZVR5cGUoKS5nZXRJZCgpKTsKLQkJCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3QgY3JlYXRlIGRlbGVnYXRlICIgKyB0b1N0cmluZygpLCB0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRlbGVnYXRlOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChkZWxlZ2F0ZSAhPSBudWxsKSB7Ci0JCQlkZWxlZ2F0ZS5kaXNwb3NlKCk7Ci0JCQlkZWxlZ2F0ZSA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElSdW50aW1lI2NyZWF0ZVdvcmtpbmdDb3B5KCkKLQkgKi8KLQlwdWJsaWMgSVJ1bnRpbWVXb3JraW5nQ29weSBjcmVhdGVXb3JraW5nQ29weSgpIHsKLQkJcmV0dXJuIG5ldyBSdW50aW1lV29ya2luZ0NvcHkodGhpcyk7IAotCX0KLQotCS8qKgotCSAqIEBzZWUgSVJ1bnRpbWUjaXNXb3JraW5nQ29weSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNXb3JraW5nQ29weSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVJ1bnRpbWUjZ2V0TG9jYXRpb24oKQotCSAqLwotCXB1YmxpYyBJUGF0aCBnZXRMb2NhdGlvbigpIHsKLQkJU3RyaW5nIHRlbXAgPSBnZXRBdHRyaWJ1dGUoUFJPUF9MT0NBVElPTiwgKFN0cmluZyludWxsKTsKLQkJaWYgKHRlbXAgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gbmV3IFBhdGgodGVtcCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGRlbGV0ZUZyb21NZXRhZGF0YSgpIHsKLQkJUmVzb3VyY2VNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVtb3ZlUnVudGltZSh0aGlzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzYXZlVG9NZXRhZGF0YShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJc3VwZXIuc2F2ZVRvTWV0YWRhdGEobW9uaXRvcik7Ci0JCVJlc291cmNlTWFuYWdlci5nZXRJbnN0YW5jZSgpLmFkZFJ1bnRpbWUodGhpcyk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRYTUxSb290KCkgewotCQlyZXR1cm4gInJ1bnRpbWUiOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzVGVzdEVudmlyb25tZW50KCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKFBST1BfVEVTVF9FTlZJUk9OTUVOVCwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVJ1bnRpbWUjaXNTdHViKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1N0dWIoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoUFJPUF9TVFVCLCBmYWxzZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0SW50ZXJuYWwoUnVudGltZVdvcmtpbmdDb3B5IHdjKSB7Ci0JCW1hcCA9IHdjLm1hcDsKLQkJcnVudGltZVR5cGUgPSB3Yy5ydW50aW1lVHlwZTsKLQkJZmlsZSA9IHdjLmZpbGU7Ci0JCWRlbGVnYXRlID0gd2MuZGVsZWdhdGU7Ci0JCQotCQlpbnQgdGltZXN0YW1wID0gd2MuZ2V0VGltZXN0YW1wKCk7Ci0JCW1hcC5wdXQoInRpbWVzdGFtcCIsIEludGVnZXIudG9TdHJpbmcodGltZXN0YW1wKzEpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBsb2FkU3RhdGUoSU1lbWVudG8gbWVtZW50bykgewotCQlyZXNvbHZlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVzb2x2ZSgpIHsKLQkJU3RyaW5nIHJ1bnRpbWVUeXBlSWQgPSBnZXRBdHRyaWJ1dGUoUFJPUF9SVU5USU1FX1RZUEVfSUQsIChTdHJpbmcpIG51bGwpOwotCQlpZiAocnVudGltZVR5cGVJZCAhPSBudWxsKQotCQkJcnVudGltZVR5cGUgPSBTZXJ2ZXJDb3JlLmZpbmRSdW50aW1lVHlwZShydW50aW1lVHlwZUlkKTsKLQkJZWxzZQotCQkJcnVudGltZVR5cGUgPSBudWxsOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNhdmVTdGF0ZShJTWVtZW50byBtZW1lbnRvKSB7Ci0JCWlmIChydW50aW1lVHlwZSAhPSBudWxsKQotCQkJbWVtZW50by5wdXRTdHJpbmcoUFJPUF9SVU5USU1FX1RZUEVfSUQsIHJ1bnRpbWVUeXBlLmdldElkKCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgT2JqZWN0I2VxdWFscyhPYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJaWYgKCEob2JqIGluc3RhbmNlb2YgUnVudGltZSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQlSdW50aW1lIHJ1bnRpbWUgPSAoUnVudGltZSkgb2JqOwotCQlyZXR1cm4gcnVudGltZS5nZXRJZCgpLmVxdWFscyhnZXRJZCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElSdW50aW1lI2dldEFkYXB0ZXIoQ2xhc3MpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJaWYgKGRlbGVnYXRlICE9IG51bGwpIHsKLQkJCWlmIChhZGFwdGVyLmlzSW5zdGFuY2UoZGVsZWdhdGUpKQotCQkJCXJldHVybiBkZWxlZ2F0ZTsKLQkJfQotCQlyZXR1cm4gUGxhdGZvcm0uZ2V0QWRhcHRlck1hbmFnZXIoKS5nZXRBZGFwdGVyKHRoaXMsIGFkYXB0ZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVJ1bnRpbWUjbG9hZEFkYXB0ZXIoQ2xhc3MsIElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIE9iamVjdCBsb2FkQWRhcHRlcihDbGFzcyBhZGFwdGVyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJZ2V0RGVsZWdhdGUobW9uaXRvcik7Ci0JCWlmIChhZGFwdGVyLmlzSW5zdGFuY2UoZGVsZWdhdGUpKQotCQkJcmV0dXJuIGRlbGVnYXRlOwotCQotCQlyZXR1cm4gUGxhdGZvcm0uZ2V0QWRhcHRlck1hbmFnZXIoKS5sb2FkQWRhcHRlcih0aGlzLCBhZGFwdGVyLmdldE5hbWUoKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPYmplY3QjdG9TdHJpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiUnVudGltZVsiICsgZ2V0SWQoKSArICIsICIgKyBnZXROYW1lKCkgKyAiLCAiICsgZ2V0TG9jYXRpb24oKSArICIsICIgKyBnZXRSdW50aW1lVHlwZSgpICsgIl0iOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9SdW50aW1lTG9jYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvUnVudGltZUxvY2F0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY4M2U3OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9SdW50aW1lTG9jYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWVXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuUnVudGltZUxvY2F0b3JEZWxlZ2F0ZTsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBSdW50aW1lTG9jYXRvciBpbXBsZW1lbnRzIElSdW50aW1lTG9jYXRvciB7Ci0JcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudDsKLQlwcml2YXRlIFJ1bnRpbWVMb2NhdG9yRGVsZWdhdGUgZGVsZWdhdGU7Ci0KLQlwdWJsaWMgUnVudGltZUxvY2F0b3IoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLQl9Ci0JCi0JcHJvdGVjdGVkIElDb25maWd1cmF0aW9uRWxlbWVudCBnZXRFbGVtZW50KCkgewotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVJ1bnRpbWVMb2NhdG9yI2dldElkKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImlkIik7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElSdW50aW1lTG9jYXRvcgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRUeXBlSWRzKCkgewotCQl0cnkgewotCQkJcmV0dXJuIFNlcnZlclBsdWdpbi50b2tlbml6ZShlbGVtZW50LmdldEF0dHJpYnV0ZSgidHlwZUlkcyIpLCAiLCIpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVJ1bnRpbWVMb2NhdG9yCi0JICovCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHNUeXBlKFN0cmluZyBpZCkgewotCQlyZXR1cm4gU2VydmVyUGx1Z2luLnN1cHBvcnRzVHlwZShnZXRUeXBlSWRzKCksIGlkKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUnVudGltZUxvY2F0b3JEZWxlZ2F0ZSBnZXREZWxlZ2F0ZSgpIHsKLQkJaWYgKGRlbGVnYXRlID09IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJZGVsZWdhdGUgPSAoUnVudGltZUxvY2F0b3JEZWxlZ2F0ZSkgZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJjbGFzcyIpOwotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3QgY3JlYXRlIGRlbGVnYXRlICIgKyB0b1N0cmluZygpICsgIjogIiArIHQuZ2V0TWVzc2FnZSgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZGVsZWdhdGU7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElSdW50aW1lTG9jYXRvciNzZWFyY2hGb3JSdW50aW1lcygpCi0JICovCi0JcHVibGljIHZvaWQgc2VhcmNoRm9yUnVudGltZXMoSVBhdGggcGF0aCwgZmluYWwgSVJ1bnRpbWVTZWFyY2hMaXN0ZW5lciBmb3VuZCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXRyeSB7Ci0JCQkvL2dldERlbGVnYXRlKCkuc2VhcmNoRm9yUnVudGltZXMocGF0aCwgZm91bmQsIG1vbml0b3IpOwotCQkJZ2V0RGVsZWdhdGUoKS5zZWFyY2hGb3JSdW50aW1lcyhwYXRoLCBuZXcgUnVudGltZUxvY2F0b3JEZWxlZ2F0ZS5JUnVudGltZVNlYXJjaExpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bnRpbWVGb3VuZChJUnVudGltZVdvcmtpbmdDb3B5IHJ1bnRpbWUpIHsKLQkJCQkJZm91bmQucnVudGltZUZvdW5kKHJ1bnRpbWUpOwotCQkJCX0KLQkJCX0sIG1vbml0b3IpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgY2FsbGluZyBkZWxlZ2F0ZSAiICsgdG9TdHJpbmcoKSArICI6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIlJ1bnRpbWVMb2NhdG9yWyIgKyBnZXRJZCgpICsgIl0iOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9SdW50aW1lVHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvUnVudGltZVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjEyZWUxZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9SdW50aW1lVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5SdW50aW1lRGVsZWdhdGU7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUnVudGltZVR5cGUgaW1wbGVtZW50cyBJUnVudGltZVR5cGUgewotCXByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQ7Ci0JcHJpdmF0ZSBMaXN0IG1vZHVsZVR5cGVzOwotCi0JcHVibGljIFJ1bnRpbWVUeXBlKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiB0aGUgaWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQl0cnkgewotCQkJcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJpZCIpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBuYW1lCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQl0cnkgewotCQkJcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJuYW1lIik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGRlc2NyaXB0aW9uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZSgiZGVzY3JpcHRpb24iKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0VmVuZG9yKCkgewotCQl0cnkgewotCQkJU3RyaW5nIHZlbmRvciA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ2ZW5kb3IiKTsKLQkJCWlmICh2ZW5kb3IgIT0gbnVsbCkKLQkJCQlyZXR1cm4gdmVuZG9yOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQkJcmV0dXJuIE1lc3NhZ2VzLmRlZmF1bHRWZW5kb3I7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpIHsKLQkJdHJ5IHsKLQkJCVN0cmluZyB2ZXJzaW9uID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoInZlcnNpb24iKTsKLQkJCWlmICh2ZXJzaW9uICE9IG51bGwpCi0JCQkJcmV0dXJuIHZlcnNpb247Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQlyZXR1cm4gTWVzc2FnZXMuZGVmYXVsdFZlcnNpb247Ci0JfQotCQotCXByb3RlY3RlZCBSdW50aW1lRGVsZWdhdGUgY3JlYXRlUnVudGltZURlbGVnYXRlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0cnkgewotCQkJcmV0dXJuIChSdW50aW1lRGVsZWdhdGUpIGVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc3VwcG9ydGVkIG1vZHVsZSB0eXBlcy4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIG1vZHVsZSB0eXBlcwotCSAqLwotCXB1YmxpYyBJTW9kdWxlVHlwZVtdIGdldE1vZHVsZVR5cGVzKCkgewotCQl0cnkgewotCQkJaWYgKG1vZHVsZVR5cGVzID09IG51bGwpCi0JCQkJbW9kdWxlVHlwZXMgPSBTZXJ2ZXJQbHVnaW4uZ2V0TW9kdWxlVHlwZXMoZWxlbWVudC5nZXRDaGlsZHJlbigibW9kdWxlVHlwZSIpKTsKLQkKLQkJCUlNb2R1bGVUeXBlW10gbXQgPSBuZXcgSU1vZHVsZVR5cGVbbW9kdWxlVHlwZXMuc2l6ZSgpXTsKLQkJCW1vZHVsZVR5cGVzLnRvQXJyYXkobXQpOwotCQkJcmV0dXJuIG10OwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG5ldyBJTW9kdWxlVHlwZVswXTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhbkNyZWF0ZSgpIHsKLQkJdHJ5IHsKLQkJCVN0cmluZyBhID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImNsYXNzIik7Ci0JCQlyZXR1cm4gYSAhPSBudWxsICYmIGEubGVuZ3RoKCkgPiAwOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JcHVibGljIElSdW50aW1lV29ya2luZ0NvcHkgY3JlYXRlUnVudGltZShTdHJpbmcgaWQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlSdW50aW1lV29ya2luZ0NvcHkgcndjID0gbmV3IFJ1bnRpbWVXb3JraW5nQ29weShudWxsLCBpZCwgdGhpcyk7Ci0JCXJ3Yy5zZXREZWZhdWx0cyhtb25pdG9yKTsKLQkJcmV0dXJuIHJ3YzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQllbGVtZW50ID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZSgpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gZWxlbWVudC5nZXREZWNsYXJpbmdFeHRlbnNpb24oKS5nZXROYW1lc3BhY2UoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIlJ1bnRpbWVUeXBlWyIgKyBnZXRJZCgpICsgIiwgIiArIGdldE5hbWUoKSArICJdIjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvUnVudGltZVdvcmtpbmdDb3B5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9SdW50aW1lV29ya2luZ0NvcHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmEyZDRmMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9SdW50aW1lV29ya2luZ0NvcHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLkludGVybmFsSW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLlJ1bnRpbWVEZWxlZ2F0ZTsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBSdW50aW1lV29ya2luZ0NvcHkgZXh0ZW5kcyBSdW50aW1lIGltcGxlbWVudHMgSVJ1bnRpbWVXb3JraW5nQ29weSB7Ci0JcHJvdGVjdGVkIFN0cmluZyBQUk9QX0lEX1NFVCA9ICJpZC1zZXQiOwotCXByb3RlY3RlZCBSdW50aW1lIHJ1bnRpbWU7Ci0JcHJvdGVjdGVkIFdvcmtpbmdDb3B5SGVscGVyIHdjaDsKLQkKLQlwcm90ZWN0ZWQgUnVudGltZURlbGVnYXRlIHdvcmtpbmdDb3B5RGVsZWdhdGU7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgcnVudGltZSB3b3JraW5nIGNvcHkgZnJvbSBleGlzdGluZyBydW50aW1lLgotCSAqIAotCSAqIEBwYXJhbSBydW50aW1lCi0JICovCi0JcHVibGljIFJ1bnRpbWVXb3JraW5nQ29weShSdW50aW1lIHJ1bnRpbWUpIHsKLQkJc3VwZXIocnVudGltZS5nZXRGaWxlKCkpOwotCQl0aGlzLnJ1bnRpbWUgPSBydW50aW1lOwotCQkKLQkJcnVudGltZVR5cGUgPSBydW50aW1lLmdldFJ1bnRpbWVUeXBlKCk7Ci0JCQotCQltYXAgPSBuZXcgSGFzaE1hcChydW50aW1lLm1hcCk7Ci0JCXdjaCA9IG5ldyBXb3JraW5nQ29weUhlbHBlcih0aGlzKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IHJ1bnRpbWUgd29ya2luZyBjb3B5IGZvciBhIG5ldyBydW50aW1lLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICogQHBhcmFtIGlkCi0JICogQHBhcmFtIHJ1bnRpbWVUeXBlCi0JICovCi0JcHVibGljIFJ1bnRpbWVXb3JraW5nQ29weShJRmlsZSBmaWxlLCBTdHJpbmcgaWQsIElSdW50aW1lVHlwZSBydW50aW1lVHlwZSkgewotCQlzdXBlcihmaWxlLCBpZCwgcnVudGltZVR5cGUpOwotCQl3Y2ggPSBuZXcgV29ya2luZ0NvcHlIZWxwZXIodGhpcyk7Ci0JCXdjaC5zZXREaXJ0eSh0cnVlKTsKLQkJCi0JCWlmIChpZCA9PSBudWxsIHx8IGlkLmxlbmd0aCgpID09IDApIHsKLQkJCWlkID0gU2VydmVyUGx1Z2luLmdlbmVyYXRlSWQoKTsKLQkJCW1hcC5wdXQoUFJPUF9JRCwgaWQpOwotCQl9IGVsc2UKLQkJCXNldEF0dHJpYnV0ZShQUk9QX0lEX1NFVCwgdHJ1ZSk7Ci0JCQotCQkvLyB0aHJvdyBDb3JlRXhjZXB0aW9uIGlmIHRoZSBpZCBhbHJlYWR5IGV4aXN0cwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVJ1bnRpbWUjaXNXb3JraW5nQ29weSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNXb3JraW5nQ29weSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJUnVudGltZSNjcmVhdGVXb3JraW5nQ29weSgpCi0JICovCi0JcHVibGljIElSdW50aW1lV29ya2luZ0NvcHkgY3JlYXRlV29ya2luZ0NvcHkoKSB7Ci0JCXJldHVybiB0aGlzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShTdHJpbmcgYXR0cmlidXRlTmFtZSwgaW50IHZhbHVlKSB7Ci0JCXdjaC5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSwgdmFsdWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShTdHJpbmcgYXR0cmlidXRlTmFtZSwgYm9vbGVhbiB2YWx1ZSkgewotCQl3Y2guc2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUsIHZhbHVlKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBTdHJpbmcgdmFsdWUpIHsKLQkJd2NoLnNldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lLCB2YWx1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBMaXN0IHZhbHVlKSB7Ci0JCXdjaC5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSwgdmFsdWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShTdHJpbmcgYXR0cmlidXRlTmFtZSwgTWFwIHZhbHVlKSB7Ci0JCXdjaC5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSwgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVJ1bnRpbWVXb3JraW5nQ29weSNzZXROYW1lKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXdjaC5zZXROYW1lKG5hbWUpOwotCQlib29sZWFuIHNldCA9IGdldEF0dHJpYnV0ZShQUk9QX0lEX1NFVCwgZmFsc2UpOwotCQlpZiAocnVudGltZSA9PSBudWxsICYmICFzZXQpCi0JCQlzZXRBdHRyaWJ1dGUoImlkIiwgbmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VGVzdEVudmlyb25tZW50KGJvb2xlYW4gYikgewotCQlzZXRBdHRyaWJ1dGUoUFJPUF9URVNUX0VOVklST05NRU5ULCBiKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBJUnVudGltZVdvcmtpbmdDb3B5I3NldFN0dWIoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdHViKGJvb2xlYW4gYikgewotCQlzZXRBdHRyaWJ1dGUoUFJPUF9TVFVCLCBiKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElSdW50aW1lV29ya2luZ0NvcHkjaXNEaXJ0eSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEaXJ0eSgpIHsKLQkJcmV0dXJuIHdjaC5pc0RpcnR5KCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgSVJ1bnRpbWVXb3JraW5nQ29weSNnZXRPcmlnaW5hbCgpCi0JICovCi0JcHVibGljIElSdW50aW1lIGdldE9yaWdpbmFsKCkgewotCQlyZXR1cm4gcnVudGltZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElSdW50aW1lV29ya2luZ0NvcHkjc2V0UmVhZE9ubHkoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWFkT25seShib29sZWFuIGIpIHsKLQkJd2NoLnNldExvY2tlZChiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQcml2YXRlKGJvb2xlYW4gYikgewotCQl3Y2guc2V0UHJpdmF0ZShiKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElSdW50aW1lV29ya2luZ0NvcHkjc2V0TG9jYXRpb24oSVBhdGgpCi0JICovCi0JcHVibGljIHZvaWQgc2V0TG9jYXRpb24oSVBhdGggcGF0aCkgewotCQlpZiAocGF0aCA9PSBudWxsKQotCQkJc2V0QXR0cmlidXRlKFBST1BfTE9DQVRJT04sIChTdHJpbmcpbnVsbCk7Ci0JCWVsc2UKLQkJCXNldEF0dHJpYnV0ZShQUk9QX0xPQ0FUSU9OLCBwYXRoLnRvU3RyaW5nKCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVJ1bnRpbWVXb3JraW5nQ29weSNzYXZlKGJvb2xlYW4sIElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIElSdW50aW1lIHNhdmUoYm9vbGVhbiBmb3JjZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCW1vbml0b3IgPSBQcm9ncmVzc1V0aWwuZ2V0TW9uaXRvckZvcihtb25pdG9yKTsKLQkJbW9uaXRvci5zdWJUYXNrKE5MUy5iaW5kKE1lc3NhZ2VzLnNhdmluZ1Rhc2ssIGdldE5hbWUoKSkpOwotCQkKLQkJaWYgKCFmb3JjZSAmJiBnZXRPcmlnaW5hbCgpICE9IG51bGwpCi0JCQl3Y2gudmFsaWRhdGVUaW1lc3RhbXAoKChSdW50aW1lKSBnZXRPcmlnaW5hbCgpKS5nZXRUaW1lc3RhbXAoKSk7Ci0JCQotCQlJUnVudGltZSBvcmlnUnVudGltZSA9IHJ1bnRpbWU7Ci0JCWlmIChydW50aW1lID09IG51bGwpCi0JCQlydW50aW1lID0gbmV3IFJ1bnRpbWUoZmlsZSk7Ci0JCQotCQlTdHJpbmcgb2xkSWQgPSBnZXRJZCgpOwotCQlTdHJpbmcgbmFtZSA9IGdldE5hbWUoKTsKLQkJYm9vbGVhbiBzZXQgPSBnZXRBdHRyaWJ1dGUoUFJPUF9JRF9TRVQsIGZhbHNlKTsKLQkJaWYgKCFvbGRJZC5lcXVhbHMobmFtZSkgJiYgIXNldCkgewotCQkJc2V0QXR0cmlidXRlKCJpZCIsIG5hbWUpOwotCQl9IGVsc2UKLQkJCW9sZElkID0gbnVsbDsKLQkJCi0JCXJ1bnRpbWUuc2V0SW50ZXJuYWwodGhpcyk7Ci0JCXJ1bnRpbWUuc2F2ZVRvTWV0YWRhdGEobW9uaXRvcik7Ci0JCXdjaC5zZXREaXJ0eShmYWxzZSk7Ci0JCQotCQlpZiAob2xkSWQgIT0gbnVsbCkKLQkJCXVwZGF0ZVJ1bnRpbWVSZWZlcmVuY2VzKG9sZElkLCBuYW1lLCBvcmlnUnVudGltZSk7Ci0JCQotCQlyZXR1cm4gcnVudGltZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVSdW50aW1lUmVmZXJlbmNlcyhmaW5hbCBTdHJpbmcgb2xkSWQsIGZpbmFsIFN0cmluZyBuZXdJZCwgZmluYWwgSVJ1bnRpbWUgb3JpZ1J1bnRpbWUpIHsKLQkJLy8gVE9ETyBmaXggbWUKLQkJLypjbGFzcyBVcGRhdGVSdW50aW1lUmVmZXJlbmNlc0pvYiBleHRlbmRzIEpvYiB7Ci0JCQlwdWJsaWMgVXBkYXRlUnVudGltZVJlZmVyZW5jZXNKb2IoKSB7Ci0JCQkJc3VwZXIoTkxTLmJpbmQoTWVzc2FnZXMuc2F2aW5nVGFzaywgbmV3SWQpKTsKLQkJCX0KLQotCQkJcHVibGljIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCS8vIGZpeCAucnVudGltZSBmaWxlcwotCQkJCUlQcm9qZWN0W10gcHJvamVjdHMgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3RzKCk7Ci0JCQkJaWYgKHByb2plY3RzICE9IG51bGwpIHsKLQkJCQkJaW50IHNpemUgPSBwcm9qZWN0cy5sZW5ndGg7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJCQlQcm9qZWN0UHJvcGVydGllcyBwcm9wcyA9IChQcm9qZWN0UHJvcGVydGllcykgU2VydmVyQ29yZS5nZXRQcm9qZWN0UHJvcGVydGllcyhwcm9qZWN0c1tpXSk7Ci0JCQkJCQlpZiAob2xkSWQuZXF1YWxzKHByb3BzLmdldFJ1bnRpbWVUYXJnZXRJZCgpKSkgewotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCXByb3BzLnNldFJ1bnRpbWVUYXJnZXRJZChuZXdJZCwgbW9uaXRvcik7Ci0JCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3Igc2V0dGluZyBydW50aW1lIHRhcmdldCIsIGUpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQkvLyBzYXZlIHNlcnZlcnMKLQkJCQlpZiAocnVudGltZSAhPSBudWxsKSB7Ci0JCQkJCVJlc291cmNlTWFuYWdlciBybSA9IFJlc291cmNlTWFuYWdlci5nZXRJbnN0YW5jZSgpOwotCQkJCQlJU2VydmVyW10gc2VydmVycyA9IHJtLmdldFNlcnZlcnMoKTsKLQkJCQkJaWYgKHNlcnZlcnMgIT0gbnVsbCkgewotCQkJCQkJaW50IHNpemUgPSBzZXJ2ZXJzLmxlbmd0aDsKLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJCQkJaWYgKG9sZElkLmVxdWFscygoKFNlcnZlcilzZXJ2ZXJzW2ldKS5nZXRSdW50aW1lSWQoKSkpIHsKLQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCVNlcnZlcldvcmtpbmdDb3B5IHdjID0gKFNlcnZlcldvcmtpbmdDb3B5KSBzZXJ2ZXJzW2ldLmNyZWF0ZVdvcmtpbmdDb3B5KCk7Ci0JCQkJCQkJCQl3Yy5zZXRSdW50aW1lSWQobmV3SWQpOwotCQkJCQkJCQkJd2Muc2F2ZShmYWxzZSwgbW9uaXRvcik7Ci0JCQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQkvLyBpZ25vcmUKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCAiIiwgbnVsbCk7Ci0JCQl9Ci0JCX0KLQkJVXBkYXRlUnVudGltZVJlZmVyZW5jZXNKb2Igam9iID0gbmV3IFVwZGF0ZVJ1bnRpbWVSZWZlcmVuY2VzSm9iKCk7Ci0JCWpvYi5zY2hlZHVsZSgpOyovCi0JfQotCi0JcHJvdGVjdGVkIFJ1bnRpbWVEZWxlZ2F0ZSBnZXRXb3JraW5nQ29weURlbGVnYXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAod29ya2luZ0NvcHlEZWxlZ2F0ZSAhPSBudWxsKQotCQkJcmV0dXJuIHdvcmtpbmdDb3B5RGVsZWdhdGU7Ci0JCQotCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCWlmICh3b3JraW5nQ29weURlbGVnYXRlID09IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlsb25nIHRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQkJd29ya2luZ0NvcHlEZWxlZ2F0ZSA9ICgoUnVudGltZVR5cGUpIHJ1bnRpbWVUeXBlKS5jcmVhdGVSdW50aW1lRGVsZWdhdGUoKTsKLQkJCQkJSW50ZXJuYWxJbml0aWFsaXplci5pbml0aWFsaXplUnVudGltZURlbGVnYXRlKHdvcmtpbmdDb3B5RGVsZWdhdGUsIHRoaXMsIG1vbml0b3IpOwotCQkJCQlUcmFjZS50cmFjZShUcmFjZS5QRVJGT1JNQU5DRSwgIlJ1bnRpbWVXb3JraW5nQ29weS5nZXRXb3JraW5nQ29weURlbGVnYXRlKCk6IDwiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGltZSkgKyAiPiAiICsgZ2V0UnVudGltZVR5cGUoKS5nZXRJZCgpKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3QgY3JlYXRlIGRlbGVnYXRlICIgKyB0b1N0cmluZygpLCBlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHdvcmtpbmdDb3B5RGVsZWdhdGU7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCQlpZiAod29ya2luZ0NvcHlEZWxlZ2F0ZSAhPSBudWxsKQotCQkJd29ya2luZ0NvcHlEZWxlZ2F0ZS5kaXNwb3NlKCk7Ci0JfQotCi0JLyoqCi0JICogQWRkIGEgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyIHRvIHRoaXMgc2VydmVyLgotCSAqCi0JICogQHBhcmFtIGxpc3RlbmVyIGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAobGlzdGVuZXIgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkxpc3RlbmVyIGNhbm5vdCBiZSBudWxsIik7Ci0JCXdjaC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0JCi0JLyoqCi0JICogUmVtb3ZlIGEgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyIGZyb20gdGhpcyBzZXJ2ZXIuCi0JICoKLQkgKiBAcGFyYW0gbGlzdGVuZXIgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChsaXN0ZW5lciA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTGlzdGVuZXIgY2Fubm90IGJlIG51bGwiKTsKLQkJd2NoLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQkKLQkvKioKLQkgKiBGaXJlIGEgcHJvcGVydHkgY2hhbmdlIGV2ZW50LgotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgYSBwcm9wZXJ0eSBuYW1lCi0JICogQHBhcmFtIG9sZFZhbHVlIHRoZSBvbGQgdmFsdWUKLQkgKiBAcGFyYW0gbmV3VmFsdWUgdGhlIG5ldyB2YWx1ZQotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXdjaC5maXJlUHJvcGVydHlDaGFuZ2VFdmVudChwcm9wZXJ0eU5hbWUsIG9sZFZhbHVlLCBuZXdWYWx1ZSk7Ci0JfQotCQotCS8qKgotCSAqIFNldCB0aGUgZGVmYXVsdHMuCi0JICogCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0cyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJdHJ5IHsKLQkJCWdldFdvcmtpbmdDb3B5RGVsZWdhdGUobW9uaXRvcikuc2V0RGVmYXVsdHMobW9uaXRvcik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBjYWxsaW5nIGRlbGVnYXRlIHNldERlZmF1bHRzKCkgIiArIHRvU3RyaW5nKCksIGUpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1NlcnZlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvU2VydmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkOWUzYTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvU2VydmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotoCogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnV0aWwuU29ja2V0VXRpbDsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2ZXIgZXh0ZW5kcyBCYXNlIGltcGxlbWVudHMgSVNlcnZlciB7Ci0JLyoqCi0JICogU2VydmVyIGlkIGF0dHJpYnV0ZSAodmFsdWUgInNlcnZlci1pZCIpIG9mIGxhdW5jaCBjb25maWd1cmF0aW9ucy4KLQkgKiBUaGlzIGF0dHJpYnV0ZSBpcyB1c2VkIHRvIHRhZyBhIGxhdW5jaCBjb25maWd1cmF0aW9uIHdpdGggdGhlCi0JICogaWQgb2YgdGhlIGNvcnJlc3BvbmRpbmcgc2VydmVyLgotCSAqIAotCSAqIEBzZWUgSUxhdW5jaENvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1NFUlZFUl9JRCA9ICJzZXJ2ZXItaWQiOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBMaXN0IEVNUFRZX0xJU1QgPSBuZXcgQXJyYXlMaXN0KDApOwotCi0JLyoqCi0JICogRmlsZSBleHRlbnNpb24gKHZhbHVlICJzZXJ2ZXIiKSBmb3Igc2VyaWFsaXplZCByZXByZXNlbnRhdGlvbiBvZgotCSAqIHNlcnZlciBpbnN0YW5jZXMuCi0JICogPHA+Ci0JICogW2lzc3VlOiBXaGF0IGlzIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoaXMgZmlsZSBleHRlbnNpb24gYW5kCi0JICogdGhlIGZpbGUgcGFzc2VkIHRvIElTZXJ2ZXJUeXBlLmNyZWF0ZSguLi4pIG9yIHJldHVybmVkIGJ5Ci0JICogSVNlcnZlci5nZXRGaWxlKCk/IFRoYXQgaXMsIGFyZSBzZXJ2ZXIgZmlsZXMgZXhwZWN0ZWQgdG8gZW5kCi0JICogaW4gIi5zZXJ2ZXIiLCBvciBpcyB0aGlzIGp1c3QgYSBkZWZhdWx0PyBJZiB0aGUgZm9ybWVyCi0JICogKGFzIEkgc3VzcGVjdCksIHRoZW4gSVNlcnZlclR5cGUuY3JlYXRlIG5lZWRzIHRvIHNheSBzbywKLQkgKiBhbmQgdGhlIGltcGxlbWVudGF0aW9uIHNob3VsZCBlbmZvcmNlIHRoZSByZXN0cmljdGlvbi5dCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfRVhURU5TSU9OID0gInNlcnZlciI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVVRPX1BVQkxJU0hfREVGQVVMVCA9IDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVVUT19QVUJMSVNIX0RJU0FCTEUgPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFVVE9fUFVCTElTSF9PVkVSUklERSA9IDI7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0hPU1ROQU1FID0gImhvc3RuYW1lIjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWRVJfSUQgPSAic2VydmVyLWlkIjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBSVU5USU1FX0lEID0gInJ1bnRpbWUtaWQiOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR1VSQVRJT05fSUQgPSAiY29uZmlndXJhdGlvbi1pZCI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9EVUxFX0xJU1QgPSAibW9kdWxlcyI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9ESVNBQkxFRF9QRVJGRVJSRURfVEFTS1MgPSAiZGlzYWJsZWQtcHJlZmVycmVkLXB1Ymxpc2gtdGFza3MiOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfRU5BQkxFRF9PUFRJT05BTF9UQVNLUyA9ICJlbmFibGVkLW9wdGlvbmFsLXB1Ymxpc2gtdGFza3MiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfQVVUT19QVUJMSVNIX1RJTUUgPSAiYXV0by1wdWJsaXNoLXRpbWUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfQVVUT19QVUJMSVNIX1NFVFRJTkcgPSAiYXV0by1wdWJsaXNoLXNldHRpbmciOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBjaGFyW10gSU5WQUxJRF9DSEFSUyA9IG5ldyBjaGFyW10geydcXCcsICcvJywgJzonLCAnKicsICc/JywgJyInLCAnPCcsICc+JywgJ3wnLCAnXDAnLCAnQCcsICcmJ307Ci0KLQlwcm90ZWN0ZWQgSVNlcnZlclR5cGUgc2VydmVyVHlwZTsKLQlwcm90ZWN0ZWQgU2VydmVyRGVsZWdhdGUgZGVsZWdhdGU7Ci0JcHJvdGVjdGVkIFNlcnZlckJlaGF2aW91ckRlbGVnYXRlIGJlaGF2aW91ckRlbGVnYXRlOwotCi0JcHJvdGVjdGVkIElSdW50aW1lIHJ1bnRpbWU7Ci0JcHJvdGVjdGVkIElGb2xkZXIgY29uZmlndXJhdGlvbjsKLQkKLQkvLyB0aGUgbGlzdCBvZiBtb2R1bGVzIHRoYXQgYXJlIHRvIGJlIHB1Ymxpc2hlZCB0byB0aGUgc2VydmVyCi0JcHJvdGVjdGVkIExpc3QgbW9kdWxlczsKLQkKLQkvLyB0cmFuc2llbnQgZmllbGRzCi0JcHJvdGVjdGVkIHRyYW5zaWVudCBTdHJpbmcgbW9kZSA9IElMYXVuY2hNYW5hZ2VyLlJVTl9NT0RFOwotCXByb3RlY3RlZCB0cmFuc2llbnQgaW50IHNlcnZlclN0YXRlID0gU1RBVEVfVU5LTk9XTjsKLQlwcm90ZWN0ZWQgdHJhbnNpZW50IGludCBzZXJ2ZXJTeW5jU3RhdGU7Ci0JcHJvdGVjdGVkIHRyYW5zaWVudCBib29sZWFuIHNlcnZlclJlc3RhcnROZWVkZWQ7Ci0KLQlwcm90ZWN0ZWQgdHJhbnNpZW50IE1hcCBtb2R1bGVTdGF0ZSA9IG5ldyBIYXNoTWFwKCk7Ci0JcHJvdGVjdGVkIHRyYW5zaWVudCBNYXAgbW9kdWxlUHVibGlzaFN0YXRlID0gbmV3IEhhc2hNYXAoKTsKLQlwcm90ZWN0ZWQgdHJhbnNpZW50IE1hcCBtb2R1bGVSZXN0YXJ0U3RhdGUgPSBuZXcgSGFzaE1hcCgpOwotCQotCXByb3RlY3RlZCB0cmFuc2llbnQgSVN0YXR1cyBzZXJ2ZXJTdGF0dXM7Ci0JcHJvdGVjdGVkIHRyYW5zaWVudCBNYXAgbW9kdWxlU3RhdHVzID0gbmV3IEhhc2hNYXAoKTsKLQotCXByb3RlY3RlZCB0cmFuc2llbnQgU2VydmVyUHVibGlzaEluZm8gcHVibGlzaEluZm87Ci0JcHJvdGVjdGVkIHRyYW5zaWVudCBBdXRvUHVibGlzaFRocmVhZCBhdXRvUHVibGlzaFRocmVhZDsKLQotLyoJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gc3RhdGVTdHJpbmdzID0gbmV3IFN0cmluZ1tdIHsKLQkJInVua25vd24iLCAic3RhcnRpbmciLCAic3RhcnRlZCIsICJzdGFydGVkX2RlYnVnIiwKLQkJInN0b3BwaW5nIiwgInN0b3BwZWQiLCAic3RhcnRlZF91bnN1cHBvcnRlZCIsICJzdGFydGVkX3Byb2ZpbGUiCi0JfTsqLwotCi0JLy8gcHVibGlzaCBsaXN0ZW5lcnMKLQlwcm90ZWN0ZWQgdHJhbnNpZW50IExpc3QgcHVibGlzaExpc3RlbmVyczsKLQotCS8vIFNlcnZlciBsaXN0ZW5lcnMKLQlwcm90ZWN0ZWQgdHJhbnNpZW50IFNlcnZlck5vdGlmaWNhdGlvbk1hbmFnZXIgbm90aWZpY2F0aW9uTWFuYWdlcjsKLQotCXB1YmxpYyBjbGFzcyBBdXRvUHVibGlzaFRocmVhZCBleHRlbmRzIFRocmVhZCB7Ci0JCXB1YmxpYyBib29sZWFuIHN0b3A7Ci0JCXB1YmxpYyBpbnQgdGltZSA9IDA7Ci0KLQkJcHVibGljIEF1dG9QdWJsaXNoVGhyZWFkKCkgewotCQkJc3VwZXIoIkF1dG9tYXRpYyBQdWJsaXNoaW5nIik7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJBdXRvLXB1Ymxpc2ggdGhyZWFkIHN0YXJ0aW5nIGZvciAiICsgU2VydmVyLnRoaXMgKyAiIC0gIiArIHRpbWUgKyAicyIpOwotCQkJaWYgKHN0b3ApCi0JCQkJcmV0dXJuOwotCQkJCi0JCQl0cnkgewotCQkJCXNsZWVwKHRpbWUgKiAxMDAwKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCQkKLQkJCWlmIChzdG9wKQotCQkJCXJldHVybjsKLQkJCQotCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiQXV0by1wdWJsaXNoIHRocmVhZCBwdWJsaXNoaW5nICIgKyBTZXJ2ZXIudGhpcyk7Ci0JCQkKLQkJCVB1Ymxpc2hTZXJ2ZXJKb2IgcHVibGlzaEpvYiA9IG5ldyBQdWJsaXNoU2VydmVySm9iKFNlcnZlci50aGlzLCBJU2VydmVyLlBVQkxJU0hfQVVUTywgZmFsc2UpOwotCQkJcHVibGlzaEpvYi5zY2hlZHVsZSgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29tcGFyYXRvciBQVUJMSVNIX09QRVJBVElPTl9DT01QQVJUT1IgPSBuZXcgQ29tcGFyYXRvcigpIHsKLSAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbGVmdE9wLCBPYmplY3QgcmlnaHRPcCkgewotICAgICAgICAgIFB1Ymxpc2hPcGVyYXRpb24gbGVmdCA9IChQdWJsaXNoT3BlcmF0aW9uKSBsZWZ0T3A7Ci0gICAgICAgICAgUHVibGlzaE9wZXJhdGlvbiByaWdodCA9IChQdWJsaXNoT3BlcmF0aW9uKSByaWdodE9wOwotICAgICAgICAgIGlmIChsZWZ0LmdldE9yZGVyKCkgPiByaWdodC5nZXRPcmRlcigpKQotICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgICBpZiAobGVmdC5nZXRPcmRlcigpIDwgcmlnaHQuZ2V0T3JkZXIoKSkKLSAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgIHJldHVybiAwOwotICAgICAgfQotCX07Ci0KLQkvLyB3b3JraW5nIGNvcHksIGxvYWRlZCByZXNvdXJjZQotCXB1YmxpYyBTZXJ2ZXIoSUZpbGUgZmlsZSkgewotCQlzdXBlcihmaWxlKTsKLQkJbWFwLnB1dChQUk9QX0hPU1ROQU1FLCAibG9jYWxob3N0Iik7Ci0JfQotCi0JLy8gY3JlYXRpb24gKHdvcmtpbmcgY29weSkKLQlwdWJsaWMgU2VydmVyKFN0cmluZyBpZCwgSUZpbGUgZmlsZSwgSVJ1bnRpbWUgcnVudGltZSwgSVNlcnZlclR5cGUgc2VydmVyVHlwZSkgewotCQlzdXBlcihmaWxlLCBpZCk7Ci0JCXRoaXMucnVudGltZSA9IHJ1bnRpbWU7Ci0JCXRoaXMuc2VydmVyVHlwZSA9IHNlcnZlclR5cGU7Ci0JCW1hcC5wdXQoInNlcnZlci10eXBlLWlkIiwgc2VydmVyVHlwZS5nZXRJZCgpKTsKLQkJbWFwLnB1dChQUk9QX0hPU1ROQU1FLCAibG9jYWxob3N0Iik7Ci0JCWlmIChydW50aW1lICE9IG51bGwgJiYgcnVudGltZS5nZXRSdW50aW1lVHlwZSgpICE9IG51bGwpIHsKLQkJCVN0cmluZyBuYW1lID0gcnVudGltZS5nZXRSdW50aW1lVHlwZSgpLmdldE5hbWUoKTsKLQkJCW1hcC5wdXQoUFJPUF9OQU1FLCBuYW1lKTsKLQkJfQotCQlzZXJ2ZXJTdGF0ZSA9ICgoU2VydmVyVHlwZSlzZXJ2ZXJUeXBlKS5nZXRJbml0aWFsU3RhdGUoKTsKLQl9Ci0JCi0JcHVibGljIElTZXJ2ZXJUeXBlIGdldFNlcnZlclR5cGUoKSB7Ci0JCXJldHVybiBzZXJ2ZXJUeXBlOwotCX0KLQkKLQlwdWJsaWMgSVNlcnZlcldvcmtpbmdDb3B5IGNyZWF0ZVdvcmtpbmdDb3B5KCkgewotCQlyZXR1cm4gbmV3IFNlcnZlcldvcmtpbmdDb3B5KHRoaXMpOyAKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1dvcmtpbmdDb3B5KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGRlbGV0ZUZyb21NZXRhZGF0YSgpIHsKLQkJUmVzb3VyY2VNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVtb3ZlU2VydmVyKHRoaXMpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzYXZlVG9NZXRhZGF0YShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJc3VwZXIuc2F2ZVRvTWV0YWRhdGEobW9uaXRvcik7Ci0JCVJlc291cmNlTWFuYWdlci5nZXRJbnN0YW5jZSgpLmFkZFNlcnZlcih0aGlzKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlckF0dHJpYnV0ZXMjZ2V0UnVudGltZSgpCi0JICovCi0JcHVibGljIElSdW50aW1lIGdldFJ1bnRpbWUoKSB7Ci0JCXJldHVybiBydW50aW1lOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UnVudGltZUlkKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKFJVTlRJTUVfSUQsIChTdHJpbmcpIG51bGwpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyQXR0cmlidXRlcyNnZXRTZXJ2ZXJDb25maWd1cmF0aW9uKCkKLQkgKi8KLQlwdWJsaWMgSUZvbGRlciBnZXRTZXJ2ZXJDb25maWd1cmF0aW9uKCkgewotCQlyZXR1cm4gY29uZmlndXJhdGlvbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgU2VydmVyRGVsZWdhdGUgZ2V0RGVsZWdhdGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmIChkZWxlZ2F0ZSAhPSBudWxsIHx8IHNlcnZlclR5cGUgPT0gbnVsbCkKLQkJCXJldHVybiBkZWxlZ2F0ZTsKLQkJCi0JCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJaWYgKGRlbGVnYXRlID09IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlsb25nIHRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQkJZGVsZWdhdGUgPSAoKFNlcnZlclR5cGUpIHNlcnZlclR5cGUpLmNyZWF0ZVNlcnZlckRlbGVnYXRlKCk7Ci0JCQkJCUludGVybmFsSW5pdGlhbGl6ZXIuaW5pdGlhbGl6ZVNlcnZlckRlbGVnYXRlKGRlbGVnYXRlLCBTZXJ2ZXIudGhpcywgbW9uaXRvcik7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlBFUkZPUk1BTkNFLCAiU2VydmVyLmdldERlbGVnYXRlKCk6IDwiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGltZSkgKyAiPiAiICsgZ2V0U2VydmVyVHlwZSgpLmdldElkKCkpOwotCQkJCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBjcmVhdGUgZGVsZWdhdGUgIiArIHRvU3RyaW5nKCksIHQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZGVsZWdhdGU7Ci0JfQotCi0JcHJvdGVjdGVkIFNlcnZlckJlaGF2aW91ckRlbGVnYXRlIGdldEJlaGF2aW91ckRlbGVnYXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAoYmVoYXZpb3VyRGVsZWdhdGUgIT0gbnVsbCB8fCBzZXJ2ZXJUeXBlID09IG51bGwpCi0JCQlyZXR1cm4gYmVoYXZpb3VyRGVsZWdhdGU7Ci0JCQotCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCWlmIChiZWhhdmlvdXJEZWxlZ2F0ZSA9PSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJbG9uZyB0aW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJCWJlaGF2aW91ckRlbGVnYXRlID0gKChTZXJ2ZXJUeXBlKSBzZXJ2ZXJUeXBlKS5jcmVhdGVTZXJ2ZXJCZWhhdmlvdXJEZWxlZ2F0ZSgpOwotCQkJCQlJbnRlcm5hbEluaXRpYWxpemVyLmluaXRpYWxpemVTZXJ2ZXJCZWhhdmlvdXJEZWxlZ2F0ZShiZWhhdmlvdXJEZWxlZ2F0ZSwgU2VydmVyLnRoaXMsIG1vbml0b3IpOwotCQkJCQlUcmFjZS50cmFjZShUcmFjZS5QRVJGT1JNQU5DRSwgIlNlcnZlci5nZXRCZWhhdmlvdXJEZWxlZ2F0ZSgpOiA8IiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHRpbWUpICsgIj4gIiArIGdldFNlcnZlclR5cGUoKS5nZXRJZCgpKTsKLQkJCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3QgY3JlYXRlIGJlaGF2aW91ciBkZWxlZ2F0ZSAiICsgdG9TdHJpbmcoKSwgdCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBiZWhhdmlvdXJEZWxlZ2F0ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoZGVsZWdhdGUgIT0gbnVsbCkgewotCQkJZGVsZWdhdGUuZGlzcG9zZSgpOwotCQkJZGVsZWdhdGUgPSBudWxsOwotCQl9Ci0JCWlmIChiZWhhdmlvdXJEZWxlZ2F0ZSAhPSBudWxsKSB7Ci0JCQliZWhhdmlvdXJEZWxlZ2F0ZS5kaXNwb3NlKCk7Ci0JCQliZWhhdmlvdXJEZWxlZ2F0ZSA9IG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEhvc3QoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoUFJPUF9IT1NUTkFNRSwgImxvY2FsaG9zdCIpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0QXV0b1B1Ymxpc2hUaW1lKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKFBST1BfQVVUT19QVUJMSVNIX1RJTUUsIC0xKTsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRBdXRvUHVibGlzaFNldHRpbmcoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoUFJPUF9BVVRPX1BVQkxJU0hfU0VUVElORywgQVVUT19QVUJMSVNIX0RFRkFVTFQpOwotCX0KLQotCS8qKgotICAgICogUmV0dXJucyBhIGxpc3Qgb2YgaWQgKFN0cmluZykgb2YgcHJlZmVycmVkIHB1Ymxpc2ggb3BlcmF0aW9ucyB0aGF0IHdpbGwgbm90IGJlIHJ1bgotICAgICogZHVyaW5nIHB1Ymxpc2guCi0gICAgKiAKLSAgICAqIEByZXR1cm4gYSBsaXN0IG9mIHB1Ymxpc2ggb3BlcmF0aW9uIGlkcwotICAgICovCi0JcHVibGljIExpc3QgZ2V0RGlzYWJsZWRQcmVmZXJyZWRQdWJsaXNoT3BlcmF0aW9uSWRzKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKFBST1BfRElTQUJMRURfUEVSRkVSUkVEX1RBU0tTLCBFTVBUWV9MSVNUKTsJCQotCX0KLQotCS8qKgotICAgICogUmV0dXJucyBhIGxpc3Qgb2YgaWQgKFN0cmluZykgb2Ygb3B0aW9uYWwgcHVibGlzaCBvcGVyYXRpb25zIHRoYXQgYXJlIGVuYWJsZWQgdG8gCi0gICAgKiBiZSBydW4gZHVyaW5nIHB1Ymxpc2guCi0gICAgKiAKLSAgICAqIEByZXR1cm4gYSBsaXN0IG9mIHB1Ymxpc2ggb3BlcmF0aW9uIGlkcwotICAgICovCi0JcHVibGljIExpc3QgZ2V0RW5hYmxlZE9wdGlvbmFsUHVibGlzaE9wZXJhdGlvbklkcygpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZShQUk9QX0VOQUJMRURfT1BUSU9OQUxfVEFTS1MsIEVNUFRZX0xJU1QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHNlcnZlci4gKHNlZSBTRVJWRVJfWFhYIGNvbnN0YW50cykKLQkgKgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRTZXJ2ZXJTdGF0ZSgpIHsKLQkJcmV0dXJuIHNlcnZlclN0YXRlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TW9kZSgpIHsKLQkJcmV0dXJuIG1vZGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2VydmVyU3RhdGUoaW50IHN0YXRlKSB7Ci0JCWlmIChzdGF0ZSA9PSBzZXJ2ZXJTdGF0ZSkKLQkJCXJldHVybjsKLQotCQl0aGlzLnNlcnZlclN0YXRlID0gc3RhdGU7Ci0JCWZpcmVTZXJ2ZXJTdGF0ZUNoYW5nZUV2ZW50KCk7Ci0JfQotCi0JLyoqCi0JICogQWRkIGEgbGlzdGVuZXIgdG8gdGhpcyBzZXJ2ZXIuCi0JICoKLQkgKiBAcGFyYW0gbGlzdGVuZXIgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5tb2RlbC5JU2VydmVyTGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRTZXJ2ZXJMaXN0ZW5lcihJU2VydmVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGxpc3RlbmVyID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJNb2R1bGUgY2Fubm90IGJlIG51bGwiKTsKLQkJVHJhY2UudHJhY2UoVHJhY2UuTElTVEVORVJTLCAiQWRkaW5nIHNlcnZlciBsaXN0ZW5lciAiICsgbGlzdGVuZXIgKyAiIHRvICIgKyB0aGlzKTsKLQkJZ2V0U2VydmVyTm90aWZpY2F0aW9uTWFuYWdlcigpLmFkZExpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgYSBsaXN0ZW5lciB0byB0aGlzIHNlcnZlciB3aXRoIHRoZSBnaXZlbiBldmVudCBtYXNrLgotCSAqCi0JICogQHBhcmFtIGxpc3RlbmVyIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIubW9kZWwuSVNlcnZlckxpc3RlbmVyCi0JICogQHBhcmFtIGV2ZW50TWFzayB0byBsaW1pdCBsaXN0ZW5pbmcgdG8gY2VydGFpbiB0eXBlcyBvZiBldmVudHMKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRTZXJ2ZXJMaXN0ZW5lcihJU2VydmVyTGlzdGVuZXIgbGlzdGVuZXIsIGludCBldmVudE1hc2spIHsKLQkJaWYgKGxpc3RlbmVyID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJNb2R1bGUgY2Fubm90IGJlIG51bGwiKTsKLQkJVHJhY2UudHJhY2UoVHJhY2UuTElTVEVORVJTLCAiQWRkaW5nIHNlcnZlciBsaXN0ZW5lciAiICsgbGlzdGVuZXIgKyAiIHRvICIgKyB0aGlzICsgIiB3aXRoIGV2ZW50TWFzayAiICsgZXZlbnRNYXNrKTsKLQkJZ2V0U2VydmVyTm90aWZpY2F0aW9uTWFuYWdlcigpLmFkZExpc3RlbmVyKGxpc3RlbmVyLCBldmVudE1hc2spOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhIGxpc3RlbmVyIGZyb20gdGhpcyBzZXJ2ZXIuCi0JICoKLQkgKiBAcGFyYW0gbGlzdGVuZXIgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5tb2RlbC5JU2VydmVyTGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVTZXJ2ZXJMaXN0ZW5lcihJU2VydmVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGxpc3RlbmVyID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJNb2R1bGUgY2Fubm90IGJlIG51bGwiKTsKLQkJVHJhY2UudHJhY2UoVHJhY2UuTElTVEVORVJTLCAiUmVtb3Zpbmcgc2VydmVyIGxpc3RlbmVyICIgKyBsaXN0ZW5lciArICIgZnJvbSAiICsgdGhpcyk7Ci0JCWdldFNlcnZlck5vdGlmaWNhdGlvbk1hbmFnZXIoKS5yZW1vdmVMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCQotCS8qKgotCSAqIEZpcmUgYSBzZXJ2ZXIgbGlzdGVuZXIgcmVzdGFydCBzdGF0ZSBjaGFuZ2UgZXZlbnQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVJlc3RhcnRTdGF0ZUNoYW5nZUV2ZW50KCkgewotCQlUcmFjZS50cmFjZShUcmFjZS5MSVNURU5FUlMsICItPi0gRmlyaW5nIHNlcnZlciByZXN0YXJ0IGNoYW5nZSBldmVudDogIiArIGdldE5hbWUoKSArICIgLT4tIik7Ci0JCi0JCWlmIChub3RpZmljYXRpb25NYW5hZ2VyID09IG51bGwgfHwgbm90aWZpY2F0aW9uTWFuYWdlci5oYXNMaXN0ZW5lckVudHJpZXMoKSkKLQkJCXJldHVybjsKLQkKLQkJbm90aWZpY2F0aW9uTWFuYWdlci5icm9hZGNhc3RDaGFuZ2UoCi0JCQluZXcgU2VydmVyRXZlbnQoU2VydmVyRXZlbnQuU0VSVkVSX0NIQU5HRSB8IFNlcnZlckV2ZW50LlJFU1RBUlRfU1RBVEVfQ0hBTkdFLCB0aGlzLCBnZXRTZXJ2ZXJTdGF0ZSgpLCAKLQkJCQlnZXRTZXJ2ZXJQdWJsaXNoU3RhdGUoKSwgZ2V0U2VydmVyUmVzdGFydFN0YXRlKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBGaXJlIGEgc2VydmVyIGxpc3RlbmVyIHN0YXRlIGNoYW5nZSBldmVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlU2VydmVyU3RhdGVDaGFuZ2VFdmVudCgpIHsKLQkJVHJhY2UudHJhY2UoVHJhY2UuTElTVEVORVJTLCAiLT4tIEZpcmluZyBzZXJ2ZXIgc3RhdGUgY2hhbmdlIGV2ZW50OiAiICsgZ2V0TmFtZSgpICsgIiwgIiArIGdldFNlcnZlclN0YXRlKCkgKyAiIC0+LSIpOwotCQotCQlpZiAobm90aWZpY2F0aW9uTWFuYWdlciA9PSBudWxsIHx8IG5vdGlmaWNhdGlvbk1hbmFnZXIuaGFzTGlzdGVuZXJFbnRyaWVzKCkpCi0JCQlyZXR1cm47Ci0JCi0JCW5vdGlmaWNhdGlvbk1hbmFnZXIuYnJvYWRjYXN0Q2hhbmdlKAotCQkJbmV3IFNlcnZlckV2ZW50KFNlcnZlckV2ZW50LlNFUlZFUl9DSEFOR0UgfCBTZXJ2ZXJFdmVudC5TVEFURV9DSEFOR0UsIHRoaXMsIGdldFNlcnZlclN0YXRlKCksIAotCQkJCWdldFNlcnZlclB1Ymxpc2hTdGF0ZSgpLCBnZXRTZXJ2ZXJSZXN0YXJ0U3RhdGUoKSkpOwotCX0KLQotCS8qKgotCSAqIEZpcmUgYSBzZXJ2ZXIgbGlzdGVuZXIgbW9kdWxlIHN0YXRlIGNoYW5nZSBldmVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlTW9kdWxlU3RhdGVDaGFuZ2VFdmVudChJTW9kdWxlW10gbW9kdWxlKSB7Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLkxJU1RFTkVSUywgIi0+LSBGaXJpbmcgbW9kdWxlIHN0YXRlIGNoYW5nZSBldmVudDogIiArIGdldE5hbWUoKSArICIsICIgKyBnZXRTZXJ2ZXJTdGF0ZSgpICsgIiAtPi0iKTsKLQkJCi0JCWlmIChub3RpZmljYXRpb25NYW5hZ2VyID09IG51bGwgfHwgbm90aWZpY2F0aW9uTWFuYWdlci5oYXNMaXN0ZW5lckVudHJpZXMoKSkKLQkJCXJldHVybjsKLQkJCi0JCW5vdGlmaWNhdGlvbk1hbmFnZXIuYnJvYWRjYXN0Q2hhbmdlKAotCQkJbmV3IFNlcnZlckV2ZW50KFNlcnZlckV2ZW50Lk1PRFVMRV9DSEFOR0UgfCBTZXJ2ZXJFdmVudC5TVEFURV9DSEFOR0UsIHRoaXMsIG1vZHVsZSwgZ2V0TW9kdWxlU3RhdGUobW9kdWxlKSwgCi0JCQkJZ2V0TW9kdWxlUHVibGlzaFN0YXRlKG1vZHVsZSksIGdldE1vZHVsZVJlc3RhcnRTdGF0ZShtb2R1bGUpKSk7Ci0JfQotCi0JLyoqCi0JICogRmlyZSBhIHNlcnZlciBsaXN0ZW5lciBtb2R1bGUgcHVibGlzaCBzdGF0ZSBjaGFuZ2UgZXZlbnQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZU1vZHVsZVB1Ymxpc2hTdGF0ZUNoYW5nZUV2ZW50KElNb2R1bGVbXSBtb2R1bGUpIHsKLQkJVHJhY2UudHJhY2UoVHJhY2UuTElTVEVORVJTLCAiLT4tIEZpcmluZyBtb2R1bGUgcHVibGlzaCBzdGF0ZSBjaGFuZ2UgZXZlbnQ6ICIgKyBnZXROYW1lKCkgKyAiLCAiICsgZ2V0U2VydmVyU3RhdGUoKSArICIgLT4tIik7Ci0JCQotCQlpZiAobm90aWZpY2F0aW9uTWFuYWdlciA9PSBudWxsIHx8IG5vdGlmaWNhdGlvbk1hbmFnZXIuaGFzTGlzdGVuZXJFbnRyaWVzKCkpCi0JCQlyZXR1cm47Ci0JCQotCQlub3RpZmljYXRpb25NYW5hZ2VyLmJyb2FkY2FzdENoYW5nZSgKLQkJCW5ldyBTZXJ2ZXJFdmVudChTZXJ2ZXJFdmVudC5NT0RVTEVfQ0hBTkdFIHwgU2VydmVyRXZlbnQuUFVCTElTSF9TVEFURV9DSEFOR0UsIHRoaXMsIG1vZHVsZSwgZ2V0TW9kdWxlU3RhdGUobW9kdWxlKSwgCi0JCQkJZ2V0TW9kdWxlUHVibGlzaFN0YXRlKG1vZHVsZSksIGdldE1vZHVsZVJlc3RhcnRTdGF0ZShtb2R1bGUpKSk7Ci0JfQotCi0JLyoqCi0JICogRmlyZSBhIHNlcnZlciBsaXN0ZW5lciBtb2R1bGUgc3RhdGUgY2hhbmdlIGV2ZW50LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVNb2R1bGVSZXN0YXJ0Q2hhbmdlRXZlbnQoSU1vZHVsZVtdIG1vZHVsZSkgewotCQlUcmFjZS50cmFjZShUcmFjZS5MSVNURU5FUlMsICItPi0gRmlyaW5nIG1vZHVsZSByZXN0YXJ0IGNoYW5nZSBldmVudDogIiArIGdldE5hbWUoKSArICIsICIgKyBnZXRTZXJ2ZXJTdGF0ZSgpICsgIiAtPi0iKTsKLQkJCi0JCWlmIChub3RpZmljYXRpb25NYW5hZ2VyID09IG51bGwgfHwgbm90aWZpY2F0aW9uTWFuYWdlci5oYXNMaXN0ZW5lckVudHJpZXMoKSkKLQkJCXJldHVybjsKLQkJCi0JCW5vdGlmaWNhdGlvbk1hbmFnZXIuYnJvYWRjYXN0Q2hhbmdlKAotCQkJbmV3IFNlcnZlckV2ZW50KFNlcnZlckV2ZW50Lk1PRFVMRV9DSEFOR0UgfCBTZXJ2ZXJFdmVudC5SRVNUQVJUX1NUQVRFX0NIQU5HRSwgdGhpcywgbW9kdWxlLCBnZXRNb2R1bGVTdGF0ZShtb2R1bGUpLCAKLQkJCQlnZXRNb2R1bGVQdWJsaXNoU3RhdGUobW9kdWxlKSwgZ2V0TW9kdWxlUmVzdGFydFN0YXRlKG1vZHVsZSkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNb2RlKFN0cmluZyBtKSB7Ci0JCWlmIChtID09IG1vZGUpCi0JCQlyZXR1cm47Ci0KLQkJdGhpcy5tb2RlID0gbTsKLQkJZmlyZVNlcnZlclN0YXRlQ2hhbmdlRXZlbnQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNb2R1bGVTdGF0ZShJTW9kdWxlW10gbW9kdWxlLCBpbnQgc3RhdGUpIHsKLQkJaWYgKG1vZHVsZSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTW9kdWxlIGNhbm5vdCBiZSBudWxsIik7Ci0JCUludGVnZXIgaW4gPSBuZXcgSW50ZWdlcihzdGF0ZSk7Ci0JCW1vZHVsZVN0YXRlLnB1dChnZXRLZXkobW9kdWxlKSwgaW4pOwotCQlmaXJlTW9kdWxlU3RhdGVDaGFuZ2VFdmVudChtb2R1bGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1vZHVsZVB1Ymxpc2hTdGF0ZShJTW9kdWxlW10gbW9kdWxlLCBpbnQgc3RhdGUpIHsKLQkJaWYgKG1vZHVsZSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTW9kdWxlIGNhbm5vdCBiZSBudWxsIik7Ci0JCUludGVnZXIgaW4gPSBuZXcgSW50ZWdlcihzdGF0ZSk7Ci0JCWlmIChzdGF0ZSA9PSAtMSkKLQkJCW1vZHVsZVB1Ymxpc2hTdGF0ZS5yZW1vdmUoZ2V0S2V5KG1vZHVsZSkpOwotCQltb2R1bGVQdWJsaXNoU3RhdGUucHV0KGdldEtleShtb2R1bGUpLCBpbik7Ci0JCWZpcmVNb2R1bGVQdWJsaXNoU3RhdGVDaGFuZ2VFdmVudChtb2R1bGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1vZHVsZVJlc3RhcnRTdGF0ZShJTW9kdWxlW10gbW9kdWxlLCBib29sZWFuIHIpIHsKLQkJaWYgKG1vZHVsZSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTW9kdWxlIGNhbm5vdCBiZSBudWxsIik7Ci0JCUJvb2xlYW4gYiA9IG5ldyBCb29sZWFuKHIpOwotCQltb2R1bGVTdGF0ZS5wdXQoZ2V0S2V5KG1vZHVsZSksIGIpOwotCQlmaXJlTW9kdWxlUmVzdGFydENoYW5nZUV2ZW50KG1vZHVsZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlTW9kdWxlUHJvamVjdENoYW5nZShmaW5hbCBJTW9kdWxlIG1vZHVsZSkgewotCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICI+IGhhbmRsZURlcGxveWFibGVQcm9qZWN0Q2hhbmdlKCkgIiArIHRoaXMgKyAiICIgKyBtb2R1bGUpOwotCQkKLQkJY2xhc3MgSGVscGVyIHsKLQkJCWJvb2xlYW4gY2hhbmdlZDsKLQkJfQotCQlmaW5hbCBIZWxwZXIgaGVscGVyID0gbmV3IEhlbHBlcigpOwotCQkKLQkJZmluYWwgTGlzdCBtb2R1bGVzMiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCi0JCUlNb2R1bGVWaXNpdG9yIHZpc2l0b3IgPSBuZXcgSU1vZHVsZVZpc2l0b3IoKSB7Ci0JCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJTW9kdWxlW10gbW9kdWxlMikgewotCQkJCW1vZHVsZXMyLmFkZChtb2R1bGUyKTsKLQkJCQkKLQkJCQlpbnQgc2l6ZSA9IG1vZHVsZTIubGVuZ3RoOwotCQkJCUlNb2R1bGUgbSA9IG1vZHVsZTJbc2l6ZSAtIDFdOwotCQkJCWlmIChtLmdldFByb2plY3QoKSA9PSBudWxsKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkKLQkJCQlpZiAobW9kdWxlLmVxdWFscyhtKSkgewotCQkJCQlpZiAoaGFzUHVibGlzaGVkUmVzb3VyY2VEZWx0YShtb2R1bGUyKSkgewotCQkJCQkJaGVscGVyLmNoYW5nZWQgPSB0cnVlOwotCQkJCQkJc2V0TW9kdWxlUHVibGlzaFN0YXRlKG1vZHVsZTIsIElTZXJ2ZXIuUFVCTElTSF9TVEFURV9JTkNSRU1FTlRBTCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX07Ci0JCQotCQl2aXNpdCh2aXNpdG9yLCBudWxsKTsKLQkJCi0JCWlmIChnZXRTZXJ2ZXJQdWJsaXNoSW5mbygpLmhhc1N0cnVjdHVyZUNoYW5nZWQobW9kdWxlczIpKQotCQkJc2V0U2VydmVyUHVibGlzaFN0YXRlKElTZXJ2ZXIuUFVCTElTSF9TVEFURV9JTkNSRU1FTlRBTCk7Ci0JCQotCQlpZiAoIWhlbHBlci5jaGFuZ2VkKQotCQkJcmV0dXJuOwotCQkKLQkJaWYgKGdldFNlcnZlclN0YXRlKCkgIT0gSVNlcnZlci5TVEFURV9TVE9QUEVEICYmIGJlaGF2aW91ckRlbGVnYXRlICE9IG51bGwpCi0JCQliZWhhdmlvdXJEZWxlZ2F0ZS5oYW5kbGVSZXNvdXJjZUNoYW5nZSgpOwotCQkKLQkJaWYgKGdldFNlcnZlclN0YXRlKCkgIT0gSVNlcnZlci5TVEFURV9TVE9QUEVEKQotCQkJYXV0b1B1Ymxpc2goKTsKLQkJCi0JCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIjwgaGFuZGxlRGVwbG95YWJsZVByb2plY3RDaGFuZ2UoKSIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzdG9wQXV0b1B1Ymxpc2goKSB7Ci0JCWlmIChhdXRvUHVibGlzaFRocmVhZCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkKLQkJYXV0b1B1Ymxpc2hUaHJlYWQuc3RvcCA9IHRydWU7Ci0JCWF1dG9QdWJsaXNoVGhyZWFkLmludGVycnVwdCgpOwotCQlhdXRvUHVibGlzaFRocmVhZCA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmVzZXQgYXV0b21hdGljIHB1Ymxpc2ggdGhyZWFkIGlmIGl0IGlzIHJ1bm5pbmcgYW5kIHN0YXJ0IGEgbmV3Ci0JICogdGhyZWFkIGlmIGF1dG9tYXRpYyBwdWJsaXNoaW5nIGlzIGN1cnJlbnRseSBlbmFibGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGF1dG9QdWJsaXNoKCkgewotCQlzdG9wQXV0b1B1Ymxpc2goKTsKLQkJCi0JCWlmIChnZXRBdXRvUHVibGlzaFNldHRpbmcoKSA9PSBBVVRPX1BVQkxJU0hfRElTQUJMRSkKLQkJCXJldHVybjsKLQkJCi0JCWludCB0aW1lID0gMDsKLQkJaWYgKGdldEF1dG9QdWJsaXNoU2V0dGluZygpID09IEFVVE9fUFVCTElTSF9ERUZBVUxUKSB7Ci0JCQlTZXJ2ZXJQcmVmZXJlbmNlcyBwcmVmID0gU2VydmVyUHJlZmVyZW5jZXMuZ2V0SW5zdGFuY2UoKTsKLQkJCWJvb2xlYW4gbG9jYWwgPSBTb2NrZXRVdGlsLmlzTG9jYWxob3N0KGdldEhvc3QoKSk7Ci0JCQlpZiAobG9jYWwgJiYgcHJlZi5nZXRBdXRvUHVibGlzaExvY2FsKCkpCi0JCQkJdGltZSA9IHByZWYuZ2V0QXV0b1B1Ymxpc2hMb2NhbFRpbWUoKTsKLQkJCWVsc2UgaWYgKCFsb2NhbCAmJiBwcmVmLmdldEF1dG9QdWJsaXNoUmVtb3RlKCkpCi0JCQkJdGltZSA9IHByZWYuZ2V0QXV0b1B1Ymxpc2hSZW1vdGVUaW1lKCk7Ci0JCX0gZWxzZQotCQkJdGltZSA9IGdldEF1dG9QdWJsaXNoVGltZSgpOwotCQkKLQkJaWYgKHRpbWUgPiAwKSB7Ci0JCQlhdXRvUHVibGlzaFRocmVhZCA9IG5ldyBBdXRvUHVibGlzaFRocmVhZCgpOwotCQkJYXV0b1B1Ymxpc2hUaHJlYWQudGltZSA9IHRpbWU7Ci0JCQlhdXRvUHVibGlzaFRocmVhZC5zZXRQcmlvcml0eShUaHJlYWQuTUlOX1BSSU9SSVRZICsgMSk7Ci0JCQlhdXRvUHVibGlzaFRocmVhZC5zdGFydCgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBTZXJ2ZXJOb3RpZmljYXRpb25NYW5hZ2VyIGdldFNlcnZlck5vdGlmaWNhdGlvbk1hbmFnZXIoKSB7Ci0JCWlmIChub3RpZmljYXRpb25NYW5hZ2VyID09IG51bGwpIHsKLQkJCW5vdGlmaWNhdGlvbk1hbmFnZXIgPSBuZXcgU2VydmVyTm90aWZpY2F0aW9uTWFuYWdlcigpOwotCQl9Ci0JCXJldHVybiBub3RpZmljYXRpb25NYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbmZpZ3VyYXRpb24ncyBzeW5jIHN0YXRlLgotCSAqCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFNlcnZlclB1Ymxpc2hTdGF0ZSgpIHsKLQkJcmV0dXJuIHNlcnZlclN5bmNTdGF0ZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBjb25maWd1cmF0aW9uIHN5bmMgc3RhdGUuCi0JICoKLQkgKiBAcGFyYW0gc3RhdGUgaW50Ci0JICovCi0JcHVibGljIHZvaWQgc2V0U2VydmVyUHVibGlzaFN0YXRlKGludCBzdGF0ZSkgewotCQlpZiAoc3RhdGUgPT0gc2VydmVyU3luY1N0YXRlKQotCQkJcmV0dXJuOwotCQlzZXJ2ZXJTeW5jU3RhdGUgPSBzdGF0ZTsKLQkJZmlyZVB1Ymxpc2hTdGF0ZUNoYW5nZSgpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgYSBwdWJsaXNoIGxpc3RlbmVyIHRvIHRoaXMgc2VydmVyLgotCSAqIEhhcyBubyBlZmZlY3QgaWYgYW4gaWRlbnRpY2FsIGxpc3RlbmVyIGlzIGFscmVhZHkgcmVnaXN0ZXJlZC4KLQkgKgotCSAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgcHVibGlzaCBsaXN0ZW5lcgotCSAqIEBzZWUgI3JlbW92ZVB1Ymxpc2hMaXN0ZW5lcihJUHVibGlzaExpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFB1Ymxpc2hMaXN0ZW5lcihJUHVibGlzaExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChsaXN0ZW5lciA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTGlzdGVuZXIgY2Fubm90IGJlIG51bGwiKTsKLQkJVHJhY2UudHJhY2UoVHJhY2UuTElTVEVORVJTLCAiQWRkaW5nIHB1Ymxpc2ggbGlzdGVuZXIgIiArIGxpc3RlbmVyICsgIiB0byAiICsgdGhpcyk7Ci0KLQkJaWYgKHB1Ymxpc2hMaXN0ZW5lcnMgPT0gbnVsbCkKLQkJCXB1Ymxpc2hMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXB1Ymxpc2hMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGEgcHVibGlzaCBsaXN0ZW5lciBmcm9tIHRoaXMgc2VydmVyLgotCSAqIEhhcyBubyBlZmZlY3QgaWYgdGhlIGxpc3RlbmVyIGlzIG5vdCByZWdpc3RlcmVkLgotCSAqCi0JICogQHBhcmFtIGxpc3RlbmVyIHRoZSBwdWJsaXNoIGxpc3RlbmVyCi0JICogQHNlZSAjYWRkUHVibGlzaExpc3RlbmVyKElQdWJsaXNoTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlUHVibGlzaExpc3RlbmVyKElQdWJsaXNoTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGxpc3RlbmVyID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJMaXN0ZW5lciBjYW5ub3QgYmUgbnVsbCIpOwotCQlUcmFjZS50cmFjZShUcmFjZS5MSVNURU5FUlMsICJSZW1vdmluZyBwdWJsaXNoIGxpc3RlbmVyICIgKyBsaXN0ZW5lciArICIgZnJvbSAiICsgdGhpcyk7Ci0KLQkJaWYgKHB1Ymxpc2hMaXN0ZW5lcnMgIT0gbnVsbCkKLQkJCXB1Ymxpc2hMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQl9Ci0JCi0JLyoqCi0JICogRmlyZSBhIHB1Ymxpc2ggc3RhcnQgZXZlbnQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGZpcmVQdWJsaXNoU3RhcnRlZCgpIHsKLQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiLT4tIEZpcmluZyBwdWJsaXNoIHN0YXJ0ZWQgZXZlbnQgLT4tIik7Ci0JCi0JCWlmIChwdWJsaXNoTGlzdGVuZXJzID09IG51bGwgfHwgcHVibGlzaExpc3RlbmVycy5pc0VtcHR5KCkpCi0JCQlyZXR1cm47Ci0KLQkJaW50IHNpemUgPSBwdWJsaXNoTGlzdGVuZXJzLnNpemUoKTsKLQkJSVB1Ymxpc2hMaXN0ZW5lcltdIHNybCA9IG5ldyBJUHVibGlzaExpc3RlbmVyW3NpemVdOwotCQlwdWJsaXNoTGlzdGVuZXJzLnRvQXJyYXkoc3JsKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiICBGaXJpbmcgcHVibGlzaCBzdGFydGVkIGV2ZW50IHRvICIgKyBzcmxbaV0pOwotCQkJdHJ5IHsKLQkJCQlzcmxbaV0ucHVibGlzaFN0YXJ0ZWQodGhpcyk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIiAgRXJyb3IgZmlyaW5nIHB1Ymxpc2ggc3RhcnRlZCBldmVudCB0byAiICsgc3JsW2ldLCBlKTsKLQkJCX0KLQkJfQotCi0JCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIi08LSBEb25lIGZpcmluZyBwdWJsaXNoIHN0YXJ0ZWQgZXZlbnQgLTwtIik7Ci0JfQotCi0JLyoqCi0JICogRmlyZSBhIHB1Ymxpc2ggc3RvcCBldmVudC4KLQkgKgotCSAqIEBwYXJhbSBzdGF0dXMgcHVibGlzaGluZyBzdGF0dXMKLQkgKi8KLQlwcml2YXRlIHZvaWQgZmlyZVB1Ymxpc2hGaW5pc2hlZChJU3RhdHVzIHN0YXR1cykgewotCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICItPi0gRmlyaW5nIHB1Ymxpc2hpbmcgZmluaXNoZWQgZXZlbnQ6ICIgKyBzdGF0dXMgKyAiIC0+LSIpOwotCQotCQlpZiAocHVibGlzaExpc3RlbmVycyA9PSBudWxsIHx8IHB1Ymxpc2hMaXN0ZW5lcnMuaXNFbXB0eSgpKQotCQkJcmV0dXJuOwotCi0JCWludCBzaXplID0gcHVibGlzaExpc3RlbmVycy5zaXplKCk7Ci0JCUlQdWJsaXNoTGlzdGVuZXJbXSBzcmwgPSBuZXcgSVB1Ymxpc2hMaXN0ZW5lcltzaXplXTsKLQkJcHVibGlzaExpc3RlbmVycy50b0FycmF5KHNybCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIiAgRmlyaW5nIHB1Ymxpc2hpbmcgZmluaXNoZWQgZXZlbnQgdG8gIiArIHNybFtpXSk7Ci0JCQl0cnkgewotCQkJCXNybFtpXS5wdWJsaXNoRmluaXNoZWQodGhpcywgc3RhdHVzKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiICBFcnJvciBmaXJpbmcgcHVibGlzaGluZyBmaW5pc2hlZCBldmVudCB0byAiICsgc3JsW2ldLCBlKTsKLQkJCX0KLQkJfQotCi0JCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIi08LSBEb25lIGZpcmluZyBwdWJsaXNoaW5nIGZpbmlzaGVkIGV2ZW50IC08LSIpOwotCX0KLQotCS8qKgotCSAqIEZpcmUgYSBwdWJsaXNoIHN0YXRlIGNoYW5nZSBldmVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlUHVibGlzaFN0YXRlQ2hhbmdlKCkgewotCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICItPi0gRmlyaW5nIHB1Ymxpc2ggc3RhdGUgY2hhbmdlIGV2ZW50IC0+LSIpOwotCQkKLQkJaWYgKG5vdGlmaWNhdGlvbk1hbmFnZXIgPT0gbnVsbCB8fCBub3RpZmljYXRpb25NYW5hZ2VyLmhhc0xpc3RlbmVyRW50cmllcygpKQotCQkJcmV0dXJuOwotCQkKLQkJbm90aWZpY2F0aW9uTWFuYWdlci5icm9hZGNhc3RDaGFuZ2UoCi0JCQluZXcgU2VydmVyRXZlbnQoU2VydmVyRXZlbnQuU0VSVkVSX0NIQU5HRSB8IFNlcnZlckV2ZW50LlBVQkxJU0hfU1RBVEVfQ0hBTkdFLCB0aGlzLCBnZXRTZXJ2ZXJTdGF0ZSgpLCAKLQkJCQkJZ2V0U2VydmVyUHVibGlzaFN0YXRlKCksIGdldFNlcnZlclJlc3RhcnRTdGF0ZSgpKSk7Ci0JfQotCi0JLyoqCi0JICogRmlyZSBhIHB1Ymxpc2ggc3RhdGUgY2hhbmdlIGV2ZW50LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVQdWJsaXNoU3RhdGVDaGFuZ2UoSU1vZHVsZVtdIG1vZHVsZSkgewotCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICItPi0gRmlyaW5nIHB1Ymxpc2ggc3RhdGUgY2hhbmdlIGV2ZW50OiAiICsgbW9kdWxlICsgIiAtPi0iKTsKLQkKLQkJaWYgKG5vdGlmaWNhdGlvbk1hbmFnZXIgPT0gbnVsbCB8fCBub3RpZmljYXRpb25NYW5hZ2VyLmhhc0xpc3RlbmVyRW50cmllcygpKQotCQkJcmV0dXJuOwotCQotCQlub3RpZmljYXRpb25NYW5hZ2VyLmJyb2FkY2FzdENoYW5nZSgKLQkJCW5ldyBTZXJ2ZXJFdmVudChTZXJ2ZXJFdmVudC5NT0RVTEVfQ0hBTkdFIHwgU2VydmVyRXZlbnQuUFVCTElTSF9TVEFURV9DSEFOR0UsIHRoaXMsIG1vZHVsZSwgZ2V0TW9kdWxlU3RhdGUobW9kdWxlKSwgCi0JCQkJZ2V0TW9kdWxlUHVibGlzaFN0YXRlKG1vZHVsZSksIGdldE1vZHVsZVJlc3RhcnRTdGF0ZShtb2R1bGUpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBzZXJ2ZXIgaXMgaW4gYSBzdGF0ZSB0aGF0IGl0IGNhbgotCSAqIGJlIHB1Ymxpc2hlZCB0by4KLQkgKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGNhblB1Ymxpc2goKSB7Ci0JCS8vIGNhbid0IHB1Ymxpc2ggaWYgdGhlIHNlcnZlciBpcyBzdGFydGluZyBvciBzdG9wcGluZwotCQlpbnQgc3RhdGUgPSBnZXRTZXJ2ZXJTdGF0ZSgpOwotCQlpZiAoc3RhdGUgPT0gU1RBVEVfU1RBUlRJTkcgfHwgc3RhdGUgPT0gU1RBVEVfU1RPUFBJTkcpCi0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCBNZXNzYWdlcy5lcnJvclB1Ymxpc2hTdGFydGluZywgbnVsbCk7Ci0JCQotCQkvLyBjYW4ndCBwdWJsaXNoIGlmIHRoZXJlIGlzIG5vIGNvbmZpZ3VyYXRpb24KLQkJaWYgKGdldFNlcnZlclR5cGUoKSA9PSBudWxsIHx8IGdldFNlcnZlclR5cGUoKS5oYXNTZXJ2ZXJDb25maWd1cmF0aW9uKCkgJiYgY29uZmlndXJhdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTWVzc2FnZXMuZXJyb3JQdWJsaXNoTm9Db25maWd1cmF0aW9uLCBudWxsKTsKLQkJCi0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc2VydmVyIHNob3VsZCBiZSBwdWJsaXNoZWQgdG8uIFRoaXMgaXMgPGNvZGU+dHJ1ZTwvY29kZT4gd2hlbiB0aGUgc2VydmVyCi0JICogY2FuIGJlIHB1Ymxpc2hlZCB0byBhbmQgdGhlIHNlcnZlcidzIHB1Ymxpc2ggc3RhdGUgb3IgYW55IG1vZHVsZSdzIHB1Ymxpc2ggc3RhdGUgaXMgbm90Ci0JICogUFVCTElTSF9TVEFURV9OT05FLiAKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRQdWJsaXNoKCkgewotCQlpZiAoIWNhblB1Ymxpc2goKS5pc09LKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQlpZiAoZ2V0U2VydmVyUHVibGlzaFN0YXRlKCkgIT0gUFVCTElTSF9TVEFURV9OT05FKQotCQkJcmV0dXJuIHRydWU7Ci0JCQotCQljbGFzcyBUZW1wIHsKLQkJCWJvb2xlYW4gcHVibGlzaDsKLQkJfQotCQlmaW5hbCBUZW1wIHRlbXAgPSBuZXcgVGVtcCgpOwotCQkKLQkJdmlzaXQobmV3IElNb2R1bGVWaXNpdG9yKCkgewotCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSU1vZHVsZVtdIG1vZHVsZSkgewotCQkJCWlmIChnZXRNb2R1bGVQdWJsaXNoU3RhdGUobW9kdWxlKSAhPSBQVUJMSVNIX1NUQVRFX05PTkUpIHsKLQkJCQkJdGVtcC5wdWJsaXNoID0gdHJ1ZTsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfSwgbnVsbCk7Ci0JCQotCQlyZXR1cm4gdGVtcC5wdWJsaXNoOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc2VydmVyIHNob3VsZCBiZSByZXN0YXJ0ZWQuIFRoaXMgaXMgPGNvZGU+dHJ1ZTwvY29kZT4gd2hlbiB0aGUgc2VydmVyCi0JICogY2FuIGJlIHJlc3RhcnRlZCBhbmQgdGhlIHNlcnZlcidzIHJlc3RhcnQgc3RhdGUgb3IgYW55IG1vZHVsZSdzIHJlc3RhcnQgc3RhdGVzIGlzIG5vdAotCSAqIGZhbHNlLiAKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRSZXN0YXJ0KCkgewotCQlpZiAoIWNhblB1Ymxpc2goKS5pc09LKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQlpZiAoZ2V0U2VydmVyUmVzdGFydFN0YXRlKCkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJCi0JCWNsYXNzIFRlbXAgewotCQkJYm9vbGVhbiBwdWJsaXNoOwotCQl9Ci0JCWZpbmFsIFRlbXAgdGVtcCA9IG5ldyBUZW1wKCk7Ci0JCQotCQl2aXNpdChuZXcgSU1vZHVsZVZpc2l0b3IoKSB7Ci0JCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJTW9kdWxlW10gbW9kdWxlKSB7Ci0JCQkJaWYgKGdldE1vZHVsZVJlc3RhcnRTdGF0ZShtb2R1bGUpKSB7Ci0JCQkJCXRlbXAucHVibGlzaCA9IHRydWU7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0sIG51bGwpOwotCQkKLQkJcmV0dXJuIHRlbXAucHVibGlzaDsKLQl9Ci0KLQlwdWJsaWMgU2VydmVyUHVibGlzaEluZm8gZ2V0U2VydmVyUHVibGlzaEluZm8oKSB7Ci0JCWlmIChwdWJsaXNoSW5mbyA9PSBudWxsKSB7Ci0JCQlwdWJsaXNoSW5mbyA9IFB1Ymxpc2hJbmZvLmdldEluc3RhbmNlKCkuZ2V0U2VydmVyUHVibGlzaEluZm8odGhpcyk7Ci0JCX0KLQkJcmV0dXJuIHB1Ymxpc2hJbmZvOwotCX0KLQotCS8qCi0JICogUHVibGlzaCB0byB0aGUgc2VydmVyIHVzaW5nIHRoZSBwcm9ncmVzcyBtb25pdG9yLiBUaGUgcmVzdWx0IG9mIHRoZQotCSAqIHB1Ymxpc2ggb3BlcmF0aW9uIGlzIHJldHVybmVkIGFzIGFuIElTdGF0dXMuCi0JICovCi0JcHVibGljIElTdGF0dXMgcHVibGlzaChmaW5hbCBpbnQga2luZCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmIChnZXRTZXJ2ZXJUeXBlKCkgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIE1lc3NhZ2VzLmVycm9yUHVibGlzaGluZywgbnVsbCk7Ci0KLQkJLy8gY2hlY2sgd2hhdCBpcyBvdXQgb2Ygc3luYyBhbmQgcHVibGlzaAotCQlpZiAoZ2V0U2VydmVyVHlwZSgpLmhhc1NlcnZlckNvbmZpZ3VyYXRpb24oKSAmJiBjb25maWd1cmF0aW9uID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCBNZXNzYWdlcy5lcnJvck5vQ29uZmlndXJhdGlvbiwgbnVsbCk7Ci0JCQotCQkvLyBtYWtlIHN1cmUgdGhhdCB0aGUgZGVsZWdhdGUgaXMgbG9hZGVkIGFuZCB0aGUgc2VydmVyIHN0YXRlIGlzIGNvcnJlY3QKLQkJbG9hZEFkYXB0ZXIoU2VydmVyQmVoYXZpb3VyRGVsZWdhdGUuY2xhc3MsIG1vbml0b3IpOwotCQkKLQkJaWYgKCgoU2VydmVyVHlwZSlnZXRTZXJ2ZXJUeXBlKCkpLnN0YXJ0QmVmb3JlUHVibGlzaCgpICYmIChnZXRTZXJ2ZXJTdGF0ZSgpID09IElTZXJ2ZXIuU1RBVEVfU1RPUFBFRCkpIHsKLQkJCXRyeSB7Ci0JCQkJc3luY2hyb25vdXNTdGFydChJTGF1bmNoTWFuYWdlci5SVU5fTU9ERSwgbW9uaXRvcik7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3Igc3RhcnRpbmcgc2VydmVyIiwgY2UpOwotCQkJCXJldHVybiBjZS5nZXRTdGF0dXMoKTsKLQkJCX0KLQkJfQotCQkKLQkJZmlyZVB1Ymxpc2hTdGFydGVkKCk7Ci0JCUlTdGF0dXMgc3RhdHVzID0gZG9QdWJsaXNoKGtpbmQsIG1vbml0b3IpOwotCQlmaXJlUHVibGlzaEZpbmlzaGVkKHN0YXR1cyk7Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCi0JcHJvdGVjdGVkIElTdGF0dXMgZG9QdWJsaXNoKGludCBraW5kLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiLS0+LS0gUHVibGlzaGluZyB0byBzZXJ2ZXI6ICIgKyB0b1N0cmluZygpICsgIiAtLT4tLSIpOwotCQkKLQkJc3RvcEF1dG9QdWJsaXNoKCk7Ci0JCQotCQl0cnkgewotCQkJZ2V0U2VydmVyUHVibGlzaEluZm8oKS5zdGFydENhY2hpbmcoKTsKLQkJCUlTdGF0dXMgc3RhdHVzID0gZ2V0QmVoYXZpb3VyRGVsZWdhdGUobW9uaXRvcikucHVibGlzaChraW5kLCBtb25pdG9yKTsKLQkJCQotCQkJZmluYWwgTGlzdCBtb2R1bGVzMiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCXZpc2l0KG5ldyBJTW9kdWxlVmlzaXRvcigpIHsKLQkJCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJTW9kdWxlW10gbW9kdWxlKSB7Ci0JCQkJCWlmIChnZXRNb2R1bGVQdWJsaXNoU3RhdGUobW9kdWxlKSA9PSBJU2VydmVyLlBVQkxJU0hfU1RBVEVfTk9ORSkKLQkJCQkJCWdldFNlcnZlclB1Ymxpc2hJbmZvKCkuZmlsbChtb2R1bGUpOwotCQkJCQkKLQkJCQkJbW9kdWxlczIuYWRkKG1vZHVsZSk7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0sIG1vbml0b3IpOwotCQkJCi0JCQlnZXRTZXJ2ZXJQdWJsaXNoSW5mbygpLnJlbW92ZURlbGV0ZWRNb2R1bGVQdWJsaXNoSW5mbyhtb2R1bGVzMik7Ci0JCQlnZXRTZXJ2ZXJQdWJsaXNoSW5mbygpLmNsZWFyQ2FjaGUoKTsKLQkJCWdldFNlcnZlclB1Ymxpc2hJbmZvKCkuc2F2ZSgpOwotCQkJCi0JCQlyZXR1cm4gc3RhdHVzOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgY2FsbGluZyBkZWxlZ2F0ZSBwdWJsaXNoKCkgIiArIHRvU3RyaW5nKCksIGUpOwotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTWVzc2FnZXMuZXJyb3JQdWJsaXNoaW5nLCBlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHB1Ymxpc2ggdGFza3MgdGhhdCBoYXZlIGJlZW4gdGFyZ2V0dGVkIHRvIHRoaXMgc2VydmVyLgotCSAqIFRoZXNlIHRhc2tzIHNob3VsZCBiZSBydW4gZHVyaW5nIHB1Ymxpc2hpbmcgYW5kIHdpbGwgYmUgaW5pdGlhbGl6ZWQKLQkgKiB3aXRoIGEgdGFzayBtb2RlbC4KLQkgKiAKLQkgKiBAcGFyYW0ga2luZCBvbmUgb2YgdGhlIElTZXJ2ZXIuUFVCTElTSF9YWCBjb25zdGFudHMKLQkgKiBAcGFyYW0gbW9kdWxlTGlzdCBhIGxpc3Qgb2YgbW9kdWxlcwotCSAqIEBwYXJhbSBraW5kTGlzdCBvbmUgb2YgdGhlIElTZXJ2ZXIgcHVibGlzaCBjaGFuZ2UgY29uc3RhbnRzCi0JICogQHJldHVybiBhIHBvc3NpYmx5IGVtcHR5IGFycmF5IG9mIElPcHRpb25hbFRhc2tzCi0JICovCi0JcHVibGljIFB1Ymxpc2hPcGVyYXRpb25bXSBnZXRUYXNrcyhpbnQga2luZCwgTGlzdCBtb2R1bGVMaXN0LCBMaXN0IGtpbmRMaXN0KSB7Ci0JCUxpc3QgdGFza3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQotCQlTdHJpbmcgc2VydmVyVHlwZUlkID0gZ2V0U2VydmVyVHlwZSgpLmdldElkKCk7Ci0JCQotCQlJUHVibGlzaFRhc2tbXSBwdWJsaXNoVGFza3MgPSBTZXJ2ZXJQbHVnaW4uZ2V0UHVibGlzaFRhc2tzKCk7Ci0JCWlmIChwdWJsaXNoVGFza3MgIT0gbnVsbCkgewotCQkJTGlzdCBlbmFibGVkVGFza3MgPSBnZXRFbmFibGVkT3B0aW9uYWxQdWJsaXNoT3BlcmF0aW9uSWRzKCk7Ci0JCQlMaXN0IGRpc2FibGVkVGFza3MgPSBnZXREaXNhYmxlZFByZWZlcnJlZFB1Ymxpc2hPcGVyYXRpb25JZHMoKTsKLQkJCQotCQkJVGFza01vZGVsIHRhc2tNb2RlbCA9IG5ldyBUYXNrTW9kZWwoKTsKLQkJCXRhc2tNb2RlbC5wdXRPYmplY3QoVGFza01vZGVsLlRBU0tfU0VSVkVSLCB0aGlzKTsKLQkJCQotCQkJaW50IHNpemUgPSBwdWJsaXNoVGFza3MubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlJUHVibGlzaFRhc2sgdGFzayA9IHB1Ymxpc2hUYXNrc1tpXTsKLQkJCQlpZiAodGFzay5zdXBwb3J0c1R5cGUoc2VydmVyVHlwZUlkKSkgewotCQkJCQlQdWJsaXNoT3BlcmF0aW9uW10gdGFza3MyID0gdGFzay5nZXRUYXNrcyh0aGlzLCBraW5kLCBtb2R1bGVMaXN0LCBraW5kTGlzdCk7Ci0JCQkJCWlmICh0YXNrczIgIT0gbnVsbCkgewotCQkJCQkJaW50IHNpemUyID0gdGFza3MyLmxlbmd0aDsKLQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgc2l6ZTI7IGorKykgewotCQkJCQkJCWlmICh0YXNrczJbal0uZ2V0S2luZCgpID09IFB1Ymxpc2hPcGVyYXRpb24uUkVRVUlSRUQpIHsKLQkJCQkJCQkJdGFza3MuYWRkKHRhc2tzMltqXSk7Ci0JCQkJCQkJCXRhc2tzMltqXS5zZXRUYXNrTW9kZWwodGFza01vZGVsKTsKLQkJCQkJCQl9IGVsc2UgaWYgKHRhc2tzMltqXS5nZXRLaW5kKCkgPT0gUHVibGlzaE9wZXJhdGlvbi5QUkVGRVJSRUQpIHsKLQkJCQkJCQkJU3RyaW5nIG9wSWQgPSBnZXRQdWJsaXNoT3BlcmF0aW9uSWQodGFza3MyW2pdKTsKLQkJCQkJCQkJaWYgKCFkaXNhYmxlZFRhc2tzLmNvbnRhaW5zKG9wSWQpKSB7Ci0JCQkJCQkJCQl0YXNrcy5hZGQodGFza3MyW2pdKTsKLQkJCQkJCQkJCXRhc2tzMltqXS5zZXRUYXNrTW9kZWwodGFza01vZGVsKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0gZWxzZSBpZiAodGFza3MyW2pdLmdldEtpbmQoKSA9PSBQdWJsaXNoT3BlcmF0aW9uLk9QVElPTkFMKSB7Ci0JCQkJCQkJCVN0cmluZyBvcElkID0gZ2V0UHVibGlzaE9wZXJhdGlvbklkKHRhc2tzMltqXSk7Ci0JCQkJCQkJCWlmIChlbmFibGVkVGFza3MuY29udGFpbnMob3BJZCkpIHsKLQkJCQkJCQkJCXRhc2tzLmFkZCh0YXNrczJbal0pOwotCQkJCQkJCQkJdGFza3MyW2pdLnNldFRhc2tNb2RlbCh0YXNrTW9kZWwpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlDb2xsZWN0aW9ucy5zb3J0KHRhc2tzLCBQVUJMSVNIX09QRVJBVElPTl9DT01QQVJUT1IpOwotCQkKLQkJcmV0dXJuIChQdWJsaXNoT3BlcmF0aW9uW10pIHRhc2tzLnRvQXJyYXkobmV3IFB1Ymxpc2hPcGVyYXRpb25bdGFza3Muc2l6ZSgpXSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYWxsIHB1Ymxpc2ggdGFza3MgdGhhdCBoYXZlIGJlZW4gdGFyZ2V0dGVkIHRvIHRoaXMgc2VydmVyIHR5cGUuCi0JICogVGhlIHRhc2tzIHdpbGwgbm90IGJlIGluaXRpYWxpemVkIHdpdGggYSB0YXNrIG1vZGVsLiAKLQkgKiAKLQkgKiBAcGFyYW0gbW9kdWxlTGlzdCBhIGxpc3Qgb2YgbW9kdWxlcwotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgcHVibGlzaCBvcGVyYXRpb25zCi0JICovCi0JcHVibGljIFB1Ymxpc2hPcGVyYXRpb25bXSBnZXRBbGxUYXNrcyhMaXN0IG1vZHVsZUxpc3QpIHsKLQkJU3RyaW5nIHNlcnZlclR5cGVJZCA9IGdldFNlcnZlclR5cGUoKS5nZXRJZCgpOwotCQlpZiAoc2VydmVyVHlwZUlkID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IFB1Ymxpc2hPcGVyYXRpb25bMF07Ci0JCQotCQlMaXN0IHRhc2tzID0gbmV3IEFycmF5TGlzdCgpOwotCQkKLQkJSVB1Ymxpc2hUYXNrW10gcHVibGlzaFRhc2tzID0gU2VydmVyUGx1Z2luLmdldFB1Ymxpc2hUYXNrcygpOwotCQlpZiAocHVibGlzaFRhc2tzICE9IG51bGwpIHsKLQkJCWludCBzaXplID0gcHVibGlzaFRhc2tzLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJSVB1Ymxpc2hUYXNrIHRhc2sgPSBwdWJsaXNoVGFza3NbaV07Ci0JCQkJaWYgKHRhc2suc3VwcG9ydHNUeXBlKHNlcnZlclR5cGVJZCkpIHsKLQkJCQkJUHVibGlzaE9wZXJhdGlvbltdIHRhc2tzMiA9IHRhc2suZ2V0VGFza3ModGhpcywgbW9kdWxlTGlzdCk7Ci0JCQkJCXRhc2tzLmFkZEFsbChBcnJheXMuYXNMaXN0KHRhc2tzMikpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJQ29sbGVjdGlvbnMuc29ydCh0YXNrcywgUFVCTElTSF9PUEVSQVRJT05fQ09NUEFSVE9SKTsKLQkJCi0JCXJldHVybiAoUHVibGlzaE9wZXJhdGlvbltdKXRhc2tzLnRvQXJyYXkobmV3IFB1Ymxpc2hPcGVyYXRpb25bdGFza3Muc2l6ZSgpXSk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0UHVibGlzaE9wZXJhdGlvbklkKFB1Ymxpc2hPcGVyYXRpb24gb3ApIHsKLQkJcmV0dXJuIGdldElkKCkrInwiK29wLmdldExhYmVsKCk7Ci0JfQotCQotCXB1YmxpYyBMaXN0IGdldEFsbE1vZHVsZXMoKSB7Ci0JCWZpbmFsIExpc3QgbW9kdWxlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCi0JCUlNb2R1bGVWaXNpdG9yIHZpc2l0b3IgPSBuZXcgSU1vZHVsZVZpc2l0b3IoKSB7Ci0JCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJTW9kdWxlW10gbW9kdWxlKSB7Ci0JCQkJaWYgKCFtb2R1bGVMaXN0LmNvbnRhaW5zKG1vZHVsZSkpCi0JCQkJCW1vZHVsZUxpc3QuYWRkKG1vZHVsZSk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX07Ci0KLQkJdmlzaXQodmlzaXRvciwgbnVsbCk7Ci0JCQotCQlyZXR1cm4gbW9kdWxlTGlzdDsKLQl9Ci0KLQkvKgotCSAqIFJldHVybnMgdGhlIG1vZHVsZSByZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gcHVibGlzaGVkLgotCSAqIAotCSAqIEBzZWUgU2VydmVyQmVoYXZpb3VyRGVsZWdhdGUuZ2V0UHVibGlzaGVkUmVzb3VyY2VzKElNb2R1bGVbXSkKLQkgKi8KLQlwdWJsaWMgSU1vZHVsZVJlc291cmNlW10gZ2V0UmVzb3VyY2VzKElNb2R1bGVbXSBtb2R1bGUpIHsKLQkJaWYgKG1vZHVsZSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTW9kdWxlIGNhbm5vdCBiZSBudWxsIik7Ci0JCXJldHVybiBnZXRTZXJ2ZXJQdWJsaXNoSW5mbygpLmdldFJlc291cmNlcyhtb2R1bGUpOwotCX0KLQotCS8qCi0JICogUmV0dXJucyB0aGUgbW9kdWxlIHJlc291cmNlcyB0aGF0IGhhdmUgYmVlbiBwdWJsaXNoZWQuCi0JICogCi0JICogQHNlZSBTZXJ2ZXJCZWhhdmlvdXJEZWxlZ2F0ZS5nZXRQdWJsaXNoZWRSZXNvdXJjZXMoSU1vZHVsZVtdKQotCSAqLwotCXB1YmxpYyBJTW9kdWxlUmVzb3VyY2VbXSBnZXRQdWJsaXNoZWRSZXNvdXJjZXMoSU1vZHVsZVtdIG1vZHVsZSkgewotCQlpZiAobW9kdWxlID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJNb2R1bGUgY2Fubm90IGJlIG51bGwiKTsKLQkJcmV0dXJuIGdldFNlcnZlclB1Ymxpc2hJbmZvKCkuZ2V0TW9kdWxlUHVibGlzaEluZm8obW9kdWxlKS5nZXRSZXNvdXJjZXMoKTsKLQl9Ci0KLQkvKgotCSAqIFJldHVybnMgdGhlIGRlbHRhIG9mIHRoZSBjdXJyZW50IG1vZHVsZSByZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4KLQkgKiBwdWJsaXNoZWQgY29tcGFyZWQgdG8gdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIG1vZHVsZS4KLQkgKiAKLQkgKiBAc2VlIFNlcnZlckJlaGF2aW91ckRlbGVnYXRlLmdldFB1Ymxpc2hlZFJlc291cmNlRGVsdGEoSU1vZHVsZVtdKQotCSAqLwotCXB1YmxpYyBJTW9kdWxlUmVzb3VyY2VEZWx0YVtdIGdldFB1Ymxpc2hlZFJlc291cmNlRGVsdGEoSU1vZHVsZVtdIG1vZHVsZSkgewotCQlpZiAobW9kdWxlID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJNb2R1bGUgY2Fubm90IGJlIG51bGwiKTsKLQkJcmV0dXJuIGdldFNlcnZlclB1Ymxpc2hJbmZvKCkuZ2V0RGVsdGEobW9kdWxlKTsKLQl9Ci0KLQkvKgotCSAqIFJldHVybnMgdGhlIGRlbHRhIG9mIHRoZSBjdXJyZW50IG1vZHVsZSByZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4KLQkgKiBwdWJsaXNoZWQgY29tcGFyZWQgdG8gdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIG1vZHVsZS4KLQkgKiAKLQkgKiBAc2VlIFNlcnZlckJlaGF2aW91ckRlbGVnYXRlLmdldFB1Ymxpc2hlZFJlc291cmNlRGVsdGEoSU1vZHVsZVtdKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc1B1Ymxpc2hlZFJlc291cmNlRGVsdGEoSU1vZHVsZVtdIG1vZHVsZSkgewotCQlpZiAobW9kdWxlID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJNb2R1bGUgY2Fubm90IGJlIG51bGwiKTsKLQkJcmV0dXJuIGdldFNlcnZlclB1Ymxpc2hJbmZvKCkuaGFzRGVsdGEobW9kdWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElTZXJ2ZXIjZ2V0QWRhcHRlcihDbGFzcykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQlpZiAoZGVsZWdhdGUgIT0gbnVsbCkgewotCQkJaWYgKGFkYXB0ZXIuaXNJbnN0YW5jZShkZWxlZ2F0ZSkpCi0JCQkJcmV0dXJuIGRlbGVnYXRlOwotCQl9Ci0JCWlmIChiZWhhdmlvdXJEZWxlZ2F0ZSAhPSBudWxsKSB7Ci0JCQlpZiAoYWRhcHRlci5pc0luc3RhbmNlKGJlaGF2aW91ckRlbGVnYXRlKSkKLQkJCQlyZXR1cm4gYmVoYXZpb3VyRGVsZWdhdGU7Ci0JCX0KLQkJcmV0dXJuIFBsYXRmb3JtLmdldEFkYXB0ZXJNYW5hZ2VyKCkuZ2V0QWRhcHRlcih0aGlzLCBhZGFwdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElTZXJ2ZXIjbG9hZEFkYXB0ZXIoQ2xhc3MsIElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIE9iamVjdCBsb2FkQWRhcHRlcihDbGFzcyBhZGFwdGVyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJZ2V0RGVsZWdhdGUobW9uaXRvcik7Ci0JCWlmIChhZGFwdGVyLmlzSW5zdGFuY2UoZGVsZWdhdGUpKQotCQkJcmV0dXJuIGRlbGVnYXRlOwotCQkKLQkJZ2V0QmVoYXZpb3VyRGVsZWdhdGUobW9uaXRvcik7Ci0JCWlmIChhZGFwdGVyLmlzSW5zdGFuY2UoYmVoYXZpb3VyRGVsZWdhdGUpKQotCQkJcmV0dXJuIGJlaGF2aW91ckRlbGVnYXRlOwotCQkKLQkJcmV0dXJuIFBsYXRmb3JtLmdldEFkYXB0ZXJNYW5hZ2VyKCkubG9hZEFkYXB0ZXIodGhpcywgYWRhcHRlci5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBnZXROYW1lKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBzZXJ2ZXIgaXMgaW4gYSBzdGF0ZSB0aGF0IGl0IGNhbgotCSAqIGJlIHN0YXJ0ZWQsIGFuZCBzdXBwb3J0cyB0aGUgZ2l2ZW4gbW9kZS4KLQkgKgotCSAqIEBwYXJhbSBtb2RlMgotCSAqIEByZXR1cm4gc3RhdHVzCi0JICovCi0JcHVibGljIElTdGF0dXMgY2FuU3RhcnQoU3RyaW5nIG1vZGUyKSB7Ci0JCWludCBzdGF0ZSA9IGdldFNlcnZlclN0YXRlKCk7Ci0JCWlmIChzdGF0ZSAhPSBTVEFURV9TVE9QUEVEICYmIHN0YXRlICE9IFNUQVRFX1VOS05PV04pCi0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCBNZXNzYWdlcy5jYW5TdGFydEVycm9yU3RhdGUsIG51bGwpOwotCQkKLQkJaWYgKGdldFNlcnZlclR5cGUoKSA9PSBudWxsIHx8ICFnZXRTZXJ2ZXJUeXBlKCkuc3VwcG9ydHNMYXVuY2hNb2RlKG1vZGUyKSkKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIE1lc3NhZ2VzLmVycm9yTGF1bmNoTW9kZSwgbnVsbCk7Ci0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCQotCXB1YmxpYyBJTGF1bmNoIGdldEV4aXN0aW5nTGF1bmNoKCkgewotCQlJTGF1bmNoTWFuYWdlciBsYXVuY2hNYW5hZ2VyID0gRGVidWdQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExhdW5jaE1hbmFnZXIoKTsKLQkJCi0JCUlMYXVuY2hbXSBsYXVuY2hlcyA9IGxhdW5jaE1hbmFnZXIuZ2V0TGF1bmNoZXMoKTsKLQkJaW50IHNpemUgPSBsYXVuY2hlcy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlJTGF1bmNoQ29uZmlndXJhdGlvbiBsYXVuY2hDb25maWcgPSBsYXVuY2hlc1tpXS5nZXRMYXVuY2hDb25maWd1cmF0aW9uKCk7Ci0JCQl0cnkgewotCQkJCWlmIChsYXVuY2hDb25maWcgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgc2VydmVySWQgPSBsYXVuY2hDb25maWcuZ2V0QXR0cmlidXRlKFNFUlZFUl9JRCwgKFN0cmluZykgbnVsbCk7Ci0JCQkJCWlmIChnZXRJZCgpLmVxdWFscyhzZXJ2ZXJJZCkpIHsKLQkJCQkJCWlmICghbGF1bmNoZXNbaV0uaXNUZXJtaW5hdGVkKCkpCi0JCQkJCQkJcmV0dXJuIGxhdW5jaGVzW2ldOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldHVwTGF1bmNoQ29uZmlndXJhdGlvbihJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IHdvcmtpbmdDb3B5LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJdHJ5IHsKLQkJCWdldEJlaGF2aW91ckRlbGVnYXRlKG1vbml0b3IpLnNldHVwTGF1bmNoQ29uZmlndXJhdGlvbih3b3JraW5nQ29weSwgbW9uaXRvcik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBjYWxsaW5nIGRlbGVnYXRlIHNldExhdW5jaERlZmF1bHRzKCkgIiArIHRvU3RyaW5nKCksIGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBsYXVuY2ggY29uZmlndXJhdGlvbiBmb3IgdGhpcyBzZXJ2ZXIuIElmIG9uZSBkb2VzIG5vdCBleGlzdCwgaXQKLQkgKiB3aWxsIGJlIGNyZWF0ZWQgaWYgImNyZWF0ZSIgaXMgdHJ1ZSwgYW5kIG90aGVyd2lzZSB3aWxsIHJldHVybiBudWxsLgotCSAqIAotCSAqIEBwYXJhbSBjcmVhdGUgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYSBuZXcgbGF1bmNoIGNvbmZpZ3VyYXRpb24gc2hvdWxkIGJlCi0JICogICAgY3JlYXRlZCBpZiB0aGVyZSBhcmUgbm9uZSBhbHJlYWR5Ci0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqIEByZXR1cm4gdGhlIGxhdW5jaCBjb25maWd1cmF0aW9uLCBubyA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSB3YXMgbm8KLQkgKiAgICBleGlzdGluZyBsYXVuY2ggY29uZmlndXJhdGlvbiBhbmQgPGNvZGU+Y3JlYXRlPC9jb2RlPiB3YXMgZmFsc2UKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgSUxhdW5jaENvbmZpZ3VyYXRpb24gZ2V0TGF1bmNoQ29uZmlndXJhdGlvbihib29sZWFuIGNyZWF0ZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlMYXVuY2hDb25maWd1cmF0aW9uVHlwZSBsYXVuY2hDb25maWdUeXBlID0gKChTZXJ2ZXJUeXBlKSBnZXRTZXJ2ZXJUeXBlKCkpLmdldExhdW5jaENvbmZpZ3VyYXRpb25UeXBlKCk7Ci0JCQotCQlJTGF1bmNoTWFuYWdlciBsYXVuY2hNYW5hZ2VyID0gRGVidWdQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExhdW5jaE1hbmFnZXIoKTsKLQkJSUxhdW5jaENvbmZpZ3VyYXRpb25bXSBsYXVuY2hDb25maWdzID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWxhdW5jaENvbmZpZ3MgPSBsYXVuY2hNYW5hZ2VyLmdldExhdW5jaENvbmZpZ3VyYXRpb25zKGxhdW5jaENvbmZpZ1R5cGUpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCQotCQlpZiAobGF1bmNoQ29uZmlncyAhPSBudWxsKSB7Ci0JCQlpbnQgc2l6ZSA9IGxhdW5jaENvbmZpZ3MubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQl0cnkgewotCQkJCQlTdHJpbmcgc2VydmVySWQgPSBsYXVuY2hDb25maWdzW2ldLmdldEF0dHJpYnV0ZShTRVJWRVJfSUQsIChTdHJpbmcpIG51bGwpOwotCQkJCQlpZiAoZ2V0SWQoKS5lcXVhbHMoc2VydmVySWQpKSB7Ci0JCQkJCQlJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IHdjID0gbGF1bmNoQ29uZmlnc1tpXS5nZXRXb3JraW5nQ29weSgpOwotCQkJCQkJc2V0dXBMYXVuY2hDb25maWd1cmF0aW9uKHdjLCBtb25pdG9yKTsKLQkJCQkJCWlmICh3Yy5pc0RpcnR5KCkpCi0JCQkJCQkJcmV0dXJuIHdjLmRvU2F2ZSgpOwotCQkJCQkJcmV0dXJuIGxhdW5jaENvbmZpZ3NbaV07Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgY29uZmlndXJpbmcgbGF1bmNoIiwgZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlpZiAoIWNyZWF0ZSkKLQkJCXJldHVybiBudWxsOwotCQkKLQkJLy8gY3JlYXRlIGEgbmV3IGxhdW5jaCBjb25maWd1cmF0aW9uCi0JCVN0cmluZyBsYXVuY2hOYW1lID0gZ2V0VmFsaWRMYXVuY2hDb25maWd1cmF0aW9uTmFtZShnZXROYW1lKCkpOwotCQlsYXVuY2hOYW1lID0gbGF1bmNoTWFuYWdlci5nZW5lcmF0ZVVuaXF1ZUxhdW5jaENvbmZpZ3VyYXRpb25OYW1lRnJvbShsYXVuY2hOYW1lKTsgCi0JCUlMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgd2MgPSBsYXVuY2hDb25maWdUeXBlLm5ld0luc3RhbmNlKG51bGwsIGxhdW5jaE5hbWUpOwotCQl3Yy5zZXRBdHRyaWJ1dGUoU0VSVkVSX0lELCBnZXRJZCgpKTsKLQkJc2V0dXBMYXVuY2hDb25maWd1cmF0aW9uKHdjLCBtb25pdG9yKTsKLQkJcmV0dXJuIHdjLmRvU2F2ZSgpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsaWRMYXVuY2hDb25maWd1cmF0aW9uTmFtZShTdHJpbmcgcykgewotCQlpZiAocyA9PSBudWxsIHx8IHMubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiAiMSI7Ci0JCWludCBzaXplID0gSU5WQUxJRF9DSEFSUy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlzID0gcy5yZXBsYWNlKElOVkFMSURfQ0hBUlNbaV0sICdfJyk7Ci0JCX0KLQkJcmV0dXJuIHM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJU2VydmVyI3N0YXJ0KFN0cmluZywgSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChTdHJpbmcgbW9kZTIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJTdGFydGluZyBzZXJ2ZXI6ICIgKyB0b1N0cmluZygpICsgIiwgbGF1bmNoTW9kZTogIiArIG1vZGUyKTsKLQkKLQkJdHJ5IHsKLQkJCUlMYXVuY2hDb25maWd1cmF0aW9uIGxhdW5jaENvbmZpZyA9IGdldExhdW5jaENvbmZpZ3VyYXRpb24odHJ1ZSwgbW9uaXRvcik7Ci0JCQlJTGF1bmNoIGxhdW5jaCA9IGxhdW5jaENvbmZpZy5sYXVuY2gobW9kZTIsIG1vbml0b3IpOyAvLyAsIHRydWUpOyAtIGNhdXNlcyB3b3Jrc3BhY2UgbG9jawotCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiTGF1bmNoOiAiICsgbGF1bmNoKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBzdGFydGluZyBzZXJ2ZXIgIiArIHRvU3RyaW5nKCksIGUpOwotCQkJdGhyb3cgZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENsZWFuIHVwIGFueSBvbGQgbGF1bmNoIGNvbmZpZ3VyYXRpb25zIHdpdGggdGhlIGN1cnJlbnQgc2VydmVyJ3MgaWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVsZXRlTGF1bmNoQ29uZmlndXJhdGlvbnMoKSB7Ci0JCWlmIChnZXRTZXJ2ZXJUeXBlKCkgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSUxhdW5jaE1hbmFnZXIgbGF1bmNoTWFuYWdlciA9IERlYnVnUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMYXVuY2hNYW5hZ2VyKCk7Ci0JCUlMYXVuY2hDb25maWd1cmF0aW9uVHlwZSBsYXVuY2hDb25maWdUeXBlID0gKChTZXJ2ZXJUeXBlKSBnZXRTZXJ2ZXJUeXBlKCkpLmdldExhdW5jaENvbmZpZ3VyYXRpb25UeXBlKCk7Ci0JCQotCQlJTGF1bmNoQ29uZmlndXJhdGlvbltdIGNvbmZpZ3MgPSBudWxsOwotCQl0cnkgewotCQkJY29uZmlncyA9IGxhdW5jaE1hbmFnZXIuZ2V0TGF1bmNoQ29uZmlndXJhdGlvbnMobGF1bmNoQ29uZmlnVHlwZSk7Ci0JCQlpbnQgc2l6ZSA9IGNvbmZpZ3MubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQl0cnkgewotCQkJCQlpZiAoZ2V0SWQoKS5lcXVhbHMoY29uZmlnc1tpXS5nZXRBdHRyaWJ1dGUoU0VSVkVSX0lELCAoU3RyaW5nKSBudWxsKSkpCi0JCQkJCQljb25maWdzW2ldLmRlbGV0ZSgpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIGlnbm9yZQotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJU2VydmVyI2NhblJlc3RhcnQoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGNhblJlc3RhcnQoU3RyaW5nIG1vZGUyKSB7Ci0JCWlmICghZ2V0U2VydmVyVHlwZSgpLnN1cHBvcnRzTGF1bmNoTW9kZShtb2RlMikpCi0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCBNZXNzYWdlcy5lcnJvckxhdW5jaE1vZGUsIG51bGwpOwotCi0JCWludCBzdGF0ZSA9IGdldFNlcnZlclN0YXRlKCk7Ci0JCWlmIChzdGF0ZSA9PSBTVEFURV9TVEFSVEVEKQotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQotCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCBNZXNzYWdlcy5lcnJvclJlc3RhcnROb3RTdGFydGVkLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHJlc3RhcnQgc3RhdGUgb2YgdGhlIHNlcnZlci4gVGhpcwotCSAqIGltcGxlbWVudGF0aW9uIHdpbGwgYWx3YXlzIHJldHVybiBmYWxzZSB3aGVuIHRoZSBzZXJ2ZXIKLQkgKiBpcyBzdG9wcGVkLgotCSAqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0U2VydmVyUmVzdGFydFN0YXRlKCkgewotCQlpZiAoZ2V0U2VydmVyU3RhdGUoKSA9PSBTVEFURV9TVE9QUEVEKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gc2VydmVyUmVzdGFydE5lZWRlZDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBzZXJ2ZXIgcmVzdGFydCBzdGF0ZS4KLQkgKgotCSAqIEBwYXJhbSBzdGF0ZSBib29sZWFuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldFNlcnZlclJlc3RhcnRTdGF0ZShib29sZWFuIHN0YXRlKSB7Ci0JCWlmIChzdGF0ZSA9PSBzZXJ2ZXJSZXN0YXJ0TmVlZGVkKQotCQkJcmV0dXJuOwotCQlzZXJ2ZXJSZXN0YXJ0TmVlZGVkID0gc3RhdGU7Ci0JCWZpcmVSZXN0YXJ0U3RhdGVDaGFuZ2VFdmVudCgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVNlcnZlciNyZXN0YXJ0KFN0cmluZywgSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXN0YXJ0KGZpbmFsIFN0cmluZyBtb2RlMiwgZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmIChnZXRTZXJ2ZXJTdGF0ZSgpID09IFNUQVRFX1NUT1BQRUQpCi0JCQlyZXR1cm47Ci0JCi0JCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIlJlc3RhcnRpbmcgc2VydmVyOiAiICsgZ2V0TmFtZSgpKTsKLQkKLQkJdHJ5IHsKLQkJCXRyeSB7Ci0JCQkJZ2V0QmVoYXZpb3VyRGVsZWdhdGUobnVsbCkucmVzdGFydChtb2RlMik7Ci0JCQkJcmV0dXJuOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGNhbGxpbmcgZGVsZWdhdGUgcmVzdGFydCgpICIgKyB0b1N0cmluZygpKTsKLQkJCX0KLQkJCi0JCQkvLyBhZGQgbGlzdGVuZXIgdG8gc3RhcnQgaXQgYXMgc29vbiBhcyBpdCBpcyBzdG9wcGVkCi0JCQlhZGRTZXJ2ZXJMaXN0ZW5lcihuZXcgSVNlcnZlckxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHNlcnZlckNoYW5nZWQoU2VydmVyRXZlbnQgZXZlbnQpIHsKLQkJCQkJaW50IGV2ZW50S2luZCA9IGV2ZW50LmdldEtpbmQoKTsKLQkJCQkJSVNlcnZlciBzZXJ2ZXIgPSBldmVudC5nZXRTZXJ2ZXIoKTsKLQkJCQkJaWYgKGV2ZW50S2luZCA9PSAoU2VydmVyRXZlbnQuU0VSVkVSX0NIQU5HRSB8IFNlcnZlckV2ZW50LlNUQVRFX0NIQU5HRSkpIHsKLQkJCQkJCWlmIChzZXJ2ZXIuZ2V0U2VydmVyU3RhdGUoKSA9PSBTVEFURV9TVE9QUEVEKSB7Ci0JCQkJCQkJc2VydmVyLnJlbW92ZVNlcnZlckxpc3RlbmVyKHRoaXMpOwotCi0JCQkJCQkJLy8gcmVzdGFydCBpbiBhIHF1YXJ0ZXIgc2Vjb25kIChnaXZlIG90aGVyIGxpc3RlbmVycyBhIGNoYW5jZQotCQkJCQkJCS8vIHRvIGhlYXIgdGhlIHN0b3BwZWQgbWVzc2FnZSkKLQkJCQkJCQlUaHJlYWQgdCA9IG5ldyBUaHJlYWQoKSB7Ci0JCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQkJVGhyZWFkLnNsZWVwKDI1MCk7Ci0JCQkJCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCQkJCS8vIGlnbm9yZQotCQkJCQkJCQkJfQotCQkJCQkJCQkJU2VydmVyVHlwZSBzdCA9IChTZXJ2ZXJUeXBlKSBnZXRTZXJ2ZXJUeXBlKCk7Ci0JCQkJCQkJCQlpZiAoc3Quc3RhcnRCZWZvcmVQdWJsaXNoKCkpIHsKLQkJCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJCQlTZXJ2ZXIudGhpcy5zdGFydChtb2RlMiwgbW9uaXRvcik7Ci0JCQkJCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3Igd2hpbGUgcmVzdGFydGluZyBzZXJ2ZXIiLCBlKTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQlpZiAoU2VydmVyUHJlZmVyZW5jZXMuZ2V0SW5zdGFuY2UoKS5pc0F1dG9QdWJsaXNoaW5nKCkgJiYgc2hvdWxkUHVibGlzaCgpKSB7Ci0JCQkJCQkJCQkJcHVibGlzaChQVUJMSVNIX0lOQ1JFTUVOVEFMLCBudWxsKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWlmIChnZXRTZXJ2ZXJTdGF0ZSgpICE9IElTZXJ2ZXIuU1RBVEVfU1RBUlRFRCkgewotCQkJCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQkJCVNlcnZlci50aGlzLnN0YXJ0KG1vZGUyLCBtb25pdG9yKTsKLQkJCQkJCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciB3aGlsZSByZXN0YXJ0aW5nIHNlcnZlciIsIGUpOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX07Ci0JCQkJCQkJdC5zZXREYWVtb24odHJ1ZSk7Ci0JCQkJCQkJdC5zZXRQcmlvcml0eShUaHJlYWQuTk9STV9QUklPUklUWSAtIDIpOwotCQkJCQkJCXQuc3RhcnQoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkKLQkJCQl9Ci0JCQl9KTsKLQkKLQkJCS8vIHN0b3AgdGhlIHNlcnZlcgotCQkJc3RvcChmYWxzZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciByZXN0YXJ0aW5nIHNlcnZlciIsIGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBzZXJ2ZXIgaXMgaW4gYSBzdGF0ZSB0aGF0IGl0IGNhbgotCSAqIGJlIHN0b3BwZWQuCi0JICoKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBjYW5TdG9wKCkgewotCQlpZiAoZ2V0U2VydmVyU3RhdGUoKSA9PSBTVEFURV9TVE9QUEVEKQotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTWVzc2FnZXMuZXJyb3JTdG9wQWxyZWFkeVN0b3BwZWQsIG51bGwpOwotCi0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVNlcnZlciNzdG9wKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChib29sZWFuIGZvcmNlKSB7Ci0JCWlmIChnZXRTZXJ2ZXJTdGF0ZSgpID09IFNUQVRFX1NUT1BQRUQpCi0JCQlyZXR1cm47Ci0KLQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiU3RvcHBpbmcgc2VydmVyOiAiICsgdG9TdHJpbmcoKSk7Ci0KLQkJdHJ5IHsKLQkJCWdldEJlaGF2aW91ckRlbGVnYXRlKG51bGwpLnN0b3AoZm9yY2UpOwotCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgY2FsbGluZyBkZWxlZ2F0ZSBzdG9wKCkgIiArIHRvU3RyaW5nKCksIHQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJU2VydmVyI3N0YXJ0KFN0cmluZywgSU9wZXJhdGlvbkxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KFN0cmluZyBtb2RlMiwgSU9wZXJhdGlvbkxpc3RlbmVyIGxpc3RlbmVyMikgewotCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJzeW5jaHJvbm91c1N0YXJ0IDEiKTsKLQkJZmluYWwgT2JqZWN0IG11dGV4ID0gbmV3IE9iamVjdCgpOwotCQotCQkvLyBhZGQgbGlzdGVuZXIgdG8gdGhlIHNlcnZlcgotCQlJU2VydmVyTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgSVNlcnZlckxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VydmVyQ2hhbmdlZChTZXJ2ZXJFdmVudCBldmVudCkgewotCQkJCWludCBldmVudEtpbmQgPSBldmVudC5nZXRLaW5kKCk7Ci0JCQkJSVNlcnZlciBzZXJ2ZXIgPSBldmVudC5nZXRTZXJ2ZXIoKTsKLQkJCQlpZiAoZXZlbnRLaW5kID09IChTZXJ2ZXJFdmVudC5TRVJWRVJfQ0hBTkdFIHwgU2VydmVyRXZlbnQuU1RBVEVfQ0hBTkdFKSkgewotCQkJCQlpbnQgc3RhdGUgPSBzZXJ2ZXIuZ2V0U2VydmVyU3RhdGUoKTsKLQkJCQkJaWYgKHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfU1RBUlRFRCB8fCBzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1NUT1BQRUQpIHsKLQkJCQkJCS8vIG5vdGlmeSB3YWl0ZXIKLQkJCQkJCXN5bmNocm9uaXplZCAobXV0ZXgpIHsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJzeW5jaHJvbm91c1N0YXJ0IG5vdGlmeSIpOwotCQkJCQkJCQltdXRleC5ub3RpZnlBbGwoKTsKLQkJCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBub3RpZnlpbmcgc2VydmVyIHN0YXJ0IiwgZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9OwotCQlhZGRTZXJ2ZXJMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCQotCQlmaW5hbCBpbnQgc2VydmVyVGltZW91dCA9ICgoU2VydmVyVHlwZSkgZ2V0U2VydmVyVHlwZSgpKS5nZXRTdGFydFRpbWVvdXQoKTsKLQkJY2xhc3MgVGltZXIgewotCQkJYm9vbGVhbiB0aW1lb3V0OwotCQkJYm9vbGVhbiBhbHJlYWR5RG9uZTsKLQkJfQotCQlmaW5hbCBUaW1lciB0aW1lciA9IG5ldyBUaW1lcigpOwotCQkJCi0JCVRocmVhZCB0aHJlYWQgPSBuZXcgVGhyZWFkKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXRyeSB7Ci0JCQkJCVRocmVhZC5zbGVlcChzZXJ2ZXJUaW1lb3V0ICogMTAwMCk7Ci0JCQkJCWlmICghdGltZXIuYWxyZWFkeURvbmUpIHsKLQkJCQkJCXRpbWVyLnRpbWVvdXQgPSB0cnVlOwotCQkJCQkJLy8gbm90aWZ5IHdhaXRlcgotCQkJCQkJc3luY2hyb25pemVkIChtdXRleCkgewotCQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgInN5bmNocm9ub3VzU3RhcnQgbm90aWZ5IHRpbWVvdXQiKTsKLQkJCQkJCQltdXRleC5ub3RpZnlBbGwoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIG5vdGlmeWluZyBzZXJ2ZXIgc3RhcnQgdGltZW91dCIsIGUpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQkJdGhyZWFkLnNldERhZW1vbih0cnVlKTsKLQkJdGhyZWFkLnN0YXJ0KCk7Ci0JCQotCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJzeW5jaHJvbm91c1N0YXJ0IDIiKTsKLQkKLQkJLy8gc3RhcnQgdGhlIHNlcnZlcgotCQl0cnkgewotCQkJc3RhcnQobW9kZTIsIChJUHJvZ3Jlc3NNb25pdG9yKW51bGwpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXJlbW92ZVNlcnZlckxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJCXRpbWVyLmFscmVhZHlEb25lID0gdHJ1ZTsKLQkJCWxpc3RlbmVyMi5kb25lKGUuZ2V0U3RhdHVzKCkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCi0JCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgInN5bmNocm9ub3VzU3RhcnQgMyIpOwotCQotCQkvLyB3YWl0IGZvciBpdCEgd2FpdCBmb3IgaXQhIC4uLgotCQlzeW5jaHJvbml6ZWQgKG11dGV4KSB7Ci0JCQl0cnkgewotCQkJCXdoaWxlICghdGltZXIudGltZW91dCAmJiAhKGdldFNlcnZlclN0YXRlKCkgPT0gSVNlcnZlci5TVEFURV9TVEFSVEVEIHx8IGdldFNlcnZlclN0YXRlKCkgPT0gSVNlcnZlci5TVEFURV9TVE9QUEVEKSkKLQkJCQkJbXV0ZXgud2FpdCgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciB3YWl0aW5nIGZvciBzZXJ2ZXIgc3RhcnQiLCBlKTsKLQkJCX0KLQkJfQotCQlyZW1vdmVTZXJ2ZXJMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCXRpbWVyLmFscmVhZHlEb25lID0gdHJ1ZTsKLQkJCi0JCWlmICh0aW1lci50aW1lb3V0KSB7Ci0JCQlsaXN0ZW5lcjIuZG9uZShuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yU3RhcnRUaW1lb3V0LCBuZXcgU3RyaW5nW10geyBnZXROYW1lKCksIChzZXJ2ZXJUaW1lb3V0IC8gMTAwMCkgKyAiIiB9KSwgbnVsbCkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXRpbWVyLmFscmVhZHlEb25lID0gdHJ1ZTsKLQkJCi0JCWlmIChnZXRTZXJ2ZXJTdGF0ZSgpID09IElTZXJ2ZXIuU1RBVEVfU1RPUFBFRCkgewotCQkJbGlzdGVuZXIyLmRvbmUobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCBOTFMuYmluZChNZXNzYWdlcy5lcnJvclN0YXJ0RmFpbGVkLCBnZXROYW1lKCkpLCBudWxsKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkKLQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAic3luY2hyb25vdXNTdGFydCA0Iik7Ci0JCWxpc3RlbmVyMi5kb25lKFN0YXR1cy5PS19TVEFUVVMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN5bmNocm9ub3VzU3RhcnQoU3RyaW5nIG1vZGUyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAic3luY2hyb25vdXNTdGFydCAxIik7Ci0JCWZpbmFsIE9iamVjdCBtdXRleCA9IG5ldyBPYmplY3QoKTsKLQkKLQkJbW9uaXRvciA9IFByb2dyZXNzVXRpbC5nZXRNb25pdG9yRm9yKG1vbml0b3IpOwotCQkKLQkJLy8gYWRkIGxpc3RlbmVyIHRvIHRoZSBzZXJ2ZXIKLQkJSVNlcnZlckxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IElTZXJ2ZXJMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlcnZlckNoYW5nZWQoU2VydmVyRXZlbnQgZXZlbnQpIHsKLQkJCQlpbnQgZXZlbnRLaW5kID0gZXZlbnQuZ2V0S2luZCgpOwotCQkJCUlTZXJ2ZXIgc2VydmVyID0gZXZlbnQuZ2V0U2VydmVyKCk7Ci0JCQkJaWYgKGV2ZW50S2luZCA9PSAoU2VydmVyRXZlbnQuU0VSVkVSX0NIQU5HRSB8IFNlcnZlckV2ZW50LlNUQVRFX0NIQU5HRSkpIHsKLQkJCQkJaW50IHN0YXRlID0gc2VydmVyLmdldFNlcnZlclN0YXRlKCk7Ci0JCQkJCWlmIChzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1NUQVJURUQgfHwgc3RhdGUgPT0gSVNlcnZlci5TVEFURV9TVE9QUEVEKSB7Ci0JCQkJCQkvLyBub3RpZnkgd2FpdGVyCi0JCQkJCQlzeW5jaHJvbml6ZWQgKG11dGV4KSB7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAic3luY2hyb25vdXNTdGFydCBub3RpZnkiKTsKLQkJCQkJCQkJbXV0ZXgubm90aWZ5QWxsKCk7Ci0JCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3Igbm90aWZ5aW5nIHNlcnZlciBzdGFydCIsIGUpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfTsKLQkJYWRkU2VydmVyTGlzdGVuZXIobGlzdGVuZXIpOwotCQkKLQkJZmluYWwgaW50IHNlcnZlclRpbWVvdXQgPSAoKFNlcnZlclR5cGUpIGdldFNlcnZlclR5cGUoKSkuZ2V0U3RhcnRUaW1lb3V0KCk7Ci0JCWNsYXNzIFRpbWVyIHsKLQkJCWJvb2xlYW4gdGltZW91dDsKLQkJCWJvb2xlYW4gYWxyZWFkeURvbmU7Ci0JCX0KLQkJZmluYWwgVGltZXIgdGltZXIgPSBuZXcgVGltZXIoKTsKLQkJCi0JCWZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcjIgPSBtb25pdG9yOwotCQlUaHJlYWQgdGhyZWFkID0gbmV3IFRocmVhZCgiU3luY2hyb25vdXMgU2VydmVyIFN0YXJ0IikgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXRyeSB7Ci0JCQkJCWludCB0b3RhbFRpbWVvdXQgPSBzZXJ2ZXJUaW1lb3V0OwotCQkJCQlib29sZWFuIHVzZXJDYW5jZWxsZWQgPSBmYWxzZTsKLQkJCQkJaW50IHJldHJ5UGVyaW9kID0gMjUwMDsKLQkJCQkJd2hpbGUgKHRvdGFsVGltZW91dCA+IDAgJiYgIXVzZXJDYW5jZWxsZWQgJiYgIXRpbWVyLmFscmVhZHlEb25lKSB7Ci0JCQkJCQlUaHJlYWQuc2xlZXAocmV0cnlQZXJpb2QpOwotCQkJCQkJdG90YWxUaW1lb3V0IC09IHJldHJ5UGVyaW9kOwotCQkJCQkJaWYgKG1vbml0b3IyLmlzQ2FuY2VsZWQoKSkgewotCQkJCQkJCS8vIHVzZXIgY2FuY2VsbGVkIC0gc2V0IHRoZSBzZXJ2ZXIgc3RhdGUgdG8gc3RvcHBlZAotCQkJCQkJCXVzZXJDYW5jZWxsZWQgPSB0cnVlOwotCQkJCQkJCXNldFNlcnZlclN0YXRlKElTZXJ2ZXIuU1RBVEVfU1RPUFBFRCk7Ci0JCQkJCQkJLy8gbm90aWZ5IHdhaXRlcgotCQkJCQkJCXN5bmNocm9uaXplZCAobXV0ZXgpIHsKLQkJCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAic3luY2hyb25vdXNTdGFydCB1c2VyIGNhbmNlbGxlZC4iKTsKLQkJCQkJCQkJbXV0ZXgubm90aWZ5QWxsKCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmICghdXNlckNhbmNlbGxlZCAmJiAhdGltZXIuYWxyZWFkeURvbmUpIHsKLQkJCQkJCXRpbWVyLnRpbWVvdXQgPSB0cnVlOwotCQkJCQkJLy8gbm90aWZ5IHdhaXRlcgotCQkJCQkJc3luY2hyb25pemVkIChtdXRleCkgewotCQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgInN5bmNocm9ub3VzU3RhcnQgbm90aWZ5IHRpbWVvdXQiKTsKLQkJCQkJCQltdXRleC5ub3RpZnlBbGwoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIG5vdGlmeWluZyBzZXJ2ZXIgc3RhcnQgdGltZW91dCIsIGUpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQkJdGhyZWFkLnNldERhZW1vbih0cnVlKTsKLQkJdGhyZWFkLnN0YXJ0KCk7Ci0JCi0JCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgInN5bmNocm9ub3VzU3RhcnQgMiIpOwotCQotCQkvLyBzdGFydCB0aGUgc2VydmVyCi0JCXRyeSB7Ci0JCQlzdGFydChtb2RlMiwgbW9uaXRvcik7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJcmVtb3ZlU2VydmVyTGlzdGVuZXIobGlzdGVuZXIpOwotCQkJdGltZXIuYWxyZWFkeURvbmUgPSB0cnVlOwotCQkJdGhyb3cgZTsKLQkJfQotCQotCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJzeW5jaHJvbm91c1N0YXJ0IDMiKTsKLQkKLQkJLy8gd2FpdCBmb3IgaXQhIHdhaXQgZm9yIGl0ISAuLi4KLQkJc3luY2hyb25pemVkIChtdXRleCkgewotCQkJdHJ5IHsKLQkJCQl3aGlsZSAoIW1vbml0b3IuaXNDYW5jZWxlZCgpICYmICF0aW1lci50aW1lb3V0ICYmICEoZ2V0U2VydmVyU3RhdGUoKSA9PSBJU2VydmVyLlNUQVRFX1NUQVJURUQgfHwgZ2V0U2VydmVyU3RhdGUoKSA9PSBJU2VydmVyLlNUQVRFX1NUT1BQRUQpKQotCQkJCQltdXRleC53YWl0KCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIHdhaXRpbmcgZm9yIHNlcnZlciBzdGFydCIsIGUpOwotCQkJfQotCQl9Ci0JCXJlbW92ZVNlcnZlckxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJdGltZXIuYWxyZWFkeURvbmUgPSB0cnVlOwotCQkKLQkJaWYgKHRpbWVyLnRpbWVvdXQpCi0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yU3RhcnRUaW1lb3V0LCBuZXcgU3RyaW5nW10geyBnZXROYW1lKCksIHNlcnZlclRpbWVvdXQgKyAiIiB9KSwgbnVsbCkpOwotCQl0aW1lci5hbHJlYWR5RG9uZSA9IHRydWU7Ci0JCQotCQlpZiAoZ2V0U2VydmVyU3RhdGUoKSA9PSBJU2VydmVyLlNUQVRFX1NUT1BQRUQpCi0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yU3RhcnRGYWlsZWQsIGdldE5hbWUoKSksIG51bGwpKTsKLQkKLQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAic3luY2hyb25vdXNTdGFydCA0Iik7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElTZXJ2ZXIjc3luY2hyb25vdXNSZXN0YXJ0KFN0cmluZywgSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzeW5jaHJvbm91c1Jlc3RhcnQoU3RyaW5nIG1vZGUyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJc3luY2hyb25vdXNTdG9wKHRydWUpOwotCQlzeW5jaHJvbm91c1N0YXJ0KG1vZGUyLCBtb25pdG9yKTsKLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIElTZXJ2ZXIjcmVzdGFydChTdHJpbmcsIElPcGVyYXRpb25MaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXN0YXJ0KFN0cmluZyBtb2RlMiwgSU9wZXJhdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChnZXRTZXJ2ZXJTdGF0ZSgpID09IFNUQVRFX1NUT1BQRUQpCi0JCQlyZXR1cm47Ci0JCi0JCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIlJlc3RhcnRpbmcgc2VydmVyOiAiICsgZ2V0TmFtZSgpKTsKLQkKLQkJdHJ5IHsKLQkJCWZpbmFsIElPcGVyYXRpb25MaXN0ZW5lciBsaXN0ZW5lcjIgPSBsaXN0ZW5lcjsKLQkJCUlTZXJ2ZXJMaXN0ZW5lciBjdXJMaXN0ZW5lciA9IG5ldyBJU2VydmVyTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgc2VydmVyQ2hhbmdlZChTZXJ2ZXJFdmVudCBldmVudCkgewotCQkJCQlpbnQgZXZlbnRLaW5kID0gZXZlbnQuZ2V0S2luZCgpOwotCQkJCQlJU2VydmVyIHNlcnZlciA9IGV2ZW50LmdldFNlcnZlcigpOwotCQkJCQlpZiAoZXZlbnRLaW5kID09IChTZXJ2ZXJFdmVudC5TRVJWRVJfQ0hBTkdFIHwgU2VydmVyRXZlbnQuU1RBVEVfQ0hBTkdFKSkgewotCQkJCQkJaWYgKHNlcnZlci5nZXRTZXJ2ZXJTdGF0ZSgpID09IFNUQVRFX1NUQVJURUQpIHsKLQkJCQkJCQlzZXJ2ZXIucmVtb3ZlU2VydmVyTGlzdGVuZXIodGhpcyk7Ci0JCQkJCQkJbGlzdGVuZXIyLmRvbmUoU3RhdHVzLk9LX1NUQVRVUyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9OwotCQkJdHJ5IHsKLQkJCQlhZGRTZXJ2ZXJMaXN0ZW5lcihjdXJMaXN0ZW5lcik7Ci0JCQkJZ2V0QmVoYXZpb3VyRGVsZWdhdGUobnVsbCkucmVzdGFydChtb2RlMik7Ci0JCQkJcmV0dXJuOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGNhbGxpbmcgZGVsZWdhdGUgcmVzdGFydCgpICIgKyB0b1N0cmluZygpKTsKLQkJCQlyZW1vdmVTZXJ2ZXJMaXN0ZW5lcihjdXJMaXN0ZW5lcik7Ci0JCQl9Ci0JCQotCQkJZmluYWwgU3RyaW5nIG1vZGUzID0gbW9kZTI7Ci0JCQkvLyBhZGQgbGlzdGVuZXIgdG8gc3RhcnQgaXQgYXMgc29vbiBhcyBpdCBpcyBzdG9wcGVkCi0JCQlhZGRTZXJ2ZXJMaXN0ZW5lcihuZXcgSVNlcnZlckxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHNlcnZlckNoYW5nZWQoU2VydmVyRXZlbnQgZXZlbnQpIHsKLQkJCQkJaW50IGV2ZW50S2luZCA9IGV2ZW50LmdldEtpbmQoKTsKLQkJCQkJSVNlcnZlciBzZXJ2ZXIgPSBldmVudC5nZXRTZXJ2ZXIoKTsKLQkJCQkJaWYgKGV2ZW50S2luZCA9PSAoU2VydmVyRXZlbnQuU0VSVkVSX0NIQU5HRSB8IFNlcnZlckV2ZW50LlNUQVRFX0NIQU5HRSkpIHsKLQkJCQkJCWlmIChzZXJ2ZXIuZ2V0U2VydmVyU3RhdGUoKSA9PSBTVEFURV9TVE9QUEVEKSB7Ci0JCQkJCQkJc2VydmVyLnJlbW92ZVNlcnZlckxpc3RlbmVyKHRoaXMpOwotCi0JCQkJCQkJLy8gcmVzdGFydCBpbiBhIHF1YXJ0ZXIgc2Vjb25kIChnaXZlIG90aGVyIGxpc3RlbmVycyBhIGNoYW5jZQotCQkJCQkJCS8vIHRvIGhlYXIgdGhlIHN0b3BwZWQgbWVzc2FnZSkKLQkJCQkJCQlUaHJlYWQgdCA9IG5ldyBUaHJlYWQoIlJlc3RhcnQgdGhyZWFkIikgewotCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJCVRocmVhZC5zbGVlcCgyNTApOwotCQkJCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCQkvLyBpZ25vcmUKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCVNlcnZlclR5cGUgc3QgPSAoU2VydmVyVHlwZSkgZ2V0U2VydmVyVHlwZSgpOwotCQkJCQkJCQkJaWYgKHN0LnN0YXJ0QmVmb3JlUHVibGlzaCgpKSB7Ci0JCQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCQkJU2VydmVyLnRoaXMuc3RhcnQobW9kZTMsIGxpc3RlbmVyMik7Ci0JCQkJCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3Igd2hpbGUgcmVzdGFydGluZyBzZXJ2ZXIiLCBlKTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQlpZiAoU2VydmVyUHJlZmVyZW5jZXMuZ2V0SW5zdGFuY2UoKS5pc0F1dG9QdWJsaXNoaW5nKCkgJiYgc2hvdWxkUHVibGlzaCgpKSB7Ci0JCQkJCQkJCQkJcHVibGlzaChQVUJMSVNIX0lOQ1JFTUVOVEFMLCBudWxsKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWlmIChnZXRTZXJ2ZXJTdGF0ZSgpICE9IElTZXJ2ZXIuU1RBVEVfU1RBUlRFRCkgewotCQkJCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQkJCVNlcnZlci50aGlzLnN0YXJ0KG1vZGUzLCBsaXN0ZW5lcjIpOwotCQkJCQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIHdoaWxlIHJlc3RhcnRpbmcgc2VydmVyIiwgZSk7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfTsKLQkJCQkJCQl0LnNldERhZW1vbih0cnVlKTsKLQkJCQkJCQl0LnNldFByaW9yaXR5KFRocmVhZC5OT1JNX1BSSU9SSVRZIC0gMik7Ci0JCQkJCQkJdC5zdGFydCgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCQotCQkJCX0KLQkJCX0pOwotCQotCQkJLy8gc3RvcCB0aGUgc2VydmVyCi0JCQlzdG9wKGZhbHNlKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIHJlc3RhcnRpbmcgc2VydmVyIiwgZSk7Ci0JCQlsaXN0ZW5lci5kb25lKG51bGwpOwotCQl9Ci0JfQotCQotCS8qCi0JICogQHNlZSBJU2VydmVyI3N0b3AoYm9vbGVhbiwgSU9wZXJhdGlvbkxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoYm9vbGVhbiBmb3JjZSwgSU9wZXJhdGlvbkxpc3RlbmVyIGxpc3RlbmVyMikgewotCQlpZiAoZ2V0U2VydmVyU3RhdGUoKSA9PSBJU2VydmVyLlNUQVRFX1NUT1BQRUQpCi0JCQlyZXR1cm47Ci0JCQotCQlmaW5hbCBPYmplY3QgbXV0ZXggPSBuZXcgT2JqZWN0KCk7Ci0JCi0JCS8vIGFkZCBsaXN0ZW5lciB0byB0aGUgc2VydmVyCi0JCUlTZXJ2ZXJMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBJU2VydmVyTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZXJ2ZXJDaGFuZ2VkKFNlcnZlckV2ZW50IGV2ZW50KSB7Ci0JCQkJaW50IGV2ZW50S2luZCA9IGV2ZW50LmdldEtpbmQoKTsKLQkJCQlJU2VydmVyIHNlcnZlciA9IGV2ZW50LmdldFNlcnZlcigpOwotCQkJCWlmIChldmVudEtpbmQgPT0gKFNlcnZlckV2ZW50LlNFUlZFUl9DSEFOR0UgfCBTZXJ2ZXJFdmVudC5TVEFURV9DSEFOR0UpKSB7Ci0JCQkJCWludCBzdGF0ZSA9IHNlcnZlci5nZXRTZXJ2ZXJTdGF0ZSgpOwotCQkJCQlpZiAoU2VydmVyLnRoaXMgPT0gc2VydmVyICYmIHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfU1RPUFBFRCkgewotCQkJCQkJLy8gbm90aWZ5IHdhaXRlcgotCQkJCQkJc3luY2hyb25pemVkIChtdXRleCkgewotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCW11dGV4Lm5vdGlmeUFsbCgpOwotCQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIG5vdGlmeWluZyBzZXJ2ZXIgc3RvcCIsIGUpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfTsKLQkJYWRkU2VydmVyTGlzdGVuZXIobGlzdGVuZXIpOwotCQkKLQkJY2xhc3MgVGltZXIgewotCQkJYm9vbGVhbiB0aW1lb3V0OwotCQkJYm9vbGVhbiBhbHJlYWR5RG9uZTsKLQkJfQotCQlmaW5hbCBUaW1lciB0aW1lciA9IG5ldyBUaW1lcigpOwotCQkKLQkJVGhyZWFkIHRocmVhZCA9IG5ldyBUaHJlYWQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJVGhyZWFkLnNsZWVwKDEyMDAwMCk7Ci0JCQkJCWlmICghdGltZXIuYWxyZWFkeURvbmUpIHsKLQkJCQkJCXRpbWVyLnRpbWVvdXQgPSB0cnVlOwotCQkJCQkJLy8gbm90aWZ5IHdhaXRlcgotCQkJCQkJc3luY2hyb25pemVkIChtdXRleCkgewotCQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgInN0b3Agbm90aWZ5IHRpbWVvdXQiKTsKLQkJCQkJCQltdXRleC5ub3RpZnlBbGwoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIG5vdGlmeWluZyBzZXJ2ZXIgc3RvcCB0aW1lb3V0IiwgZSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCQl0aHJlYWQuc2V0RGFlbW9uKHRydWUpOwotCQl0aHJlYWQuc3RhcnQoKTsKLQkKLQkJLy8gc3RvcCB0aGUgc2VydmVyCi0JCXN0b3AoZm9yY2UpOwotCQotCQkvLyB3YWl0IGZvciBpdCEgd2FpdCBmb3IgaXQhCi0JCXN5bmNocm9uaXplZCAobXV0ZXgpIHsKLQkJCXRyeSB7Ci0JCQkJd2hpbGUgKCF0aW1lci50aW1lb3V0ICYmIGdldFNlcnZlclN0YXRlKCkgIT0gSVNlcnZlci5TVEFURV9TVE9QUEVEKQotCQkJCQltdXRleC53YWl0KCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIHdhaXRpbmcgZm9yIHNlcnZlciBzdG9wIiwgZSk7Ci0JCQl9Ci0JCX0KLQkJcmVtb3ZlU2VydmVyTGlzdGVuZXIobGlzdGVuZXIpOwotCQkKLQkJLyoKLQkJLy9jYW4ndCB0aHJvdyBleGNlcHRpb25zCi0JCWlmICh0aW1lci50aW1lb3V0KQotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJDb3JlLlBMVUdJTl9JRCwgMCwgU2VydmVyUGx1Z2luLmdldFJlc291cmNlKCIlZXJyb3JTdGFydEZhaWxlZCIsIGdldE5hbWUoKSksIG51bGwpKTsKLQkJZWxzZQotCQkJdGltZXIuYWxyZWFkeURvbmUgPSB0cnVlOwotCQkKLQkJaWYgKGdldFNlcnZlclN0YXRlKCkgPT0gSVNlcnZlci5TVEFURV9TVE9QUEVEKQotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJDb3JlLlBMVUdJTl9JRCwgMCwgU2VydmVyUGx1Z2luLmdldFJlc291cmNlKCIlZXJyb3JTdGFydEZhaWxlZCIsIGdldE5hbWUoKSksIG51bGwpKTsqLwotCQlsaXN0ZW5lcjIuZG9uZShTdGF0dXMuT0tfU1RBVFVTKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVNlcnZlciNzeW5jaHJvbm91c1N0b3AoKQotCSAqLwotCXB1YmxpYyB2b2lkIHN5bmNocm9ub3VzU3RvcChib29sZWFuIGZvcmNlKSB7Ci0JCWlmIChnZXRTZXJ2ZXJTdGF0ZSgpID09IElTZXJ2ZXIuU1RBVEVfU1RPUFBFRCkKLQkJCXJldHVybjsKLQkJCi0JCWZpbmFsIE9iamVjdCBtdXRleCA9IG5ldyBPYmplY3QoKTsKLQkKLQkJLy8gYWRkIGxpc3RlbmVyIHRvIHRoZSBzZXJ2ZXIKLQkJSVNlcnZlckxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IElTZXJ2ZXJMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlcnZlckNoYW5nZWQoU2VydmVyRXZlbnQgZXZlbnQpIHsKLQkJCQlpbnQgZXZlbnRLaW5kID0gZXZlbnQuZ2V0S2luZCgpOwotCQkJCUlTZXJ2ZXIgc2VydmVyID0gZXZlbnQuZ2V0U2VydmVyKCk7Ci0JCQkJaWYgKGV2ZW50S2luZCA9PSAoU2VydmVyRXZlbnQuU0VSVkVSX0NIQU5HRSB8IFNlcnZlckV2ZW50LlNUQVRFX0NIQU5HRSkpIHsKLQkJCQkJaW50IHN0YXRlID0gc2VydmVyLmdldFNlcnZlclN0YXRlKCk7Ci0JCQkJCWlmIChTZXJ2ZXIudGhpcyA9PSBzZXJ2ZXIgJiYgc3RhdGUgPT0gSVNlcnZlci5TVEFURV9TVE9QUEVEKSB7Ci0JCQkJCQkvLyBub3RpZnkgd2FpdGVyCi0JCQkJCQlzeW5jaHJvbml6ZWQgKG11dGV4KSB7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJbXV0ZXgubm90aWZ5QWxsKCk7Ci0JCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3Igbm90aWZ5aW5nIHNlcnZlciBzdG9wIiwgZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9OwotCQlhZGRTZXJ2ZXJMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCQotCQljbGFzcyBUaW1lciB7Ci0JCQlib29sZWFuIHRpbWVvdXQ7Ci0JCQlib29sZWFuIGFscmVhZHlEb25lOwotCQl9Ci0JCWZpbmFsIFRpbWVyIHRpbWVyID0gbmV3IFRpbWVyKCk7Ci0JCQotCQlUaHJlYWQgdGhyZWFkID0gbmV3IFRocmVhZCgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl0cnkgewotCQkJCQlUaHJlYWQuc2xlZXAoMTIwMDAwKTsKLQkJCQkJaWYgKCF0aW1lci5hbHJlYWR5RG9uZSkgewotCQkJCQkJdGltZXIudGltZW91dCA9IHRydWU7Ci0JCQkJCQkvLyBub3RpZnkgd2FpdGVyCi0JCQkJCQlzeW5jaHJvbml6ZWQgKG11dGV4KSB7Ci0JCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAic3RvcCBub3RpZnkgdGltZW91dCIpOwotCQkJCQkJCW11dGV4Lm5vdGlmeUFsbCgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3Igbm90aWZ5aW5nIHNlcnZlciBzdG9wIHRpbWVvdXQiLCBlKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCXRocmVhZC5zZXREYWVtb24odHJ1ZSk7Ci0JCXRocmVhZC5zdGFydCgpOwotCQotCQkvLyBzdG9wIHRoZSBzZXJ2ZXIKLQkJc3RvcChmb3JjZSk7Ci0JCi0JCS8vIHdhaXQgZm9yIGl0ISB3YWl0IGZvciBpdCEKLQkJc3luY2hyb25pemVkIChtdXRleCkgewotCQkJdHJ5IHsKLQkJCQl3aGlsZSAoIXRpbWVyLnRpbWVvdXQgJiYgZ2V0U2VydmVyU3RhdGUoKSAhPSBJU2VydmVyLlNUQVRFX1NUT1BQRUQpCi0JCQkJCW11dGV4LndhaXQoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3Igd2FpdGluZyBmb3Igc2VydmVyIHN0b3AiLCBlKTsKLQkJCX0KLQkJfQotCQlyZW1vdmVTZXJ2ZXJMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCQotCQkvKgotCQkvL2Nhbid0IHRocm93IGV4Y2VwdGlvbnMKLQkJaWYgKHRpbWVyLnRpbWVvdXQpCi0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlckNvcmUuUExVR0lOX0lELCAwLCBTZXJ2ZXJQbHVnaW4uZ2V0UmVzb3VyY2UoIiVlcnJvclN0YXJ0RmFpbGVkIiwgZ2V0TmFtZSgpKSwgbnVsbCkpOwotCQllbHNlCi0JCQl0aW1lci5hbHJlYWR5RG9uZSA9IHRydWU7Ci0JCQotCQlpZiAoZ2V0U2VydmVyU3RhdGUoKSA9PSBJU2VydmVyLlNUQVRFX1NUT1BQRUQpCi0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlckNvcmUuUExVR0lOX0lELCAwLCBTZXJ2ZXJQbHVnaW4uZ2V0UmVzb3VyY2UoIiVlcnJvclN0YXJ0RmFpbGVkIiwgZ2V0TmFtZSgpKSwgbnVsbCkpOyovCi0JfQotCQotCS8qCi0JICogVHJpZ2dlciBhIHJlc3RhcnQgb2YgdGhlIGdpdmVuIG1vZHVsZSBhbmQgd2FpdCB1bnRpbCBpdCBoYXMgZmluaXNoZWQgcmVzdGFydGluZy4KLQkgKgotCSAqIEBwYXJhbSBtb2R1bGUgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGUKLQkgKiBAcGFyYW0gbW9uaXRvciBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcgotCSAqIEBleGNlcHRpb24gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb24gLSB0aHJvd24gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHRyeWluZyB0byByZXN0YXJ0IHRoZSBtb2R1bGUKLQkgKgotCXB1YmxpYyB2b2lkIHN5bmNocm9ub3VzUmVzdGFydE1vZHVsZShmaW5hbCBJTW9kdWxlW10gbW9kdWxlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAic3luY2hyb25vdXNNb2R1bGVSZXN0YXJ0IDEiKTsKLQotCQlmaW5hbCBPYmplY3QgbXV0ZXggPSBuZXcgT2JqZWN0KCk7Ci0JCi0JCS8vIGFkZCBsaXN0ZW5lciB0byB0aGUgbW9kdWxlCi0JCUlTZXJ2ZXJMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBJU2VydmVyTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZXJ2ZXJDaGFuZ2VkKFNlcnZlckV2ZW50IGV2ZW50KSB7Ci0JCQkJaW50IGV2ZW50S2luZCA9IGV2ZW50LmdldEtpbmQoKTsKLQkJCQlJU2VydmVyIHNlcnZlciA9IGV2ZW50LmdldFNlcnZlcigpOwotCQkJCWlmIChldmVudEtpbmQgPT0gKFNlcnZlckV2ZW50Lk1PRFVMRV9DSEFOR0UgfCBTZXJ2ZXJFdmVudC5TVEFURV9DSEFOR0UpKSB7Ci0JCQkJCWludCBzdGF0ZSA9IHNlcnZlci5nZXRNb2R1bGVTdGF0ZShtb2R1bGUpOwotCQkJCQlpZiAoc3RhdGUgPT0gSVNlcnZlci5TVEFURV9TVEFSVEVEIHx8IHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfU1RPUFBFRCkgewotCQkJCQkJLy8gbm90aWZ5IHdhaXRlcgotCQkJCQkJc3luY2hyb25pemVkIChtdXRleCkgewotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgInN5bmNocm9ub3VzTW9kdWxlUmVzdGFydCBub3RpZnkiKTsKLQkJCQkJCQkJbXV0ZXgubm90aWZ5QWxsKCk7Ci0JCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3Igbm90aWZ5aW5nIG1vZHVsZSByZXN0YXJ0IiwgZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9OwotCQlhZGRTZXJ2ZXJMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCQotCQkvLyBtYWtlIHN1cmUgaXQgdGltZXMgb3V0IGFmdGVyIDMwcwotCQljbGFzcyBUaW1lciB7Ci0JCQlib29sZWFuIHRpbWVvdXQ7Ci0JCQlib29sZWFuIGFscmVhZHlEb25lOwotCQl9Ci0JCWZpbmFsIFRpbWVyIHRpbWVyID0gbmV3IFRpbWVyKCk7Ci0JCQotCQlUaHJlYWQgdGhyZWFkID0gbmV3IFRocmVhZCgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl0cnkgewotCQkJCQlUaHJlYWQuc2xlZXAoMzAwMDApOwotCQkJCQlpZiAoIXRpbWVyLmFscmVhZHlEb25lKSB7Ci0JCQkJCQl0aW1lci50aW1lb3V0ID0gdHJ1ZTsKLQkJCQkJCS8vIG5vdGlmeSB3YWl0ZXIKLQkJCQkJCXN5bmNocm9uaXplZCAobXV0ZXgpIHsKLQkJCQkJCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJzeW5jaHJvbm91c01vZHVsZVJlc3RhcnQgbm90aWZ5IHRpbWVvdXQiKTsKLQkJCQkJCQltdXRleC5ub3RpZnlBbGwoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIG5vdGlmeWluZyBtb2R1bGUgcmVzdGFydCB0aW1lb3V0IiwgZSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCQl0aHJlYWQuc2V0RGFlbW9uKHRydWUpOwotCQl0aHJlYWQuc3RhcnQoKTsKLQkKLQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAic3luY2hyb25vdXNNb2R1bGVSZXN0YXJ0IDIiKTsKLQkKLQkJLy8gcmVzdGFydCB0aGUgbW9kdWxlCi0JCXRyeSB7Ci0JCQlnZXRCZWhhdmlvdXJEZWxlZ2F0ZShudWxsKS5yZXN0YXJ0TW9kdWxlKG1vZHVsZSwgbW9uaXRvcik7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJcmVtb3ZlU2VydmVyTGlzdGVuZXIobGlzdGVuZXIpOwotCQkJdGhyb3cgZTsKLQkJfQotCQotCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJzeW5jaHJvbm91c01vZHVsZVJlc3RhcnQgMyIpOwotCQotCQkvLyB3YWl0IGZvciBpdCEgd2FpdCBmb3IgaXQhIC4uLgotCQlzeW5jaHJvbml6ZWQgKG11dGV4KSB7Ci0JCQl0cnkgewotCQkJCXdoaWxlICghdGltZXIudGltZW91dCAmJiAhKGdldE1vZHVsZVN0YXRlKG1vZHVsZSkgPT0gSVNlcnZlci5TVEFURV9TVEFSVEVEIHx8IGdldE1vZHVsZVN0YXRlKG1vZHVsZSkgPT0gSVNlcnZlci5TVEFURV9TVE9QUEVEKSkKLQkJCQkJbXV0ZXgud2FpdCgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciB3YWl0aW5nIGZvciBzZXJ2ZXIgc3RhcnQiLCBlKTsKLQkJCX0KLQkJfQotCQlyZW1vdmVTZXJ2ZXJMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWlmICh0aW1lci50aW1lb3V0KQotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCBOTFMuYmluZChNZXNzYWdlcy5lcnJvck1vZHVsZVJlc3RhcnRGYWlsZWQsIGdldE5hbWUoKSksIG51bGwpKTsKLQkJdGltZXIuYWxyZWFkeURvbmUgPSB0cnVlOwotCQkKLQkJaWYgKGdldE1vZHVsZVN0YXRlKG1vZHVsZSkgPT0gSVNlcnZlci5TVEFURV9TVE9QUEVEKQotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCBOTFMuYmluZChNZXNzYWdlcy5lcnJvck1vZHVsZVJlc3RhcnRGYWlsZWQsIGdldE5hbWUoKSksIG51bGwpKTsKLQkKLQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAic3luY2hyb25vdXNNb2R1bGVSZXN0YXJ0IDQiKTsKLQl9Ki8KLQotCXB1YmxpYyBJUGF0aCBnZXRUZW1wRGlyZWN0b3J5KCkgewotCQlyZXR1cm4gU2VydmVyUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0VGVtcERpcmVjdG9yeShnZXRJZCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFhNTFJvb3QoKSB7Ci0JCXJldHVybiAic2VydmVyIjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBsb2FkU3RhdGUoSU1lbWVudG8gbWVtZW50bykgewotCQlyZXNvbHZlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVzb2x2ZSgpIHsKLQkJSVNlcnZlclR5cGUgb2xkU2VydmVyVHlwZSA9IHNlcnZlclR5cGU7Ci0JCVN0cmluZyBzZXJ2ZXJUeXBlSWQgPSBnZXRBdHRyaWJ1dGUoInNlcnZlci10eXBlLWlkIiwgKFN0cmluZyludWxsKTsKLQkJaWYgKHNlcnZlclR5cGVJZCAhPSBudWxsKQotCQkJc2VydmVyVHlwZSA9IFNlcnZlckNvcmUuZmluZFNlcnZlclR5cGUoc2VydmVyVHlwZUlkKTsKLQkJZWxzZQotCQkJc2VydmVyVHlwZSA9IG51bGw7Ci0JCWlmIChzZXJ2ZXJUeXBlICE9IG51bGwgJiYgIXNlcnZlclR5cGUuZXF1YWxzKG9sZFNlcnZlclR5cGUpKQotCQkJc2VydmVyU3RhdGUgPSAoKFNlcnZlclR5cGUpc2VydmVyVHlwZSkuZ2V0SW5pdGlhbFN0YXRlKCk7Ci0JCQotCQlTdHJpbmcgcnVudGltZUlkID0gZ2V0QXR0cmlidXRlKFJVTlRJTUVfSUQsIChTdHJpbmcpbnVsbCk7Ci0JCWlmIChydW50aW1lSWQgIT0gbnVsbCkKLQkJCXJ1bnRpbWUgPSBTZXJ2ZXJDb3JlLmZpbmRSdW50aW1lKHJ1bnRpbWVJZCk7Ci0JCQotCQlTdHJpbmcgY29uZmlnUGF0aCA9IGdldEF0dHJpYnV0ZShDT05GSUdVUkFUSU9OX0lELCAoU3RyaW5nKW51bGwpOwotCQljb25maWd1cmF0aW9uID0gbnVsbDsKLQkJaWYgKGNvbmZpZ1BhdGggIT0gbnVsbCkKLQkJCWNvbmZpZ3VyYXRpb24gPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZvbGRlcihuZXcgUGF0aChjb25maWdQYXRoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0SW50ZXJuYWwoU2VydmVyV29ya2luZ0NvcHkgd2MpIHsKLQkJbWFwID0gbmV3IEhhc2hNYXAod2MubWFwKTsKLQkJY29uZmlndXJhdGlvbiA9IHdjLmNvbmZpZ3VyYXRpb247Ci0JCXJ1bnRpbWUgPSB3Yy5ydW50aW1lOwotCQlzZXJ2ZXJTeW5jU3RhdGUgPSB3Yy5zZXJ2ZXJTeW5jU3RhdGU7Ci0JCS8vcmVzdGFydE5lZWRlZCA9IHdjLnJlc3RhcnROZWVkZWQ7Ci0JCXNlcnZlclR5cGUgPSB3Yy5zZXJ2ZXJUeXBlOwotCQltb2R1bGVzID0gd2MubW9kdWxlczsKLQotCQkvLyBjYW4gbmV2ZXIgbW9kaWZ5IHRoZSBmb2xsb3dpbmcgcHJvcGVydGllcyB2aWEgdGhlIHdvcmtpbmcgY29weQotCQkvL3NlcnZlclN0YXRlID0gd2Muc2VydmVyU3RhdGU7Ci0JCWRlbGVnYXRlID0gd2MuZGVsZWdhdGU7Ci0JCQotCQlhdXRvUHVibGlzaCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNhdmVTdGF0ZShJTWVtZW50byBtZW1lbnRvKSB7Ci0JCWlmIChzZXJ2ZXJUeXBlICE9IG51bGwpCi0JCQltZW1lbnRvLnB1dFN0cmluZygic2VydmVyLXR5cGUiLCBzZXJ2ZXJUeXBlLmdldElkKCkpOwotCi0JCWlmIChjb25maWd1cmF0aW9uICE9IG51bGwpCi0JCQltZW1lbnRvLnB1dFN0cmluZyhDT05GSUdVUkFUSU9OX0lELCBjb25maWd1cmF0aW9uLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSk7Ci0JCWVsc2UKLQkJCW1lbWVudG8ucHV0U3RyaW5nKENPTkZJR1VSQVRJT05fSUQsIG51bGwpOwotCQkKLQkJaWYgKHJ1bnRpbWUgIT0gbnVsbCkKLQkJCW1lbWVudG8ucHV0U3RyaW5nKFJVTlRJTUVfSUQsIHJ1bnRpbWUuZ2V0SWQoKSk7Ci0JCWVsc2UKLQkJCW1lbWVudG8ucHV0U3RyaW5nKFJVTlRJTUVfSUQsIG51bGwpOwotCX0KLQotCS8qcHVibGljIHZvaWQgdXBkYXRlQ29uZmlndXJhdGlvbigpIHsKLQkJdHJ5IHsKLQkJCWdldERlbGVnYXRlKG51bGwpLnVwZGF0ZUNvbmZpZ3VyYXRpb24oKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGNhbGxpbmcgZGVsZWdhdGUgdXBkYXRlQ29uZmlndXJhdGlvbigpICIgKyB0b1N0cmluZygpLCBlKTsKLQkJfQotCX0qLwotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyQ29uZmlndXJhdGlvbiNjYW5Nb2RpZnlNb2R1bGUob3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklNb2R1bGUpCi0JICovCi0JcHVibGljIElTdGF0dXMgY2FuTW9kaWZ5TW9kdWxlcyhJTW9kdWxlW10gYWRkLCBJTW9kdWxlW10gcmVtb3ZlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKChhZGQgPT0gbnVsbCB8fCBhZGQubGVuZ3RoID09IDApICYmIChyZW1vdmUgPT0gbnVsbCB8fCByZW1vdmUubGVuZ3RoID09IDApKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQWRkIGFuZCByZW1vdmUgY2Fubm90IGJvdGggYmUgbnVsbC9lbXB0eSIpOwotCQkKLQkJaWYgKGFkZCAhPSBudWxsICYmIGFkZC5sZW5ndGggPiAwKSB7Ci0JCQlpbnQgc2l6ZSA9IGFkZC5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCUlNb2R1bGVUeXBlIG1vZHVsZVR5cGUgPSBhZGRbaV0uZ2V0TW9kdWxlVHlwZSgpOyAKLQkJCQlpZiAoIVNlcnZlclV0aWwuaXNTdXBwb3J0ZWRNb2R1bGUoZ2V0U2VydmVyVHlwZSgpLmdldFJ1bnRpbWVUeXBlKCkuZ2V0TW9kdWxlVHlwZXMoKSwgbW9kdWxlVHlwZSkpCi0JCQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yQ2Fubm90QWRkTW9kdWxlLAotCQkJCQkJCW5ldyBPYmplY3RbXSB7IG1vZHVsZVR5cGUuZ2V0TmFtZSgpLCBtb2R1bGVUeXBlLmdldFZlcnNpb24oKSB9KSwgbnVsbCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXRyeSB7Ci0JCQlyZXR1cm4gZ2V0RGVsZWdhdGUobW9uaXRvcikuY2FuTW9kaWZ5TW9kdWxlcyhhZGQsIHJlbW92ZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBjYWxsaW5nIGRlbGVnYXRlIGNhbk1vZGlmeU1vZHVsZXMoKSAiICsgdG9TdHJpbmcoKSwgZSk7Ci0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCAiIiwgbnVsbCk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlciNnZXRNb2R1bGVzKCkKLQkgKi8KLQlwdWJsaWMgSU1vZHVsZVtdIGdldE1vZHVsZXMoKSB7Ci0JCWlmIChtb2R1bGVzID09IG51bGwpIHsKLQkJCS8vIGNvbnZlcnQgZnJvbSBhdHRyaWJ1dGUKLQkJCUxpc3QgbGlzdCA9IGdldEF0dHJpYnV0ZShNT0RVTEVfTElTVCwgKExpc3QpIG51bGwpOwotCQkJaWYgKGxpc3QgPT0gbnVsbCkKLQkJCQlsaXN0ID0gbmV3IEFycmF5TGlzdCgxKTsKLQkJCQotCQkJbW9kdWxlcyA9IG5ldyBBcnJheUxpc3QobGlzdC5zaXplKCkgKyAxKTsKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCVN0cmluZyBtb2R1bGVJZCA9IChTdHJpbmcpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlTdHJpbmcgbmFtZSA9ICI8dW5rbm93bj4iOwotCQkJCWludCBpbmRleCA9IG1vZHVsZUlkLmluZGV4T2YoIjo6Iik7Ci0JCQkJaWYgKGluZGV4ID4gMCkgewotCQkJCQluYW1lID0gbW9kdWxlSWQuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQkJCQkJbW9kdWxlSWQgPSBtb2R1bGVJZC5zdWJzdHJpbmcoaW5kZXgrMik7Ci0JCQkJfQotCQkJCQotCQkJCVN0cmluZyBtb2R1bGVUeXBlSWQgPSBudWxsOwotCQkJCVN0cmluZyBtb2R1bGVUeXBlVmVyc2lvbiA9IG51bGw7Ci0JCQkJaW5kZXggPSBtb2R1bGVJZC5pbmRleE9mKCI6OiIpOwotCQkJCWlmIChpbmRleCA+IDApIHsKLQkJCQkJaW50IGluZGV4MiA9IG1vZHVsZUlkLmluZGV4T2YoIjo6IiwgaW5kZXgrMSk7Ci0JCQkJCW1vZHVsZVR5cGVJZCA9IG1vZHVsZUlkLnN1YnN0cmluZyhpbmRleCsyLCBpbmRleDIpOwotCQkJCQltb2R1bGVUeXBlVmVyc2lvbiA9IG1vZHVsZUlkLnN1YnN0cmluZyhpbmRleDIrMik7Ci0JCQkJCW1vZHVsZUlkID0gbW9kdWxlSWQuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQkJCQl9Ci0JCQkJCi0JCQkJSU1vZHVsZSBtb2R1bGUgPSBTZXJ2ZXJVdGlsLmdldE1vZHVsZShtb2R1bGVJZCk7Ci0JCQkJaWYgKG1vZHVsZSA9PSBudWxsKSB7Ci0JCQkJCUlNb2R1bGVUeXBlIG1vZHVsZVR5cGUgPSBudWxsOwotCQkJCQlpZiAobW9kdWxlVHlwZUlkICE9IG51bGwpCi0JCQkJCQltb2R1bGVUeXBlID0gbmV3IE1vZHVsZVR5cGUobW9kdWxlVHlwZUlkLCBtb2R1bGVUeXBlVmVyc2lvbik7Ci0JCQkJCW1vZHVsZSA9IG5ldyBEZWxldGVkTW9kdWxlKG1vZHVsZUlkLCBuYW1lLCBtb2R1bGVUeXBlKTsKLQkJCQl9Ci0JCQkJaWYgKG1vZHVsZSAhPSBudWxsKQotCQkJCQltb2R1bGVzLmFkZChtb2R1bGUpOwotCQkJfQotCQl9Ci0JCQotCQlJTW9kdWxlW10gbW9kdWxlczIgPSBuZXcgSU1vZHVsZVttb2R1bGVzLnNpemUoKV07Ci0JCW1vZHVsZXMudG9BcnJheShtb2R1bGVzMik7Ci0JCXJldHVybiBtb2R1bGVzMjsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlciNnZXRNb2R1bGVTdGF0ZSgpCi0JICovCi0JcHVibGljIGludCBnZXRNb2R1bGVTdGF0ZShJTW9kdWxlW10gbW9kdWxlKSB7Ci0JCWlmIChtb2R1bGUgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk1vZHVsZSBjYW5ub3QgYmUgbnVsbCIpOwotCQl0cnkgewotCQkJSW50ZWdlciBpbiA9IChJbnRlZ2VyKSBtb2R1bGVTdGF0ZS5nZXQoZ2V0S2V5KG1vZHVsZSkpOwotCQkJaWYgKGluICE9IG51bGwpCi0JCQkJcmV0dXJuIGluLmludFZhbHVlKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQlyZXR1cm4gU1RBVEVfVU5LTk9XTjsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlciNnZXRNb2R1bGVTdGF0ZSgpCi0JICovCi0JcHVibGljIGludCBnZXRNb2R1bGVQdWJsaXNoU3RhdGUoSU1vZHVsZVtdIG1vZHVsZSkgewotCQlpZiAobW9kdWxlID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJNb2R1bGUgY2Fubm90IGJlIG51bGwiKTsKLQkJdHJ5IHsKLQkJCUludGVnZXIgaW4gPSAoSW50ZWdlcikgbW9kdWxlUHVibGlzaFN0YXRlLmdldChnZXRLZXkobW9kdWxlKSk7Ci0JCQlpZiAoaW4gIT0gbnVsbCkKLQkJCQlyZXR1cm4gaW4uaW50VmFsdWUoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCXJldHVybiBQVUJMSVNIX1NUQVRFX1VOS05PV047Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElTZXJ2ZXIjZ2V0Q2hpbGRNb2R1bGUoSU1vZHVsZVtdKQotCSAqLwotCXB1YmxpYyBJTW9kdWxlW10gZ2V0Q2hpbGRNb2R1bGVzKElNb2R1bGVbXSBtb2R1bGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAobW9kdWxlID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJNb2R1bGUgY2Fubm90IGJlIG51bGwiKTsKLQkJdHJ5IHsKLQkJCUlNb2R1bGVbXSBjaGlsZHJlbiA9IGdldERlbGVnYXRlKG1vbml0b3IpLmdldENoaWxkTW9kdWxlcyhtb2R1bGUpOwotCQkJaWYgKGNoaWxkcmVuICE9IG51bGwgJiYgY2hpbGRyZW4ubGVuZ3RoID09IDEgJiYgY2hpbGRyZW5bMF0uZXF1YWxzKG1vZHVsZVttb2R1bGUubGVuZ3RoIC0gMV0pKQotCQkJCXJldHVybiBudWxsOwotCQkJcmV0dXJuIGNoaWxkcmVuOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgY2FsbGluZyBkZWxlZ2F0ZSBnZXRDaGlsZE1vZHVsZXMoKSAiICsgdG9TdHJpbmcoKSwgZSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBJU2VydmVyI2dldFJvb3RNb2R1bGVzKElNb2R1bGUpCi0JICovCi0JcHVibGljIElNb2R1bGVbXSBnZXRSb290TW9kdWxlcyhJTW9kdWxlIG1vZHVsZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChtb2R1bGUgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk1vZHVsZSBjYW5ub3QgYmUgbnVsbCIpOwotCQl0cnkgewotCQkJcmV0dXJuIGdldERlbGVnYXRlKG1vbml0b3IpLmdldFJvb3RNb2R1bGVzKG1vZHVsZSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gc2UpIHsKLQkJCS8vVHJhY2UudHJhY2UoVHJhY2UuRklORVIsICJDb3JlRXhjZXB0aW9uIGNhbGxpbmcgZGVsZWdhdGUgZ2V0UGFyZW50TW9kdWxlcygpICIgKyB0b1N0cmluZygpICsgIjogIiArIHNlLmdldE1lc3NhZ2UoKSk7Ci0JCQl0aHJvdyBzZTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGNhbGxpbmcgZGVsZWdhdGUgZ2V0UGFyZW50TW9kdWxlcygpICIgKyB0b1N0cmluZygpLCBlKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gbW9kdWxlIGNhbiBiZSByZXN0YXJ0ZWQuCi0JICoKLQkgKiBAcGFyYW0gbW9kdWxlIHRoZSBtb2R1bGUKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIG1vZHVsZSBjYW4gYmUKLQkgKiAgICByZXN0YXJ0ZWQsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIElTdGF0dXMgY2FuQ29udHJvbE1vZHVsZShJTW9kdWxlW10gbW9kdWxlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKG1vZHVsZSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTW9kdWxlIGNhbm5vdCBiZSBudWxsIik7Ci0JCXRyeSB7Ci0JCQlib29sZWFuIGIgPSBnZXRCZWhhdmlvdXJEZWxlZ2F0ZShtb25pdG9yKS5jYW5Db250cm9sTW9kdWxlKG1vZHVsZSk7Ci0JCQlpZiAoYikKLQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGNhbGxpbmcgZGVsZWdhdGUgY2FuUmVzdGFydFJ1bnRpbWUoKSAiICsgdG9TdHJpbmcoKSwgZSk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTWVzc2FnZXMuZXJyb3JSZXN0YXJ0TW9kdWxlLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVjayBpZiB0aGUgZ2l2ZW4gbW9kdWxlIGlzIGluIHN5bmMgb24gdGhlIHNlcnZlci4gSXQgc2hvdWxkCi0JICogcmV0dXJuIHRydWUgaWYgdGhlIG1vZHVsZSBzaG91bGQgYmUgcmVzdGFydGVkIChpcyBvdXQgb2YKLQkgKiBzeW5jKSBvciBmYWxzZSBpZiB0aGUgbW9kdWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgcmVzdGFydGVkLgotCSAqCi0JICogQHBhcmFtIG1vZHVsZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSU1vZHVsZQotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldE1vZHVsZVJlc3RhcnRTdGF0ZShJTW9kdWxlW10gbW9kdWxlKSB7Ci0JCWlmIChtb2R1bGUgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk1vZHVsZSBjYW5ub3QgYmUgbnVsbCIpOwotCQl0cnkgewotCQkJQm9vbGVhbiBiID0gKEJvb2xlYW4pIG1vZHVsZVJlc3RhcnRTdGF0ZS5nZXQoZ2V0S2V5KG1vZHVsZSkpOwotCQkJaWYgKGIgIT0gbnVsbCkKLQkJCQlyZXR1cm4gYi5ib29sZWFuVmFsdWUoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVNlcnZlciNzdGFydE1vZHVsZShJTW9kdWxlW10sIElPcGVyYXRpb25MaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydE1vZHVsZShJTW9kdWxlW10gbW9kdWxlLCBJT3BlcmF0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKG1vZHVsZSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTW9kdWxlIGNhbm5vdCBiZSBudWxsIik7Ci0JCXRyeSB7Ci0JCQlnZXRCZWhhdmlvdXJEZWxlZ2F0ZShudWxsKS5zdGFydE1vZHVsZShtb2R1bGUsIG51bGwpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgY2FsbGluZyBkZWxlZ2F0ZSByZXN0YXJ0TW9kdWxlKCkgIiArIHRvU3RyaW5nKCksIGUpOwotCQl9Ci0JfQotCQotCS8qCi0JICogQHNlZSBJU2VydmVyI3N0b3BNb2R1bGUoSU1vZHVsZVtdLCBJT3BlcmF0aW9uTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcE1vZHVsZShJTW9kdWxlW10gbW9kdWxlLCBJT3BlcmF0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKG1vZHVsZSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTW9kdWxlIGNhbm5vdCBiZSBudWxsIik7Ci0JCXRyeSB7Ci0JCQlnZXRCZWhhdmlvdXJEZWxlZ2F0ZShudWxsKS5zdG9wTW9kdWxlKG1vZHVsZSwgbnVsbCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBjYWxsaW5nIGRlbGVnYXRlIHJlc3RhcnRNb2R1bGUoKSAiICsgdG9TdHJpbmcoKSwgZSk7Ci0JCX0KLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIElTZXJ2ZXIjcmVzdGFydE1vZHVsZShJTW9kdWxlW10sIElPcGVyYXRpb25MaXN0ZW5lciwgSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXN0YXJ0TW9kdWxlKElNb2R1bGVbXSBtb2R1bGUsIElPcGVyYXRpb25MaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAobW9kdWxlID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJNb2R1bGUgY2Fubm90IGJlIG51bGwiKTsKLQkJdHJ5IHsKLQkJCWdldEJlaGF2aW91ckRlbGVnYXRlKG51bGwpLnN0b3BNb2R1bGUobW9kdWxlLCBudWxsKTsKLQkJCWdldEJlaGF2aW91ckRlbGVnYXRlKG51bGwpLnN0YXJ0TW9kdWxlKG1vZHVsZSwgbnVsbCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBjYWxsaW5nIGRlbGVnYXRlIHJlc3RhcnRNb2R1bGUoKSAiICsgdG9TdHJpbmcoKSwgZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhbiBhcnJheSBvZiBJU2VydmVyUG9ydHMgdGhhdCB0aGlzIHNlcnZlciBoYXMuCi0JICoKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqIEByZXR1cm4gYSBwb3NzaWJseSBlbXB0eSBhcnJheSBvZiBzZXJ2ZXJzIHBvcnRzCi0JICovCi0JcHVibGljIFNlcnZlclBvcnRbXSBnZXRTZXJ2ZXJQb3J0cyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBnZXREZWxlZ2F0ZShtb25pdG9yKS5nZXRTZXJ2ZXJQb3J0cygpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgY2FsbGluZyBkZWxlZ2F0ZSBnZXRTZXJ2ZXJQb3J0cygpICIgKyB0b1N0cmluZygpLCBlKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFZpc2l0IGFsbCB0aGUgbW9kdWxlcyBpbiB0aGUgc2VydmVyIHdpdGggdGhlIGdpdmVuIG1vZHVsZSB2aXNpdG9yLgotCSAqIAotCSAqIEBwYXJhbSB2aXNpdG9yIHRoZSB2aXNpdG9yCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqLwotCXB1YmxpYyB2b2lkIHZpc2l0KElNb2R1bGVWaXNpdG9yIHZpc2l0b3IsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAodmlzaXRvciA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVmlzaXRvciBjYW5ub3QgYmUgbnVsbCIpOwotCQlJTW9kdWxlW10gbW9kdWxlczIgPSBnZXRNb2R1bGVzKCk7Ci0JCWlmIChtb2R1bGVzMiAhPSBudWxsKSB7IAotCQkJaW50IHNpemUgPSBtb2R1bGVzMi5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCWlmICghdmlzaXRNb2R1bGUobmV3IElNb2R1bGVbXSB7IG1vZHVsZXMyW2ldIH0sIHZpc2l0b3IsIG1vbml0b3IpKQotCQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgdG8ga2VlcCB2aXNpdGluZywgYW5kIGZhbHNlIHRvIHN0b3AuCi0JICogCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiB2aXNpdE1vZHVsZShJTW9kdWxlW10gbW9kdWxlLCBJTW9kdWxlVmlzaXRvciB2aXNpdG9yLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKG1vZHVsZSA9PSBudWxsKQotCQkJcmV0dXJuIHRydWU7Ci0JCQotCQlpZiAoIXZpc2l0b3IudmlzaXQobW9kdWxlKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCUlNb2R1bGVbXSBjaGlsZHJlbiA9IGdldENoaWxkTW9kdWxlcyhtb2R1bGUsIG1vbml0b3IpOwotCQlpZiAoY2hpbGRyZW4gIT0gbnVsbCkgewotCQkJaW50IHNpemUgPSBjaGlsZHJlbi5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCUlNb2R1bGVbXSBtb2R1bGUyID0gbmV3IElNb2R1bGVbbW9kdWxlLmxlbmd0aCArIDFdOwotCQkJCVN5c3RlbS5hcnJheWNvcHkobW9kdWxlLCAwLCBtb2R1bGUyLCAwLCBtb2R1bGUubGVuZ3RoKTsKLQkJCQltb2R1bGUyW21vZHVsZS5sZW5ndGhdID0gY2hpbGRyZW5baV07Ci0JCQkJCi0JCQkJaWYgKCF2aXNpdE1vZHVsZShtb2R1bGUyLCB2aXNpdG9yLCBtb25pdG9yKSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEtleShJTW9kdWxlW10gbW9kdWxlKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCi0JCWlmIChtb2R1bGUgIT0gbnVsbCkgewotCQkJaW50IHNpemUgPSBtb2R1bGUubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlpZiAoaSAhPSAwKQotCQkJCQlzYi5hcHBlbmQoIiMiKTsKLQkJCQlzYi5hcHBlbmQobW9kdWxlW2ldLmdldElkKCkpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNb2R1bGVTdGF0dXMoSU1vZHVsZVtdIG1vZHVsZSwgSVN0YXR1cyBzdGF0dXMpIHsKLQkJaWYgKG1vZHVsZSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTW9kdWxlIGNhbm5vdCBiZSBudWxsIik7Ci0JCW1vZHVsZVN0YXR1cy5wdXQoZ2V0S2V5KG1vZHVsZSksIHN0YXR1cyk7Ci0JCS8vZmlyZVNlcnZlck1vZHVsZVN0YXRlQ2hhbmdlRXZlbnQobW9kdWxlKTsKLQl9Ci0JCi0JcHVibGljIElTdGF0dXMgZ2V0TW9kdWxlU3RhdHVzKElNb2R1bGVbXSBtb2R1bGUpIHsKLQkJaWYgKG1vZHVsZSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTW9kdWxlIGNhbm5vdCBiZSBudWxsIik7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gKElTdGF0dXMpIG1vZHVsZVN0YXR1cy5nZXQoZ2V0S2V5KG1vZHVsZSkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJTdGF0dXMoSVN0YXR1cyBzdGF0dXMpIHsKLQkJc2VydmVyU3RhdHVzID0gc3RhdHVzOwotCQkvL2ZpcmVTZXJ2ZXJTdGF0ZUNoYW5nZUV2ZW50KCk7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgZ2V0U2VydmVyU3RhdHVzKCkgewotCQlyZXR1cm4gc2VydmVyU3RhdHVzOwotCX0KLQotCS8qKgotCSAqIFN3aXRjaCB0aGUgc2VydmVyJ3MgbG9jYXRpb24gYmV0d2VlbiB0aGUgd29ya3NwYWNlIGFuZCAubWV0YWRhdGEuCi0JICogCi0JICogQHBhcmFtIHNlcnZlciBhIHNlcnZlcgotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvcgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiBzb21ldGhpbmcgZ29lcyB3cm9uZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzd2l0Y2hMb2NhdGlvbihTZXJ2ZXIgc2VydmVyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSUZpbGUgZmlsZSA9IHNlcnZlci5nZXRGaWxlKCk7Ci0JCVNlcnZlcldvcmtpbmdDb3B5IHdjID0gKFNlcnZlcldvcmtpbmdDb3B5KSBzZXJ2ZXIuY3JlYXRlV29ya2luZ0NvcHkoKTsKLQkJc2VydmVyLmRlbGV0ZSgpOwotCQlpZiAoZmlsZSA9PSBudWxsKSB7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gU2VydmVyVHlwZS5nZXRTZXJ2ZXJQcm9qZWN0KCk7Ci0JCQlmaWxlID0gU2VydmVyVXRpbC5nZXRVbnVzZWRTZXJ2ZXJGaWxlKHByb2plY3QsIHdjKTsKLQkJCXdjLnNldEZpbGUoZmlsZSk7Ci0JCQlzZXJ2ZXIuZmlsZSA9IGZpbGU7Ci0JCX0gZWxzZSB7Ci0JCQl3Yy5zZXRGaWxlKG51bGwpOwotCQkJc2VydmVyLmZpbGUgPSBudWxsOwotCQl9Ci0JCXdjLnNhdmUodHJ1ZSwgbW9uaXRvcik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgc2VydmVyIChzZWUgU0VSVkVSX1hYWCBjb25zdGFudHMpIGFmdGVyCi0JICogcmVmcmVzaGluZyB0aGUgc3RhdGUgb2YgdGhlIHNlcnZlci4gVGhlIG9ubHkgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoaXMgbWV0aG9kCi0JICogYW5kIHRoZSBtZXRob2Qgd2l0aG91dCBhIHByb2dyZXNzIG1vbml0b3IgaXMgdGhhdCB0aGlzIG1ldGhvZCBtYXkgY2F1c2UKLQkgKiBwbHVnaW4gbG9hZGluZyBhbmQgbm90IHJldHVybiBpbW1lZGlhdGVseS4gSG93ZXZlciwgdGhlIHNlcnZlciB3aWxsIGFsd2F5cwotCSAqIGJlIHVwZGF0ZWQgYW5kIGluIHN5bmMsIHNvIHRoZSBJU2VydmVyLlNUQVRFX1VOS05PV04gc3RhdGUgc2hvdWxkIG5ldmVyIGJlCi0JICogcmV0dXJuZWQuCi0JICogCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiBAcmV0dXJuIHRoZSBzZXJ2ZXIgc3RhdGUKLQkgKi8KLQlwdWJsaWMgaW50IGdldFNlcnZlclN0YXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlsb2FkQWRhcHRlcihTZXJ2ZXJCZWhhdmlvdXJEZWxlZ2F0ZS5jbGFzcywgbW9uaXRvcik7Ci0JCXJldHVybiBnZXRTZXJ2ZXJTdGF0ZSgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9TZXJ2ZXJMaXN0ZW5lci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvU2VydmVyTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFlNDhkMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9TZXJ2ZXJMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudXRpbC5TZXJ2ZXJMaWZlY3ljbGVBZGFwdGVyOwotLyoqCi0gKiBMaXN0ZW5zIGZvciBtZXNzYWdlcyBmcm9tIHRoZSBzZXJ2ZXJzLiBUaGlzIGNsYXNzIGtlZXBzCi0gKiB0cmFjayBvZiBzZXJ2ZXIgaW5zdGFuY2VzIGN1cnJlbnQgc3RhdGUgYW5kIGFueSBjbGllbnRzCi0gKiB0aGF0IGFyZSB3YWl0aW5nIHRvIHJ1biBvbiB0aGUgc2VydmVyLiAKLSAqLwotcHVibGljIGNsYXNzIFNlcnZlckxpc3RlbmVyIGV4dGVuZHMgU2VydmVyTGlmZWN5Y2xlQWRhcHRlciBpbXBsZW1lbnRzIElTZXJ2ZXJMaXN0ZW5lciB7Ci0JLy8gc3RhdGljIGluc3RhbmNlCi0JcHJvdGVjdGVkIHN0YXRpYyBTZXJ2ZXJMaXN0ZW5lciBsaXN0ZW5lcjsKLQotCS8qKgotCSAqIFNlcnZlckxpc3RlbmVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHJpdmF0ZSBTZXJ2ZXJMaXN0ZW5lcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBzdGF0aWMgaW5zdGFuY2UuCi0JICoKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5wbHVnaW4uU2VydmVyTGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFNlcnZlckxpc3RlbmVyIGdldEluc3RhbmNlKCkgewotCQlpZiAobGlzdGVuZXIgPT0gbnVsbCkKLQkJCWxpc3RlbmVyID0gbmV3IFNlcnZlckxpc3RlbmVyKCk7Ci0JCXJldHVybiBsaXN0ZW5lcjsKLQl9Ci0JCi0JLyoqCi0JICogQ2FsbGVkIHdoZW4gdGhlIHNlcnZlciBjb25maWd1cmF0aW9uJ3Mgc3luYyBzdGF0ZSBjaGFuZ2VzLgotCSAqCi0JICogQHBhcmFtIHNlcnZlciBvcmcuZWNsaXBzZS53c3Quc2VydmVyLm1vZGVsLklTZXJ2ZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb25maWd1cmF0aW9uU3luY1N0YXRlQ2hhbmdlKElTZXJ2ZXIgc2VydmVyKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBBIG5ldyByZXNvdXJjZSBoYXMgYmVlbiBhZGRlZC4KLQkgKgotCSAqIEBwYXJhbSBzZXJ2ZXIgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXJ2ZXJBZGRlZChJU2VydmVyIHNlcnZlcikgewotCQlzZXJ2ZXIuYWRkU2VydmVyTGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogQSBleGlzdGluZyByZXNvdXJjZSBoYXMgYmVlbiByZW1vdmVkLgotCSAqCi0JICogQHBhcmFtIHNlcnZlciBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcgotCSAqLwotCXB1YmxpYyB2b2lkIHNlcnZlclJlbW92ZWQoSVNlcnZlciBzZXJ2ZXIpIHsKLQkJc2VydmVyLnJlbW92ZVNlcnZlckxpc3RlbmVyKHRoaXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNlcnZlckNoYW5nZWQoU2VydmVyRXZlbnQgZXZlbnQpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9TZXJ2ZXJNb25pdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9TZXJ2ZXJNb25pdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzYTAwOWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvU2VydmVyTW9uaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJQb3J0OwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFNlcnZlck1vbml0b3IgaW1wbGVtZW50cyBJU2VydmVyTW9uaXRvciB7Ci0JcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudDsKLQlwcml2YXRlIFNlcnZlck1vbml0b3JEZWxlZ2F0ZSBkZWxlZ2F0ZTsKLQotCS8qKgotCSAqIE1vbml0b3IgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCBhIGNvbmZpZ3VyYXRpb24gZWxlbWVudAotCSAqLwotCXB1YmxpYyBTZXJ2ZXJNb25pdG9yKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaWQgb2YgdGhpcyBkZWZhdWx0IHNlcnZlci4KLQkgKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZSgiaWQiKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSU1vbml0b3IjZ2V0RGVzY3JpcHRpb24oKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZSgiZGVzY3JpcHRpb24iKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSU1vbml0b3IjZ2V0TGFiZWwoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJU3RyaW5nIGxhYmVsID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoIm5hbWUiKTsKLQkJaWYgKGxhYmVsID09IG51bGwpCi0JCQlyZXR1cm4gIm4vYSI7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSU1vbml0b3IjZ2V0RGVsZWdhdGUoKQotCSAqLwotCXB1YmxpYyBTZXJ2ZXJNb25pdG9yRGVsZWdhdGUgZ2V0RGVsZWdhdGUoKSB7Ci0JCWlmIChkZWxlZ2F0ZSA9PSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWRlbGVnYXRlID0gKFNlcnZlck1vbml0b3JEZWxlZ2F0ZSkgZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJjbGFzcyIpOwotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3QgY3JlYXRlIGRlbGVnYXRlIiArIHRvU3RyaW5nKCkgKyAiOiAiICsgdC5nZXRNZXNzYWdlKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBkZWxlZ2F0ZTsKLQl9Ci0KLQkvKioKLQkgKiBTdGFydCBtb25pdG9yaW5nIHRoZSBnaXZlbiBwb3J0LCBhbmQgcmV0dXJuIHRoZSBwb3J0IG51bWJlciB0bwotCSAqIHR1bm5lbCByZXF1ZXN0cyB0aHJvdWdoLgotCSAqIAotCSAqIEBwYXJhbSBzZXJ2ZXIgYSBzZXJ2ZXIKLQkgKiBAcGFyYW0gcG9ydCBhIHBvcnQKLQkgKiBAcGFyYW0gbW9uaXRvclBvcnQgdGhlIHBvcnQgdXNlZCBmb3IgbW9uaXRvcmluZwotCSAqIEByZXR1cm4gdGhlIHBvcnQgdXNlZCBmb3IgbW9uaXRvcmluZwotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiBhbnl0aGluZyBnb2VzIHdyb25nCi0JICovCi0JcHVibGljIGludCBzdGFydE1vbml0b3JpbmcoSVNlcnZlciBzZXJ2ZXIsIFNlcnZlclBvcnQgcG9ydCwgaW50IG1vbml0b3JQb3J0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZ2V0RGVsZWdhdGUoKS5zdGFydE1vbml0b3Jpbmcoc2VydmVyLCBwb3J0LCBtb25pdG9yUG9ydCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCXRocm93IGNlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgY2FsbGluZyBkZWxlZ2F0ZSAiICsgdG9TdHJpbmcoKSArICI6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdG9wIG1vbml0b3JpbmcgdGhlIGdpdmVuIHBvcnQuCi0JICogCi0JICogQHBhcmFtIHNlcnZlciBhIHNlcnZlcgotCSAqIEBwYXJhbSBwb3J0IGEgcG9ydAotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3BNb25pdG9yaW5nKElTZXJ2ZXIgc2VydmVyLCBTZXJ2ZXJQb3J0IHBvcnQpIHsKLQkJdHJ5IHsKLQkJCWdldERlbGVnYXRlKCkuc3RvcE1vbml0b3Jpbmcoc2VydmVyLCBwb3J0KTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGNhbGxpbmcgZGVsZWdhdGUgIiArIHRvU3RyaW5nKCkgKyAiOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiTW9uaXRvclsiICsgZ2V0SWQoKSArICJdIjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvU2VydmVyTW9uaXRvckRlbGVnYXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9TZXJ2ZXJNb25pdG9yRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNjM2Q2Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9TZXJ2ZXJNb25pdG9yRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyUG9ydDsKLS8qKgotICogQW4gaW50ZXJmYWNlIHRvIGEgVENQL0lQIG1vbml0b3IuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTZXJ2ZXJNb25pdG9yRGVsZWdhdGUgewotCS8qKgotCSAqIFN0YXJ0IG1vbml0b3JpbmcgdGhlIGdpdmVuIHBvcnQsIGFuZCByZXR1cm4gdGhlIHBvcnQgbnVtYmVyIHRvCi0JICogdHVubmVsIHJlcXVlc3RzIHRocm91Z2guIFRoZSBtb25pdG9yUG9ydCBpcyB0aGUgbmV3IHBvcnQgdG8gdXNlLCBvcgotCSAqIC0xIHRvIHBpY2sgYSByYW5kb20gcG9ydC4KLQkgKiAKLQkgKiBAcGFyYW0gc2VydmVyIGEgc2VydmVyCi0JICogQHBhcmFtIHBvcnQgYSBwb3J0Ci0JICogQHBhcmFtIG1vbml0b3JQb3J0IHRoZSBwb3J0IHVzZWQgZm9yIG1vbml0b3JpbmcKLQkgKiBAcmV0dXJuIHRoZSBwb3J0IHVzZWQgZm9yIG1vbml0b3JpbmcKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gaWYgYW55dGhpbmcgZ29lcyB3cm9uZwotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBpbnQgc3RhcnRNb25pdG9yaW5nKElTZXJ2ZXIgc2VydmVyLCBTZXJ2ZXJQb3J0IHBvcnQsIGludCBtb25pdG9yUG9ydCkgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBTdG9wIG1vbml0b3JpbmcgdGhlIGdpdmVuIHBvcnQuCi0JICogCi0JICogQHBhcmFtIHNlcnZlciBhIHNlcnZlcgotCSAqIEBwYXJhbSBwb3J0IGEgcG9ydAotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHN0b3BNb25pdG9yaW5nKElTZXJ2ZXIgc2VydmVyLCBTZXJ2ZXJQb3J0IHBvcnQpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1NlcnZlck1vbml0b3JNYW5hZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9TZXJ2ZXJNb25pdG9yTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTZiNzhlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1NlcnZlck1vbml0b3JNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLio7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgU2VydmVyTW9uaXRvck1hbmFnZXIgaW1wbGVtZW50cyBJU2VydmVyTW9uaXRvck1hbmFnZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNT05JVE9SX0RBVEFfRklMRSA9ICJtb25pdG9ycy54bWwiOwotCQotCXByb3RlY3RlZCBzdGF0aWMgU2VydmVyTW9uaXRvck1hbmFnZXIgaW5zdGFuY2U7Ci0KLQlwcm90ZWN0ZWQgTGlzdCBwb3J0cyA9IG5ldyBBcnJheUxpc3QoKTsgCi0JcHJvdGVjdGVkIFNlcnZlck1vbml0b3IgbW9uaXRvcjsKLQkKLQljbGFzcyBNb25pdG9yZWRQb3J0IGltcGxlbWVudHMgSU1vbml0b3JlZFNlcnZlclBvcnQgewotCQlwcm90ZWN0ZWQgSVNlcnZlciBzZXJ2ZXI7Ci0JCXByb3RlY3RlZCBTZXJ2ZXJQb3J0IHBvcnQ7Ci0JCXByb3RlY3RlZCBpbnQgbmV3UG9ydCA9IC0xOwotCQlwcm90ZWN0ZWQgU3RyaW5nW10gY29udGVudDsKLQkJcHVibGljIGJvb2xlYW4gc3RhcnRlZDsKLQkJCi0JCXB1YmxpYyBNb25pdG9yZWRQb3J0KElTZXJ2ZXIgc2VydmVyLCBTZXJ2ZXJQb3J0IHBvcnQsIGludCBuZXdQb3J0LCBTdHJpbmdbXSBjb250ZW50KSB7Ci0JCQl0aGlzLnNlcnZlciA9IHNlcnZlcjsKLQkJCXRoaXMucG9ydCA9IHBvcnQ7Ci0JCQl0aGlzLm5ld1BvcnQgPSBuZXdQb3J0OwotCQkJdGhpcy5jb250ZW50ID0gY29udGVudDsKLQkJfQotCQkKLQkJcHVibGljIE1vbml0b3JlZFBvcnQoSU1lbWVudG8gbWVtZW50bywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQlsb2FkKG1lbWVudG8sIG1vbml0b3IpOwotCQl9Ci0JCQotCQlwdWJsaWMgSVNlcnZlciBnZXRTZXJ2ZXIoKSB7Ci0JCQlyZXR1cm4gc2VydmVyOwotCQl9Ci0JCQotCQlwdWJsaWMgU2VydmVyUG9ydCBnZXRTZXJ2ZXJQb3J0KCkgewotCQkJcmV0dXJuIHBvcnQ7Ci0JCX0KLQkJCi0JCXB1YmxpYyBpbnQgZ2V0TW9uaXRvclBvcnQoKSB7Ci0JCQlyZXR1cm4gbmV3UG9ydDsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgc2V0TW9uaXRvclBvcnQoaW50IHApIHsKLQkJCW5ld1BvcnQgPSBwOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nW10gZ2V0Q29udGVudFR5cGVzKCkgewotCQkJaWYgKGNvbnRlbnQgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbmV3IFN0cmluZ1swXTsKLQkJCXJldHVybiBjb250ZW50OwotCQl9Ci0JCQotCQlwdWJsaWMgYm9vbGVhbiBpc1N0YXJ0ZWQoKSB7Ci0JCQlyZXR1cm4gc3RhcnRlZDsKLQkJfQotCQkKLQkJcHJvdGVjdGVkIHZvaWQgc2V0U3RhcnRlZChib29sZWFuIHMpIHsKLQkJCXN0YXJ0ZWQgPSBzOwotCQl9Ci0JCQotCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQkJaWYgKCEob2JqIGluc3RhbmNlb2YgTW9uaXRvcmVkUG9ydCkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJTW9uaXRvcmVkUG9ydCBtcCA9IChNb25pdG9yZWRQb3J0KSBvYmo7Ci0JCQlpZiAoIW1wLnNlcnZlci5lcXVhbHMoc2VydmVyKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAoIW1wLnBvcnQuZXF1YWxzKHBvcnQpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmIChuZXdQb3J0ICE9IG1wLm5ld1BvcnQpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKGNvbnRlbnQgPT0gbnVsbCAmJiBtcC5jb250ZW50ICE9IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKGNvbnRlbnQgIT0gbnVsbCAmJiBtcC5jb250ZW50ID09IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKGNvbnRlbnQgIT0gbnVsbCkgewotCQkJCWludCBzaXplID0gY29udGVudC5sZW5ndGg7Ci0JCQkJaWYgKHNpemUgIT0gbXAuY29udGVudC5sZW5ndGgpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLQkJCQkJaWYgKCFjb250ZW50W2ldLmVxdWFscyhtcC5jb250ZW50W2ldKSkKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5TYXZlKCkgewotCQkJcmV0dXJuIChwb3J0LmdldElkKCkgIT0gbnVsbCk7Ci0JCX0KLQkJCi0JCXByb3RlY3RlZCB2b2lkIHNhdmUoSU1lbWVudG8gbWVtZW50bykgewotCQkJbWVtZW50by5wdXRTdHJpbmcoInNlcnZlcklkIiwgc2VydmVyLmdldElkKCkpOwotCQkJaWYgKG5ld1BvcnQgIT0gLTEpCi0JCQkJbWVtZW50by5wdXRTdHJpbmcoInBvcnQiLCBuZXdQb3J0ICsgIiIpOwotCQkJbWVtZW50by5wdXRTdHJpbmcoInBvcnRJZCIsIHBvcnQuZ2V0SWQoKSk7Ci0JCQltZW1lbnRvLnB1dEJvb2xlYW4oInN0YXJ0ZWQiLCBzdGFydGVkKTsKLQkJCQotCQkJaWYgKGNvbnRlbnQgIT0gbnVsbCkgewotCQkJCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQlpbnQgc2l6ZSA9IGNvbnRlbnQubGVuZ3RoOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJCWlmIChpID4gMCkKLQkJCQkJCXNiLmFwcGVuZCgiLCIpOwotCQkJCQlzYi5hcHBlbmQoY29udGVudFtpXSk7Ci0JCQkJfQotCQkJCW1lbWVudG8ucHV0U3RyaW5nKCJjb250ZW50VHlwZXMiLCBzYi50b1N0cmluZygpKTsKLQkJCX0KLQkJfQotCQkKLQkJcHJvdGVjdGVkIHZvaWQgbG9hZChJTWVtZW50byBtZW1lbnRvLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IyKSB7Ci0JCQlTdHJpbmcgc2VydmVySWQgPSBtZW1lbnRvLmdldFN0cmluZygic2VydmVySWQiKTsKLQkJCXNlcnZlciA9IG51bGw7Ci0JCQlpZiAoc2VydmVySWQgIT0gbnVsbCkKLQkJCQlzZXJ2ZXIgPSBTZXJ2ZXJDb3JlLmZpbmRTZXJ2ZXIoc2VydmVySWQpOwotCQkJaWYgKHNlcnZlciA9PSBudWxsKQotCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJTZXJ2ZXIgY291bGQgbm90IGJlIGZvdW5kOiAiICsgc2VydmVySWQgKyAiICIgKyBzZXJ2ZXIpOwotCQkJU3RyaW5nIG5ld1BvcnRTdHIgPSBtZW1lbnRvLmdldFN0cmluZygicG9ydCIpOwotCQkJaWYgKG5ld1BvcnRTdHIgIT0gbnVsbCAmJiBuZXdQb3J0U3RyLmxlbmd0aCgpID4gMCkKLQkJCQluZXdQb3J0ID0gSW50ZWdlci5wYXJzZUludChuZXdQb3J0U3RyKTsKLQkJCVN0cmluZyBwb3J0SWQgPSBtZW1lbnRvLmdldFN0cmluZygicG9ydElkIik7Ci0JCQkKLQkJCVNlcnZlclBvcnRbXSBwb3J0czIgPSBzZXJ2ZXIuZ2V0U2VydmVyUG9ydHMobW9uaXRvcjIpOwotCQkJaWYgKHBvcnRzMiAhPSBudWxsKSB7Ci0JCQkJaW50IHNpemUgPSBwb3J0czIubGVuZ3RoOwotCQkJCWZvciAoaW50IGkgPSAwOyBwb3J0ID09IG51bGwgJiYgaSA8IHNpemU7IGkrKykgewotCQkJCQlTZXJ2ZXJQb3J0IHNwID0gcG9ydHMyW2ldOwotCQkJCQlpZiAoc3AuZ2V0SWQoKSAhPSBudWxsICYmIHNwLmdldElkKCkuZXF1YWxzKHBvcnRJZCkpCi0JCQkJCQlwb3J0ID0gc3A7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHBvcnQgPT0gbnVsbCkKLQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQ291bGQgbm90IHJlbG9jYXRlIHBvcnQ6ICIgKyBzZXJ2ZXJJZCArICIgIiArIHNlcnZlciArICIgIiArIHBvcnRJZCk7Ci0JCQkKLQkJCVN0cmluZyBzID0gbWVtZW50by5nZXRTdHJpbmcoImNvbnRlbnRUeXBlcyIpOwotCQkJaWYgKHMgIT0gbnVsbCkKLQkJCQljb250ZW50ID0gU2VydmVyUGx1Z2luLnRva2VuaXplKHMsICIsIik7Ci0JCQkKLQkJCUJvb2xlYW4gYiA9IG1lbWVudG8uZ2V0Qm9vbGVhbigic3RhcnRlZCIpOwotCQkJaWYgKGIgIT0gbnVsbCAmJiBiLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJbmV3UG9ydCA9IG1vbml0b3Iuc3RhcnRNb25pdG9yaW5nKHNlcnZlciwgcG9ydCwgbmV3UG9ydCk7Ci0JCQkJCXN0YXJ0ZWQgPSB0cnVlOwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiQ291bGQgbm90IHJlc3RhcnQgc2VydmVyIG1vbml0b3IiLCBlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU2VydmVyTW9uaXRvck1hbmFnZXIoKSB7Ci0JCUlTZXJ2ZXJNb25pdG9yW10gbW9uaXRvcnMgPSBTZXJ2ZXJQbHVnaW4uZ2V0U2VydmVyTW9uaXRvcnMoKTsKLQkJaWYgKG1vbml0b3JzICE9IG51bGwgJiYgbW9uaXRvcnMubGVuZ3RoID4gMCkKLQkJCW1vbml0b3IgPSAoU2VydmVyTW9uaXRvcikgbW9uaXRvcnNbMF07Ci0JCQotCQlpbnN0YW5jZSA9IHRoaXM7Ci0JCWxvYWRNb25pdG9ycygpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFNlcnZlck1vbml0b3JNYW5hZ2VyIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLQkJCW5ldyBTZXJ2ZXJNb25pdG9yTWFuYWdlcigpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzaHV0ZG93bigpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWluc3RhbmNlLnNhdmVNb25pdG9ycygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1vbml0b3IgdGhhdCBpcyBjdXJyZW50bHkgYmVpbmcgdXNlZC4KLQkgKiAgCi0JICogQHJldHVybiB0aGUgY3VycmVudCBzZXJ2ZXIgbW9uaXRvcgotCSAqLwotCXB1YmxpYyBJU2VydmVyTW9uaXRvciBnZXRDdXJyZW50U2VydmVyTW9uaXRvcigpIHsKLQkJcmV0dXJuIG1vbml0b3I7Ci0JfQotCi0JLyoqCi0JICogU3dpdGNoIHRvIHVzZSBhIGRpZmZlcmVudCBzZXJ2ZXIgbW9uaXRvci4gQWxsIGV4aXN0aW5nIG1vbml0b3JzIHdpbGwgYmUKLQkgKiByZW1vdmVkIGZyb20gdGhlIGN1cnJlbnQgbW9uaXRvciBhbmQgYWRkZWQgdG8gdGhlIG5ldyBtb25pdG9yLgotCSAqIAotCSAqIEBwYXJhbSBuZXdNb25pdG9yCi0JICogQHRocm93cyBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlcnZlck1vbml0b3IoSVNlcnZlck1vbml0b3IgbmV3TW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsICJOb3QgaW1wbGVtZW50ZWQgeWV0IiwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxpc3Qgb2YgcG9ydHMgdGhhdCBhcmUgY3VycmVudGx5IGJlaW5nIG1vbml0b3JlZC4KLQkgKgotCSAqIEBwYXJhbSBzZXJ2ZXIgYSBzZXJ2ZXIKLQkgKiBAcmV0dXJuIGEgcG9zc2libHkgZW1wdHkgYXJyYXkgb2YgbW9uaXRvcmVkIHNlcnZlciBwb3J0cwotCSAqLwotCXB1YmxpYyBJTW9uaXRvcmVkU2VydmVyUG9ydFtdIGdldE1vbml0b3JlZFBvcnRzKElTZXJ2ZXIgc2VydmVyKSB7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBwb3J0cy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlNb25pdG9yZWRQb3J0IG1wID0gKE1vbml0b3JlZFBvcnQpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChtcC5zZXJ2ZXIuZXF1YWxzKHNlcnZlcikpCi0JCQkJbGlzdC5hZGQobXApOwotCQl9Ci0JCQotCQlJTW9uaXRvcmVkU2VydmVyUG9ydFtdIG1zcCA9IG5ldyBJTW9uaXRvcmVkU2VydmVyUG9ydFtsaXN0LnNpemUoKV07Ci0JCWxpc3QudG9BcnJheShtc3ApOwotCQlyZXR1cm4gbXNwOwotCX0KLQotCS8qKgotCSAqIFN0YXJ0cyBtb25pdG9yaW5nIHRoZSBnaXZlbiBwb3J0LCBhbmQgcmV0dXJucyB0aGUgbmV3IHBvcnQgIyB0byB1c2UgdGhhdCB3aWxsCi0JICogcm91dGUgdG8gdGhlIG1vbml0b3JlZCBwb3J0LgotCSAqIAotCSAqIEBwYXJhbSBzZXJ2ZXIgYSBzZXJ2ZXIKLQkgKiBAcGFyYW0gcG9ydCBhIHBvcnQKLQkgKiBAcGFyYW0gbW9uaXRvclBvcnQgdGhlIHBvcnQgdXNlZCBmb3IgbW9uaXRvcmluZwotCSAqIEBwYXJhbSBjb250ZW50IHRoZSBjb250ZW50Ci0JICogQHJldHVybiBhIG1vbml0b3JlZCBzZXJ2ZXIgcG9ydAotCSAqLwotCXB1YmxpYyBJTW9uaXRvcmVkU2VydmVyUG9ydCBjcmVhdGVNb25pdG9yKElTZXJ2ZXIgc2VydmVyLCBTZXJ2ZXJQb3J0IHBvcnQsIGludCBtb25pdG9yUG9ydCwgU3RyaW5nW10gY29udGVudCkgewotCQlpZiAocG9ydCA9PSBudWxsIHx8IG1vbml0b3IgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkKLQkJTW9uaXRvcmVkUG9ydCBtcCA9IG5ldyBNb25pdG9yZWRQb3J0KHNlcnZlciwgcG9ydCwgbW9uaXRvclBvcnQsIGNvbnRlbnQpOwotCQlwb3J0cy5hZGQobXApOwotCQlyZXR1cm4gbXA7Ci0JfQotCi0JLyoqCi0JICogU3RvcCBtb25pdG9yaW5nIHRoZSBnaXZlbiBwb3J0LiBUaHJvd3MgYSBDb3JlRXhjZXB0aW9uIGlmIHRoZXJlIHdhcyBhIHByb2JsZW0KLQkgKiBzdG9wcGluZyB0aGUgbW9uaXRvcmluZwotCSAqCi0JICogQHBhcmFtIHBvcnQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVNb25pdG9yKElNb25pdG9yZWRTZXJ2ZXJQb3J0IHBvcnQpIHsKLQkJaWYgKHBvcnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQl0cnkgewotCQkJcG9ydHMucmVtb3ZlKHBvcnQpOwotCQkJaWYgKHBvcnQuaXNTdGFydGVkKCkpCi0JCQkJbW9uaXRvci5zdG9wTW9uaXRvcmluZyhwb3J0LmdldFNlcnZlcigpLCBwb3J0LmdldFNlcnZlclBvcnQoKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3QgcmVtb3ZlIG1vbml0b3IiLCBlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFN0YXJ0IHRoZSBtb25pdG9yLiBJZiB0aGUgbXNwIHBvcnQgaXMgLTEsIGl0IHdpbGwgYmUgdXBkYXRlZCB0byB0aGUgcG9ydCB0aGF0IGlzIGFjdHVhbGx5IGluIHVzZS4KLQkgKiAKLQkgKiBAcGFyYW0gbXNwCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnRNb25pdG9yKElNb25pdG9yZWRTZXJ2ZXJQb3J0IG1zcCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAobXNwID09IG51bGwgfHwgbXNwLmlzU3RhcnRlZCgpKQotCQkJcmV0dXJuOwotCQkKLQkJTW9uaXRvcmVkUG9ydCBwb3J0ID0gKE1vbml0b3JlZFBvcnQpIG1zcDsKLQkJcG9ydC5zZXRNb25pdG9yUG9ydChtb25pdG9yLnN0YXJ0TW9uaXRvcmluZyhtc3AuZ2V0U2VydmVyKCksIG1zcC5nZXRTZXJ2ZXJQb3J0KCksIG1zcC5nZXRNb25pdG9yUG9ydCgpKSk7Ci0JCXBvcnQuc2V0U3RhcnRlZCh0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBTdG9wIG1vbml0b3JpbmcuCi0JICogCi0JICogQHBhcmFtIG1zcAotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3BNb25pdG9yKElNb25pdG9yZWRTZXJ2ZXJQb3J0IG1zcCkgewotCQlpZiAobXNwID09IG51bGwgfHwgIW1zcC5pc1N0YXJ0ZWQoKSkKLQkJCXJldHVybjsKLQkJTW9uaXRvcmVkUG9ydCBwb3J0ID0gKE1vbml0b3JlZFBvcnQpIG1zcDsKLQkJbW9uaXRvci5zdG9wTW9uaXRvcmluZyhtc3AuZ2V0U2VydmVyKCksIG1zcC5nZXRTZXJ2ZXJQb3J0KCkpOwotCQlwb3J0LnNldFN0YXJ0ZWQoZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1hcHBlZCBwb3J0IHRvIHVzZSB3aGVuIG1ha2luZyByZXF1ZXN0cyB0byB0aGUgZ2l2ZW4gc2VydmVyCi0JICogYW5kIHBvcnQgbnVtYmVyLiBSZXR1cm5zIHRoZSBleGlzdGluZyBwb3J0IG51bWJlciBpZiB0aGUgcG9ydCBpcyBub3QgYmVpbmcKLQkgKiBtb25pdG9yZWQuCi0JICogCi0JICogQHBhcmFtIHNlcnZlciBhIHNlcnZlcgotCSAqIEBwYXJhbSBwb3J0IGEgcG9ydCBudW1iZXIKLQkgKiBAcGFyYW0gY29udGVudCB0aGUgY29udGVudAotCSAqIEByZXR1cm4gdGhlIHBvcnQgdXNlZCBmb3IgbW9uaXRvcmluZwotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TW9uaXRvcmVkUG9ydChJU2VydmVyIHNlcnZlciwgaW50IHBvcnQsIFN0cmluZyBjb250ZW50KSB7Ci0JCXRyeSB7Ci0JCQlJdGVyYXRvciBpdGVyYXRvciA9IHBvcnRzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJTW9uaXRvcmVkUG9ydCBtcCA9IChNb25pdG9yZWRQb3J0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYgKG1wLmlzU3RhcnRlZCgpICYmIG1wLnNlcnZlci5lcXVhbHMoc2VydmVyKSAmJiBtcC5wb3J0LmdldFBvcnQoKSA9PSBwb3J0KSB7Ci0JCQkJCVN0cmluZ1tdIGNvbnRlbnRUeXBlcyA9IG1wLmdldENvbnRlbnRUeXBlcygpOwotCQkJCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQkJCWlmIChjb250ZW50ICE9IG51bGwgJiYgY29udGVudFR5cGVzICE9IG51bGwgJiYgY29udGVudFR5cGVzLmxlbmd0aCA+IDApIHsKLQkJCQkJCWludCBzaXplID0gY29udGVudFR5cGVzLmxlbmd0aDsKLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotCQkJCQkJCWlmIChjb250ZW50LmVxdWFscyhjb250ZW50VHlwZXNbaV0pKQotCQkJCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJCX0gZWxzZQotCQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCQlpZiAoZm91bmQgJiYgbXAubmV3UG9ydCAhPSAtMSkKLQkJCQkJCXJldHVybiBtcC5uZXdQb3J0OwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCXJldHVybiBwb3J0OwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzYXZlTW9uaXRvcnMoKSB7Ci0JCVN0cmluZyBmaWxlbmFtZSA9IFNlcnZlclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFN0YXRlTG9jYXRpb24oKS5hcHBlbmQoTU9OSVRPUl9EQVRBX0ZJTEUpLnRvT1NTdHJpbmcoKTsKLQkJdHJ5IHsKLQkJCVhNTE1lbWVudG8gbWVtZW50byA9IFhNTE1lbWVudG8uY3JlYXRlV3JpdGVSb290KCJtb25pdG9ycyIpOwotCi0JCQlJdGVyYXRvciBpdGVyYXRvciA9IHBvcnRzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJTW9uaXRvcmVkUG9ydCBtcCA9IChNb25pdG9yZWRQb3J0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYgKG1wLmNhblNhdmUoKSkgewotCQkJCQlJTWVtZW50byBjaGlsZCA9IG1lbWVudG8uY3JlYXRlQ2hpbGQoIm1vbml0b3IiKTsKLQkJCQkJbXAuc2F2ZShjaGlsZCk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQltZW1lbnRvLnNhdmVUb0ZpbGUoZmlsZW5hbWUpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3Igc2F2aW5nIG1vbml0b3IgaW5mbyIsIGUpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGxvYWRNb25pdG9ycygpIHsKLQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiTG9hZGluZyBtb25pdG9yIGluZm8iKTsKLQkJU3RyaW5nIGZpbGVuYW1lID0gU2VydmVyUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U3RhdGVMb2NhdGlvbigpLmFwcGVuZChNT05JVE9SX0RBVEFfRklMRSkudG9PU1N0cmluZygpOwotCQkKLQkJdHJ5IHsKLQkJCUlNZW1lbnRvIG1lbWVudG8gPSBYTUxNZW1lbnRvLmxvYWRNZW1lbnRvKGZpbGVuYW1lKTsKLQkJCQotCQkJSU1lbWVudG9bXSBjaGlsZHJlbiA9IG1lbWVudG8uZ2V0Q2hpbGRyZW4oIm1vbml0b3IiKTsKLQkJCWludCBzaXplID0gY2hpbGRyZW4ubGVuZ3RoOwotCQkJCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCXRyeSB7Ci0JCQkJCU1vbml0b3JlZFBvcnQgbXAgPSBuZXcgTW9uaXRvcmVkUG9ydChjaGlsZHJlbltpXSwgbnVsbCk7Ci0JCQkJCXBvcnRzLmFkZChtcCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIkNvdWxkIG5vdCBsb2FkIG1vbml0b3I6ICIgKyBlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiQ291bGQgbm90IGxvYWQgbW9uaXRvciBpbmZvOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1NlcnZlck5vdGlmaWNhdGlvbk1hbmFnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1NlcnZlck5vdGlmaWNhdGlvbk1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhmMmQ0YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9TZXJ2ZXJOb3RpZmljYXRpb25NYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi2gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlckV2ZW50OwotLyoqCi0gKiBOb3RpZmljYXRpb24gbWFuYWdlciBmb3Igc2VydmVyLgotICovCi1wdWJsaWMgY2xhc3MgU2VydmVyTm90aWZpY2F0aW9uTWFuYWdlciB7Ci0JcHJpdmF0ZSBMaXN0IGxpc3RlbmVyTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkKLQkvKioKLQkgKiBGb3IgbWFza2luZyBldmVudCBvbiBhbGwgY2hhbmdlcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBTExfRVZFTlRTID0gMHhGRkZGOwotCQotCXByaXZhdGUgY2xhc3MgTGlzdGVuZXJFbnRyeSB7Ci0JCXByaXZhdGUgSVNlcnZlckxpc3RlbmVyIGxpc3RlbmVyOwotCQlwcml2YXRlIGludCBldmVudE1hc2s7Ci0JCQotCQlwcml2YXRlIExpc3RlbmVyRW50cnkoSVNlcnZlckxpc3RlbmVyIGN1ckxpc3RlbmVyLCBpbnQgY3VyRXZlbnRNYXNrKSB7Ci0JCQlsaXN0ZW5lciA9IGN1ckxpc3RlbmVyOwotCQkJZXZlbnRNYXNrID0gY3VyRXZlbnRNYXNrOwotCQl9Ci0JCQotCQlwcm90ZWN0ZWQgSVNlcnZlckxpc3RlbmVyIGdldExpc3RlbmVyKCkgewotCQkJcmV0dXJuIGxpc3RlbmVyOwotCQl9Ci0JCQotCQlwcm90ZWN0ZWQgaW50IGdldEV2ZW50TWFzaygpIHsKLQkJCXJldHVybiBldmVudE1hc2s7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgbm90aWZpY2F0aW9uIG1hbmFnZXIuCi0JICovCi0JcHVibGljIFNlcnZlck5vdGlmaWNhdGlvbk1hbmFnZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQWRkIGxpc3RlbmVyIGZvciBhbGwgZXZlbnRzLgotCSAqIAotCSAqIEBwYXJhbSBjdXJMaXN0ZW5lcgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElTZXJ2ZXJMaXN0ZW5lciBjdXJMaXN0ZW5lcikgewotCQlhZGRMaXN0ZW5lcihjdXJMaXN0ZW5lciwgQUxMX0VWRU5UUyk7Ci0JfQotCQotCS8qKgotCSAqIEFkZCBsaXN0ZW5lciBmb3IgdGhlIGV2ZW50cyBzcGVjaWZpZWQgYnkgdGhlIG1hc2suCi0JICogCi0JICogQHBhcmFtIGN1ckxpc3RlbmVyCi0JICogQHBhcmFtIGV2ZW50TWFzawotCSAqLwotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElTZXJ2ZXJMaXN0ZW5lciBjdXJMaXN0ZW5lciwgaW50IGV2ZW50TWFzaykgewotCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICItPi0gQWRkaW5nIHNlcnZlciBsaXN0ZW5lciB0byBub3RpZmljYXRpb24gbWFuYWdlcjogIiArIGN1ckxpc3RlbmVyICsgIiAiICsgZXZlbnRNYXNrICsgIiAtPi0iKTsKLQkJaWYgKGN1ckxpc3RlbmVyID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJc3luY2hyb25pemVkIChsaXN0ZW5lckxpc3QpIHsKLQkJCWxpc3RlbmVyTGlzdC5hZGQobmV3IExpc3RlbmVyRW50cnkoY3VyTGlzdGVuZXIsIGV2ZW50TWFzaykpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYnJvYWRjYXN0Q2hhbmdlKFNlcnZlckV2ZW50IGV2ZW50KSB7Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIi0+LSBCcm9hZGNhc3Rpbmcgc2VydmVyIGV2ZW50OiAiICsgZXZlbnQgKyAiIC0+LSIpOwotCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWludCBldmVudEtpbmQgPSBldmVudC5nZXRLaW5kKCk7Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIiAgU2VydmVyIGV2ZW50IGtpbmQ6ICIgKyBldmVudEtpbmQgKyAiIC0+LSIpOwotCQkKLQkJLy8gb25seSBub3RpZnkgbGlzdGVuZXJzIHRoYXQgbGlzdGVuIHRvIG1vZHVsZSBldmVudAotCQlpbnQgc2l6ZTsKLQkJTGlzdGVuZXJFbnRyeVtdIGxpc3RlbmVyczsKLQkJc3luY2hyb25pemVkIChsaXN0ZW5lckxpc3QpIHsKLQkJCXNpemUgPSBsaXN0ZW5lckxpc3Quc2l6ZSgpOwotCQkJbGlzdGVuZXJzID0gKExpc3RlbmVyRW50cnlbXSkgbGlzdGVuZXJMaXN0LnRvQXJyYXkobmV3IExpc3RlbmVyRW50cnlbc2l6ZV0pOwotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlMaXN0ZW5lckVudHJ5IGN1ckVudHJ5ID0gbGlzdGVuZXJzW2ldOwotCQkJaW50IG1hc2sgPSBjdXJFbnRyeS5nZXRFdmVudE1hc2soKTsKLQotCQkJLy8gY2hlY2sgaWYgdGhlIHR5cGUgb2YgdGhlIGV2ZW50IG1hdGNoZXMgdGhlIG1hc2ssIGUuZy4gc2VydmVyIG9yIG1vZHVsZSBjaGFuZ2UKLQkJCWJvb2xlYW4gaXNUeXBlTWF0Y2ggPSAoKG1hc2sgJiBldmVudEtpbmQgJiBTZXJ2ZXJFdmVudC5TRVJWRVJfQ0hBTkdFKSAhPSAwKSAKLQkJCQkJfHwgKChtYXNrICYgZXZlbnRLaW5kICYgU2VydmVyRXZlbnQuTU9EVUxFX0NIQU5HRSkgIT0gMCk7Ci0JCQkvLyBjaGVjayB0aGUga2luZCBvZiBjaGFuZ2UKLQkJCWJvb2xlYW4gaXNLaW5kTWF0Y2ggPSAobWFzayAmIGV2ZW50S2luZCBeIFNlcnZlckV2ZW50LlNFUlZFUl9DSEFOR0UgXiBTZXJ2ZXJFdmVudC5NT0RVTEVfQ0hBTkdFKSAhPSAwOwotCQkJCi0JCQlpZiAoaXNUeXBlTWF0Y2ggJiYgaXNLaW5kTWF0Y2gpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICItPi0gRmlyaW5nIHNlcnZlciBldmVudCB0byBsaXN0ZW5lcjogIiArIGN1ckVudHJ5LmdldExpc3RlbmVyKCkgKyAiIC0+LSIpOwotCQkJCXRyeSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkxJU1RFTkVSUywgIiAgRmlyaW5nIHNlcnZlciBldmVudCB0byBsaXN0ZW5lcjogIiArIGN1ckVudHJ5LmdldExpc3RlbmVyKCkpOwotCQkJCQljdXJFbnRyeS5nZXRMaXN0ZW5lcigpLnNlcnZlckNoYW5nZWQoZXZlbnQpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIiAgRXJyb3IgZmlyaW5nIHNlcnZlciBldmVudDogIiArIGN1ckVudHJ5LmdldExpc3RlbmVyKCksIGUpOwotCQkJCX0KLQkJCQlUcmFjZS50cmFjZShUcmFjZS5MSVNURU5FUlMsICItPC0gRG9uZSBGaXJpbmcgc2VydmVyIGV2ZW50IC08LSIpOwotCQkJfQotCQl9Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIi08LSBEb25lIGJyb2FkY2FzdGluZyBzZXJ2ZXIgZXZlbnQgLTwtIik7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgbGlzdGVuZXIgbGlzdCBpcyBub3QgZW1wdHk7IG90aGVyd2lzZSwgcmV0dXJucyBmYWxzZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGxpc3RlbmVyIGxpc3QgaXMgbm90IGVtcHR5OyBvdGhlcndpc2UsIHJldHVybnMgZmFsc2UKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNMaXN0ZW5lckVudHJpZXMoKSB7Ci0JCXJldHVybiBsaXN0ZW5lckxpc3Quc2l6ZSgpID09IDA7Ci0JfQotCQotCS8qKgotCSAqIFJlbW92ZSBhIGxpc3RlbmVyIGZyb20gbm90aWZpY2F0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBjdXJMaXN0ZW5lcgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElTZXJ2ZXJMaXN0ZW5lciBjdXJMaXN0ZW5lcikgewotCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICItPi0gUmVtb3Zpbmcgc2VydmVyIGxpc3RlbmVyIGZyb20gbm90aWZpY2F0aW9uIG1hbmFnZXI6ICIgKyBjdXJMaXN0ZW5lciArICIgLT4tIik7Ci0JCWlmIChjdXJMaXN0ZW5lciA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJTGlzdGVuZXJFbnRyeSBtYXRjaGVkTGlzdGVuZXJFbnRyeSA9IG51bGw7Ci0JCUl0ZXJhdG9yIGxpc3RlbmVySXRlciA9IGxpc3RlbmVyTGlzdC5pdGVyYXRvcigpOwotCQl3aGlsZSAobWF0Y2hlZExpc3RlbmVyRW50cnkgPT0gbnVsbCAmJiBsaXN0ZW5lckl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlMaXN0ZW5lckVudHJ5IGN1ckVudHJ5ID0gKExpc3RlbmVyRW50cnkpbGlzdGVuZXJJdGVyLm5leHQoKTsKLQkJCWlmIChjdXJMaXN0ZW5lci5lcXVhbHMoY3VyRW50cnkuZ2V0TGlzdGVuZXIoKSkpIHsKLQkJCQltYXRjaGVkTGlzdGVuZXJFbnRyeSA9IGN1ckVudHJ5OwotCQkJfQotCQl9Ci0JCWlmIChtYXRjaGVkTGlzdGVuZXJFbnRyeSAhPSBudWxsKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKGxpc3RlbmVyTGlzdCkgewotCQkJCWxpc3RlbmVyTGlzdC5yZW1vdmUobWF0Y2hlZExpc3RlbmVyRW50cnkpOwotCQkJfQotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1NlcnZlclBsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvU2VydmVyUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzODc3YzAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvU2VydmVyUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEudGV4dC5EYXRlRm9ybWF0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGVBcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJDb3JlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVFdmVudDsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlTGlzdGVuZXI7Ci0vKioKLSAqIFRoZSBtYWluIHNlcnZlciBwbHVnaW4gY2xhc3MuCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfUFJFRl9GSUxFID0gIi5zZXJ2ZXJQcmVmZXJlbmNlIjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTSFVURE9XTl9KT0JfRkFNSUxZID0gIm9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5mYW1pbHkiOwotCS8vcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVHSVNUUllfSk9CX0ZBTUlMWSA9ICJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnJlZ2lzdHJ5LmZhbWlseSI7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIERhdGVGb3JtYXQgZGYgPSBEYXRlRm9ybWF0LmdldERhdGVUaW1lSW5zdGFuY2UoRGF0ZUZvcm1hdC5TSE9SVCwgRGF0ZUZvcm1hdC5TSE9SVCk7Ci0JcHJvdGVjdGVkIHN0YXRpYyBpbnQgbnVtID0gMDsKLQotCS8vIGNhY2hlZCBjb3B5IG9mIGFsbCBsYXVuY2hhYmxlIGFkYXB0ZXJzCi0JcHJpdmF0ZSBzdGF0aWMgTGlzdCBsYXVuY2hhYmxlQWRhcHRlcnM7Ci0KLQkvLyBjYWNoZWQgY29weSBvZiBhbGwgbGF1bmNoYWJsZSBjbGllbnRzCi0JcHJpdmF0ZSBzdGF0aWMgTGlzdCBjbGllbnRzOwotCi0JLy8gY2FjaGVkIGNvcHkgb2YgYWxsIG1vZHVsZSBmYWN0b3JpZXMKLQlwcml2YXRlIHN0YXRpYyBMaXN0IG1vZHVsZUZhY3RvcmllczsKLQotCS8vIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzCi0JcHJpdmF0ZSBzdGF0aWMgU2VydmVyUGx1Z2luIHNpbmdsZXRvbjsKLQotCS8vIGNhY2hlZCBjb3B5IG9mIGFsbCBwdWJsaXNoIHRhc2tzCi0JcHJpdmF0ZSBzdGF0aWMgTGlzdCBwdWJsaXNoVGFza3M7Ci0KLQkvLwljYWNoZWQgY29weSBvZiBhbGwgc2VydmVyIG1vbml0b3JzCi0JcHJpdmF0ZSBzdGF0aWMgTGlzdCBtb25pdG9yczsKLQotCS8vCWNhY2hlZCBjb3B5IG9mIGFsbCBydW50aW1lIGxvY2F0b3JzCi0JcHJpdmF0ZSBzdGF0aWMgTGlzdCBydW50aW1lTG9jYXRvcnM7Ci0KLQkvLyBjYWNoZWQgY29weSBvZiBhbGwgbW9kdWxlIGFydGlmYWN0IGFkYXB0ZXJzCi0JcHJpdmF0ZSBzdGF0aWMgTGlzdCBtb2R1bGVBcnRpZmFjdEFkYXB0ZXJzOwotCi0JLy8JY2FjaGVkIGNvcHkgb2YgYWxsIGluc3RhbGxhYmxlIHNlcnZlcnMKLQlwcml2YXRlIHN0YXRpYyBMaXN0IGluc3RhbGxhYmxlU2VydmVyczsKLQotCS8vCWNhY2hlZCBjb3B5IG9mIGFsbCBpbnN0YWxsYWJsZSBydW50aW1lcwotCXByaXZhdGUgc3RhdGljIExpc3QgaW5zdGFsbGFibGVSdW50aW1lczsKLQotCS8vIHJlZ2lzdHJ5IGxpc3RlbmVyCi0JcHJpdmF0ZSBzdGF0aWMgSVJlZ2lzdHJ5Q2hhbmdlTGlzdGVuZXIgcmVnaXN0cnlMaXN0ZW5lcjsKLQkKLQlwdWJsaWMgc3RhdGljIEJ1bmRsZUNvbnRleHQgYnVuZGxlQ29udGV4dDsKLQotCS8vIGJ1bmRsZSBsaXN0ZW5lcgotCXByaXZhdGUgQnVuZGxlTGlzdGVuZXIgYnVuZGxlTGlzdGVuZXI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVNUF9EQVRBX0ZJTEUgPSAidG1wLWRhdGEueG1sIjsKLQotCWNsYXNzIFRlbXBEaXIgewotCQlTdHJpbmcgcGF0aDsKLQkJaW50IGFnZTsKLQl9Ci0KLQkvLyB0ZW1wIGRpcmVjdG9yaWVzIC0gU3RyaW5nIGtleSB0byBUZW1wRGlyCi0JcHJvdGVjdGVkIE1hcCB0ZW1wRGlySGFzaDsKLQotCS8qKgotCSAqIHNlcnZlciBjb3JlIHBsdWdpbiBpZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUiOwotCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBTZXJ2ZXJQbHVnaW4uCi0JICovCi0JcHVibGljIFNlcnZlclBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJc2luZ2xldG9uID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhpcyBwbHVnaW4uCi0JICoKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5wbHVnaW4uU2VydmVyUGx1Z2luCi0JICovCi0JcHVibGljIHN0YXRpYyBTZXJ2ZXJQbHVnaW4gZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBzaW5nbGV0b247Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIHRlbXBvcmFyeSBkaXJlY3RvcnkgdGhhdCB0aGUgcmVxdWVzdG9yIGNhbiB1c2UKLQkgKiB0aHJvdWdob3V0IGl0J3MgbGlmZWN5Y2xlLiBUaGlzIGlzIHByaW1hcnkgdG8gYmUgdXNlZCBieQotCSAqIHNlcnZlciBpbnN0YW5jZXMgZm9yIHdvcmtpbmcgZGlyZWN0b3JpZXMsIGluc3RhbmNlIHNwZWNpZmljCi0JICogZmlsZXMsIGV0Yy4KLQkgKgotCSAqIDxwPkFzIGxvbmcgYXMgdGhlIHNhbWUga2V5IGlzIHVzZWQgdG8gY2FsbCB0aGlzIG1ldGhvZCBvbgotCSAqIGVhY2ggdXNlIG9mIHRoZSB3b3JrYmVuY2gsIHRoaXMgbWV0aG9kIGRpcmVjdG9yeSB3aWxsIHJldHVybgotCSAqIHRoZSBzYW1lIGRpcmVjdG9yeS4gSWYgdGhlIGRpcmVjdG9yeSBpcyBub3QgcmVxdWVzdGVkIG92ZXIgYQotCSAqIHBlcmlvZCBvZiB0aW1lLCB0aGUgZGlyZWN0b3J5IG1heSBiZSBkZWxldGVkIGFuZCBhIG5ldyBvbmUKLQkgKiB3aWxsIGJlIGFzc2lnbmVkIG9uIHRoZSBuZXh0IHJlcXVlc3QuIEZvciB0aGlzIHJlYXNvbiwgYQotCSAqIHNlcnZlciBpbnN0YW5jZSBzaG91bGQgcmVxdWVzdCB0aGUgdGVtcCBkaXJlY3Rvcnkgb24gc3RhcnR1cAotCSAqIGlmIGl0IHdhbnRzIHRvIHN0b3JlIGZpbGVzIHRoZXJlLiBJbiBhbGwgY2FzZXMsIHRoZSBpbnN0YW5jZQotCSAqIHNob3VsZCBoYXZlIGEgYmFja3VwIHBsYW4gYW55d2F5LCBhcyB0aGlzIGRpcmVjdG9yeSBtYXkgYmUKLQkgKiBkZWxldGVkIGFjY2lkZW50YWxseS48L3A+Ci0JICoKLQkgKiBAcGFyYW0ga2V5Ci0JICogQHJldHVybiBqYXZhLmlvLkZpbGUKLQkgKi8KLQlwdWJsaWMgSVBhdGggZ2V0VGVtcERpcmVjdG9yeShTdHJpbmcga2V5KSB7Ci0JCWlmIChrZXkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQotCQkvLyBmaXJzdCwgbG9vayB0aHJvdWdoIGhhc2ggb2YgY3VycmVudCBkaXJlY3RvcmllcwotCQlJUGF0aCBzdGF0ZVBhdGggPSBTZXJ2ZXJQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRTdGF0ZUxvY2F0aW9uKCk7Ci0JCXRyeSB7Ci0JCQlUZW1wRGlyIGRpciA9IChUZW1wRGlyKSB0ZW1wRGlySGFzaC5nZXQoa2V5KTsKLQkJCWlmIChkaXIgIT0gbnVsbCkgewotCQkJCWRpci5hZ2UgPSAwOwotCQkJCXJldHVybiBzdGF0ZVBhdGguYXBwZW5kKGRpci5wYXRoKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCi0JCS8vIG90aGVyd2lzZSwgY3JlYXRlIGEgbmV3IGRpcmVjdG9yeQotCQotCQkvLyBmaW5kIGZpcnN0IGZyZWUgZGlyZWN0b3J5Ci0JCVN0cmluZyBwYXRoID0gbnVsbDsKLQkJRmlsZSBkaXIgPSBudWxsOwotCQlpbnQgY291bnQgPSAwOwotCQl3aGlsZSAoZGlyID09IG51bGwgfHwgZGlyLmV4aXN0cygpKSB7Ci0JCQlwYXRoID0gInRtcCIgKyBjb3VudDsKLQkJCWRpciA9IHN0YXRlUGF0aC5hcHBlbmQocGF0aCkudG9GaWxlKCk7Ci0JCQljb3VudCArKzsKLQkJfQotCQotCQlkaXIubWtkaXJzKCk7Ci0JCi0JCVRlbXBEaXIgZCA9IG5ldyBUZW1wRGlyKCk7Ci0JCWQucGF0aCA9IHBhdGg7Ci0JCXRlbXBEaXJIYXNoLnB1dChrZXksIGQpOwotCQlzYXZlVGVtcERpckluZm8oKTsKLQkJcmV0dXJuIHN0YXRlUGF0aC5hcHBlbmQocGF0aCk7Ci0JfQotCQotCS8qKgotCSAqIFJlbW92ZSBhIHRlbXAgZGlyZWN0b3J5LgotCSAqIEBwYXJhbSBrZXkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVUZW1wRGlyZWN0b3J5KFN0cmluZyBrZXkpIHsKLQkJaWYgKGtleSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkKLQkJSVBhdGggc3RhdGVQYXRoID0gU2VydmVyUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U3RhdGVMb2NhdGlvbigpOwotCQl0cnkgewotCQkJVGVtcERpciBkaXIgPSAoVGVtcERpcikgdGVtcERpckhhc2guZ2V0KGtleSk7Ci0JCQlpZiAoZGlyICE9IG51bGwpIHsKLQkJCQl0ZW1wRGlySGFzaC5yZW1vdmUoa2V5KTsKLQkJCQlzYXZlVGVtcERpckluZm8oKTsKLQkJCQlkZWxldGVEaXJlY3Rvcnkoc3RhdGVQYXRoLmFwcGVuZChkaXIucGF0aCkudG9GaWxlKCksIG51bGwpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIkNvdWxkIG5vdCByZW1vdmUgdGVtcCBkaXJlY3RvcnkiLCBlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBMb2FkIHRoZSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGluZm9ybWF0aW9uLgotCSAqLwotCXByaXZhdGUgdm9pZCBsb2FkVGVtcERpckluZm8oKSB7Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIkxvYWRpbmcgdGVtcG9yYXJ5IGRpcmVjdG9yeSBpbmZvcm1hdGlvbiIpOwotCQlJUGF0aCBzdGF0ZVBhdGggPSBTZXJ2ZXJQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRTdGF0ZUxvY2F0aW9uKCk7Ci0JCVN0cmluZyBmaWxlbmFtZSA9IHN0YXRlUGF0aC5hcHBlbmQoVEVNUF9EQVRBX0ZJTEUpLnRvT1NTdHJpbmcoKTsKLQkKLQkJdGVtcERpckhhc2ggPSBuZXcgSGFzaE1hcCgpOwotCQl0cnkgewotCQkJSU1lbWVudG8gbWVtZW50byA9IFhNTE1lbWVudG8ubG9hZE1lbWVudG8oZmlsZW5hbWUpOwotCQotCQkJSU1lbWVudG9bXSBjaGlsZHJlbiA9IG1lbWVudG8uZ2V0Q2hpbGRyZW4oInRlbXAtZGlyZWN0b3J5Iik7Ci0JCQlpbnQgc2l6ZSA9IGNoaWxkcmVuLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJU3RyaW5nIGtleSA9IGNoaWxkcmVuW2ldLmdldFN0cmluZygia2V5Iik7Ci0JCi0JCQkJVGVtcERpciBkID0gbmV3IFRlbXBEaXIoKTsKLQkJCQlkLnBhdGggPSBjaGlsZHJlbltpXS5nZXRTdHJpbmcoInBhdGgiKTsKLQkJCQlkLmFnZSA9IGNoaWxkcmVuW2ldLmdldEludGVnZXIoImFnZSIpLmludFZhbHVlKCk7Ci0JCQkJZC5hZ2UrKzsKLQkKLQkJCQl0ZW1wRGlySGFzaC5wdXQoa2V5LCBkKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBsb2FkIHRlbXBvcmFyeSBkaXJlY3RvcnkgaW5mb3JtYXRpb246ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGxvZ2dpbmcuCi0JICoKLQkgKiBAcGFyYW0gc3RhdHVzIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhJU3RhdHVzIHN0YXR1cykgewotCQlnZXRJbnN0YW5jZSgpLmdldExvZygpLmxvZyhzdGF0dXMpOwotCX0KLQotCS8qKgotCSAqIFNhdmUgdGhlIHRlbXBvcmFyeSBkaXJlY3RvcnkgaW5mb3JtYXRpb24uCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNhdmVUZW1wRGlySW5mbygpIHsKLQkJLy8gc2F2ZSByZW1haW5pbmcgZGlyZWN0b3JpZXMKLQkJSVBhdGggc3RhdGVQYXRoID0gU2VydmVyUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U3RhdGVMb2NhdGlvbigpOwotCQlTdHJpbmcgZmlsZW5hbWUgPSBzdGF0ZVBhdGguYXBwZW5kKFRFTVBfREFUQV9GSUxFKS50b09TU3RyaW5nKCk7Ci0JCi0JCXRyeSB7Ci0JCQlYTUxNZW1lbnRvIG1lbWVudG8gPSBYTUxNZW1lbnRvLmNyZWF0ZVdyaXRlUm9vdCgidGVtcC1kaXJlY3RvcmllcyIpOwotCQotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSB0ZW1wRGlySGFzaC5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJVGVtcERpciBkID0gKFRlbXBEaXIpIHRlbXBEaXJIYXNoLmdldChrZXkpOwotCQotCQkJCWlmIChkLmFnZSA8IDUpIHsKLQkJCQkJSU1lbWVudG8gY2hpbGQgPSBtZW1lbnRvLmNyZWF0ZUNoaWxkKCJ0ZW1wLWRpcmVjdG9yeSIpOwotCQkJCQljaGlsZC5wdXRTdHJpbmcoImtleSIsIGtleSk7Ci0JCQkJCWNoaWxkLnB1dFN0cmluZygicGF0aCIsIGQucGF0aCk7Ci0JCQkJCWNoaWxkLnB1dEludGVnZXIoImFnZSIsIGQuYWdlKTsKLQkJCQl9IGVsc2UKLQkJCQkJZGVsZXRlRGlyZWN0b3J5KHN0YXRlUGF0aC5hcHBlbmQoZC5wYXRoKS50b0ZpbGUoKSwgbnVsbCk7Ci0JCQl9Ci0JCi0JCQltZW1lbnRvLnNhdmVUb0ZpbGUoZmlsZW5hbWUpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IHNhdmUgdGVtcG9yYXJ5IGRpcmVjdG9yeSBpbmZvcm1hdGlvbiIsIGUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQbHVnaW5QcmVmZXJlbmNlcygpIHsKLQkJU2VydmVyUHJlZmVyZW5jZXMuZ2V0SW5zdGFuY2UoKS5zZXREZWZhdWx0cygpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgUGx1Z2luI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLkNPTkZJRywgIi0tLS0tPi0tLS0tIFNlcnZlciBDb3JlIHBsdWdpbiBzdGFydHVwIC0tLS0tPi0tLS0tIik7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQlidW5kbGVDb250ZXh0ID0gY29udGV4dDsKLQkJCi0JCWluaXRpYWxpemVEZWZhdWx0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQotCQkvLyBsb2FkIHRlbXAgZGlyZWN0b3J5IGluZm9ybWF0aW9uCi0JCWxvYWRUZW1wRGlySW5mbygpOwotCQkKLQkJYnVuZGxlTGlzdGVuZXIgPSBuZXcgQnVuZGxlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBidW5kbGVDaGFuZ2VkKEJ1bmRsZUV2ZW50IGV2ZW50KSB7Ci0JCQkJU3RyaW5nIGJ1bmRsZUlkID0gZXZlbnQuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCk7Ci0JCQkJLy9UcmFjZS50cmFjZShUcmFjZS5JTkZPLCBldmVudC5nZXRUeXBlKCkgKyAiICIgKyBidW5kbGVJZCk7Ci0JCQkJLy8gVE9ETyBzaG91bGQgYWxzbyBsb29rIGZvciBVTklOU1RBTExFRCBhbmQgVU5SRVNPTFZFRAotCQkJCWlmIChCdW5kbGVFdmVudC5TVE9QUEVEID09IGV2ZW50LmdldFR5cGUoKSAmJiBSZXNvdXJjZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5pc0FjdGl2ZUJ1bmRsZShidW5kbGVJZCkpCi0JCQkJCXN0b3BCdW5kbGUoYnVuZGxlSWQpOwotCQkJfQotCQl9OwotCQljb250ZXh0LmFkZEJ1bmRsZUxpc3RlbmVyKGJ1bmRsZUxpc3RlbmVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzdG9wQnVuZGxlKGZpbmFsIFN0cmluZyBidW5kbGVJZCkgewotCQljbGFzcyBTdG9wSm9iIGV4dGVuZHMgSm9iIHsKLQkJCXB1YmxpYyBTdG9wSm9iKCkgewotCQkJCXN1cGVyKCJEaXNwb3Npbmcgc2VydmVycyIpOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgYm9vbGVhbiBiZWxvbmdzVG8oT2JqZWN0IGZhbWlseSkgewotCQkJCXJldHVybiBTSFVURE9XTl9KT0JfRkFNSUxZLmVxdWFscyhmYW1pbHkpOwotCQkJfQotCi0JCQlwdWJsaWMgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yMikgewotCQkJCVJlc291cmNlTWFuYWdlci5nZXRJbnN0YW5jZSgpLnNodXRkb3duQnVuZGxlKGJ1bmRsZUlkKTsKLQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCX0KLQkJfQotCQkKLQkJU3RvcEpvYiBqb2IgPSBuZXcgU3RvcEpvYigpOwotCQlqb2Iuc2V0VXNlcihmYWxzZSk7Ci0JCWpvYi5zY2hlZHVsZSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgUGx1Z2luI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlUcmFjZS50cmFjZShUcmFjZS5DT05GSUcsICItLS0tLTwtLS0tLSBTZXJ2ZXIgQ29yZSBwbHVnaW4gc2h1dGRvd24gLS0tLS08LS0tLS0iKTsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQkJCi0JCWlmIChyZWdpc3RyeUxpc3RlbmVyICE9IG51bGwpCi0JCQlQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpLnJlbW92ZVJlZ2lzdHJ5Q2hhbmdlTGlzdGVuZXIocmVnaXN0cnlMaXN0ZW5lcik7Ci0JCQotCQlSZXNvdXJjZU1hbmFnZXIuc2h1dGRvd24oKTsKLQkJU2VydmVyTW9uaXRvck1hbmFnZXIuc2h1dGRvd24oKTsKLQkJCi0JCXRyeSB7Ci0JCQlQbGF0Zm9ybS5nZXRKb2JNYW5hZ2VyKCkuam9pbihTSFVURE9XTl9KT0JfRkFNSUxZLCBudWxsKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJFcnJvciB3YWl0aW5nIGZvciBzaHV0ZG93biBqb2IiLCBlKTsKLQkJfQotCQljb250ZXh0LnJlbW92ZUJ1bmRsZUxpc3RlbmVyKGJ1bmRsZUxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIHRva2VuaXplKFN0cmluZyBwYXJhbSwgU3RyaW5nIGRlbGltKSB7Ci0JCWlmIChwYXJhbSA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBTdHJpbmdbMF07Ci0JCQotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQotCQlTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHBhcmFtLCBkZWxpbSk7Ci0JCXdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCVN0cmluZyBzdHIgPSBzdC5uZXh0VG9rZW4oKTsKLQkJCWlmIChzdHIgIT0gbnVsbCAmJiBzdHIubGVuZ3RoKCkgPiAwKQotCQkJCWxpc3QuYWRkKHN0ci50cmltKCkpOwotCQl9Ci0KLQkJU3RyaW5nW10gcyA9IG5ldyBTdHJpbmdbbGlzdC5zaXplKCldOwotCQlsaXN0LnRvQXJyYXkocyk7Ci0JCXJldHVybiBzOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgTGlzdCBnZXRNb2R1bGVUeXBlcyhJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cykgewotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmIChlbGVtZW50cyA9PSBudWxsKQotCQkJcmV0dXJuIGxpc3Q7Ci0JCi0JCWludCBzaXplID0gZWxlbWVudHMubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJU3RyaW5nW10gdHlwZXMgPSB0b2tlbml6ZShlbGVtZW50c1tpXS5nZXRBdHRyaWJ1dGUoInR5cGVzIiksICIsIik7Ci0JCQlTdHJpbmdbXSB2ZXJzaW9ucyA9IHRva2VuaXplKGVsZW1lbnRzW2ldLmdldEF0dHJpYnV0ZSgidmVyc2lvbnMiKSwgIiwiKTsKLQkJCWludCBzaXplVCA9IHR5cGVzLmxlbmd0aDsKLQkJCWludCBzaXplViA9IHZlcnNpb25zLmxlbmd0aDsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgc2l6ZVQ7IGorKykgewotCQkJCWZvciAoaW50IGsgPSAwOyBrIDwgc2l6ZVY7IGsrKykgewotCQkJCQlNb2R1bGVUeXBlIG1vZHVsZSA9IG5ldyBNb2R1bGVUeXBlKHR5cGVzW2pdLCB2ZXJzaW9uc1trXSk7Ci0JCQkJCWxpc3QuYWRkKG1vZHVsZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZW5lcmF0ZUlkKCkgewotCQlTdHJpbmcgcyA9IGRmLmZvcm1hdChuZXcgRGF0ZSgpKS50b1N0cmluZygpICsgbnVtKys7Ci0JCXMgPSBzLnJlcGxhY2UoJyAnLCAnXycpOwotCQlzID0gcy5yZXBsYWNlKCc6JywgJ18nKTsKLQkJcyA9IHMucmVwbGFjZSgnLycsICdfJyk7Ci0JCXMgPSBzLnJlcGxhY2UoJ1xcJywgJ18nKTsKLQkJcmV0dXJuIHM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIGlkcyBjb250YWlucyBpZC4KLQkgKiAKLQkgKiBAcGFyYW0gaWRzCi0JICogQHBhcmFtIGlkCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSBpZCBpcyBzdXBwb3J0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc3VwcG9ydHNUeXBlKFN0cmluZ1tdIGlkcywgU3RyaW5nIGlkKSB7Ci0JCWlmIChpZCA9PSBudWxsIHx8IGlkLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJaWYgKGlkcyA9PSBudWxsKQotCQkJcmV0dXJuIHRydWU7Ci0JCQotCQlpbnQgc2l6ZSA9IGlkcy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlpZiAoaWRzW2ldLmVuZHNXaXRoKCIqIikpIHsKLQkJCQlpZiAoaWQubGVuZ3RoKCkgPj0gaWRzW2ldLmxlbmd0aCgpICYmIGlkLnN0YXJ0c1dpdGgoaWRzW2ldLnN1YnN0cmluZygwLCBpZHNbaV0ubGVuZ3RoKCkgLSAxKSkpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfSBlbHNlIGlmIChpZC5lcXVhbHMoaWRzW2ldKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIFJlY3Vyc2l2ZWx5IGRlbGV0ZSBhIGRpcmVjdG9yeS4KLQkgKgotCSAqIEBwYXJhbSBkaXIgamF2YS5pby5GaWxlCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBpcyByZXF1aXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBkZWxldGVEaXJlY3RvcnkoRmlsZSBkaXIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQl0cnkgewotCQkJaWYgKCFkaXIuZXhpc3RzKCkgfHwgIWRpci5pc0RpcmVjdG9yeSgpKQotCQkJCXJldHVybjsKLQkKLQkJCUZpbGVbXSBmaWxlcyA9IGRpci5saXN0RmlsZXMoKTsKLQkJCWludCBzaXplID0gZmlsZXMubGVuZ3RoOwotCQkJbW9uaXRvciA9IFByb2dyZXNzVXRpbC5nZXRNb25pdG9yRm9yKG1vbml0b3IpOwotCQkJbW9uaXRvci5iZWdpblRhc2soTkxTLmJpbmQoTWVzc2FnZXMuZGVsZXRpbmdUYXNrLCBuZXcgU3RyaW5nW10ge2Rpci5nZXRBYnNvbHV0ZVBhdGgoKX0pLCBzaXplICogMTApOwotCQotCQkJLy8gY3ljbGUgdGhyb3VnaCBmaWxlcwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlGaWxlIGN1cnJlbnQgPSBmaWxlc1tpXTsKLQkJCQlpZiAoY3VycmVudC5pc0ZpbGUoKSkgewotCQkJCQljdXJyZW50LmRlbGV0ZSgpOwotCQkJCQltb25pdG9yLndvcmtlZCgxMCk7Ci0JCQkJfSBlbHNlIGlmIChjdXJyZW50LmlzRGlyZWN0b3J5KCkpIHsKLQkJCQkJbW9uaXRvci5zdWJUYXNrKE5MUy5iaW5kKE1lc3NhZ2VzLmRlbGV0aW5nVGFzaywgbmV3IFN0cmluZ1tdIHtjdXJyZW50LmdldEFic29sdXRlUGF0aCgpfSkpOwotCQkJCQlkZWxldGVEaXJlY3RvcnkoY3VycmVudCwgUHJvZ3Jlc3NVdGlsLmdldFN1Yk1vbml0b3JGb3IobW9uaXRvciwgMTApKTsKLQkJCQl9Ci0JCQl9Ci0JCQlkaXIuZGVsZXRlKCk7Ci0JCQltb25pdG9yLmRvbmUoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGRlbGV0aW5nIGRpcmVjdG9yeSAiICsgZGlyLmdldEFic29sdXRlUGF0aCgpLCBlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGFsbCBrbm93biBsYXVuY2hhYmxlIGFkYXB0ZXJzLgotCSAqIDxwPgotCSAqIEEgbmV3IGFycmF5IGlzIHJldHVybmVkIG9uIGVhY2ggY2FsbCwgc28gY2xpZW50cyBtYXkgc3RvcmUgb3IgbW9kaWZ5IHRoZSByZXN1bHQuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gYSBwb3NzaWJseS1lbXB0eSBhcnJheSBvZiBsYXVuY2hhYmxlIGFkYXB0ZXJzIHtAbGluayBJTGF1bmNoYWJsZUFkYXB0ZXJ9Ci0JICovCi0JcHVibGljIHN0YXRpYyBJTGF1bmNoYWJsZUFkYXB0ZXJbXSBnZXRMYXVuY2hhYmxlQWRhcHRlcnMoKSB7Ci0JCWlmIChsYXVuY2hhYmxlQWRhcHRlcnMgPT0gbnVsbCkKLQkJCWxvYWRMYXVuY2hhYmxlQWRhcHRlcnMoKTsKLQkJSUxhdW5jaGFibGVBZGFwdGVyW10gbGEgPSBuZXcgSUxhdW5jaGFibGVBZGFwdGVyW2xhdW5jaGFibGVBZGFwdGVycy5zaXplKCldOwotCQlsYXVuY2hhYmxlQWRhcHRlcnMudG9BcnJheShsYSk7Ci0JCXJldHVybiBsYTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGFsbCBrbm93biBjbGllbnQgaW5zdGFuY2VzLgotCSAqIDxwPgotCSAqIEEgbmV3IGFycmF5IGlzIHJldHVybmVkIG9uIGVhY2ggY2FsbCwgc28gY2xpZW50cyBtYXkgc3RvcmUgb3IgbW9kaWZ5IHRoZSByZXN1bHQuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gYSBwb3NzaWJseS1lbXB0eSBhcnJheSBvZiBjbGllbnQgaW5zdGFuY2VzIHtAbGluayBJQ2xpZW50fQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUNsaWVudFtdIGdldENsaWVudHMoKSB7Ci0JCWlmIChjbGllbnRzID09IG51bGwpCi0JCQlsb2FkQ2xpZW50cygpOwotCQlJQ2xpZW50W10gYyA9IG5ldyBJQ2xpZW50W2NsaWVudHMuc2l6ZSgpXTsKLQkJY2xpZW50cy50b0FycmF5KGMpOwotCQlyZXR1cm4gYzsKLQl9Ci0JCi0JLyoqCi0JICogTG9hZCB0aGUgbGF1bmNoYWJsZSBhZGFwdGVycyBleHRlbnNpb24gcG9pbnQuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgbG9hZExhdW5jaGFibGVBZGFwdGVycygpIHsKLQkJaWYgKGxhdW5jaGFibGVBZGFwdGVycyAhPSBudWxsKQotCQkJcmV0dXJuOwotCQlUcmFjZS50cmFjZShUcmFjZS5FWFRFTlNJT05fUE9JTlQsICItPi0gTG9hZGluZyAubGF1bmNoYWJsZUFkYXB0ZXJzIGV4dGVuc2lvbiBwb2ludCAtPi0iKTsKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2YgPSByZWdpc3RyeS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgImxhdW5jaGFibGVBZGFwdGVycyIpOwotCi0JCWludCBzaXplID0gY2YubGVuZ3RoOwotCQlsYXVuY2hhYmxlQWRhcHRlcnMgPSBuZXcgQXJyYXlMaXN0KHNpemUpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJdHJ5IHsKLQkJCQlsYXVuY2hhYmxlQWRhcHRlcnMuYWRkKG5ldyBMYXVuY2hhYmxlQWRhcHRlcihjZltpXSkpOwotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkVYVEVOU0lPTl9QT0lOVCwgIiAgTG9hZGVkIGxhdW5jaGFibGVBZGFwdGVyOiAiICsgY2ZbaV0uZ2V0QXR0cmlidXRlKCJpZCIpKTsKLQkJCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiICBDb3VsZCBub3QgbG9hZCBsYXVuY2hhYmxlQWRhcHRlcjogIiArIGNmW2ldLmdldEF0dHJpYnV0ZSgiaWQiKSwgdCk7Ci0JCQl9Ci0JCX0KLQkJVHJhY2UudHJhY2UoVHJhY2UuRVhURU5TSU9OX1BPSU5ULCAiLTwtIERvbmUgbG9hZGluZyAubGF1bmNoYWJsZUFkYXB0ZXJzIGV4dGVuc2lvbiBwb2ludCAtPC0iKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkIHRoZSBjbGllbnQgZXh0ZW5zaW9uIHBvaW50LgotCSAqLwotCXByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIGxvYWRDbGllbnRzKCkgewotCQlpZiAoY2xpZW50cyAhPSBudWxsKQotCQkJcmV0dXJuOwotCQlUcmFjZS50cmFjZShUcmFjZS5FWFRFTlNJT05fUE9JTlQsICItPi0gTG9hZGluZyAuY2xpZW50cyBleHRlbnNpb24gcG9pbnQgLT4tIik7Ci0JCUlFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNmID0gcmVnaXN0cnkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsICJjbGllbnRzIik7Ci0KLQkJaW50IHNpemUgPSBjZi5sZW5ndGg7Ci0JCWNsaWVudHMgPSBuZXcgQXJyYXlMaXN0KHNpemUpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJdHJ5IHsKLQkJCQljbGllbnRzLmFkZChuZXcgQ2xpZW50KGNmW2ldKSk7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuRVhURU5TSU9OX1BPSU5ULCAiICBMb2FkZWQgY2xpZW50czogIiArIGNmW2ldLmdldEF0dHJpYnV0ZSgiaWQiKSk7Ci0JCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIiAgQ291bGQgbm90IGxvYWQgY2xpZW50czogIiArIGNmW2ldLmdldEF0dHJpYnV0ZSgiaWQiKSwgdCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIHNvcnQgYnkgaW5kZXggdG8gcHV0IGxvd2VyIG51bWJlcnMgZmlyc3QgaW4gb3JkZXIKLQkJc2l6ZSA9IGNsaWVudHMuc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemUtMTsgaSsrKSB7Ci0JCQlmb3IgKGludCBqID0gaSsxOyBqIDwgc2l6ZTsgaisrKSB7Ci0JCQkJQ2xpZW50IGEgPSAoQ2xpZW50KSBjbGllbnRzLmdldChpKTsKLQkJCQlDbGllbnQgYiA9IChDbGllbnQpIGNsaWVudHMuZ2V0KGopOwotCQkJCWlmIChhLmdldFByaW9yaXR5KCkgPCBiLmdldFByaW9yaXR5KCkpIHsKLQkJCQkJY2xpZW50cy5zZXQoaSwgYik7Ci0JCQkJCWNsaWVudHMuc2V0KGosIGEpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJVHJhY2UudHJhY2UoVHJhY2UuRVhURU5TSU9OX1BPSU5ULCAiLTwtIERvbmUgbG9hZGluZyAuY2xpZW50cyBleHRlbnNpb24gcG9pbnQgLTwtIik7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgYWxsIGtub3duIHB1Ymxpc2ggdGFza3MuCi0JICogPHA+Ci0JICogQSBuZXcgYXJyYXkgaXMgcmV0dXJuZWQgb24gZWFjaCBjYWxsLCBzbyBjbGllbnRzIG1heSBzdG9yZSBvciBtb2RpZnkgdGhlIHJlc3VsdC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiBhIHBvc3NpYmx5LWVtcHR5IGFycmF5IG9mIHB1Ymxpc2ggdGFza3MgaW5zdGFuY2VzIHtAbGluayBJUHVibGlzaFRhc2t9Ci0JICovCi0JcHVibGljIHN0YXRpYyBJUHVibGlzaFRhc2tbXSBnZXRQdWJsaXNoVGFza3MoKSB7Ci0JCWlmIChwdWJsaXNoVGFza3MgPT0gbnVsbCkKLQkJCWxvYWRQdWJsaXNoVGFza3MoKTsKLQkJSVB1Ymxpc2hUYXNrW10gc3QgPSBuZXcgSVB1Ymxpc2hUYXNrW3B1Ymxpc2hUYXNrcy5zaXplKCldOwotCQlwdWJsaXNoVGFza3MudG9BcnJheShzdCk7Ci0JCXJldHVybiBzdDsKLQl9Ci0JCi0JLyoqCi0JICogTG9hZCB0aGUgcHVibGlzaCB0YXNrIGV4dGVuc2lvbiBwb2ludC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBzeW5jaHJvbml6ZWQgdm9pZCBsb2FkUHVibGlzaFRhc2tzKCkgewotCQlpZiAocHVibGlzaFRhc2tzICE9IG51bGwpCi0JCQlyZXR1cm47Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLkVYVEVOU0lPTl9QT0lOVCwgIi0+LSBMb2FkaW5nIC5wdWJsaXNoVGFza3MgZXh0ZW5zaW9uIHBvaW50IC0+LSIpOwotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjZiA9IHJlZ2lzdHJ5LmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcihTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAicHVibGlzaFRhc2tzIik7Ci0KLQkJaW50IHNpemUgPSBjZi5sZW5ndGg7Ci0JCXB1Ymxpc2hUYXNrcyA9IG5ldyBBcnJheUxpc3Qoc2l6ZSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCXB1Ymxpc2hUYXNrcy5hZGQobmV3IFB1Ymxpc2hUYXNrKGNmW2ldKSk7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuRVhURU5TSU9OX1BPSU5ULCAiICBMb2FkZWQgcHVibGlzaFRhc2s6ICIgKyBjZltpXS5nZXRBdHRyaWJ1dGUoImlkIikpOwotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICIgIENvdWxkIG5vdCBsb2FkIHB1Ymxpc2hUYXNrOiAiICsgY2ZbaV0uZ2V0QXR0cmlidXRlKCJpZCIpLCB0KTsKLQkJCX0KLQkJfQotCQkKLQkJVHJhY2UudHJhY2UoVHJhY2UuRVhURU5TSU9OX1BPSU5ULCAiLTwtIERvbmUgbG9hZGluZyAucHVibGlzaFRhc2tzIGV4dGVuc2lvbiBwb2ludCAtPC0iKTsKLQl9Ci0JCi0JLyoqCi0JICogU29ydCB0aGUgZ2l2ZW4gbGlzdCBvZiBJT3JkZXJlZCBpdGVtcyBpbnRvIGluZGV4ZWQgb3JkZXIuCi0JICoKLQkgKiBAcGFyYW0gbGlzdCBqYXZhLnV0aWwuTGlzdAotCSAqIEByZXR1cm4gamF2YS51dGlsLkxpc3QKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBMaXN0IHNvcnRPcmRlcmVkTGlzdChMaXN0IGxpc3QpIHsKLQkJaWYgKGxpc3QgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCWludCBzaXplID0gbGlzdC5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZSAtIDE7IGkrKykgewotCQkJZm9yIChpbnQgaiA9IGkgKyAxOyBqIDwgc2l6ZTsgaisrKSB7Ci0JCQkJSU9yZGVyZWQgYSA9IChJT3JkZXJlZCkgbGlzdC5nZXQoaSk7Ci0JCQkJSU9yZGVyZWQgYiA9IChJT3JkZXJlZCkgbGlzdC5nZXQoaik7Ci0JCQkJaWYgKGEuZ2V0T3JkZXIoKSA+IGIuZ2V0T3JkZXIoKSkgewotCQkJCQlPYmplY3QgdGVtcCA9IGE7Ci0JCQkJCWxpc3Quc2V0KGksIGIpOwotCQkJCQlsaXN0LnNldChqLCB0ZW1wKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgYWxsIGtub3duIG1vZHVsZSBtb2R1bGUgZmFjdG9yaWVzLgotCSAqIDxwPgotCSAqIEEgbmV3IGFycmF5IGlzIHJldHVybmVkIG9uIGVhY2ggY2FsbCwgc28gY2xpZW50cyBtYXkgc3RvcmUgb3IgbW9kaWZ5IHRoZSByZXN1bHQuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGFycmF5IG9mIG1vZHVsZSBmYWN0b3JpZXMge0BsaW5rIE1vZHVsZUZhY3Rvcnl9Ci0JICovCi0JcHVibGljIHN0YXRpYyBNb2R1bGVGYWN0b3J5W10gZ2V0TW9kdWxlRmFjdG9yaWVzKCkgewotCQlpZiAobW9kdWxlRmFjdG9yaWVzID09IG51bGwpCi0JCQlsb2FkTW9kdWxlRmFjdG9yaWVzKCk7Ci0JCQotCQlNb2R1bGVGYWN0b3J5W10gbWYgPSBuZXcgTW9kdWxlRmFjdG9yeVttb2R1bGVGYWN0b3JpZXMuc2l6ZSgpXTsKLQkJbW9kdWxlRmFjdG9yaWVzLnRvQXJyYXkobWYpOwotCQlyZXR1cm4gbWY7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1vZHVsZSBmYWN0b3J5IHdpdGggdGhlIGdpdmVuIGlkLCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIGlmIG5vbmUuIFRoaXMgY29udmVuaWVuY2UgbWV0aG9kIHNlYXJjaGVzIHRoZSBsaXN0IG9mIGtub3duCi0JICogbW9kdWxlIGZhY3RvcmllcyAoe0BsaW5rICNnZXRNb2R1bGVGYWN0b3JpZXMoKX0pIGZvciB0aGUgb25lIGEgbWF0Y2hpbmcKLQkgKiBtb2R1bGUgZmFjdG9yeSBpZCAoe0BsaW5rIE1vZHVsZUZhY3RvcnkjZ2V0SWQoKX0pLiBUaGUgaWQgbWF5IG5vdCBiZSBudWxsLgotCSAqCi0JICogQHBhcmFtIGlkIHRoZSBtb2R1bGUgZmFjdG9yeSBpZAotCSAqIEByZXR1cm4gdGhlIG1vZHVsZSBmYWN0b3J5LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBubyBtb2R1bGUgZmFjdG9yeQotCSAqIHdpdGggdGhlIGdpdmVuIGlkCi0JICovCi0JcHVibGljIHN0YXRpYyBNb2R1bGVGYWN0b3J5IGZpbmRNb2R1bGVGYWN0b3J5KFN0cmluZyBpZCkgewotCQlpZiAoaWQgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQotCQlpZiAobW9kdWxlRmFjdG9yaWVzID09IG51bGwpCi0JCQlsb2FkTW9kdWxlRmFjdG9yaWVzKCk7Ci0JCQotCQlJdGVyYXRvciBpdGVyYXRvciA9IG1vZHVsZUZhY3Rvcmllcy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlNb2R1bGVGYWN0b3J5IGZhY3RvcnkgPSAoTW9kdWxlRmFjdG9yeSkgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKGlkLmVxdWFscyhmYWN0b3J5LmdldElkKCkpKQotCQkJCXJldHVybiBmYWN0b3J5OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBMb2FkIHRoZSBtb2R1bGUgZmFjdG9yaWVzIGV4dGVuc2lvbiBwb2ludC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBzeW5jaHJvbml6ZWQgdm9pZCBsb2FkTW9kdWxlRmFjdG9yaWVzKCkgewotCQlpZiAobW9kdWxlRmFjdG9yaWVzICE9IG51bGwpCi0JCQlyZXR1cm47Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLkVYVEVOU0lPTl9QT0lOVCwgIi0+LSBMb2FkaW5nIC5tb2R1bGVGYWN0b3JpZXMgZXh0ZW5zaW9uIHBvaW50IC0+LSIpOwotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjZiA9IHJlZ2lzdHJ5LmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcihTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAibW9kdWxlRmFjdG9yaWVzIik7Ci0KLQkJaW50IHNpemUgPSBjZi5sZW5ndGg7Ci0JCW1vZHVsZUZhY3RvcmllcyA9IG5ldyBBcnJheUxpc3Qoc2l6ZSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCW1vZHVsZUZhY3Rvcmllcy5hZGQobmV3IE1vZHVsZUZhY3RvcnkoY2ZbaV0pKTsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5FWFRFTlNJT05fUE9JTlQsICIgIExvYWRlZCBtb2R1bGVGYWN0b3JpZXM6ICIgKyBjZltpXS5nZXRBdHRyaWJ1dGUoImlkIikpOwotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICIgIENvdWxkIG5vdCBsb2FkIG1vZHVsZUZhY3RvcmllczogIiArIGNmW2ldLmdldEF0dHJpYnV0ZSgiaWQiKSwgdCk7Ci0JCQl9Ci0JCX0KLQkJc29ydE9yZGVyZWRMaXN0KG1vZHVsZUZhY3Rvcmllcyk7Ci0JCQotCQlUcmFjZS50cmFjZShUcmFjZS5FWFRFTlNJT05fUE9JTlQsICItPC0gRG9uZSBsb2FkaW5nIC5tb2R1bGVGYWN0b3JpZXMgZXh0ZW5zaW9uIHBvaW50IC08LSIpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGFsbCBwcm9qZWN0cyBjb250YWluZWQgYnkgdGhlIHNlcnZlci4gVGhpcyBpbmNsdWRlZCB0aGUKLQkgKiBwcm9qZWN0cyB0aGF0IGFyZSBpbiB0aGUgY29uZmlndXJhdGlvbiwgYXMgd2VsbCBhcyB0aGVpcgotCSAqIGNoaWxkcmVuLCBhbmQgdGhlaXIgY2hpbGRyZW4uLi4KLQkgKgotCSAqIEBwYXJhbSBzZXJ2ZXIgYSBzZXJ2ZXIKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCi0JICogICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCi0JICogQHJldHVybiBhIHBvc3NpYmx5LWVtcHR5IGFycmF5IG9mIG1vZHVsZSBpbnN0YW5jZXMge0BsaW5rIElNb2R1bGV9Ci0JICovCi0JLypwdWJsaWMgc3RhdGljIElNb2R1bGVbXSBnZXRBbGxDb250YWluZWRNb2R1bGVzKElTZXJ2ZXIgc2VydmVyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJLy9UcmFjZS50cmFjZSgiPiBnZXRBbGxDb250YWluZWRNb2R1bGVzOiAiICsgZ2V0TmFtZShjb25maWd1cmF0aW9uKSk7Ci0JCUxpc3QgbW9kdWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKHNlcnZlciA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBJTW9kdWxlWzBdOwotCi0JCS8vIGdldCBhbGwgb2YgdGhlIGRpcmVjdGx5IGNvbnRhaW5lZCBwcm9qZWN0cwotCQlJTW9kdWxlW10gZGVwbG95cyA9IHNlcnZlci5nZXRNb2R1bGVzKCk7Ci0JCWlmIChkZXBsb3lzID09IG51bGwgfHwgZGVwbG95cy5sZW5ndGggPT0gMCkKLQkJCXJldHVybiBuZXcgSU1vZHVsZVswXTsKLQotCQlpbnQgc2l6ZSA9IGRlcGxveXMubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJaWYgKGRlcGxveXNbaV0gIT0gbnVsbCAmJiAhbW9kdWxlcy5jb250YWlucyhkZXBsb3lzW2ldKSkKLQkJCQltb2R1bGVzLmFkZChkZXBsb3lzW2ldKTsKLQkJfQotCi0JCS8vVHJhY2UudHJhY2UoIiAgZ2V0QWxsQ29udGFpbmVkTW9kdWxlczogcm9vdCBsZXZlbCBkb25lIik7Ci0KLQkJLy8gZ2V0IGFsbCBvZiB0aGUgbW9kdWxlJ3MgY2hpbGRyZW4KLQkJaW50IGNvdW50ID0gMDsKLQkJd2hpbGUgKGNvdW50IDwgbW9kdWxlcy5zaXplKCkpIHsKLQkJCUlNb2R1bGUgbW9kdWxlID0gKElNb2R1bGUpIG1vZHVsZXMuZ2V0KGNvdW50KTsKLQkJCXRyeSB7Ci0JCQkJSU1vZHVsZVtdIGNoaWxkcmVuID0gc2VydmVyLmdldENoaWxkTW9kdWxlcyhtb2R1bGUsIG1vbml0b3IpOwotCQkJCWlmIChjaGlsZHJlbiAhPSBudWxsKSB7Ci0JCQkJCXNpemUgPSBjaGlsZHJlbi5sZW5ndGg7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJCQlpZiAoY2hpbGRyZW5baV0gIT0gbnVsbCAmJiAhbW9kdWxlcy5jb250YWlucyhjaGlsZHJlbltpXSkpCi0JCQkJCQkJbW9kdWxlcy5hZGQoY2hpbGRyZW5baV0pOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBnZXR0aW5nIGNoaWxkIG1vZHVsZXMgZm9yOiAiICsgbW9kdWxlLmdldE5hbWUoKSwgZSk7Ci0JCQl9Ci0JCQljb3VudCArKzsKLQkJfQotCi0JCS8vVHJhY2UudHJhY2UoIjwgZ2V0QWxsQ29udGFpbmVkTW9kdWxlcyIpOwotCi0JCUlNb2R1bGVbXSBtb2R1bGVzMiA9IG5ldyBJTW9kdWxlW21vZHVsZXMuc2l6ZSgpXTsKLQkJbW9kdWxlcy50b0FycmF5KG1vZHVsZXMyKTsKLQkJcmV0dXJuIG1vZHVsZXMyOwotCX0qLwotCQotCS8qKgotCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgYWxsIGtub3duIHNlcnZlciBtb25pdG9yIGluc3RhbmNlcy4KLQkgKiA8cD4KLQkgKiBBIG5ldyBhcnJheSBpcyByZXR1cm5lZCBvbiBlYWNoIGNhbGwsIHNvIGNsaWVudHMgbWF5IHN0b3JlIG9yIG1vZGlmeSB0aGUgcmVzdWx0LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgcG9zc2libHktZW1wdHkgYXJyYXkgb2Ygc2VydmVyIG1vbml0b3IgaW5zdGFuY2VzIHtAbGluayBJU2VydmVyTW9uaXRvcn0KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTZXJ2ZXJNb25pdG9yW10gZ2V0U2VydmVyTW9uaXRvcnMoKSB7Ci0JCWlmIChtb25pdG9ycyA9PSBudWxsKQotCQkJbG9hZFNlcnZlck1vbml0b3JzKCk7Ci0JCUlTZXJ2ZXJNb25pdG9yW10gc20gPSBuZXcgSVNlcnZlck1vbml0b3JbbW9uaXRvcnMuc2l6ZSgpXTsKLQkJbW9uaXRvcnMudG9BcnJheShzbSk7Ci0JCXJldHVybiBzbTsKLQl9Ci0JCi0JLyoqCi0JICogTG9hZCB0aGUgc2VydmVyIG1vbml0b3IgZXh0ZW5zaW9uIHBvaW50LgotCSAqLwotCXByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIGxvYWRTZXJ2ZXJNb25pdG9ycygpIHsKLQkJaWYgKG1vbml0b3JzICE9IG51bGwpCi0JCQlyZXR1cm47Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLkVYVEVOU0lPTl9QT0lOVCwgIi0+LSBMb2FkaW5nIC5zZXJ2ZXJNb25pdG9ycyBleHRlbnNpb24gcG9pbnQgLT4tIik7Ci0JCUlFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNmID0gcmVnaXN0cnkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsICJpbnRlcm5hbFNlcnZlck1vbml0b3JzIik7Ci0KLQkJaW50IHNpemUgPSBjZi5sZW5ndGg7Ci0JCW1vbml0b3JzID0gbmV3IEFycmF5TGlzdChzaXplKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJbW9uaXRvcnMuYWRkKG5ldyBTZXJ2ZXJNb25pdG9yKGNmW2ldKSk7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuRVhURU5TSU9OX1BPSU5ULCAiICBMb2FkZWQgc2VydmVyTW9uaXRvcjogIiArIGNmW2ldLmdldEF0dHJpYnV0ZSgiaWQiKSk7Ci0JCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIiAgQ291bGQgbm90IGxvYWQgc2VydmVyTW9uaXRvcjogIiArIGNmW2ldLmdldEF0dHJpYnV0ZSgiaWQiKSwgdCk7Ci0JCQl9Ci0JCX0KLQkKLQkJVHJhY2UudHJhY2UoVHJhY2UuRVhURU5TSU9OX1BPSU5ULCAiLTwtIERvbmUgbG9hZGluZyAuc2VydmVyTW9uaXRvcnMgZXh0ZW5zaW9uIHBvaW50IC08LSIpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGFsbCBrbm93biBydW50aW1lIGxvY2F0b3IgaW5zdGFuY2VzLgotCSAqIDxwPgotCSAqIEEgbmV3IGFycmF5IGlzIHJldHVybmVkIG9uIGVhY2ggY2FsbCwgc28gY2xpZW50cyBtYXkgc3RvcmUgb3IgbW9kaWZ5IHRoZSByZXN1bHQuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gYSBwb3NzaWJseS1lbXB0eSBhcnJheSBvZiBydW50aW1lIGxvY2F0b3IgaW5zdGFuY2VzIHtAbGluayBJUnVudGltZUxvY2F0b3J9Ci0JICovCi0JcHVibGljIHN0YXRpYyBJUnVudGltZUxvY2F0b3JbXSBnZXRSdW50aW1lTG9jYXRvcnMoKSB7Ci0JCWlmIChydW50aW1lTG9jYXRvcnMgPT0gbnVsbCkKLQkJCWxvYWRSdW50aW1lTG9jYXRvcnMoKTsKLQkJSVJ1bnRpbWVMb2NhdG9yW10gcmwgPSBuZXcgSVJ1bnRpbWVMb2NhdG9yW3J1bnRpbWVMb2NhdG9ycy5zaXplKCldOwotCQlydW50aW1lTG9jYXRvcnMudG9BcnJheShybCk7Ci0JCXJldHVybiBybDsKLQl9Ci0JCi0JLyoqCi0JICogTG9hZCB0aGUgcnVudGltZSBsb2NhdG9ycy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBzeW5jaHJvbml6ZWQgdm9pZCBsb2FkUnVudGltZUxvY2F0b3JzKCkgewotCQlpZiAocnVudGltZUxvY2F0b3JzICE9IG51bGwpCi0JCQlyZXR1cm47Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLkVYVEVOU0lPTl9QT0lOVCwgIi0+LSBMb2FkaW5nIC5ydW50aW1lTG9jYXRvcnMgZXh0ZW5zaW9uIHBvaW50IC0+LSIpOwotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjZiA9IHJlZ2lzdHJ5LmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcihTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAicnVudGltZUxvY2F0b3JzIik7Ci0KLQkJaW50IHNpemUgPSBjZi5sZW5ndGg7Ci0JCXJ1bnRpbWVMb2NhdG9ycyA9IG5ldyBBcnJheUxpc3Qoc2l6ZSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCVJ1bnRpbWVMb2NhdG9yIHJ1bnRpbWVMb2NhdG9yID0gbmV3IFJ1bnRpbWVMb2NhdG9yKGNmW2ldKTsKLQkJCQlydW50aW1lTG9jYXRvcnMuYWRkKHJ1bnRpbWVMb2NhdG9yKTsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5FWFRFTlNJT05fUE9JTlQsICIgIExvYWRlZCBydW50aW1lTG9jYXRvcjogIiArIGNmW2ldLmdldEF0dHJpYnV0ZSgiaWQiKSk7Ci0JCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIiAgQ291bGQgbm90IGxvYWQgcnVudGltZUxvY2F0b3I6ICIgKyBjZltpXS5nZXRBdHRyaWJ1dGUoImlkIiksIHQpOwotCQkJfQotCQl9Ci0JCQotCQlUcmFjZS50cmFjZShUcmFjZS5FWFRFTlNJT05fUE9JTlQsICItPC0gRG9uZSBsb2FkaW5nIC5ydW50aW1lTG9jYXRvcnMgZXh0ZW5zaW9uIHBvaW50IC08LSIpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGFsbCBtb2R1bGUgYXJ0aWZhY3QgYWRhcHRlcnMuCi0JICoKLQkgKiBAcmV0dXJuIGEgcG9zc2libHkgZW1wdHkgYXJyYXkgb2YgbW9kdWxlIGFydGlmYWN0IGFkYXB0ZXJzCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBNb2R1bGVBcnRpZmFjdEFkYXB0ZXJbXSBnZXRNb2R1bGVBcnRpZmFjdEFkYXB0ZXJzKCkgewotCQlpZiAobW9kdWxlQXJ0aWZhY3RBZGFwdGVycyA9PSBudWxsKQotCQkJbG9hZE1vZHVsZUFydGlmYWN0QWRhcHRlcnMoKTsKLQkJCi0JCU1vZHVsZUFydGlmYWN0QWRhcHRlcltdIG1vYSA9IG5ldyBNb2R1bGVBcnRpZmFjdEFkYXB0ZXJbbW9kdWxlQXJ0aWZhY3RBZGFwdGVycy5zaXplKCldOwotCQltb2R1bGVBcnRpZmFjdEFkYXB0ZXJzLnRvQXJyYXkobW9hKTsKLQkJcmV0dXJuIG1vYTsKLQl9Ci0JCi0JLyoqCi0JICogTG9hZCB0aGUgbW9kdWxlIGFydGlmYWN0IGFkYXB0ZXJzIGV4dGVuc2lvbiBwb2ludC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBzeW5jaHJvbml6ZWQgdm9pZCBsb2FkTW9kdWxlQXJ0aWZhY3RBZGFwdGVycygpIHsKLQkJaWYgKG1vZHVsZUFydGlmYWN0QWRhcHRlcnMgIT0gbnVsbCkKLQkJCXJldHVybjsKLQkJVHJhY2UudHJhY2UoVHJhY2UuRVhURU5TSU9OX1BPSU5ULCAiLT4tIExvYWRpbmcgLm1vZHVsZUFydGlmYWN0QWRhcHRlcnMgZXh0ZW5zaW9uIHBvaW50IC0+LSIpOwotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjZiA9IHJlZ2lzdHJ5LmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcihTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAibW9kdWxlQXJ0aWZhY3RBZGFwdGVycyIpOwotCi0JCWludCBzaXplID0gY2YubGVuZ3RoOwotCQltb2R1bGVBcnRpZmFjdEFkYXB0ZXJzID0gbmV3IEFycmF5TGlzdChzaXplKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJbW9kdWxlQXJ0aWZhY3RBZGFwdGVycy5hZGQobmV3IE1vZHVsZUFydGlmYWN0QWRhcHRlcihjZltpXSkpOwotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkVYVEVOU0lPTl9QT0lOVCwgIiAgTG9hZGVkIG1vZHVsZUFydGlmYWN0QWRhcHRlcjogIiArIGNmW2ldLmdldEF0dHJpYnV0ZSgiaWQiKSk7Ci0JCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIiAgQ291bGQgbm90IGxvYWQgbW9kdWxlQXJ0aWZhY3RBZGFwdGVyOiAiICsgY2ZbaV0uZ2V0QXR0cmlidXRlKCJpZCIpLCB0KTsKLQkJCX0KLQkJfQotCQkKLQkJLy8gc29ydCBieSBpbmRleCB0byBwdXQgbG93ZXIgbnVtYmVycyBmaXJzdCBpbiBvcmRlcgotCQlzaXplID0gbW9kdWxlQXJ0aWZhY3RBZGFwdGVycy5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZS0xOyBpKyspIHsKLQkJCWZvciAoaW50IGogPSBpKzE7IGogPCBzaXplOyBqKyspIHsKLQkJCQlNb2R1bGVBcnRpZmFjdEFkYXB0ZXIgYSA9IChNb2R1bGVBcnRpZmFjdEFkYXB0ZXIpIG1vZHVsZUFydGlmYWN0QWRhcHRlcnMuZ2V0KGkpOwotCQkJCU1vZHVsZUFydGlmYWN0QWRhcHRlciBiID0gKE1vZHVsZUFydGlmYWN0QWRhcHRlcikgbW9kdWxlQXJ0aWZhY3RBZGFwdGVycy5nZXQoaik7Ci0JCQkJaWYgKGEuZ2V0UHJpb3JpdHkoKSA8IGIuZ2V0UHJpb3JpdHkoKSkgewotCQkJCQltb2R1bGVBcnRpZmFjdEFkYXB0ZXJzLnNldChpLCBiKTsKLQkJCQkJbW9kdWxlQXJ0aWZhY3RBZGFwdGVycy5zZXQoaiwgYSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlUcmFjZS50cmFjZShUcmFjZS5FWFRFTlNJT05fUE9JTlQsICItPC0gRG9uZSBsb2FkaW5nIC5tb2R1bGVBcnRpZmFjdEFkYXB0ZXJzIGV4dGVuc2lvbiBwb2ludCAtPC0iKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiBhIG1vZHVsZSBhcnRpZmFjdCBtYXkgYmUgYXZhaWxhYmxlIGZvciB0aGUgZ2l2ZW4gb2JqZWN0LAotCSAqIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotCSAqCi0JICogQHBhcmFtIG9iaiBhbiBvYmplY3QKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZXJlIGlzIGEgbW9kdWxlIGFydGlmYWN0IGFkYXB0ZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzTW9kdWxlQXJ0aWZhY3QoT2JqZWN0IG9iaikgewotCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJTZXJ2ZXJQbHVnaW4uaGFzTW9kdWxlQXJ0aWZhY3QoKSAiICsgb2JqKTsKLQkJTW9kdWxlQXJ0aWZhY3RBZGFwdGVyW10gYWRhcHRlcnMgPSBnZXRNb2R1bGVBcnRpZmFjdEFkYXB0ZXJzKCk7Ci0JCWlmIChhZGFwdGVycyAhPSBudWxsKSB7Ci0JCQlpbnQgc2l6ZSA9IGFkYXB0ZXJzLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYgKGFkYXB0ZXJzW2ldLmlzRW5hYmxlZChvYmopKSB7Ci0JCQkJCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FUiwgIlJ1biBPbiBTZXJ2ZXIgZm9yICIgKyBvYmogKyAiIGlzIGVuYWJsZWQgYnkgIiArIGFkYXB0ZXJzW2ldLmdldElkKCkpOwotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJDb3VsZCBub3QgdXNlIG1vZHVsZUFydGlmYWN0QWRhcHRlciIsIGNlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbW9kdWxlIGFydGlmYWN0IGlmIG9uZSBjYW4gYmUgZm91bmQgd2l0aG91dCBsb2FkaW5nIHBsdWdpbnMuCi0JICogCi0JICogQHBhcmFtIG9iagotCSAqIEByZXR1cm4gYSBtb2R1bGUgYXJ0aWZhY3QsIG9yIG51bGwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElNb2R1bGVBcnRpZmFjdCBnZXRNb2R1bGVBcnRpZmFjdChPYmplY3Qgb2JqKSB7Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIlNlcnZlclBsdWdpbi5nZXRNb2R1bGVBcnRpZmFjdCgpICIgKyBvYmopOwotCQlNb2R1bGVBcnRpZmFjdEFkYXB0ZXJbXSBhZGFwdGVycyA9IGdldE1vZHVsZUFydGlmYWN0QWRhcHRlcnMoKTsKLQkJaWYgKGFkYXB0ZXJzICE9IG51bGwpIHsKLQkJCWludCBzaXplID0gYWRhcHRlcnMubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQl0cnkgewotCQkJCQlpZiAoYWRhcHRlcnNbaV0uaXNFbmFibGVkKG9iaikpIHsKLQkJCQkJCUlNb2R1bGVBcnRpZmFjdCBtYSA9IGFkYXB0ZXJzW2ldLmdldE1vZHVsZUFydGlmYWN0KG9iaik7Ci0JCQkJCQlpZiAobWEgIT0gbnVsbCkKLQkJCQkJCQlyZXR1cm4gbWE7Ci0JCQkJCQkvKmlmIChQbGF0Zm9ybS5nZXRBZGFwdGVyTWFuYWdlcigpLmhhc0FkYXB0ZXIob2JqLCBNT0RVTEVfQVJUSUZBQ1RfQ0xBU1MpKSB7Ci0JCQkJCQkJcmV0dXJuIChJTW9kdWxlQXJ0aWZhY3QpIFBsYXRmb3JtLmdldEFkYXB0ZXJNYW5hZ2VyKCkuZ2V0QWRhcHRlcihvYmosIE1PRFVMRV9BUlRJRkFDVF9DTEFTUyk7Ci0JCQkJCQl9Ki8KLQkJCQkJfQotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJDb3VsZCBub3QgdXNlIG1vZHVsZUFydGlmYWN0QWRhcHRlciAiICsgYWRhcHRlcnNbaV0sIGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIG1vZHVsZSBhcnRpZmFjdCBpZiBwb3NzaWJsZSwgbG9hZGluZyBhbnkgcGx1Z2lucyByZXF1aXJlZC4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqCi0JICogQHJldHVybiBhIG1vZHVsZSBhcnRpZmFjdCwgb3IgbnVsbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSU1vZHVsZUFydGlmYWN0IGxvYWRNb2R1bGVBcnRpZmFjdChPYmplY3Qgb2JqKSB7Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIlNlcnZlclBsdWdpbi5sb2FkTW9kdWxlQXJ0aWZhY3QoKSAiICsgb2JqKTsKLQkJTW9kdWxlQXJ0aWZhY3RBZGFwdGVyW10gYWRhcHRlcnMgPSBnZXRNb2R1bGVBcnRpZmFjdEFkYXB0ZXJzKCk7Ci0JCWlmIChhZGFwdGVycyAhPSBudWxsKSB7Ci0JCQlpbnQgc2l6ZSA9IGFkYXB0ZXJzLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYgKGFkYXB0ZXJzW2ldLmlzRW5hYmxlZChvYmopKSB7Ci0JCQkJCQlJTW9kdWxlQXJ0aWZhY3QgbWEgPSBhZGFwdGVyc1tpXS5nZXRNb2R1bGVBcnRpZmFjdChvYmopOwotCQkJCQkJaWYgKG1hICE9IG51bGwpCi0JCQkJCQkJcmV0dXJuIG1hOwotCQkJCQkJLyppZiAoUGxhdGZvcm0uZ2V0QWRhcHRlck1hbmFnZXIoKS5oYXNBZGFwdGVyKG9iaiwgTU9EVUxFX0FSVElGQUNUX0NMQVNTKSkgewotCQkJCQkJCXJldHVybiAoSU1vZHVsZUFydGlmYWN0KSBQbGF0Zm9ybS5nZXRBZGFwdGVyTWFuYWdlcigpLmxvYWRBZGFwdGVyKG9iaiwgTU9EVUxFX0FSVElGQUNUX0NMQVNTKTsKLQkJCQkJCX0qLwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIkNvdWxkIG5vdCB1c2UgbW9kdWxlQXJ0aWZhY3RBZGFwdGVyICIgKyBhZGFwdGVyc1tpXSwgZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhbiBhcnJheSBvZiBhbGwga25vd24gaW5zdGFsbGFibGUgc2VydmVycy4KLQkgKiA8cD4KLQkgKiBBIG5ldyBhcnJheSBpcyByZXR1cm5lZCBvbiBlYWNoIGNhbGwsIHNvIGNsaWVudHMgbWF5IHN0b3JlIG9yIG1vZGlmeSB0aGUgcmVzdWx0LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiBpbnN0YWxsYWJsZSBzZXJ2ZXJzIHtAbGluayBJSW5zdGFsbGFibGVTZXJ2ZXJ9Ci0JICovCi0JcHVibGljIHN0YXRpYyBJSW5zdGFsbGFibGVTZXJ2ZXJbXSBnZXRJbnN0YWxsYWJsZVNlcnZlcnMoKSB7Ci0JCWlmIChpbnN0YWxsYWJsZVNlcnZlcnMgPT0gbnVsbCkKLQkJCWxvYWRJbnN0YWxsYWJsZVNlcnZlcnMoKTsKLQkJCi0JCUxpc3QgYXZhaWxhYmxlU2VydmVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBpbnN0YWxsYWJsZVNlcnZlcnMuaXRlcmF0b3IoKTsKLQkJSVJ1bnRpbWVUeXBlW10gcnVudGltZVR5cGVzID0gU2VydmVyQ29yZS5nZXRSdW50aW1lVHlwZXMoKTsKLQkJaW50IHNpemUgPSBydW50aW1lVHlwZXMubGVuZ3RoOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlJSW5zdGFsbGFibGVTZXJ2ZXIgc2VydmVyID0gKElJbnN0YWxsYWJsZVNlcnZlcikgaXRlcmF0b3IubmV4dCgpOwotCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlpZiAoc2VydmVyLmdldElkKCkuZXF1YWxzKHJ1bnRpbWVUeXBlc1tpXS5nZXRJZCgpKSkKLQkJCQkJZm91bmQgPSB0cnVlOwotCQkJfQotCQkJaWYgKCFmb3VuZCkKLQkJCQlhdmFpbGFibGVTZXJ2ZXJzLmFkZChzZXJ2ZXIpOwotCQl9Ci0JCQotCQlJSW5zdGFsbGFibGVTZXJ2ZXJbXSBpcyA9IG5ldyBJSW5zdGFsbGFibGVTZXJ2ZXJbYXZhaWxhYmxlU2VydmVycy5zaXplKCldOwotCQlhdmFpbGFibGVTZXJ2ZXJzLnRvQXJyYXkoaXMpOwotCQlyZXR1cm4gaXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBhcnJheSBvZiBhbGwga25vd24gaW5zdGFsbGFibGUgcnVudGltZXMuCi0JICogPHA+Ci0JICogQSBuZXcgYXJyYXkgaXMgcmV0dXJuZWQgb24gZWFjaCBjYWxsLCBzbyBjbGllbnRzIG1heSBzdG9yZSBvciBtb2RpZnkgdGhlIHJlc3VsdC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiB0aGUgYXJyYXkgb2YgaW5zdGFsbGFibGUgcnVudGltZXMge0BsaW5rIElJbnN0YWxsYWJsZVJ1bnRpbWV9Ci0JICovCi0JcHVibGljIHN0YXRpYyBJSW5zdGFsbGFibGVSdW50aW1lW10gZ2V0SW5zdGFsbGFibGVSdW50aW1lcygpIHsKLQkJLy9pZiAoaW5zdGFsbGFibGVSdW50aW1lcyA9PSBudWxsKQotCQkJbG9hZEluc3RhbGxhYmxlUnVudGltZXMoKTsKLQkJCi0JCUlJbnN0YWxsYWJsZVJ1bnRpbWVbXSBpciA9IG5ldyBJSW5zdGFsbGFibGVSdW50aW1lW2luc3RhbGxhYmxlUnVudGltZXMuc2l6ZSgpXTsKLQkJaW5zdGFsbGFibGVSdW50aW1lcy50b0FycmF5KGlyKTsKLQkJcmV0dXJuIGlyOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGluc3RhbGxhYmxlIHJ1bnRpbWUgZm9yIHRoZSBnaXZlbiBydW50aW1lIHR5cGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogaWYgbm9uZSBleGlzdHMuCi0JICogCi0JICogQHBhcmFtIHJ1bnRpbWVUeXBlSWQgYSBydW50aW1lIHR5cGUgaWQKLQkgKiBAcmV0dXJuIHRoZSBpbnN0YWxsYWJsZSBydW50aW1lIGZvciB0aGUgZ2l2ZW4gcnVudGltZSB0eXBlLCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqICAgIGlmIG5vbmUgZXhpc3RzIHtAbGluayBJSW5zdGFsbGFibGVSdW50aW1lfQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUluc3RhbGxhYmxlUnVudGltZSBmaW5kSW5zdGFsbGFibGVSdW50aW1lKFN0cmluZyBydW50aW1lVHlwZUlkKSB7Ci0JCWlmIChydW50aW1lVHlwZUlkID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCQotCQkvL2lmIChpbnN0YWxsYWJsZVJ1bnRpbWVzID09IG51bGwpCi0JCQlsb2FkSW5zdGFsbGFibGVSdW50aW1lcygpOwotCQkKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBpbnN0YWxsYWJsZVJ1bnRpbWVzLml0ZXJhdG9yKCk7Ci0JCUlSdW50aW1lVHlwZVtdIHJ1bnRpbWVUeXBlcyA9IFNlcnZlckNvcmUuZ2V0UnVudGltZVR5cGVzKCk7Ci0JCWludCBzaXplID0gcnVudGltZVR5cGVzLmxlbmd0aDsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJSUluc3RhbGxhYmxlUnVudGltZSBydW50aW1lID0gKElJbnN0YWxsYWJsZVJ1bnRpbWUpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJaWYgKHJ1bnRpbWUuZ2V0SWQoKS5lcXVhbHMocnVudGltZVR5cGVJZCkpCi0JCQkJCXJldHVybiBydW50aW1lOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkIHRoZSBpbnN0YWxsYWJsZSBzZXJ2ZXJzLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIGxvYWRJbnN0YWxsYWJsZVNlcnZlcnMoKSB7Ci0JCWlmIChpbnN0YWxsYWJsZVNlcnZlcnMgIT0gbnVsbCkKLQkJCXJldHVybjsKLQkJVHJhY2UudHJhY2UoVHJhY2UuRVhURU5TSU9OX1BPSU5ULCAiLT4tIExvYWRpbmcgLmluc3RhbGxhYmxlU2VydmVycyBleHRlbnNpb24gcG9pbnQgLT4tIik7Ci0JCQotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjZiA9IHJlZ2lzdHJ5LmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcihTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAiaW5zdGFsbGFibGVTZXJ2ZXJzIik7Ci0JCQotCQlpbnQgc2l6ZSA9IGNmLmxlbmd0aDsKLQkJaW5zdGFsbGFibGVTZXJ2ZXJzID0gbmV3IEFycmF5TGlzdChzaXplKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJSW5zdGFsbGFibGVTZXJ2ZXIgaXMgPSBuZXcgSW5zdGFsbGFibGVTZXJ2ZXIoY2ZbaV0pOwotCQkJCWluc3RhbGxhYmxlU2VydmVycy5hZGQoaXMpOwotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkVYVEVOU0lPTl9QT0lOVCwgIiAgTG9hZGVkIGluc3RhbGxhYmxlU2VydmVyOiAiICsgY2ZbaV0uZ2V0QXR0cmlidXRlKCJpZCIpKTsKLQkJCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiICBDb3VsZCBub3QgbG9hZCBpbnN0YWxsYWJsZVNlcnZlcjogIiArIGNmW2ldLmdldEF0dHJpYnV0ZSgiaWQiKSwgdCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCVRyYWNlLnRyYWNlKFRyYWNlLkVYVEVOU0lPTl9QT0lOVCwgIi08LSBEb25lIGxvYWRpbmcgLmluc3RhbGxhYmxlU2VydmVycyBleHRlbnNpb24gcG9pbnQgLTwtIik7Ci0JfQotCi0JLyoqCi0JICogTG9hZCB0aGUgaW5zdGFsbGFibGUgcnVudGltZXMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgbG9hZEluc3RhbGxhYmxlUnVudGltZXMoKSB7Ci0JCS8vaWYgKGluc3RhbGxhYmxlUnVudGltZXMgIT0gbnVsbCkKLQkJLy8JcmV0dXJuOwotCQlUcmFjZS50cmFjZShUcmFjZS5FWFRFTlNJT05fUE9JTlQsICItPi0gTG9hZGluZyAuaW5zdGFsbGFibGVSdW50aW1lcyBleHRlbnNpb24gcG9pbnQgLT4tIik7Ci0JCQotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjZiA9IHJlZ2lzdHJ5LmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcihTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAiaW5zdGFsbGFibGVSdW50aW1lcyIpOwotCQkKLQkJaW50IHNpemUgPSBjZi5sZW5ndGg7Ci0JCWluc3RhbGxhYmxlUnVudGltZXMgPSBuZXcgQXJyYXlMaXN0KHNpemUpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJdHJ5IHsKLQkJCQlJbnN0YWxsYWJsZVJ1bnRpbWUgaXIgPSBuZXcgSW5zdGFsbGFibGVSdW50aW1lKGNmW2ldKTsKLQkJCQlpbnN0YWxsYWJsZVJ1bnRpbWVzLmFkZChpcik7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuRVhURU5TSU9OX1BPSU5ULCAiICBMb2FkZWQgaW5zdGFsbGFibGVSdW50aW1lOiAiICsgY2ZbaV0uZ2V0QXR0cmlidXRlKCJpZCIpKTsKLQkJCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiICBDb3VsZCBub3QgbG9hZCBpbnN0YWxsYWJsZVJ1bnRpbWU6ICIgKyBjZltpXS5nZXRBdHRyaWJ1dGUoImlkIiksIHQpOwotCQkJfQotCQl9Ci0JCQotCQlUcmFjZS50cmFjZShUcmFjZS5FWFRFTlNJT05fUE9JTlQsICItPC0gRG9uZSBsb2FkaW5nIC5pbnN0YWxsYWJsZVJ1bnRpbWVzIGV4dGVuc2lvbiBwb2ludCAtPC0iKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0UmVnaXN0cnlMaXN0ZW5lcihJUmVnaXN0cnlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlyZWdpc3RyeUxpc3RlbmVyID0gbGlzdGVuZXI7IAotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHByZWZlcmVuY2UgaW5mb3JtYXRpb24gZm9yIHRoZSBwcm9qZWN0LiBUaGUgcHJvamVjdCBtYXkgbm90Ci0JICogYmUgbnVsbC4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdCBhIHByb2plY3QKLQkgKiBAcmV0dXJuIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBwcm9qZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBQcm9qZWN0UHJvcGVydGllcyBnZXRQcm9qZWN0UHJvcGVydGllcyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCXJldHVybiBuZXcgUHJvamVjdFByb3BlcnRpZXMocHJvamVjdCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1NlcnZlclByZWZlcmVuY2VzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9TZXJ2ZXJQcmVmZXJlbmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTAwMDJiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1NlcnZlclByZWZlcmVuY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi2gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLS8qKgotICogSGVscGVyIGNsYXNzIHRoYXQgc3RvcmVzIHByZWZlcmVuY2UgaW5mb3JtYXRpb24gZm9yIHNlcnZlciB0b29scy4KLSAqLwotcHVibGljIGNsYXNzIFNlcnZlclByZWZlcmVuY2VzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9BVVRPX1JFU1RBUlQgPSAiYXV0by1yZXN0YXJ0IjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9BVVRPX1BVQkxJU0ggPSAiYXV0by1wdWJsaXNoIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9NT0RVTEVfU1RBUlRfVElNRU9VVCA9ICJtb2R1bGUtc3RhcnQtdGltZW91dCI7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfQVVUT19QVUJMSVNIX0xPQ0FMID0gImF1dG8tcHVibGlzaC1sb2NhbCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfQVVUT19QVUJMSVNIX0xPQ0FMX1RJTUUgPSAiYXV0by1wdWJsaXNoLWxvY2FsLXRpbWUiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX0FVVE9fUFVCTElTSF9SRU1PVEUgPSAiYXV0by1wdWJsaXNoLXJlbW90ZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfQVVUT19QVUJMSVNIX1JFTU9URV9USU1FID0gImF1dG8tcHVibGlzaC1yZW1vdGUtdGltZSI7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfTUFDSElORV9TUEVFRCA9ICJtYWNoaW5lLXNwZWVkIjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX1NZTkNfT05fU1RBUlRVUCA9ICJzeW5jLW9uLXN0YXJ0dXAiOwotCi0JcHJpdmF0ZSBQcmVmZXJlbmNlcyBwcmVmZXJlbmNlczsKLQotCXByb3RlY3RlZCBzdGF0aWMgU2VydmVyUHJlZmVyZW5jZXMgaW5zdGFuY2U7Ci0KLQkvKioKLQkgKiBTZXJ2ZXJQcmVmZXJlbmNlIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHJpdmF0ZSBTZXJ2ZXJQcmVmZXJlbmNlcygpIHsKLQkJc3VwZXIoKTsKLQkJcHJlZmVyZW5jZXMgPSBTZXJ2ZXJQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0YXRpYyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzdGF0aWMgaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFNlcnZlclByZWZlcmVuY2VzIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLQkJCWluc3RhbmNlID0gbmV3IFNlcnZlclByZWZlcmVuY2VzKCk7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgc2VydmVycyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgcmVzdGFydGVkIHdoZW4KLQkgKiByZXF1aXJlZC4KLQkgKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQXV0b1Jlc3RhcnRpbmcoKSB7Ci0JCXJldHVybiBwcmVmZXJlbmNlcy5nZXRCb29sZWFuKFBSRUZfQVVUT19SRVNUQVJUKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgc2VydmVycyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgcmVzdGFydGVkIHdoZW4KLQkgKiByZXF1aXJlZC4KLQkgKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdEF1dG9SZXN0YXJ0aW5nKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHB1Ymxpc2hpbmcgc2hvdWxkIG9jY3VyIGJlZm9yZSBzdGFydGluZyB0aGUKLQkgKiBzZXJ2ZXIuCi0JICoKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0F1dG9QdWJsaXNoaW5nKCkgewotCQlyZXR1cm4gcHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihQUkVGX0FVVE9fUFVCTElTSCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciBwdWJsaXNoaW5nIHNob3VsZCBvY2N1ciBiZWZvcmUgc3RhcnRpbmcgdGhlCi0JICogc2VydmVyLgotCSAqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0QXV0b1B1Ymxpc2hpbmcoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFNldCB3aGV0aGVyIHNlcnZlcnMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHJlc3RhcnRlZCB3aGVuCi0JICogdGhleSBuZWVkIGEgcmVzdGFydC4KLQkgKgotCSAqIEBwYXJhbSB2YWx1ZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEF1dG9SZXN0YXJ0aW5nKGJvb2xlYW4gdmFsdWUpIHsKLQkJcHJlZmVyZW5jZXMuc2V0VmFsdWUoUFJFRl9BVVRPX1JFU1RBUlQsIHZhbHVlKTsKLQkJU2VydmVyUGx1Z2luLmdldEluc3RhbmNlKCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHdoZXRoZXIgcHVibGlzaGluZyBzaG91bGQgaGFwcGVuIGJlZm9yZSB0aGUgc2VydmVyIHN0YXJ0cy4KLQkgKgotCSAqIEBwYXJhbSB2YWx1ZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEF1dG9QdWJsaXNoaW5nKGJvb2xlYW4gdmFsdWUpIHsKLQkJcHJlZmVyZW5jZXMuc2V0VmFsdWUoUFJFRl9BVVRPX1BVQkxJU0gsIHZhbHVlKTsKLQkJU2VydmVyUGx1Z2luLmdldEluc3RhbmNlKCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbW9kdWxlIHN0YXJ0IHRpbWVvdXQuCi0JICogCi0JICogQHJldHVybiB0aGUgbW9kdWxlIHN0YXJ0IHRpbWVvdXQKLQkgKi8KLQlwdWJsaWMgaW50IGdldE1vZHVsZVN0YXJ0VGltZW91dCgpIHsKLQkJcmV0dXJuIHByZWZlcmVuY2VzLmdldEludChQUkVGX01PRFVMRV9TVEFSVF9USU1FT1VUKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG1hY2hpbmUgc3BlZWQgaW5kZXgsIGZyb20gMSB0byAxMC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSByZWxhdGl2ZSBzcGVlZAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TWFjaGluZVNwZWVkKCkgewotCQlyZXR1cm4gcHJlZmVyZW5jZXMuZ2V0SW50KFBSRUZfTUFDSElORV9TUEVFRCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgZGVmYXVsdCBtYWNoaW5lIHNwZWVkIGluZGV4LCA1LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGRlZmF1bHQgc3BlZWQgaW5kZXgKLQkgKi8KLQlwdWJsaWMgaW50IGdldERlZmF1bHRNYWNoaW5lU3BlZWQoKSB7Ci0JCXJldHVybiA1OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHJlbGF0aXZlIG1hY2hpbmUgc3BlZWQgaW5kZXgsIGZyb20gMSB0byAxMC4KLQkgKiAKLQkgKiBAcGFyYW0gc3BlZWQgdGhlIHJlbGF0aXZlIHNwZWVkIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1hY2hpbmVTcGVlZChpbnQgc3BlZWQpIHsKLQkJcHJlZmVyZW5jZXMuc2V0VmFsdWUoUFJFRl9NQUNISU5FX1NQRUVELCBzcGVlZCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzeW5jIG9uIHN0YXJ0dXAgdmFsdWUuCi0JICogCi0JICogQHJldHVybiB0aGUgc3luYyBvbiBzdGFydHVwIHZhbHVlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTeW5jT25TdGFydHVwKCkgewotCQlyZXR1cm4gcHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihQUkVGX1NZTkNfT05fU1RBUlRVUCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkZWZhdWx0IHN5bmMgb24gc3RhcnR1cCB2YWx1ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IHN5bmMgb24gc3RhcnR1cCB2YWx1ZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldERlZmF1bHRTeW5jT25TdGFydHVwKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc3luYyBvbiBzdGFydHVwIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBzeW5jIHRoZSBzeW5jIG9uIHN0YXJ0dXAgdmFsdWUgCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3luY09uU3RhcnR1cChib29sZWFuIHN5bmMpIHsKLQkJcHJlZmVyZW5jZXMuc2V0VmFsdWUoUFJFRl9TWU5DX09OX1NUQVJUVVAsIHN5bmMpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRlZmF1bHQgc2V0dGluZyBmb3IgbG9jYWwgYXV0by1wdWJsaXNoaW5nLgotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0RGVmYXVsdEF1dG9QdWJsaXNoTG9jYWwoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZXR0aW5nIGZvciBsb2NhbCBhdXRvLXB1Ymxpc2hpbmcuCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRBdXRvUHVibGlzaExvY2FsKCkgewotCQlyZXR1cm4gcHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihQUkVGX0FVVE9fUFVCTElTSF9MT0NBTCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgZm9yIGxvY2FsIGF1dG8tcHVibGlzaGluZy4KLQkgKiAKLQkgKiBAcGFyYW0gYXV0bwotCSAqLwotCXB1YmxpYyB2b2lkIHNldEF1dG9QdWJsaXNoTG9jYWwoYm9vbGVhbiBhdXRvKSB7Ci0JCXByZWZlcmVuY2VzLnNldFZhbHVlKFBSRUZfQVVUT19QVUJMSVNIX0xPQ0FMLCBhdXRvKTsKLQkJU2VydmVyUGx1Z2luLmdldEluc3RhbmNlKCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRlZmF1bHQgc2V0dGluZyBmb3IgbG9jYWwgYXV0by1wdWJsaXNoaW5nLgotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXREZWZhdWx0QXV0b1B1Ymxpc2hMb2NhbFRpbWUoKSB7Ci0JCXJldHVybiAxNTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZXR0aW5nIGZvciBsb2NhbCBhdXRvLXB1Ymxpc2hpbmcuCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldEF1dG9QdWJsaXNoTG9jYWxUaW1lKCkgewotCQlyZXR1cm4gcHJlZmVyZW5jZXMuZ2V0SW50KFBSRUZfQVVUT19QVUJMSVNIX0xPQ0FMX1RJTUUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIGZvciBsb2NhbCBhdXRvLXB1Ymxpc2hpbmcuCi0JICogCi0JICogQHBhcmFtIGF1dG8KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdXRvUHVibGlzaExvY2FsVGltZShpbnQgYXV0bykgewotCQlwcmVmZXJlbmNlcy5zZXRWYWx1ZShQUkVGX0FVVE9fUFVCTElTSF9MT0NBTF9USU1FLCBhdXRvKTsKLQkJU2VydmVyUGx1Z2luLmdldEluc3RhbmNlKCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGVmYXVsdCBzZXR0aW5nIGZvciByZW1vdGUgYXV0by1wdWJsaXNoaW5nLgotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0RGVmYXVsdEF1dG9QdWJsaXNoUmVtb3RlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2V0dGluZyBmb3IgcmVtb3RlIGF1dG8tcHVibGlzaGluZy4KLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldEF1dG9QdWJsaXNoUmVtb3RlKCkgewotCQlyZXR1cm4gcHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihQUkVGX0FVVE9fUFVCTElTSF9SRU1PVEUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIGZvciByZW1vdGUgYXV0by1wdWJsaXNoaW5nLgotCSAqIAotCSAqIEBwYXJhbSBhdXRvCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXV0b1B1Ymxpc2hSZW1vdGUoYm9vbGVhbiBhdXRvKSB7Ci0JCXByZWZlcmVuY2VzLnNldFZhbHVlKFBSRUZfQVVUT19QVUJMSVNIX1JFTU9URSwgYXV0byk7Ci0JCVNlcnZlclBsdWdpbi5nZXRJbnN0YW5jZSgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRlZmF1bHQgc2V0dGluZyBmb3IgcmVtb3RlIGF1dG8tcHVibGlzaGluZy4KLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RGVmYXVsdEF1dG9QdWJsaXNoUmVtb3RlVGltZSgpIHsKLQkJcmV0dXJuIDYwOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNldHRpbmcgZm9yIHJlbW90ZSBhdXRvLXB1Ymxpc2hpbmcuCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldEF1dG9QdWJsaXNoUmVtb3RlVGltZSgpIHsKLQkJcmV0dXJuIHByZWZlcmVuY2VzLmdldEludChQUkVGX0FVVE9fUFVCTElTSF9SRU1PVEVfVElNRSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgZm9yIHJlbW90ZSBhdXRvLXB1Ymxpc2hpbmcuCi0JICogCi0JICogQHBhcmFtIGF1dG8KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdXRvUHVibGlzaFJlbW90ZVRpbWUoaW50IGF1dG8pIHsKLQkJcHJlZmVyZW5jZXMuc2V0VmFsdWUoUFJFRl9BVVRPX1BVQkxJU0hfUkVNT1RFX1RJTUUsIGF1dG8pOwotCQlTZXJ2ZXJQbHVnaW4uZ2V0SW5zdGFuY2UoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGRlZmF1bHQgdmFsdWVzLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRzKCkgewotCQlwcmVmZXJlbmNlcy5zZXREZWZhdWx0KFBSRUZfQVVUT19QVUJMSVNILCBpc0RlZmF1bHRBdXRvUHVibGlzaGluZygpKTsKLQkJcHJlZmVyZW5jZXMuc2V0RGVmYXVsdChQUkVGX0FVVE9fUkVTVEFSVCwgaXNEZWZhdWx0QXV0b1Jlc3RhcnRpbmcoKSk7Ci0JCXByZWZlcmVuY2VzLnNldERlZmF1bHQoUFJFRl9NQUNISU5FX1NQRUVELCBnZXREZWZhdWx0TWFjaGluZVNwZWVkKCkpOwotCQkKLQkJcHJlZmVyZW5jZXMuc2V0RGVmYXVsdChQUkVGX0FVVE9fUFVCTElTSF9MT0NBTCwgZ2V0RGVmYXVsdEF1dG9QdWJsaXNoTG9jYWwoKSk7Ci0JCXByZWZlcmVuY2VzLnNldERlZmF1bHQoUFJFRl9BVVRPX1BVQkxJU0hfTE9DQUxfVElNRSwgZ2V0RGVmYXVsdEF1dG9QdWJsaXNoTG9jYWxUaW1lKCkpOwotCQlwcmVmZXJlbmNlcy5zZXREZWZhdWx0KFBSRUZfQVVUT19QVUJMSVNIX1JFTU9URSwgZ2V0RGVmYXVsdEF1dG9QdWJsaXNoUmVtb3RlKCkpOwotCQlwcmVmZXJlbmNlcy5zZXREZWZhdWx0KFBSRUZfQVVUT19QVUJMSVNIX1JFTU9URV9USU1FLCBnZXREZWZhdWx0QXV0b1B1Ymxpc2hSZW1vdGVUaW1lKCkpOwotCQkKLQkJcHJlZmVyZW5jZXMuc2V0RGVmYXVsdChQUkVGX1NZTkNfT05fU1RBUlRVUCwgZ2V0RGVmYXVsdFN5bmNPblN0YXJ0dXAoKSk7Ci0JCQotCQlwcmVmZXJlbmNlcy5zZXREZWZhdWx0KFBSRUZfTU9EVUxFX1NUQVJUX1RJTUVPVVQsIDMwMDAwMSk7Ci0JCWJvb2xlYW4gc2F2ZSA9IGZhbHNlOwotCQlpZiAocHJlZmVyZW5jZXMuaXNEZWZhdWx0KFBSRUZfTU9EVUxFX1NUQVJUX1RJTUVPVVQpKSB7Ci0JCQlwcmVmZXJlbmNlcy5zZXRWYWx1ZShQUkVGX01PRFVMRV9TVEFSVF9USU1FT1VULCAzMDAwMDApOwotCQkJc2F2ZSA9IHRydWU7Ci0JCX0KLQkJaWYgKHNhdmUpCi0JCQlTZXJ2ZXJQbHVnaW4uZ2V0SW5zdGFuY2UoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvU2VydmVyUHVibGlzaEluZm8uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1NlcnZlclB1Ymxpc2hJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiN2FkM2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvU2VydmVyUHVibGlzaEluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLaAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklNb2R1bGVGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5JTW9kdWxlRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5JTW9kdWxlUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklNb2R1bGVSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5TZXJ2ZXJCZWhhdmlvdXJEZWxlZ2F0ZTsKLS8qKgotICogSGVscGVyIHRvIG9idGFpbiBhbmQgc3RvcmUgdGhlIHB1Ymxpc2hpbmcgaW5mb3JtYXRpb24gKHdoYXQgZmlsZXMKLSAqIHdlcmUgcHVibGlzaGVkIGFuZCB3aGVuKSBmb3IgYSBzaW5nbGUgc2VydmVyLgotICovCi1wdWJsaWMgY2xhc3MgU2VydmVyUHVibGlzaEluZm8gewotCXByb3RlY3RlZCBJUGF0aCBwYXRoOwotCi0JLy8gbWFwIG9mIG1vZHVsZSBpZHMgdG8gTW9kdWxlUHVibGlzaEluZm8KLQlwcm90ZWN0ZWQgTWFwIG1vZHVsZVB1Ymxpc2hJbmZvOwotCi0JLyoqCi0JICogU2VydmVyUHVibGlzaEluZm8gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgU2VydmVyUHVibGlzaEluZm8oSVBhdGggcGF0aCkgewotCQlzdXBlcigpOwotCQkKLQkJdGhpcy5wYXRoID0gcGF0aDsKLQkJbW9kdWxlUHVibGlzaEluZm8gPSBuZXcgSGFzaE1hcCgpOwotCQlsb2FkKCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0S2V5KElNb2R1bGVbXSBtb2R1bGUpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkKLQkJaWYgKG1vZHVsZSAhPSBudWxsKSB7Ci0JCQlpbnQgc2l6ZSA9IG1vZHVsZS5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCWlmIChpICE9IDApCi0JCQkJCXNiLmFwcGVuZCgiIyIpOwotCQkJCXNiLmFwcGVuZChtb2R1bGVbaV0uZ2V0SWQoKSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldEtleShTdHJpbmcgbW9kdWxlSWQpIHsKLQkJcmV0dXJuIG1vZHVsZUlkOwotCX0KLQkKLQlwcml2YXRlIElNb2R1bGVbXSBnZXRNb2R1bGUoU3RyaW5nIG1vZHVsZUlkKSB7Ci0JCWlmIChtb2R1bGVJZCA9PSBudWxsIHx8IG1vZHVsZUlkLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gbmV3IElNb2R1bGVbMF07Ci0JCQotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCVN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIobW9kdWxlSWQsICIjIik7Ci0JCXdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCVN0cmluZyBtaWQgPSBzdC5uZXh0VG9rZW4oKTsKLQkJCWlmIChtaWQgIT0gbnVsbCAmJiBtaWQubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJSU1vZHVsZSBtID0gU2VydmVyVXRpbC5nZXRNb2R1bGUobWlkKTsKLQkJCQlpZiAobSA9PSBudWxsKQotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQlsaXN0LmFkZChtKTsKLQkJCX0KLQkJfQotCQkKLQkJSU1vZHVsZVtdIG1vZHVsZXMgPSBuZXcgSU1vZHVsZVtsaXN0LnNpemUoKV07Ci0JCWxpc3QudG9BcnJheShtb2R1bGVzKTsKLQkJcmV0dXJuIG1vZHVsZXM7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzTW9kdWxlUHVibGlzaEluZm8oSU1vZHVsZVtdIG1vZHVsZSkgewotCQlTdHJpbmcga2V5ID0gZ2V0S2V5KG1vZHVsZSk7Ci0JCXJldHVybiBtb2R1bGVQdWJsaXNoSW5mby5jb250YWluc0tleShrZXkpOwotCX0KLQotCS8qcHVibGljIHZvaWQgcmVtb3ZlTW9kdWxlUHVibGlzaEluZm8oSU1vZHVsZVtdIG1vZHVsZSkgewotCQlTdHJpbmcga2V5ID0gZ2V0S2V5KG1vZHVsZSk7Ci0JCW1vZHVsZVB1Ymxpc2hJbmZvLnJlbW92ZShrZXkpOwotCQkKLQkJc2F2ZSgpOwotCX0qLwotCi0JLyoqCi0JICogCi0JICogTm90ZTogc2F2ZSgpIG11c3QgYmUgY2FsbGVkIG1hbnVhbGx5IGFmdGVyIG1ha2luZyB0aGlzIGNhbGwuCi0JICogCi0JICogQHBhcmFtIG1vZHVsZUxpc3QKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVEZWxldGVkTW9kdWxlUHVibGlzaEluZm8oTGlzdCBtb2R1bGVMaXN0KSB7Ci0JCWludCBzaXplID0gbW9kdWxlTGlzdC5zaXplKCk7Ci0JCUxpc3QgcmVtb3ZlZCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbW9kdWxlUHVibGlzaEluZm8ua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJU3RyaW5nIGtleSA9IChTdHJpbmcpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQotCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlJTW9kdWxlW10gbW9kdWxlID0gKElNb2R1bGVbXSkgbW9kdWxlTGlzdC5nZXQoaSk7Ci0JCQkJU3RyaW5nIGtleTIgPSBnZXRLZXkobW9kdWxlKTsKLQkJCQlpZiAoa2V5ICE9IG51bGwgJiYga2V5LmVxdWFscyhrZXkyKSkKLQkJCQkJZm91bmQgPSB0cnVlOwotCQkJfQotCQkJaWYgKCFmb3VuZCkKLQkJCQlyZW1vdmVkLmFkZChrZXkpOwotCQl9Ci0JCQotCQlpdGVyYXRvciA9IHJlbW92ZWQuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJU3RyaW5nIGtleSA9IChTdHJpbmcpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCW1vZHVsZVB1Ymxpc2hJbmZvLnJlbW92ZShrZXkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwdWJsaXNoIHN0YXRlLgotCSAqLwotCXByb3RlY3RlZCBNb2R1bGVQdWJsaXNoSW5mbyBnZXRNb2R1bGVQdWJsaXNoSW5mbyhJTW9kdWxlW10gbW9kdWxlKSB7Ci0JCVN0cmluZyBrZXkgPSBnZXRLZXkobW9kdWxlKTsKLQotCQkvLyBjaGVjayBpZiBpdCBub3cgZXhpc3RzCi0JCWlmIChtb2R1bGVQdWJsaXNoSW5mby5jb250YWluc0tleShrZXkpKQotCQkJcmV0dXJuIChNb2R1bGVQdWJsaXNoSW5mbykgbW9kdWxlUHVibGlzaEluZm8uZ2V0KGtleSk7Ci0JCi0JCS8vIGhhdmUgdG8gY3JlYXRlIGEgbmV3IG9uZQotCQlJTW9kdWxlIG1vZCA9IG1vZHVsZVttb2R1bGUubGVuZ3RoIC0gMV07Ci0JCU1vZHVsZVB1Ymxpc2hJbmZvIG1waSA9IG5ldyBNb2R1bGVQdWJsaXNoSW5mbyhnZXRLZXkobW9kdWxlKSwgbW9kLmdldE5hbWUoKSwgbW9kLmdldE1vZHVsZVR5cGUoKSk7Ci0JCW1vZHVsZVB1Ymxpc2hJbmZvLnB1dChrZXksIG1waSk7Ci0JCXJldHVybiBtcGk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkUmVtb3ZlZE1vZHVsZXMoTGlzdCBtb2R1bGVMaXN0LCBMaXN0IGtpbmRMaXN0KSB7Ci0JCWludCBzaXplID0gbW9kdWxlTGlzdC5zaXplKCk7Ci0JCUxpc3QgcmVtb3ZlZCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBtb2R1bGVQdWJsaXNoSW5mby5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlTdHJpbmcga2V5ID0gKFN0cmluZykgaXRlcmF0b3IubmV4dCgpOwotCQkKLQkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJSU1vZHVsZVtdIG1vZHVsZSA9IChJTW9kdWxlW10pIG1vZHVsZUxpc3QuZ2V0KGkpOwotCQkJCVN0cmluZyBrZXkyID0gZ2V0S2V5KG1vZHVsZSk7Ci0JCQkJaWYgKGtleSAhPSBudWxsICYmIGtleS5lcXVhbHMoa2V5MikpCi0JCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCX0KLQkJCWlmICghZm91bmQpIHsKLQkJCQlNb2R1bGVQdWJsaXNoSW5mbyBtcGkgPSAoTW9kdWxlUHVibGlzaEluZm8pIG1vZHVsZVB1Ymxpc2hJbmZvLmdldChrZXkpOwotCQkJCXJlbW92ZWQuYWRkKG1waSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCWl0ZXJhdG9yID0gcmVtb3ZlZC5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlNb2R1bGVQdWJsaXNoSW5mbyBtcGkgPSAoTW9kdWxlUHVibGlzaEluZm8pIGl0ZXJhdG9yLm5leHQoKTsKLQkJCUlNb2R1bGVbXSBtb2R1bGUyID0gZ2V0TW9kdWxlKG1waS5nZXRNb2R1bGVJZCgpKTsKLQkJCWlmIChtb2R1bGUyID09IG51bGwgfHwgbW9kdWxlMi5sZW5ndGggPT0gMCkgewotCQkJCVN0cmluZyBtb2R1bGVJZCA9IG1waS5nZXRNb2R1bGVJZCgpOwotCQkJCWlmIChtb2R1bGVJZCAhPSBudWxsKSB7Ci0JCQkJCWludCBpbmRleCA9IG1vZHVsZUlkLmxhc3RJbmRleE9mKCIjIik7Ci0JCQkJCW1vZHVsZTIgPSBuZXcgSU1vZHVsZVtdIHsgbmV3IERlbGV0ZWRNb2R1bGUobW9kdWxlSWQuc3Vic3RyaW5nKGluZGV4ICsgMSksIG1waS5nZXROYW1lKCksIG1waS5nZXRNb2R1bGVUeXBlKCkpIH07Ci0JCQkJfQotCQkJfQotCQkJaWYgKG1vZHVsZTIgIT0gbnVsbCAmJiBtb2R1bGUyLmxlbmd0aCA+IDApIHsKLQkJCQltb2R1bGVMaXN0LmFkZChtb2R1bGUyKTsKLQkJCQlraW5kTGlzdC5hZGQobmV3IEludGVnZXIoU2VydmVyQmVoYXZpb3VyRGVsZWdhdGUuUkVNT1ZFRCkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgbG9hZCgpIHsKLQkJU3RyaW5nIGZpbGVuYW1lID0gcGF0aC50b09TU3RyaW5nKCk7Ci0JCWlmICghKG5ldyBGaWxlKGZpbGVuYW1lKS5leGlzdHMoKSkpCi0JCQlyZXR1cm47Ci0JCi0JCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIkxvYWRpbmcgcHVibGlzaCBpbmZvIGZyb20gIiArIGZpbGVuYW1lKTsKLQotCQl0cnkgewotCQkJSU1lbWVudG8gbWVtZW50bzIgPSBYTUxNZW1lbnRvLmxvYWRNZW1lbnRvKGZpbGVuYW1lKTsKLQkJCUlNZW1lbnRvW10gY2hpbGRyZW4gPSBtZW1lbnRvMi5nZXRDaGlsZHJlbigibW9kdWxlIik7Ci0JCi0JCQlpbnQgc2l6ZSA9IGNoaWxkcmVuLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJTW9kdWxlUHVibGlzaEluZm8gbXBpID0gbmV3IE1vZHVsZVB1Ymxpc2hJbmZvKGNoaWxkcmVuW2ldKTsKLQkJCQltb2R1bGVQdWJsaXNoSW5mby5wdXQoZ2V0S2V5KG1waS5nZXRNb2R1bGVJZCgpKSwgbXBpKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJDb3VsZCBub3QgbG9hZCBwdWJsaXNoIGluZm9ybWF0aW9uOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZSgpIHsKLQkJU3RyaW5nIGZpbGVuYW1lID0gcGF0aC50b09TU3RyaW5nKCk7Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIlNhdmluZyBwdWJsaXNoIGluZm8gdG8gIiArIGZpbGVuYW1lKTsKLQkKLQkJdHJ5IHsKLQkJCVhNTE1lbWVudG8gbWVtZW50byA9IFhNTE1lbWVudG8uY3JlYXRlV3JpdGVSb290KCJzZXJ2ZXIiKTsKLQotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBtb2R1bGVQdWJsaXNoSW5mby5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCVN0cmluZyBjb250cm9sUmVmID0gKFN0cmluZykgaXRlcmF0b3IubmV4dCgpOwotCQkJCU1vZHVsZVB1Ymxpc2hJbmZvIG1waSA9IChNb2R1bGVQdWJsaXNoSW5mbykgbW9kdWxlUHVibGlzaEluZm8uZ2V0KGNvbnRyb2xSZWYpOwotCQkJCUlNZW1lbnRvIGNoaWxkID0gbWVtZW50by5jcmVhdGVDaGlsZCgibW9kdWxlIik7Ci0JCQkJbXBpLnNhdmUoY2hpbGQpOwotCQkJfQotCQkJbWVtZW50by5zYXZlVG9GaWxlKGZpbGVuYW1lKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBzYXZlIHB1Ymxpc2ggaW5mb3JtYXRpb24iLCBlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqIE5vdGU6IHNhdmUoKSBtdXN0IGJlIGNhbGxlZCBtYW51YWxseSBhZnRlciBtYWtpbmcgdGhpcyBjYWxsLgotCSAqIEBwYXJhbSBtb2R1bGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaWxsKElNb2R1bGVbXSBtb2R1bGUpIHsKLQkJTW9kdWxlUHVibGlzaEluZm8gbXBpID0gZ2V0TW9kdWxlUHVibGlzaEluZm8obW9kdWxlKTsKLQkJbXBpLmZpbGwobW9kdWxlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSU1vZHVsZVJlc291cmNlRGVsdGFbXSBnZXREZWx0YShJTW9kdWxlW10gbW9kdWxlKSB7Ci0JCWlmIChtb2R1bGUgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgSU1vZHVsZVJlc291cmNlRGVsdGFbMF07Ci0JCQotCQlyZXR1cm4gZ2V0TW9kdWxlUHVibGlzaEluZm8obW9kdWxlKS5nZXREZWx0YShtb2R1bGUpOwotCX0KLQotCXByb3RlY3RlZCBJTW9kdWxlUmVzb3VyY2VbXSBnZXRSZXNvdXJjZXMoSU1vZHVsZVtdIG1vZHVsZSkgewotCQlpZiAobW9kdWxlID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IElNb2R1bGVSZXNvdXJjZVswXTsKLQkJCi0JCXJldHVybiBnZXRNb2R1bGVQdWJsaXNoSW5mbyhtb2R1bGUpLmdldE1vZHVsZVJlc291cmNlcyhtb2R1bGUpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgSU1vZHVsZVJlc291cmNlRGVsdGFbXSBnZXREZWx0YShJTW9kdWxlUmVzb3VyY2VbXSBvcmlnaW5hbCwgSU1vZHVsZVJlc291cmNlW10gY3VycmVudCkgewotCQlpZiAob3JpZ2luYWwgPT0gbnVsbCB8fCBjdXJyZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IElNb2R1bGVSZXNvdXJjZURlbHRhWzBdOwotCQotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWludCBzaXplID0gb3JpZ2luYWwubGVuZ3RoOwotCQlpbnQgc2l6ZTIgPSBjdXJyZW50Lmxlbmd0aDsKLQkJCi0JCU1hcCBvcmlnaW5hbE1hcCA9IG5ldyBIYXNoTWFwKHNpemUpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLQkJCW9yaWdpbmFsTWFwLnB1dChvcmlnaW5hbFtpXSwgb3JpZ2luYWxbaV0pOwotCi0JCS8vIGFkZGVkIGFuZCBjaGFuZ2VkIHJlc291cmNlcwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemUyOyBpKyspIHsKLQkJCUlNb2R1bGVSZXNvdXJjZSBvbGQgPSAoSU1vZHVsZVJlc291cmNlKSBvcmlnaW5hbE1hcC5yZW1vdmUoY3VycmVudFtpXSk7Ci0JCQlpZiAob2xkID09IG51bGwpIHsKLQkJCQlNb2R1bGVSZXNvdXJjZURlbHRhIGRlbHRhID0gbmV3IE1vZHVsZVJlc291cmNlRGVsdGEoY3VycmVudFtpXSwgSU1vZHVsZVJlc291cmNlRGVsdGEuQURERUQpOwotCQkJCWlmIChjdXJyZW50W2ldIGluc3RhbmNlb2YgSU1vZHVsZUZvbGRlcikgewotCQkJCQlJTW9kdWxlRm9sZGVyIGN1cnJlbnRGb2xkZXIgPSAoSU1vZHVsZUZvbGRlcikgY3VycmVudFtpXTsgCi0JCQkJCWRlbHRhLnNldENoaWxkcmVuKGdldERlbHRhVHJlZShjdXJyZW50Rm9sZGVyLm1lbWJlcnMoKSwgSU1vZHVsZVJlc291cmNlRGVsdGEuQURERUQpKTsKLQkJCQl9Ci0JCQkJbGlzdC5hZGQoZGVsdGEpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoY3VycmVudFtpXSBpbnN0YW5jZW9mIElNb2R1bGVGaWxlKSB7Ci0JCQkJCS8vIGluY2x1ZGUgZmlsZXMgb25seSBpZiB0aGUgbW9kaWZpY2F0aW9uIHN0YW1wIGhhcyBjaGFuZ2VkCi0JCQkJCUlNb2R1bGVGaWxlIG1mMSA9IChJTW9kdWxlRmlsZSkgb2xkOwotCQkJCQlJTW9kdWxlRmlsZSBtZjIgPSAoSU1vZHVsZUZpbGUpIGN1cnJlbnRbaV07Ci0JCQkJCWlmIChtZjEuZ2V0TW9kaWZpY2F0aW9uU3RhbXAoKSAhPSBtZjIuZ2V0TW9kaWZpY2F0aW9uU3RhbXAoKSkgewotCQkJCQkJbGlzdC5hZGQobmV3IE1vZHVsZVJlc291cmNlRGVsdGEoY3VycmVudFtpXSwgSU1vZHVsZVJlc291cmNlRGVsdGEuQ0hBTkdFRCkpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gaW5jbHVkZSBmb2xkZXJzIG9ubHkgaWYgdGhlaXIgY29udGVudHMgaGF2ZSBjaGFuZ2VkCi0JCQkJCUlNb2R1bGVGb2xkZXIgbWYxID0gKElNb2R1bGVGb2xkZXIpIG9sZDsKLQkJCQkJSU1vZHVsZUZvbGRlciBtZjIgPSAoSU1vZHVsZUZvbGRlcikgY3VycmVudFtpXTsKLQkJCQkJSU1vZHVsZVJlc291cmNlRGVsdGFbXSBtcmRjID0gZ2V0RGVsdGEobWYxLm1lbWJlcnMoKSwgbWYyLm1lbWJlcnMoKSk7Ci0JCQkJCWlmIChtcmRjLmxlbmd0aCA+IDApIHsKLQkJCQkJCU1vZHVsZVJlc291cmNlRGVsdGEgbXJkID0gbmV3IE1vZHVsZVJlc291cmNlRGVsdGEoY3VycmVudFtpXSwgSU1vZHVsZVJlc291cmNlRGVsdGEuTk9fQ0hBTkdFKTsKLQkJCQkJCW1yZC5zZXRDaGlsZHJlbihtcmRjKTsKLQkJCQkJCWxpc3QuYWRkKG1yZCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIHJlbW92ZWQgcmVzb3VyY2VzCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlpZiAob3JpZ2luYWxNYXAuY29udGFpbnNLZXkob3JpZ2luYWxbaV0pKSB7Ci0JCQkJTW9kdWxlUmVzb3VyY2VEZWx0YSBkZWx0YSA9IG5ldyBNb2R1bGVSZXNvdXJjZURlbHRhKG9yaWdpbmFsW2ldLCBJTW9kdWxlUmVzb3VyY2VEZWx0YS5SRU1PVkVEKTsKLQkJCQlpZiAob3JpZ2luYWxbaV0gaW5zdGFuY2VvZiBJTW9kdWxlRm9sZGVyKSB7Ci0JCQkJCUlNb2R1bGVGb2xkZXIgcmVtb3ZlZEZvbGRlciA9IChJTW9kdWxlRm9sZGVyKSBvcmlnaW5hbFtpXTsgCi0JCQkJCWRlbHRhLnNldENoaWxkcmVuKGdldERlbHRhVHJlZShyZW1vdmVkRm9sZGVyLm1lbWJlcnMoKSwgSU1vZHVsZVJlc291cmNlRGVsdGEuUkVNT1ZFRCkpOwotCQkJCX0KLQkJCQlsaXN0LmFkZChkZWx0YSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiAoSU1vZHVsZVJlc291cmNlRGVsdGFbXSkgbGlzdC50b0FycmF5KG5ldyBJTW9kdWxlUmVzb3VyY2VEZWx0YVtsaXN0LnNpemUoKV0pOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGhhc0RlbHRhKElNb2R1bGVbXSBtb2R1bGUpIHsKLQkJaWYgKG1vZHVsZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJcmV0dXJuIGdldE1vZHVsZVB1Ymxpc2hJbmZvKG1vZHVsZSkuaGFzRGVsdGEobW9kdWxlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaGFzRGVsdGEoSU1vZHVsZVJlc291cmNlW10gb3JpZ2luYWwsIElNb2R1bGVSZXNvdXJjZVtdIGN1cnJlbnQpIHsKLQkJaWYgKG9yaWdpbmFsID09IG51bGwgfHwgY3VycmVudCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJaW50IHNpemUgPSBvcmlnaW5hbC5sZW5ndGg7Ci0JCWludCBzaXplMiA9IGN1cnJlbnQubGVuZ3RoOwotCQkKLQkJTWFwIG9yaWdpbmFsTWFwID0gbmV3IEhhc2hNYXAoc2l6ZSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotCQkJb3JpZ2luYWxNYXAucHV0KG9yaWdpbmFsW2ldLCBvcmlnaW5hbFtpXSk7Ci0JCQotCQkvLyBhZGRlZCBhbmQgY2hhbmdlZCByZXNvdXJjZXMKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplMjsgaSsrKSB7Ci0JCQlJTW9kdWxlUmVzb3VyY2Ugb2xkID0gKElNb2R1bGVSZXNvdXJjZSkgb3JpZ2luYWxNYXAucmVtb3ZlKGN1cnJlbnRbaV0pOwotCQkJaWYgKG9sZCA9PSBudWxsKQotCQkJCXJldHVybiB0cnVlOwotCQkJCi0JCQlpZiAoY3VycmVudFtpXSBpbnN0YW5jZW9mIElNb2R1bGVGaWxlKSB7Ci0JCQkJLy8gaW5jbHVkZSBmaWxlcyBvbmx5IGlmIHRoZSBtb2RpZmljYXRpb24gc3RhbXAgaGFzIGNoYW5nZWQKLQkJCQlJTW9kdWxlRmlsZSBtZjEgPSAoSU1vZHVsZUZpbGUpIG9sZDsKLQkJCQlJTW9kdWxlRmlsZSBtZjIgPSAoSU1vZHVsZUZpbGUpIGN1cnJlbnRbaV07Ci0JCQkJaWYgKG1mMS5nZXRNb2RpZmljYXRpb25TdGFtcCgpICE9IG1mMi5nZXRNb2RpZmljYXRpb25TdGFtcCgpKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gaW5jbHVkZSBmb2xkZXJzIG9ubHkgaWYgdGhlaXIgY29udGVudHMgaGF2ZSBjaGFuZ2VkCi0JCQkJSU1vZHVsZUZvbGRlciBtZjEgPSAoSU1vZHVsZUZvbGRlcikgb2xkOwotCQkJCUlNb2R1bGVGb2xkZXIgbWYyID0gKElNb2R1bGVGb2xkZXIpIGN1cnJlbnRbaV07Ci0JCQkJaWYgKGhhc0RlbHRhKG1mMS5tZW1iZXJzKCksIG1mMi5tZW1iZXJzKCkpKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQkKLQkJLy8gcmVtb3ZlZCByZXNvdXJjZXMKLQkJcmV0dXJuICFvcmlnaW5hbE1hcC5pc0VtcHR5KCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgcmVzb3VyY2UgZGVsdGEgZm9yIGFuIGVudGlyZSB0cmVlLgotCSAqLwotCXByaXZhdGUgc3RhdGljIElNb2R1bGVSZXNvdXJjZURlbHRhW10gZ2V0RGVsdGFUcmVlKElNb2R1bGVSZXNvdXJjZVtdIHJlc291cmNlcywgaW50IGtpbmQpIHsKLQkJaWYgKHJlc291cmNlcyA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBJTW9kdWxlUmVzb3VyY2VEZWx0YVswXTsKLQkKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkKLQkJLy8gbG9vayBmb3IgZHVwbGljYXRlcwotCQlpbnQgc2l6ZSA9IHJlc291cmNlcy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlNb2R1bGVSZXNvdXJjZURlbHRhIG1yZCA9IG5ldyBNb2R1bGVSZXNvdXJjZURlbHRhKHJlc291cmNlc1tpXSwga2luZCk7Ci0JCQlpZiAocmVzb3VyY2VzW2ldIGluc3RhbmNlb2YgSU1vZHVsZUZvbGRlcikgewotCQkJCUlNb2R1bGVGb2xkZXIgbWYgPSAoSU1vZHVsZUZvbGRlcikgcmVzb3VyY2VzW2ldOwotCQkJCW1yZC5zZXRDaGlsZHJlbihnZXREZWx0YVRyZWUobWYubWVtYmVycygpLCBraW5kKSk7Ci0JCQl9Ci0JCQlsaXN0LmFkZChtcmQpOwotCQl9Ci0JCQotCQlJTW9kdWxlUmVzb3VyY2VEZWx0YVtdIGRlbHRhID0gbmV3IElNb2R1bGVSZXNvdXJjZURlbHRhW2xpc3Quc2l6ZSgpXTsKLQkJbGlzdC50b0FycmF5KGRlbHRhKTsKLQkJcmV0dXJuIGRlbHRhOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgbGlzdCBvZiBtb2R1bGVzIGJlaW5nIHB1Ymxpc2hlZCBkb2VzIG5vdCBtYXRjaCB0aGUgcHJldmlvdXMKLQkgKiBsaXN0IG9mIHB1Ymxpc2hlZCBtb2R1bGVzLgotCSAqIAotCSAqIFRPRE86IFRoaXMgbWV0aG9kIHNob3VsZCBjb21wYXJlIHRoZSBtb2R1bGVzLiBGb3Igbm93LCBjb21wYXJpbmcgdGhlIHNpemUgaXMgZmluZS4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kdWxlcyBhIGxpc3Qgb2YgbW9kdWxlcwotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHN0cnVjdHVyZSBvZiBwdWJsaXNoZWQgbW9kdWxlcyBoYXMgY2hhbmdlZCwgb3IKLQkgKiAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzU3RydWN0dXJlQ2hhbmdlZChMaXN0IG1vZHVsZXMpIHsKLQkJcmV0dXJuIG1vZHVsZXMuc2l6ZSgpICE9IG1vZHVsZVB1Ymxpc2hJbmZvLmtleVNldCgpLnNpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiBGaWxsIHRoZSBtb2R1bGUgY2FjaGUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc3RhcnRDYWNoaW5nKCkgewotCQlJdGVyYXRvciBpdGVyYXRvciA9IG1vZHVsZVB1Ymxpc2hJbmZvLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCU1vZHVsZVB1Ymxpc2hJbmZvIG1waSA9IChNb2R1bGVQdWJsaXNoSW5mbykgaXRlcmF0b3IubmV4dCgpOwotCQkJbXBpLnN0YXJ0Q2FjaGluZygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2xlYXJzIGFsbCBjYWNoZXMgb2YgY3VycmVudCBtb2R1bGUgcmVzb3VyY2VzIGFuZCBkZWx0YXMuCi0JICovCi0JcHVibGljIHZvaWQgY2xlYXJDYWNoZSgpIHsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBtb2R1bGVQdWJsaXNoSW5mby52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlNb2R1bGVQdWJsaXNoSW5mbyBtcGkgPSAoTW9kdWxlUHVibGlzaEluZm8pIGl0ZXJhdG9yLm5leHQoKTsKLQkJCW1waS5jbGVhckNhY2hlKCk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvU2VydmVyU2NoZWR1bGluZ1J1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1NlcnZlclNjaGVkdWxpbmdSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhNWFhZjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvU2VydmVyU2NoZWR1bGluZ1J1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotoCogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotLyoqCi0gKiBTaW1wbGUgam9iIHNjaGVkdWxpbmcgcnVsZSB0aGF0IHN0b3BzIGEgc2VydmVyIGZyb20gc3RhcnRpbmcsCi0gKiBwdWJsaXNoaW5nLCBvciBzdG9wcGluZyBhdCB0aGUgc2FtZSB0aW1lLgotICovCi1wdWJsaWMgY2xhc3MgU2VydmVyU2NoZWR1bGluZ1J1bGUgaW1wbGVtZW50cyBJU2NoZWR1bGluZ1J1bGUgewotCXByb3RlY3RlZCBJU2VydmVyIHNlcnZlcjsKLQkKLQlwdWJsaWMgU2VydmVyU2NoZWR1bGluZ1J1bGUoSVNlcnZlciBzZXJ2ZXIpIHsKLQkJdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKElTY2hlZHVsaW5nUnVsZSBydWxlKSB7Ci0JCWlmICghKHJ1bGUgaW5zdGFuY2VvZiBTZXJ2ZXJTY2hlZHVsaW5nUnVsZSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0NvbmZsaWN0aW5nKElTY2hlZHVsaW5nUnVsZSBydWxlKSB7Ci0JCWlmICghKHJ1bGUgaW5zdGFuY2VvZiBTZXJ2ZXJTY2hlZHVsaW5nUnVsZSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQlTZXJ2ZXJTY2hlZHVsaW5nUnVsZSBzc3J1bGUgPSAoU2VydmVyU2NoZWR1bGluZ1J1bGUpIHJ1bGU7Ci0JCXJldHVybiBzc3J1bGUuc2VydmVyLmVxdWFscyhzZXJ2ZXIpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIlNlcnZlciBzY2hlZHVsaW5nIHJ1bGUgZm9yICIgKyBzZXJ2ZXI7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1NlcnZlclR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1NlcnZlclR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhiYTgzZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9TZXJ2ZXJUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkRlYnVnUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaE1hbmFnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5TZXJ2ZXJCZWhhdmlvdXJEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuU2VydmVyRGVsZWdhdGU7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgU2VydmVyVHlwZSBpbXBsZW1lbnRzIElTZXJ2ZXJUeXBlIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9USU1FT1VUID0gMTAwMCAqIDYwICogNTsKLQlwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50OwotCi0JLyoqCi0JICogU2VydmVyVHlwZSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IGEgY29uZmlndXJhdGlvbiBlbGVtZW50Ci0JICovCi0JcHVibGljIFNlcnZlclR5cGUoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpZCBvZiB0aGlzIGZhY3RvcnkuCi0JICoKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQl0cnkgewotCQkJcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJpZCIpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoIm5hbWUiKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc3RhcnRCZWZvcmVQdWJsaXNoKCkgewotCQl0cnkgewotCQkJcmV0dXJuICJ0cnVlIi5lcXVhbHMoZWxlbWVudC5nZXRBdHRyaWJ1dGUoInN0YXJ0QmVmb3JlUHVibGlzaCIpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImRlc2NyaXB0aW9uIik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBTZXJ2ZXJEZWxlZ2F0ZSBjcmVhdGVTZXJ2ZXJEZWxlZ2F0ZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCXJldHVybiAoU2VydmVyRGVsZWdhdGUpIGVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBTZXJ2ZXJCZWhhdmlvdXJEZWxlZ2F0ZSBjcmVhdGVTZXJ2ZXJCZWhhdmlvdXJEZWxlZ2F0ZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCXJldHVybiAoU2VydmVyQmVoYXZpb3VyRGVsZWdhdGUpIGVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiYmVoYXZpb3VyQ2xhc3MiKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIElSdW50aW1lVHlwZSBnZXRSdW50aW1lVHlwZSgpIHsKLQkJdHJ5IHsKLQkJCVN0cmluZyB0eXBlSWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgicnVudGltZVR5cGVJZCIpOwotCQkJaWYgKHR5cGVJZCA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJcmV0dXJuIFNlcnZlckNvcmUuZmluZFJ1bnRpbWVUeXBlKHR5cGVJZCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc1J1bnRpbWUoKSB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgcyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJydW50aW1lIik7Ci0JCQlyZXR1cm4gInRydWUiLmVxdWFscyhzKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCXB1YmxpYyBJTGF1bmNoQ29uZmlndXJhdGlvblR5cGUgZ2V0TGF1bmNoQ29uZmlndXJhdGlvblR5cGUoKSB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgbGF1bmNoQ29uZmlnSWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgibGF1bmNoQ29uZmlnSWQiKTsKLQkJCWlmIChsYXVuY2hDb25maWdJZCA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJSUxhdW5jaE1hbmFnZXIgbGF1bmNoTWFuYWdlciA9IERlYnVnUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMYXVuY2hNYW5hZ2VyKCk7Ci0JCQlyZXR1cm4gbGF1bmNoTWFuYWdlci5nZXRMYXVuY2hDb25maWd1cmF0aW9uVHlwZShsYXVuY2hDb25maWdJZCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHNlcnZlciBjYW4gc3RhcnQgb3IgbWF5IGFscmVhZHkgYmUgc3RhcnRlZAotCSAqIGluIHRoZSBnaXZlbiBtb2RlLCBhbmQgZmFsc2UgaWYgbm90LiBVc2VzIHRoZSBsYXVuY2hNb2RlIGF0dHJpYnV0ZSwKLQkgKiB3aGljaCBtYXkgY29udGFpbiB0aGUgc3RyaW5ncyAicnVuIiwgImRlYnVnIiwgYW5kL29yICJwcm9maWxlIi4KLQkgKiAKLQkgKiBAcGFyYW0gbGF1bmNoTW9kZSBTdHJpbmcKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0xhdW5jaE1vZGUoU3RyaW5nIGxhdW5jaE1vZGUpIHsKLQkJdHJ5IHsKLQkJCUlMYXVuY2hDb25maWd1cmF0aW9uVHlwZSBjb25maWdUeXBlID0gZ2V0TGF1bmNoQ29uZmlndXJhdGlvblR5cGUoKTsKLQkJCWlmIChjb25maWdUeXBlICE9IG51bGwpCi0JCQkJcmV0dXJuIGNvbmZpZ1R5cGUuc3VwcG9ydHNNb2RlKGxhdW5jaE1vZGUpOwotCQkJCi0JCQlTdHJpbmcgbW9kZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJsYXVuY2hNb2RlcyIpOwotCQkJaWYgKG1vZGUgPT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlyZXR1cm4gbW9kZS5pbmRleE9mKGxhdW5jaE1vZGUpID49IDA7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1JlbW90ZUhvc3RzKCkgewotCQl0cnkgewotCQkJU3RyaW5nIGhvc3RzID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoInN1cHBvcnRzUmVtb3RlSG9zdHMiKTsKLQkJCXJldHVybiAoaG9zdHMgIT0gbnVsbCAmJiBob3N0cy50b0xvd2VyQ2FzZSgpLmVxdWFscygidHJ1ZSIpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCXB1YmxpYyBieXRlIGdldEluaXRpYWxTdGF0ZSgpIHsKLQkJdHJ5IHsKLQkJCVN0cmluZyBzdGF0ZVN0cmluZyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJpbml0aWFsU3RhdGUiKTsKLQkJCWlmIChzdGF0ZVN0cmluZyAhPSBudWxsKQotCQkJCXN0YXRlU3RyaW5nID0gc3RhdGVTdHJpbmcudG9Mb3dlckNhc2UoKTsKLQkJCWlmICgic3RvcHBlZCIuZXF1YWxzKHN0YXRlU3RyaW5nKSkKLQkJCQlyZXR1cm4gSVNlcnZlci5TVEFURV9TVE9QUEVEOwotCQkJZWxzZSBpZiAoInN0YXJ0ZWQiLmVxdWFscyhzdGF0ZVN0cmluZykpCi0JCQkJcmV0dXJuIElTZXJ2ZXIuU1RBVEVfU1RBUlRFRDsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCXJldHVybiBJU2VydmVyLlNUQVRFX1VOS05PV047Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzU2VydmVyQ29uZmlndXJhdGlvbigpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiAoInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoZWxlbWVudC5nZXRBdHRyaWJ1dGUoImhhc0NvbmZpZ3VyYXRpb24iKSkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JcHVibGljIElTZXJ2ZXJXb3JraW5nQ29weSBjcmVhdGVTZXJ2ZXIoU3RyaW5nIGlkLCBJRmlsZSBmaWxlLCBJUnVudGltZSBydW50aW1lLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkKLQkJaWYgKGlkID09IG51bGwgfHwgaWQubGVuZ3RoKCkgPT0gMCkKLQkJCWlkID0gU2VydmVyUGx1Z2luLmdlbmVyYXRlSWQoKTsKLQkJU2VydmVyV29ya2luZ0NvcHkgc3djID0gbmV3IFNlcnZlcldvcmtpbmdDb3B5KGlkLCBmaWxlLCBydW50aW1lLCB0aGlzKTsKLQkJc3djLnNldFJ1bnRpbWUocnVudGltZSk7Ci0JCXN3Yy5zZXREZWZhdWx0cyhtb25pdG9yKTsKLQkJCi0JCS8vIFRPRE8KLQkJaWYgKHN3Yy5nZXRTZXJ2ZXJUeXBlKCkuaGFzU2VydmVyQ29uZmlndXJhdGlvbigpKQotCQkJc3djLmltcG9ydENvbmZpZ3VyYXRpb24ocnVudGltZSwgbnVsbCk7Ci0JCQotCQlyZXR1cm4gc3djOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGFsbCBrbm93biBydW50aW1lIGluc3RhbmNlcyBvZgotCSAqIHRoZSBnaXZlbiBydW50aW1lIHR5cGUuIFRoaXMgY29udmVuaWVuY2UgbWV0aG9kIGZpbHRlcnMgdGhlIGxpc3Qgb2Yga25vd24KLQkgKiBydW50aW1lICh7QGxpbmsgU2VydmVyQ29yZSNnZXRSdW50aW1lcygpfSkgZm9yIG9uZXMgd2l0aCBhIG1hdGNoaW5nCi0JICogcnVudGltZSB0eXBlICh7QGxpbmsgSVJ1bnRpbWUjZ2V0UnVudGltZVR5cGUoKX0pLiBUaGUgYXJyYXkgd2lsbCBub3QKLQkgKiBjb250YWluIGFueSB3b3JraW5nIGNvcGllcy4KLQkgKiA8cD4KLQkgKiBBIG5ldyBhcnJheSBpcyByZXR1cm5lZCBvbiBlYWNoIGNhbGwsIHNvIGNsaWVudHMgbWF5IHN0b3JlIG9yIG1vZGlmeSB0aGUgcmVzdWx0LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gcnVudGltZVR5cGUgdGhlIHJ1bnRpbWUgdHlwZQotCSAqIEByZXR1cm4gYSBwb3NzaWJseS1lbXB0eSBsaXN0IG9mIHJ1bnRpbWUgaW5zdGFuY2VzIHtAbGluayBJUnVudGltZX0KLQkgKiBvZiB0aGUgZ2l2ZW4gcnVudGltZSB0eXBlCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBJUnVudGltZVtdIGdldFJ1bnRpbWVzKElSdW50aW1lVHlwZSBydW50aW1lVHlwZSkgewotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlSdW50aW1lW10gcnVudGltZXMgPSBTZXJ2ZXJDb3JlLmdldFJ1bnRpbWVzKCk7Ci0JCWlmIChydW50aW1lcyAhPSBudWxsKSB7Ci0JCQlpbnQgc2l6ZSA9IHJ1bnRpbWVzLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJaWYgKHJ1bnRpbWVzW2ldLmdldFJ1bnRpbWVUeXBlKCkgIT0gbnVsbCAmJiBydW50aW1lc1tpXS5nZXRSdW50aW1lVHlwZSgpLmVxdWFscyhydW50aW1lVHlwZSkpCi0JCQkJCWxpc3QuYWRkKHJ1bnRpbWVzW2ldKTsKLQkJCX0KLQkJfQotCQkKLQkJSVJ1bnRpbWVbXSByID0gbmV3IElSdW50aW1lW2xpc3Quc2l6ZSgpXTsKLQkJbGlzdC50b0FycmF5KHIpOwotCQlyZXR1cm4gcjsKLQl9Ci0KLQlwdWJsaWMgSVNlcnZlcldvcmtpbmdDb3B5IGNyZWF0ZVNlcnZlcihTdHJpbmcgaWQsIElGaWxlIGZpbGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlpZiAoaWQgPT0gbnVsbCB8fCBpZC5sZW5ndGgoKSA9PSAwKQotCQkJaWQgPSBTZXJ2ZXJQbHVnaW4uZ2VuZXJhdGVJZCgpOwotCQkKLQkJSVJ1bnRpbWUgcnVudGltZSA9IG51bGw7Ci0JCWlmIChoYXNSdW50aW1lKCkpIHsKLQkJCS8vIGxvb2sgZm9yIGV4aXN0aW5nIHJ1bnRpbWUKLQkJCUlSdW50aW1lVHlwZSBydW50aW1lVHlwZSA9IGdldFJ1bnRpbWVUeXBlKCk7Ci0JCQlJUnVudGltZVtdIHJ1bnRpbWVzID0gZ2V0UnVudGltZXMocnVudGltZVR5cGUpOwotCQkJaWYgKHJ1bnRpbWVzICE9IG51bGwgJiYgcnVudGltZXMubGVuZ3RoID4gMCkKLQkJCQlydW50aW1lID0gcnVudGltZXNbMF07Ci0JCQllbHNlIHsKLQkJCQkvLyBjcmVhdGUgcnVudGltZQotCQkJCXRyeSB7Ci0JCQkJCUlSdW50aW1lV29ya2luZ0NvcHkgcnVudGltZVdDID0gcnVudGltZVR5cGUuY3JlYXRlUnVudGltZShpZCArICItcnVudGltZSIsIG1vbml0b3IpOwotCQkJCQlTZXJ2ZXJVdGlsLnNldFJ1bnRpbWVEZWZhdWx0TmFtZShydW50aW1lV0MpOwotCQkJCQlydW50aW1lID0gcnVudGltZVdDOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkbid0IGNyZWF0ZSBydW50aW1lIiwgZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJU2VydmVyV29ya2luZ0NvcHkgc3djID0gbmV3IFNlcnZlcldvcmtpbmdDb3B5KGlkLCBmaWxlLCBydW50aW1lLCB0aGlzKTsKLQkJU2VydmVyVXRpbC5zZXRTZXJ2ZXJEZWZhdWx0TmFtZShzd2MpOwotCQlpZiAocnVudGltZSAhPSBudWxsKQotCQkJc3djLnNldFJ1bnRpbWUocnVudGltZSk7Ci0JCQotCQlzd2Muc2V0RGVmYXVsdHMobW9uaXRvcik7Ci0JCWlmIChzd2MuZ2V0U2VydmVyVHlwZSgpLmhhc1NlcnZlckNvbmZpZ3VyYXRpb24oKSkKLQkJCXN3Yy5pbXBvcnRDb25maWd1cmF0aW9uKHJ1bnRpbWUsIG51bGwpOwotCQkKLQkJcmV0dXJuIHN3YzsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdCBnZXRTZXJ2ZXJQcm9qZWN0KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJUHJvamVjdFtdIHByb2plY3RzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0cygpOwotCQlpZiAocHJvamVjdHMgIT0gbnVsbCkgewotCQkJaW50IHNpemUgPSBwcm9qZWN0cy5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCWlmIChTZXJ2ZXJQbHVnaW4uZ2V0UHJvamVjdFByb3BlcnRpZXMocHJvamVjdHNbaV0pLmlzU2VydmVyUHJvamVjdCgpKQotCQkJCQlyZXR1cm4gcHJvamVjdHNbaV07Ci0JCQl9Ci0JCX0KLQkJCi0JCVN0cmluZyBzID0gZmluZFVudXNlZFNlcnZlclByb2plY3ROYW1lKCk7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3Qocyk7Ci0JCXByb2plY3QuY3JlYXRlKG51bGwpOwotCQlwcm9qZWN0Lm9wZW4obnVsbCk7Ci0JCVNlcnZlclBsdWdpbi5nZXRQcm9qZWN0UHJvcGVydGllcyhwcm9qZWN0KS5zZXRTZXJ2ZXJQcm9qZWN0KHRydWUsIG51bGwpOwotCQlyZXR1cm4gcHJvamVjdDsKLQl9Ci0KLQkvKioKLQkgKiBGaW5kcyBhbiB1bnVzZWQgcHJvamVjdCBuYW1lIHRvIHVzZSBhcyBhIHNlcnZlciBwcm9qZWN0LgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGZpbmRVbnVzZWRTZXJ2ZXJQcm9qZWN0TmFtZSgpIHsKLQkJSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCVN0cmluZyBuYW1lID0gTkxTLmJpbmQoTWVzc2FnZXMuZGVmYXVsdFNlcnZlclByb2plY3ROYW1lLCAiIikudHJpbSgpOwotCQlpbnQgY291bnQgPSAxOwotCQl3aGlsZSAocm9vdC5nZXRQcm9qZWN0KG5hbWUpLmV4aXN0cygpKSB7Ci0JCQluYW1lID0gTkxTLmJpbmQoTWVzc2FnZXMuZGVmYXVsdFNlcnZlclByb2plY3ROYW1lLCArK2NvdW50ICsgIiIpLnRyaW0oKTsKLQkJfQotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHRpbWVvdXQgKGluIG1zKSB0aGF0IHNob3VsZCBiZSB1c2VkIHRvIHdhaXQgZm9yIHRoZSBzZXJ2ZXIgdG8gc3RhcnQuCi0JICogVGhlIGRlZmF1bHQgaXMgMiBtaW51dGVzLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHNlcnZlciBzdGFydHVwIHRpbWVvdXQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFN0YXJ0VGltZW91dCgpIHsKLQkJaW50IHRpbWVvdXQgPSAtMTsKLQkJdHJ5IHsKLQkJCWludCBpID0gSW50ZWdlci5wYXJzZUludChlbGVtZW50LmdldEF0dHJpYnV0ZSgic3RhcnRUaW1lb3V0IikpOwotCQkJaW50IHMgPSBTZXJ2ZXJQcmVmZXJlbmNlcy5nZXRJbnN0YW5jZSgpLmdldE1hY2hpbmVTcGVlZCgpOwotCQkJdGltZW91dCA9IGkgKiAoMTAgLSBzKSAvIDU7Ci0JCQlyZXR1cm4gaTsKLQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCWlmICh0aW1lb3V0IDw9IDApCi0JCQl0aW1lb3V0ID0gREVGQVVMVF9USU1FT1VUOwotCQlyZXR1cm4gdGltZW91dDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHRpbWVvdXQgKGluIG1zKSB0byB3YWl0IGJlZm9yZSBhc3N1bWluZyB0aGF0IHRoZSBzZXJ2ZXIKLQkgKiBoYXMgZmFpbGVkIHRvIHN0b3AuIFRoZSBkZWZhdWx0IGlzIDIgbWludXRlcy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzZXJ2ZXIgc2h1dGRvd24gdGltZW91dAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3RvcFRpbWVvdXQoKSB7Ci0JCWludCB0aW1lb3V0ID0gLTE7Ci0JCXRyeSB7Ci0JCQl0aW1lb3V0ID0gSW50ZWdlci5wYXJzZUludChlbGVtZW50LmdldEF0dHJpYnV0ZSgic3RvcFRpbWVvdXQiKSk7Ci0JCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQlpZiAodGltZW91dCA8PSAwKQotCQkJdGltZW91dCA9IERFRkFVTFRfVElNRU9VVDsKLQkJcmV0dXJuIHRpbWVvdXQ7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJZWxlbWVudCA9IG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2UoKSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGVsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCkuZ2V0TmFtZXNwYWNlKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiU2VydmVyVHlwZVsiICsgZ2V0SWQoKSArICJdIjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvU2VydmVyV29ya2luZ0NvcHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1NlcnZlcldvcmtpbmdDb3B5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2ZWU0YWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvU2VydmVyV29ya2luZ0NvcHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLaAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSW50ZXJuYWxJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuUHVibGlzaE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuU2VydmVyQmVoYXZpb3VyRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLlNlcnZlckRlbGVnYXRlOwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFNlcnZlcldvcmtpbmdDb3B5IGV4dGVuZHMgU2VydmVyIGltcGxlbWVudHMgSVNlcnZlcldvcmtpbmdDb3B5IHsKLQlwcm90ZWN0ZWQgU2VydmVyIHNlcnZlcjsKLQlwcm90ZWN0ZWQgV29ya2luZ0NvcHlIZWxwZXIgd2NoOwotCQotCXByb3RlY3RlZCBTZXJ2ZXJEZWxlZ2F0ZSB3b3JraW5nQ29weURlbGVnYXRlOwotCQotCS8vIHdvcmtpbmcgY29weQotCXB1YmxpYyBTZXJ2ZXJXb3JraW5nQ29weShTZXJ2ZXIgc2VydmVyKSB7Ci0JCXN1cGVyKHNlcnZlci5nZXRGaWxlKCkpOwotCQl0aGlzLnNlcnZlciA9IHNlcnZlcjsKLQkJCi0JCW1hcCA9IG5ldyBIYXNoTWFwKHNlcnZlci5tYXApOwotCQl3Y2ggPSBuZXcgV29ya2luZ0NvcHlIZWxwZXIodGhpcyk7Ci0JCQotCQlyZXNvbHZlKCk7Ci0JfQotCQotCS8vIGNyZWF0aW9uCi0JcHVibGljIFNlcnZlcldvcmtpbmdDb3B5KFN0cmluZyBpZCwgSUZpbGUgZmlsZSwgSVJ1bnRpbWUgcnVudGltZSwgSVNlcnZlclR5cGUgc2VydmVyVHlwZSkgewotCQlzdXBlcihpZCwgZmlsZSwgcnVudGltZSwgc2VydmVyVHlwZSk7Ci0JCS8vc2VydmVyID0gdGhpczsKLQkJd2NoID0gbmV3IFdvcmtpbmdDb3B5SGVscGVyKHRoaXMpOwotCQl3Y2guc2V0RGlydHkodHJ1ZSk7Ci0JCXNlcnZlclN0YXRlID0gKChTZXJ2ZXJUeXBlKXNlcnZlclR5cGUpLmdldEluaXRpYWxTdGF0ZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzV29ya2luZ0NvcHkoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwdWJsaWMgSVNlcnZlciBnZXRPcmlnaW5hbCgpIHsKLQkJcmV0dXJuIHNlcnZlcjsKLQl9Ci0JCi0JcHVibGljIElTZXJ2ZXJXb3JraW5nQ29weSBjcmVhdGVXb3JraW5nQ29weSgpIHsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCi0JcHVibGljIGludCBnZXRTZXJ2ZXJTdGF0ZSgpIHsKLQkJaWYgKHNlcnZlciAhPSBudWxsKQotCQkJcmV0dXJuIHNlcnZlci5nZXRTZXJ2ZXJTdGF0ZSgpOwotCQlyZXR1cm4gc2VydmVyU3RhdGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2VydmVyU3RhdGUoaW50IHN0YXRlKSB7Ci0JCWlmIChzZXJ2ZXIgIT0gbnVsbCkKLQkJCXNlcnZlci5zZXRTZXJ2ZXJTdGF0ZShzdGF0ZSk7Ci0JCWVsc2UKLQkJCXN1cGVyLnNldFNlcnZlclN0YXRlKHN0YXRlKTsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRTZXJ2ZXJQdWJsaXNoU3RhdGUoKSB7Ci0JCWlmIChzZXJ2ZXIgIT0gbnVsbCkKLQkJCXJldHVybiBzZXJ2ZXIuZ2V0U2VydmVyUHVibGlzaFN0YXRlKCk7Ci0JCXJldHVybiBzZXJ2ZXJTdGF0ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJQdWJsaXNoU3RhdGUoaW50IHN0YXRlKSB7Ci0JCWlmIChzZXJ2ZXIgIT0gbnVsbCkKLQkJCXNlcnZlci5zZXRTZXJ2ZXJQdWJsaXNoU3RhdGUoc3RhdGUpOwotCQllbHNlCi0JCQlzdXBlci5zZXRTZXJ2ZXJQdWJsaXNoU3RhdGUoc3RhdGUpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldE1vZGUoKSB7Ci0JCWlmIChzZXJ2ZXIgIT0gbnVsbCkKLQkJCXJldHVybiBzZXJ2ZXIuZ2V0TW9kZSgpOwotCQlyZXR1cm4gbW9kZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNb2RlKFN0cmluZyBtb2RlKSB7Ci0JCWlmIChzZXJ2ZXIgIT0gbnVsbCkKLQkJCXNlcnZlci5zZXRNb2RlKG1vZGUpOwotCQllbHNlCi0JCQlzdXBlci5zZXRNb2RlKG1vZGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShTdHJpbmcgYXR0cmlidXRlTmFtZSwgaW50IHZhbHVlKSB7Ci0JCXdjaC5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSwgdmFsdWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShTdHJpbmcgYXR0cmlidXRlTmFtZSwgYm9vbGVhbiB2YWx1ZSkgewotCQl3Y2guc2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUsIHZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIFN0cmluZyB2YWx1ZSkgewotCQl3Y2guc2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUsIHZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIExpc3QgdmFsdWUpIHsKLQkJd2NoLnNldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lLCB2YWx1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBNYXAgdmFsdWUpIHsKLQkJd2NoLnNldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lLCB2YWx1ZSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJXb3JraW5nQ29weSNzZXROYW1lKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQlzZXRBdHRyaWJ1dGUoUFJPUF9OQU1FLCBuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZWFkT25seShib29sZWFuIGIpIHsKLQkJc2V0QXR0cmlidXRlKFBST1BfTE9DS0VELCBiKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHdoZXRoZXIgdGhpcyBlbGVtZW50IGlzIHByaXZhdGUuCi0JICogR2VuZXJhbGx5IHNwZWFraW5nLCBlbGVtZW50cyBtYXJrZWQgcHJpdmF0ZSBhcmUgaW50ZXJuYWwgb25lcwotCSAqIHRoYXQgc2hvdWxkIG5vdCBiZSBzaG93biB0byB1c2VycyAoYmVjYXVzZSB0aGV5IHdvbid0IGtub3cKLQkgKiBhbnl0aGluZyBhYm91dCB0aGVtKS4KLQkgKiAKLQkgKiBAcGFyYW0gYiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGVsZW1lbnQgaXMgcHJpdmF0ZSwKLQkgKiBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqIEBzZWUgI2lzUHJpdmF0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJpdmF0ZShib29sZWFuIGIpIHsKLQkJc2V0QXR0cmlidXRlKFBST1BfUFJJVkFURSwgYik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SG9zdChTdHJpbmcgaG9zdCkgewotCQlzZXRBdHRyaWJ1dGUoUFJPUF9IT1NUTkFNRSwgaG9zdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QXV0b1B1Ymxpc2hUaW1lKGludCBwKSB7Ci0JCXNldEF0dHJpYnV0ZShQUk9QX0FVVE9fUFVCTElTSF9USU1FLCBwKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBdXRvUHVibGlzaFNldHRpbmcoaW50IHMpIHsKLQkJc2V0QXR0cmlidXRlKFBST1BfQVVUT19QVUJMSVNIX1NFVFRJTkcsIHMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNlcnZlckNvbmZpZ3VyYXRpb24oSUZvbGRlciBjb25maWcpIHsKLQkJdGhpcy5jb25maWd1cmF0aW9uID0gY29uZmlnOwotCQlpZiAoY29uZmlndXJhdGlvbiA9PSBudWxsKQotCQkJc2V0QXR0cmlidXRlKENPTkZJR1VSQVRJT05fSUQsIChTdHJpbmcpbnVsbCk7Ci0JCWVsc2UKLQkJCXNldEF0dHJpYnV0ZShDT05GSUdVUkFUSU9OX0lELCBjb25maWd1cmF0aW9uLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSk7Ci0JfQotCi0JLyoqCi0JICogRGlzYWJsZSB0aGUgcHJlZmVycmVkIHB1Ymxpc2ggb3BlcmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBvcCBhIHB1Ymxpc2ggb3BlcmF0aW9uCi0JICogQHJldHVybiB0cnVlIGlmIGNoYW5nZSBpcyBtYWRlLiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBkaXNhYmxlUHJlZmVycmVkUHVibGlzaE9wZXJhdGlvbnMoUHVibGlzaE9wZXJhdGlvbiBvcCkgewotCQlMaXN0IGxpc3QgPSBnZXRBdHRyaWJ1dGUoUFJPUF9ESVNBQkxFRF9QRVJGRVJSRURfVEFTS1MsIChMaXN0KW51bGwpOwotCQlpZiAobGlzdCA9PSBudWxsKQotCQkJbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCi0JCVN0cmluZyBvcElkID0gZ2V0UHVibGlzaE9wZXJhdGlvbklkKG9wKTsKLQkJaWYgKGxpc3QuY29udGFpbnMob3BJZCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWxpc3QuYWRkKG9wSWQpOwotCQlzZXRBdHRyaWJ1dGUoUFJPUF9ESVNBQkxFRF9QRVJGRVJSRURfVEFTS1MsIGxpc3QpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBFbmFibGUgdGhlIG9wdGlvbmFsIHB1Ymxpc2ggb3BlcmF0aW9uLiBPcHRpb25hbCBwdWJsaXNoIG9wZXJhdGlvbiBpcyBub3QgcmFuIGJ5IGRlZmF1bHQuCi0JICogCi0JICogQHBhcmFtIG9wIGEgcHVibGlzaCBvcGVyYXRpb24KLQkgKiBAcmV0dXJuIHRydWUgaWYgY2hhbmdlIGlzIG1hZGUuIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVuYWJsZU9wdGlvbmFsUHVibGlzaE9wZXJhdGlvbnMoUHVibGlzaE9wZXJhdGlvbiBvcCkgewotCQlMaXN0IGxpc3QgPSBnZXRBdHRyaWJ1dGUoUFJPUF9FTkFCTEVEX09QVElPTkFMX1RBU0tTLCAoTGlzdCludWxsKTsKLQkJaWYgKGxpc3QgPT0gbnVsbCkKLQkJCWxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQotCQlTdHJpbmcgb3BJZCA9IGdldFB1Ymxpc2hPcGVyYXRpb25JZChvcCk7Ci0JCWlmIChsaXN0LmNvbnRhaW5zKG9wSWQpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlsaXN0LmFkZChvcElkKTsKLQkJc2V0QXR0cmlidXRlKFBST1BfRU5BQkxFRF9PUFRJT05BTF9UQVNLUywgbGlzdCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJlc2V0IGFsbCBwcmVmZXJyZWQgb3BlcmF0aW9ucyB0byBkZWZhdWx0Ci0JICovCi0JcHVibGljIHZvaWQgcmVzZXRQcmVmZXJyZWRQdWJsaXNoT3BlcmF0aW9ucygpIHsKLQkJc2V0QXR0cmlidXRlKFBST1BfRElTQUJMRURfUEVSRkVSUkVEX1RBU0tTLCAoTGlzdCludWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXNldCBhbGwgb3B0aW9uYWwgb3BlcmF0aW9ucyB0byBkZWZhdWx0Ci0JICovCi0JcHVibGljIHZvaWQgcmVzZXRPcHRpb25hbFB1Ymxpc2hPcGVyYXRpb25zKCkgewotCQlzZXRBdHRyaWJ1dGUoUFJPUF9FTkFCTEVEX09QVElPTkFMX1RBU0tTLCAoTGlzdCludWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBmaWxlIHdoZXJlIHRoaXMgc2VydmVyIGluc3RhbmNlIGlzIHNlcmlhbGl6ZWQuCi0JICogCi0JICogQHBhcmFtIGZpbGUgdGhlIGZpbGUgaW4gdGhlIHdvcmtzcGFjZSB3aGVyZSB0aGUgc2VydmVyIGluc3RhbmNlCi0JICogICAgaXMgc2VyaWFsaXplZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGluZm9ybWF0aW9uIGlzCi0JICogICAgaW5zdGVhZCB0byBiZSBwZXJzaXN0ZWQgd2l0aCB0aGUgd29ya3NwYWNlIGJ1dCBub3Qgd2l0aCBhbnkKLQkgKiAgICBwYXJ0aWN1bGFyIHdvcmtzcGFjZSByZXNvdXJjZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbGUoSUZpbGUgZmlsZSkgewotCQl0aGlzLmZpbGUgPSBmaWxlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyV29ya2luZ0NvcHkjaXNEaXJ0eSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEaXJ0eSgpIHsKLQkJcmV0dXJuIHdjaC5pc0RpcnR5KCk7Ci0JfQotCi0JcHVibGljIFNlcnZlckRlbGVnYXRlIGdldFdvcmtpbmdDb3B5RGVsZWdhdGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCS8vIG1ha2Ugc3VyZSB0aGF0IHRoZSByZWd1bGFyIGRlbGVnYXRlIGlzIGxvYWRlZCAKLQkJLy9nZXREZWxlZ2F0ZSgpOwotCQkKLQkJaWYgKHdvcmtpbmdDb3B5RGVsZWdhdGUgIT0gbnVsbCB8fCBzZXJ2ZXJUeXBlID09IG51bGwpCi0JCQlyZXR1cm4gd29ya2luZ0NvcHlEZWxlZ2F0ZTsKLQkJCi0JCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJaWYgKHdvcmtpbmdDb3B5RGVsZWdhdGUgPT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCWxvbmcgdGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCQl3b3JraW5nQ29weURlbGVnYXRlID0gKChTZXJ2ZXJUeXBlKSBzZXJ2ZXJUeXBlKS5jcmVhdGVTZXJ2ZXJEZWxlZ2F0ZSgpOwotCQkJCQlJbnRlcm5hbEluaXRpYWxpemVyLmluaXRpYWxpemVTZXJ2ZXJEZWxlZ2F0ZSh3b3JraW5nQ29weURlbGVnYXRlLCB0aGlzLCBtb25pdG9yKTsKLQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuUEVSRk9STUFOQ0UsICJTZXJ2ZXJXb3JraW5nQ29weS5nZXRXb3JraW5nQ29weURlbGVnYXRlKCk6IDwiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGltZSkgKyAiPiAiICsgZ2V0U2VydmVyVHlwZSgpLmdldElkKCkpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBjcmVhdGUgZGVsZWdhdGUgIiArIHRvU3RyaW5nKCksIGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gd29ya2luZ0NvcHlEZWxlZ2F0ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU2VydmVyQmVoYXZpb3VyRGVsZWdhdGUgZ2V0QmVoYXZpb3VyRGVsZWdhdGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmIChzZXJ2ZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkKLQkJaWYgKGJlaGF2aW91ckRlbGVnYXRlICE9IG51bGwpCi0JCQlyZXR1cm4gYmVoYXZpb3VyRGVsZWdhdGU7Ci0JCQotCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCWlmIChiZWhhdmlvdXJEZWxlZ2F0ZSA9PSBudWxsKQotCQkJCWJlaGF2aW91ckRlbGVnYXRlID0gc2VydmVyLmdldEJlaGF2aW91ckRlbGVnYXRlKG1vbml0b3IpOwotCQl9Ci0JCXJldHVybiBiZWhhdmlvdXJEZWxlZ2F0ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBiZWhhdmlvdXIgZGVsZWdhdGUgaXMgY2FjaGVkIGZyb20gdGhlIG9yaWdpbmFsIHNlcnZlcgotCQliZWhhdmlvdXJEZWxlZ2F0ZSA9IG51bGw7Ci0JCQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JCWlmICh3b3JraW5nQ29weURlbGVnYXRlICE9IG51bGwpCi0JCQl3b3JraW5nQ29weURlbGVnYXRlLmRpc3Bvc2UoKTsKLQl9Ci0KLQlwdWJsaWMgSVNlcnZlciBzYXZlKGJvb2xlYW4gZm9yY2UsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQltb25pdG9yID0gUHJvZ3Jlc3NVdGlsLmdldE1vbml0b3JGb3IobW9uaXRvcik7Ci0JCW1vbml0b3Iuc3ViVGFzayhOTFMuYmluZChNZXNzYWdlcy5zYXZpbmdUYXNrLCBnZXROYW1lKCkpKTsKLQkJCi0JCWlmICghZm9yY2UgJiYgZ2V0T3JpZ2luYWwoKSAhPSBudWxsKQotCQkJd2NoLnZhbGlkYXRlVGltZXN0YW1wKCgoU2VydmVyKWdldE9yaWdpbmFsKCkpLmdldFRpbWVzdGFtcCgpKTsKLQkJCi0JCWlmIChzZXJ2ZXIgPT0gbnVsbCkgewotCQkJc2VydmVyID0gbmV3IFNlcnZlcihmaWxlKTsKLQkJCXNlcnZlci5zZXRTZXJ2ZXJTdGF0ZShzZXJ2ZXJTdGF0ZSk7Ci0JCQlzZXJ2ZXIucHVibGlzaExpc3RlbmVycyA9IHB1Ymxpc2hMaXN0ZW5lcnM7Ci0JCQlzZXJ2ZXIubm90aWZpY2F0aW9uTWFuYWdlciA9IG5vdGlmaWNhdGlvbk1hbmFnZXI7Ci0JCX0KLQkJCi0JCWlmIChnZXRTZXJ2ZXJUeXBlKCkuaGFzU2VydmVyQ29uZmlndXJhdGlvbigpKSB7Ci0JCQlJRm9sZGVyIGZvbGRlciA9IGdldFNlcnZlckNvbmZpZ3VyYXRpb24oKTsKLQkJCWlmIChmb2xkZXIgPT0gbnVsbCkgewotCQkJCWZvbGRlciA9IFNlcnZlclR5cGUuZ2V0U2VydmVyUHJvamVjdCgpLmdldEZvbGRlcihnZXROYW1lKCkgKyAiLWNvbmZpZyIpOwotCQkJCWlmICghZm9sZGVyLmV4aXN0cygpKQotCQkJCQlmb2xkZXIuY3JlYXRlKHRydWUsIHRydWUsIG51bGwpOwotCQkJCXNldFNlcnZlckNvbmZpZ3VyYXRpb24oZm9sZGVyKTsKLQkJCX0KLQkJfQotCQkKLQkJc2VydmVyLnNldEludGVybmFsKHRoaXMpOwotCQlzZXJ2ZXIuZG9TYXZlKG1vbml0b3IpOwotCQlpZiAoZ2V0U2VydmVyVHlwZSgpLmhhc1NlcnZlckNvbmZpZ3VyYXRpb24oKSkgewotCQkJSUZvbGRlciBmb2xkZXIgPSBnZXRTZXJ2ZXJDb25maWd1cmF0aW9uKCk7Ci0JCQlpZiAoZm9sZGVyICE9IG51bGwpIHsKLQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gZm9sZGVyLmdldFByb2plY3QoKTsKLQkJCQlpZiAocHJvamVjdCAhPSBudWxsICYmICFwcm9qZWN0LmV4aXN0cygpKSB7Ci0JCQkJCXByb2plY3QuY3JlYXRlKG51bGwpOwotCQkJCQlwcm9qZWN0Lm9wZW4obnVsbCk7Ci0JCQkJCVNlcnZlclBsdWdpbi5nZXRQcm9qZWN0UHJvcGVydGllcyhwcm9qZWN0KS5zZXRTZXJ2ZXJQcm9qZWN0KHRydWUsIG1vbml0b3IpOwotCQkJCX0KLQkJCQlpZiAoIWZvbGRlci5leGlzdHMoKSkKLQkJCQkJZm9sZGVyLmNyZWF0ZShJUmVzb3VyY2UuRk9SQ0UsIHRydWUsIG51bGwpOwotCQkJfQotCQl9Ci0JCWdldFdvcmtpbmdDb3B5RGVsZWdhdGUobW9uaXRvcikuc2F2ZUNvbmZpZ3VyYXRpb24obW9uaXRvcik7Ci0JCXdjaC5zZXREaXJ0eShmYWxzZSk7Ci0JCQotCQlyZXR1cm4gc2VydmVyOwotCX0KLQotCXB1YmxpYyBJU2VydmVyIHNhdmVBbGwoYm9vbGVhbiBmb3JjZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChydW50aW1lICE9IG51bGwgJiYgcnVudGltZS5pc1dvcmtpbmdDb3B5KCkpIHsKLQkJCUlSdW50aW1lV29ya2luZ0NvcHkgd2MgPSAoSVJ1bnRpbWVXb3JraW5nQ29weSkgcnVudGltZTsKLQkJCXdjLnNhdmUoZm9yY2UsIG1vbml0b3IpOwotCQl9Ci0JCQotCQlyZXR1cm4gc2F2ZShmb3JjZSwgbW9uaXRvcik7Ci0JfQotCi0JLyoqCi0JICogQWRkIGEgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyIHRvIHRoaXMgc2VydmVyLgotCSAqCi0JICogQHBhcmFtIGxpc3RlbmVyIGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAobGlzdGVuZXIgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkxpc3RlbmVyIGNhbm5vdCBiZSBudWxsIik7Ci0JCXdjaC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0JCi0JLyoqCi0JICogUmVtb3ZlIGEgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyIGZyb20gdGhpcyBzZXJ2ZXIuCi0JICoKLQkgKiBAcGFyYW0gbGlzdGVuZXIgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChsaXN0ZW5lciA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTGlzdGVuZXIgY2Fubm90IGJlIG51bGwiKTsKLQkJd2NoLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEZpcmUgYSBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnQuCi0JICogCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZSBhIHByb3BlcnR5IG5hbWUKLQkgKiBAcGFyYW0gb2xkVmFsdWUgdGhlIG9sZCB2YWx1ZQotCSAqIEBwYXJhbSBuZXdWYWx1ZSB0aGUgbmV3IHZhbHVlCi0JICovCi0JcHVibGljIHZvaWQgZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJd2NoLmZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KHByb3BlcnR5TmFtZSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRTZXJ2ZXJMaXN0ZW5lcihJU2VydmVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKHNlcnZlciAhPSBudWxsKQotCQkJc2VydmVyLmFkZFNlcnZlckxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJZWxzZQotCQkJc3VwZXIuYWRkU2VydmVyTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVNlcnZlckxpc3RlbmVyKElTZXJ2ZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAoc2VydmVyICE9IG51bGwpCi0JCQlzZXJ2ZXIucmVtb3ZlU2VydmVyTGlzdGVuZXIobGlzdGVuZXIpOwotCQllbHNlCi0JCQlzdXBlci5yZW1vdmVTZXJ2ZXJMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkUHVibGlzaExpc3RlbmVyKElQdWJsaXNoTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKHNlcnZlciAhPSBudWxsKQotCQkJc2VydmVyLmFkZFB1Ymxpc2hMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWVsc2UKLQkJCXN1cGVyLmFkZFB1Ymxpc2hMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZVB1Ymxpc2hMaXN0ZW5lcihJUHVibGlzaExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChzZXJ2ZXIgIT0gbnVsbCkKLQkJCXNlcnZlci5yZW1vdmVQdWJsaXNoTGlzdGVuZXIobGlzdGVuZXIpOwotCQllbHNlCi0JCQlzdXBlci5yZW1vdmVQdWJsaXNoTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJ1bnRpbWUoSVJ1bnRpbWUgcnVudGltZSkgewotCQl0aGlzLnJ1bnRpbWUgPSBydW50aW1lOwotCQlpZiAocnVudGltZSAhPSBudWxsKQotCQkJc2V0QXR0cmlidXRlKFJVTlRJTUVfSUQsIHJ1bnRpbWUuZ2V0SWQoKSk7Ci0JCWVsc2UKLQkJCXNldEF0dHJpYnV0ZShSVU5USU1FX0lELCAoU3RyaW5nKW51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJ1bnRpbWVJZChTdHJpbmcgcnVudGltZUlkKSB7Ci0JCXNldEF0dHJpYnV0ZShSVU5USU1FX0lELCBydW50aW1lSWQpOwotCQlyZXNvbHZlKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXIjbW9kaWZ5TW9kdWxlKG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5JTW9kdWxlKQotCSAqLwotCXB1YmxpYyB2b2lkIG1vZGlmeU1vZHVsZXMoSU1vZHVsZVtdIGFkZCwgSU1vZHVsZVtdIHJlbW92ZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmICgoYWRkID09IG51bGwgfHwgYWRkLmxlbmd0aCA9PSAwKSAmJiAocmVtb3ZlID09IG51bGwgfHwgcmVtb3ZlLmxlbmd0aCA9PSAwKSkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkFkZCBhbmQgcmVtb3ZlIGNhbm5vdCBib3RoIGJlIG51bGwvZW1wdHkiKTsKLQkJCi0JCXRyeSB7Ci0JCQltb25pdG9yID0gUHJvZ3Jlc3NVdGlsLmdldE1vbml0b3JGb3IobW9uaXRvcik7Ci0JCQltb25pdG9yLnN1YlRhc2soTWVzc2FnZXMudGFza01vZGlmeU1vZHVsZXMpOwotCQkJZ2V0V29ya2luZ0NvcHlEZWxlZ2F0ZShtb25pdG9yKS5tb2RpZnlNb2R1bGVzKGFkZCwgcmVtb3ZlLCBtb25pdG9yKTsKLQkJCXdjaC5zZXREaXJ0eSh0cnVlKTsKLQkJCQotCQkJLy8gdHJpZ2dlciBsb2FkIG9mIG1vZHVsZXMgbGlzdAotCQkJZ2V0TW9kdWxlcygpOwotCQkJCi0JCQlpZiAoYWRkICE9IG51bGwpIHsKLQkJCQlpbnQgc2l6ZSA9IGFkZC5sZW5ndGg7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQkJaWYgKCFtb2R1bGVzLmNvbnRhaW5zKGFkZFtpXSkpIHsKLQkJCQkJCW1vZHVsZXMuYWRkKGFkZFtpXSk7Ci0JCQkJCQlyZXNldFB1Ymxpc2hTdGF0ZShuZXcgSU1vZHVsZVtdIHsgYWRkW2ldIH0sIG1vbml0b3IpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlpZiAocmVtb3ZlICE9IG51bGwpIHsKLQkJCQlpbnQgc2l6ZSA9IHJlbW92ZS5sZW5ndGg7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQkJaWYgKG1vZHVsZXMuY29udGFpbnMocmVtb3ZlW2ldKSkgewotCQkJCQkJbW9kdWxlcy5yZW1vdmUocmVtb3ZlW2ldKTsKLQkJCQkJCXJlc2V0UHVibGlzaFN0YXRlKG5ldyBJTW9kdWxlW10geyByZW1vdmVbaV0gfSwgbW9uaXRvcik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCS8vIGNvbnZlcnQgdG8gYXR0cmlidXRlCi0JCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlJdGVyYXRvciBpdGVyYXRvciA9IG1vZHVsZXMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlJTW9kdWxlIG1vZHVsZSA9IChJTW9kdWxlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcihtb2R1bGUuZ2V0TmFtZSgpKTsKLQkJCQlzYi5hcHBlbmQoIjo6Iik7Ci0JCQkJc2IuYXBwZW5kKG1vZHVsZS5nZXRJZCgpKTsKLQkJCQlJTW9kdWxlVHlwZSBtdCA9IG1vZHVsZS5nZXRNb2R1bGVUeXBlKCk7Ci0JCQkJaWYgKG10ICE9IG51bGwpIHsKLQkJCQkJc2IuYXBwZW5kKCI6OiIpOwotCQkJCQlzYi5hcHBlbmQobXQuZ2V0SWQoKSk7Ci0JCQkJCXNiLmFwcGVuZCgiOjoiKTsKLQkJCQkJc2IuYXBwZW5kKG10LmdldFZlcnNpb24oKSk7Ci0JCQkJfQotCQkJCWxpc3QuYWRkKHNiLnRvU3RyaW5nKCkpOwotCQkJfQotCQkJc2V0QXR0cmlidXRlKE1PRFVMRV9MSVNULCBsaXN0KTsKLQkJCXJlc2V0T3B0aW9uYWxQdWJsaXNoT3BlcmF0aW9ucygpOwotCQkJcmVzZXRQcmVmZXJyZWRQdWJsaXNoT3BlcmF0aW9ucygpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQl0aHJvdyBjZTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGNhbGxpbmcgZGVsZWdhdGUgbW9kaWZ5TW9kdWxlKCkgIiArIHRvU3RyaW5nKCksIGUpOwotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCAiIiArIGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpLCBlKSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVzZXRQdWJsaXNoU3RhdGUoSU1vZHVsZVtdIG1vZHVsZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXNldE1vZHVsZVB1Ymxpc2hTdGF0ZShtb2R1bGUsIC0xKTsKLQkJdHJ5IHsKLQkJCUlNb2R1bGVbXSBjaGlsZHJlbiA9IGdldENoaWxkTW9kdWxlcyhtb2R1bGUsIG1vbml0b3IpOwotCQkJaW50IHNpemUgPSBjaGlsZHJlbi5sZW5ndGg7Ci0JCQlpbnQgc2l6ZTIgPSBtb2R1bGUubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlJTW9kdWxlW10gY2hpbGQgPSBuZXcgTW9kdWxlW3NpemUyICsgMV07Ci0JCQkJU3lzdGVtLmFycmF5Y29weShtb2R1bGUsIDAsIGNoaWxkLCAwLCBzaXplMik7Ci0JCQkJY2hpbGRbc2l6ZTJdID0gY2hpbGRyZW5baV07Ci0JCQkJcmVzZXRQdWJsaXNoU3RhdGUoY2hpbGQsIG1vbml0b3IpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0cyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJdHJ5IHsKLQkJCWdldFdvcmtpbmdDb3B5RGVsZWdhdGUobW9uaXRvcikuc2V0RGVmYXVsdHMobW9uaXRvcik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBjYWxsaW5nIGRlbGVnYXRlIHNldERlZmF1bHRzKCkgIiArIHRvU3RyaW5nKCksIGUpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcmVuYW1lRmlsZXMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChnZXRTZXJ2ZXJDb25maWd1cmF0aW9uKCkgIT0gbnVsbCkgewotCQkJSUZvbGRlciBmb2xkZXIgPSBnZXRTZXJ2ZXJDb25maWd1cmF0aW9uKCk7Ci0JCQlJRm9sZGVyIGZvbGRlcjIgPSBTZXJ2ZXJUeXBlLmdldFNlcnZlclByb2plY3QoKS5nZXRGb2xkZXIoZ2V0TmFtZSgpICsgIi1jb25maWciKTsKLQkJCWZvbGRlci5tb3ZlKGZvbGRlcjIuZ2V0RnVsbFBhdGgoKSwgdHJ1ZSwgdHJ1ZSwgbW9uaXRvcik7Ci0JCQlzZXRTZXJ2ZXJDb25maWd1cmF0aW9uKGZvbGRlcjIpOwotCQkJc2F2ZSh0cnVlLCBtb25pdG9yKTsKLQkJfQotCQkKLQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJSUZpbGUgZmlsZTIgPSBTZXJ2ZXJVdGlsLmdldFVudXNlZFNlcnZlckZpbGUoZmlsZS5nZXRQcm9qZWN0KCksIHRoaXMpOwotCQkJZmlsZS5tb3ZlKGZpbGUyLmdldEZ1bGxQYXRoKCksIHRydWUsIHRydWUsIG1vbml0b3IpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBQdWJsaXNoIHRvIHRoZSBzZXJ2ZXIgdXNpbmcgdGhlIHByb2dyZXNzIG1vbml0b3IuIFRoZSByZXN1bHQgb2YgdGhlCi0JICogcHVibGlzaCBvcGVyYXRpb24gaXMgcmV0dXJuZWQgYXMgYW4gSVN0YXR1cy4KLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBwdWJsaXNoKGludCBraW5kLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKHNlcnZlciAhPSBudWxsKQotCQkJcmV0dXJuIHNlcnZlci5wdWJsaXNoKGtpbmQsIG1vbml0b3IpOwotCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCBNZXNzYWdlcy5lcnJvclB1Ymxpc2hpbmcsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHNlcnZlciByZXN0YXJ0IHN0YXRlLgotCSAqCi0JICogQHBhcmFtIHN0YXRlIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJSZXN0YXJ0U3RhdGUoYm9vbGVhbiBzdGF0ZSkgewotCQlpZiAoc2VydmVyICE9IG51bGwpCi0JCQlzZXJ2ZXIuc2V0U2VydmVyUmVzdGFydFN0YXRlKHN0YXRlKTsKLQkJZWxzZQotCQkJc3VwZXIuc2V0U2VydmVyUmVzdGFydFN0YXRlKHN0YXRlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElTZXJ2ZXIjZ2V0QWRhcHRlcihDbGFzcykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQlpZiAod29ya2luZ0NvcHlEZWxlZ2F0ZSAhPSBudWxsKSB7Ci0JCQlpZiAoYWRhcHRlci5pc0luc3RhbmNlKHdvcmtpbmdDb3B5RGVsZWdhdGUpKQotCQkJCXJldHVybiB3b3JraW5nQ29weURlbGVnYXRlOwotCQl9Ci0JCWlmIChkZWxlZ2F0ZSAhPSBudWxsKSB7Ci0JCQlpZiAoYWRhcHRlci5pc0luc3RhbmNlKGRlbGVnYXRlKSkKLQkJCQlyZXR1cm4gZGVsZWdhdGU7Ci0JCX0KLQkJaWYgKGJlaGF2aW91ckRlbGVnYXRlICE9IG51bGwpIHsKLQkJCWlmIChhZGFwdGVyLmlzSW5zdGFuY2UoYmVoYXZpb3VyRGVsZWdhdGUpKQotCQkJCXJldHVybiBiZWhhdmlvdXJEZWxlZ2F0ZTsKLQkJfQotCQlyZXR1cm4gUGxhdGZvcm0uZ2V0QWRhcHRlck1hbmFnZXIoKS5nZXRBZGFwdGVyKHRoaXMsIGFkYXB0ZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVNlcnZlciNsb2FkQWRhcHRlcihDbGFzcywgSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGxvYWRBZGFwdGVyKENsYXNzIGFkYXB0ZXIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlnZXRXb3JraW5nQ29weURlbGVnYXRlKG1vbml0b3IpOwotCQlpZiAoYWRhcHRlci5pc0luc3RhbmNlKHdvcmtpbmdDb3B5RGVsZWdhdGUpKQotCQkJcmV0dXJuIHdvcmtpbmdDb3B5RGVsZWdhdGU7Ci0JCQotCQlnZXREZWxlZ2F0ZShtb25pdG9yKTsKLQkJaWYgKGFkYXB0ZXIuaXNJbnN0YW5jZShkZWxlZ2F0ZSkpCi0JCQlyZXR1cm4gZGVsZWdhdGU7Ci0JCQotCQlnZXRCZWhhdmlvdXJEZWxlZ2F0ZShtb25pdG9yKTsKLQkJaWYgKGFkYXB0ZXIuaXNJbnN0YW5jZShiZWhhdmlvdXJEZWxlZ2F0ZSkpCi0JCQlyZXR1cm4gYmVoYXZpb3VyRGVsZWdhdGU7Ci0JCQotCQlyZXR1cm4gUGxhdGZvcm0uZ2V0QWRhcHRlck1hbmFnZXIoKS5sb2FkQWRhcHRlcih0aGlzLCBhZGFwdGVyLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW1wb3J0Q29uZmlndXJhdGlvbihJUnVudGltZSBydW50aW1lMiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXRyeSB7Ci0JCQlnZXRXb3JraW5nQ29weURlbGVnYXRlKG1vbml0b3IpLmltcG9ydENvbmZpZ3VyYXRpb24ocnVudGltZTIsIG1vbml0b3IpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgY2FsbGluZyBkZWxlZ2F0ZSBzZXRMYXVuY2hEZWZhdWx0cygpICIgKyB0b1N0cmluZygpLCBlKTsKLQkJfQotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiU2VydmVyV29ya2luZ0NvcHkgIiArIGdldElkKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1N0YXJ0U2VydmVySm9iLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9TdGFydFNlcnZlckpvYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjY1ZTY3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1N0YXJ0U2VydmVySm9iLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLaAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlclNjaGVkdWxpbmdSdWxlOwotLyoqCi0gKiBBIGpvYiBmb3Igc3RhcnRpbmcgdGhlIHNlcnZlci4KLSAqLwotcHVibGljIGNsYXNzIFN0YXJ0U2VydmVySm9iIGV4dGVuZHMgQ2hhaW5lZEpvYiB7Ci0JcHJvdGVjdGVkIFN0cmluZyBsYXVuY2hNb2RlOwotCi0JcHVibGljIFN0YXJ0U2VydmVySm9iKElTZXJ2ZXIgc2VydmVyLCBTdHJpbmcgbGF1bmNoTW9kZSkgewotCQlzdXBlcihOTFMuYmluZChNZXNzYWdlcy5qb2JTdGFydGluZ1NlcnZlciwgc2VydmVyLmdldE5hbWUoKSksIHNlcnZlcik7Ci0JCXRoaXMubGF1bmNoTW9kZSA9IGxhdW5jaE1vZGU7Ci0JCXNldFJ1bGUobmV3IFNlcnZlclNjaGVkdWxpbmdSdWxlKHNlcnZlcikpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwuam9icy5JbnRlcm5hbEpvYiNydW4ob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQl0cnkgewotCQkJZ2V0U2VydmVyKCkuc3luY2hyb25vdXNTdGFydChsYXVuY2hNb2RlLCBtb25pdG9yKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJcmV0dXJuIGNlLmdldFN0YXR1cygpOwotCQl9Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9UcmFjZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvVHJhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRiYjVmZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9UcmFjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotoCogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci0vKioKLSAqIEhlbHBlciBjbGFzcyB0byByb3V0ZSB0cmFjZSBvdXRwdXQuCi0gKi8KLXB1YmxpYyBjbGFzcyBUcmFjZSB7Ci0JcHVibGljIHN0YXRpYyBpbnQgQ09ORklHID0gMDsKLQlwdWJsaWMgc3RhdGljIGludCBJTkZPID0gMTsKLQlwdWJsaWMgc3RhdGljIGludCBXQVJOSU5HID0gMjsKLQlwdWJsaWMgc3RhdGljIGludCBTRVZFUkUgPSAzOwotCXB1YmxpYyBzdGF0aWMgaW50IEZJTkVSID0gNDsKLQlwdWJsaWMgc3RhdGljIGludCBGSU5FU1QgPSA1OwotCQotCXB1YmxpYyBzdGF0aWMgaW50IFJFU09VUkNFUyA9IDY7Ci0JcHVibGljIHN0YXRpYyBpbnQgRVhURU5TSU9OX1BPSU5UID0gNzsKLQlwdWJsaWMgc3RhdGljIGludCBMSVNURU5FUlMgPSA4OwotCXB1YmxpYyBzdGF0aWMgaW50IFJVTlRJTUVfVEFSR0VUID0gOTsKLQlwdWJsaWMgc3RhdGljIGludCBQRVJGT1JNQU5DRSA9IDEwOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gbGV2ZWxOYW1lcyA9IG5ldyBTdHJpbmdbXSB7Ci0JCSJDT05GSUcgICAiLCAiSU5GTyAgICAgIiwgIldBUk5JTkcgICIsICJTRVZFUkUgICAiLCAiRklORVIgICAgIiwgIkZJTkVTVCAgICIsCi0JCSJSRVNPVVJDRVMiLCAiRVhURU5TSU9OIiwgIkxJU1RFTkVSUyIsICJUQVJHRVQgICAiLCAiUEVSRiAgICAgIn07Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHNwYWNlciA9ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTaW1wbGVEYXRlRm9ybWF0IHNkZiA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJkZC9NTS95eSBISDptbS5zcy5TU1MiKTsKLQotCXByb3RlY3RlZCBzdGF0aWMgaW50IHBsdWdpbkxlbmd0aCA9IC0xOwotCi0JLyoqCi0JICogVHJhY2UgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwcml2YXRlIFRyYWNlKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFRyYWNlIHRoZSBnaXZlbiB0ZXh0LgotCSAqCi0JICogQHBhcmFtIGxldmVsIGEgdHJhY2UgbGV2ZWwKLQkgKiBAcGFyYW0gcyBhIG1lc3NhZ2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2UoaW50IGxldmVsLCBTdHJpbmcgcykgewotCQl0cmFjZShsZXZlbCwgcywgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogVHJhY2UgdGhlIGdpdmVuIG1lc3NhZ2UgYW5kIGV4Y2VwdGlvbi4KLQkgKgotCSAqIEBwYXJhbSBsZXZlbCBhIHRyYWNlIGxldmVsCi0JICogQHBhcmFtIHMgYSBtZXNzYWdlCi0JICogQHBhcmFtIHQgYSB0aHJvd2FibGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2UoaW50IGxldmVsLCBTdHJpbmcgcywgVGhyb3dhYmxlIHQpIHsKLQkJdHJhY2UoU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgbGV2ZWwsIHMsIHQpOwotCX0KLQotCS8qKgotCSAqIFRyYWNlIHRoZSBnaXZlbiBtZXNzYWdlIGFuZCBleGNlcHRpb24uCi0JICoKLQkgKiBAcGFyYW0gbGV2ZWwgYSB0cmFjZSBsZXZlbAotCSAqIEBwYXJhbSBzIGEgbWVzc2FnZQotCSAqIEBwYXJhbSB0IGEgdGhyb3dhYmxlCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCB0cmFjZShTdHJpbmcgcGx1Z2luSWQsIGludCBsZXZlbCwgU3RyaW5nIHMsIFRocm93YWJsZSB0KSB7Ci0JCWlmIChwbHVnaW5JZCA9PSBudWxsIHx8IHMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlpZiAoIVNlcnZlclBsdWdpbi5nZXRJbnN0YW5jZSgpLmlzRGVidWdnaW5nKCkpCi0JCQlyZXR1cm47Ci0JCQotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKHBsdWdpbklkKTsKLQkJaWYgKHBsdWdpbklkLmxlbmd0aCgpID4gcGx1Z2luTGVuZ3RoKQotCQkJcGx1Z2luTGVuZ3RoID0gcGx1Z2luSWQubGVuZ3RoKCk7Ci0JCWVsc2UgaWYgKHBsdWdpbklkLmxlbmd0aCgpIDwgcGx1Z2luTGVuZ3RoKQotCQkJc2IuYXBwZW5kKHNwYWNlci5zdWJzdHJpbmcoMCwgcGx1Z2luTGVuZ3RoIC0gcGx1Z2luSWQubGVuZ3RoKCkpKTsKLQkJc2IuYXBwZW5kKCIgIik7Ci0JCXNiLmFwcGVuZChsZXZlbE5hbWVzW2xldmVsXSk7Ci0JCXNiLmFwcGVuZCgiICIpOwotCQlzYi5hcHBlbmQoc2RmLmZvcm1hdChuZXcgRGF0ZSgpKSk7Ci0JCXNiLmFwcGVuZCgiICIpOwotCQlzYi5hcHBlbmQocyk7Ci0JCS8vUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oU2VydmVyQ29yZS5QTFVHSU5fSUQgKyAiLyIgKyAicmVzb3VyY2VzIik7Ci0KLQkJU3lzdGVtLm91dC5wcmludGxuKHNiLnRvU3RyaW5nKCkpOwotCQlpZiAodCAhPSBudWxsKQotCQkJdC5wcmludFN0YWNrVHJhY2UoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvVXBkYXRlU2VydmVySm9iLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9VcGRhdGVTZXJ2ZXJKb2IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTE0MjhlYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9VcGRhdGVTZXJ2ZXJKb2IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5TZXJ2ZXJCZWhhdmlvdXJEZWxlZ2F0ZTsKLS8qKgotICogQWN0aW9uIHRvIHVwZGF0ZSBhIHNlcnZlcidzIHN0YXR1cy4KLSAqLwotcHVibGljIGNsYXNzIFVwZGF0ZVNlcnZlckpvYiBleHRlbmRzIENoYWluZWRKb2IgewotCS8qKgotCSAqIEFuIGFjdGlvbiB0byB1cGRhdGUgdGhlIHN0YXR1cyBvZiBhIHNlcnZlci4KLQkgKiAKLQkgKiBAcGFyYW0gc2VydmVyIGEgc2VydmVyCi0JICovCi0JcHVibGljIFVwZGF0ZVNlcnZlckpvYihJU2VydmVyIHNlcnZlcikgewotCQlzdXBlcihOTFMuYmluZChNZXNzYWdlcy5qb2JVcGRhdGVTZXJ2ZXIsIHNlcnZlci5nZXROYW1lKCkpLCBzZXJ2ZXIpOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJZ2V0U2VydmVyKCkubG9hZEFkYXB0ZXIoU2VydmVyQmVoYXZpb3VyRGVsZWdhdGUuY2xhc3MsIG1vbml0b3IpOwotCQkKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1dvcmtpbmdDb3B5SGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9Xb3JraW5nQ29weUhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDc4MjA1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1dvcmtpbmdDb3B5SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyV29ya2luZ0NvcHk7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgV29ya2luZ0NvcHlIZWxwZXIgewotCXByb3RlY3RlZCBCYXNlIGJhc2U7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaXNEaXJ0eTsKLQkKLQkvLyBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXJzCi0JcHJpdmF0ZSB0cmFuc2llbnQgTGlzdCBwcm9wZXJ0eUxpc3RlbmVyczsKLQotCXB1YmxpYyBXb3JraW5nQ29weUhlbHBlcihCYXNlIGJhc2UpIHsKLQkJdGhpcy5iYXNlID0gYmFzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIGludCB2YWx1ZSkgewotCQlpbnQgY3VycmVudCA9IGJhc2UuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUsIDApOwotCQlpZiAoY3VycmVudCAhPSAwICYmIGN1cnJlbnQgPT0gdmFsdWUpCi0JCQlyZXR1cm47Ci0KLQkJaXNEaXJ0eSA9IHRydWU7Ci0JCWJhc2UubWFwLnB1dChhdHRyaWJ1dGVOYW1lLCBJbnRlZ2VyLnRvU3RyaW5nKHZhbHVlKSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KGF0dHJpYnV0ZU5hbWUsIG5ldyBJbnRlZ2VyKGN1cnJlbnQpLCBuZXcgSW50ZWdlcih2YWx1ZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShTdHJpbmcgYXR0cmlidXRlTmFtZSwgYm9vbGVhbiB2YWx1ZSkgewotCQlib29sZWFuIGN1cnJlbnQgPSBiYXNlLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lLCBmYWxzZSk7Ci0KLQkJaXNEaXJ0eSA9IHRydWU7Ci0JCWJhc2UubWFwLnB1dChhdHRyaWJ1dGVOYW1lLCBCb29sZWFuLnRvU3RyaW5nKHZhbHVlKSk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KGF0dHJpYnV0ZU5hbWUsIG5ldyBCb29sZWFuKGN1cnJlbnQpLCBuZXcgQm9vbGVhbih2YWx1ZSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIFN0cmluZyB2YWx1ZSkgewotCQlTdHJpbmcgY3VycmVudCA9IGJhc2UuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUsIChTdHJpbmcpbnVsbCk7Ci0JCWlmIChjdXJyZW50ICE9IG51bGwgJiYgY3VycmVudC5lcXVhbHModmFsdWUpKQotCQkJcmV0dXJuOwotCi0JCWlzRGlydHkgPSB0cnVlOwotCQlpZiAodmFsdWUgPT0gbnVsbCkKLQkJCWJhc2UubWFwLnJlbW92ZShhdHRyaWJ1dGVOYW1lKTsKLQkJZWxzZQotCQkJYmFzZS5tYXAucHV0KGF0dHJpYnV0ZU5hbWUsIHZhbHVlKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQoYXR0cmlidXRlTmFtZSwgY3VycmVudCwgdmFsdWUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIExpc3QgdmFsdWUpIHsKLQkJTGlzdCBjdXJyZW50ID0gYmFzZS5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSwgKExpc3QpbnVsbCk7Ci0JCWlmIChjdXJyZW50ICE9IG51bGwgJiYgY3VycmVudC5lcXVhbHModmFsdWUpKQotCQkJcmV0dXJuOwotCi0JCWlzRGlydHkgPSB0cnVlOwotCQlpZiAodmFsdWUgPT0gbnVsbCkKLQkJCWJhc2UubWFwLnJlbW92ZShhdHRyaWJ1dGVOYW1lKTsKLQkJZWxzZQotCQkJYmFzZS5tYXAucHV0KGF0dHJpYnV0ZU5hbWUsIHZhbHVlKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQoYXR0cmlidXRlTmFtZSwgY3VycmVudCwgdmFsdWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShTdHJpbmcgYXR0cmlidXRlTmFtZSwgTWFwIHZhbHVlKSB7Ci0JCU1hcCBjdXJyZW50ID0gYmFzZS5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSwgKE1hcCludWxsKTsKLQkJaWYgKGN1cnJlbnQgIT0gbnVsbCAmJiBjdXJyZW50LmVxdWFscyh2YWx1ZSkpCi0JCQlyZXR1cm47Ci0KLQkJaXNEaXJ0eSA9IHRydWU7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKQotCQkJYmFzZS5tYXAucmVtb3ZlKGF0dHJpYnV0ZU5hbWUpOwotCQllbHNlCi0JCQliYXNlLm1hcC5wdXQoYXR0cmlidXRlTmFtZSwgdmFsdWUpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChhdHRyaWJ1dGVOYW1lLCBjdXJyZW50LCB2YWx1ZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJc2V0QXR0cmlidXRlKEJhc2UuUFJPUF9OQU1FLCBuYW1lKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TG9ja2VkKGJvb2xlYW4gYikgewotCQlzZXRBdHRyaWJ1dGUoQmFzZS5QUk9QX0xPQ0tFRCwgYik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UHJpdmF0ZShib29sZWFuIGIpIHsKLQkJc2V0QXR0cmlidXRlKEJhc2UuUFJPUF9QUklWQVRFLCBiKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJXb3JraW5nQ29weSNpc0RpcnR5KCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RpcnR5KCkgewotCQlyZXR1cm4gaXNEaXJ0eTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVRpbWVzdGFtcChpbnQgdGltZXN0YW1wKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChiYXNlLmdldFRpbWVzdGFtcCgpICE9IHRpbWVzdGFtcCkKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgSVNlcnZlcldvcmtpbmdDb3B5LlNBVkVfQ09ORkxJQ1QsIE1lc3NhZ2VzLmVycm9yV29ya2luZ0NvcHlUaW1lc3RhbXAsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgYSBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIgdG8gdGhpcyBzZXJ2ZXIuCi0JICoKLQkgKiBAcGFyYW0gbGlzdGVuZXIgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChwcm9wZXJ0eUxpc3RlbmVycyA9PSBudWxsKQotCQkJcHJvcGVydHlMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0KDIpOwotCQlwcm9wZXJ0eUxpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCX0KLQkKLQkvKioKLQkgKiBSZW1vdmUgYSBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIgZnJvbSB0aGlzIHNlcnZlci4KLQkgKgotCSAqIEBwYXJhbSBsaXN0ZW5lciBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKHByb3BlcnR5TGlzdGVuZXJzICE9IG51bGwpCi0JCQlwcm9wZXJ0eUxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCX0KLQkKLQkvKioKLQkgKiBGaXJlIGEgcHJvcGVydHkgY2hhbmdlIGV2ZW50LgotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgYSBwcm9wZXJ0eSBuYW1lCi0JICogQHBhcmFtIG9sZFZhbHVlIHRoZSBvbGQgdmFsdWUKLQkgKiBAcGFyYW0gbmV3VmFsdWUgdGhlIG5ldyB2YWx1ZQotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCWlmIChwcm9wZXJ0eUxpc3RlbmVycyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQotCQlQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50ID0gbmV3IFByb3BlcnR5Q2hhbmdlRXZlbnQodGhpcywgcHJvcGVydHlOYW1lLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOwotCQl0cnkgewotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBwcm9wZXJ0eUxpc3RlbmVycy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCXRyeSB7Ci0JCQkJCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSAoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcikgaXRlcmF0b3IubmV4dCgpOwotCQkJCQlsaXN0ZW5lci5wcm9wZXJ0eUNoYW5nZShldmVudCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgZmlyaW5nIHByb3BlcnR5IGNoYW5nZSBldmVudCIsIGUpOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGluIHByb3BlcnR5IGV2ZW50IiwgZSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGlydHkoYm9vbGVhbiBkaXJ0eSkgewotCQlpc0RpcnR5ID0gZGlydHk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1hNTE1lbWVudG8uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL1hNTE1lbWVudG8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2QwOTYwYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9pbnRlcm5hbC9YTUxNZW1lbnRvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgb3JnLnczYy5kb20uKjsKLWltcG9ydCBvcmcueG1sLnNheC4qOwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuKjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLio7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5kb20uRE9NU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsKLS8qKgotICogQSBNZW1lbnRvIGlzIGEgY2xhc3MgaW5kZXBlbmRlbnQgY29udGFpbmVyIGZvciBwZXJzaXN0ZW5jZQotICogaW5mby4gIEl0IGlzIGEgcmVmbGVjdGlvbiBvZiAzIHN0b3JhZ2UgcmVxdWlyZW1lbnRzLgotICoKLSAqIDEpICAgV2UgbmVlZCB0aGUgYWJpbGl0eSB0byBwZXJzaXN0IGFuIG9iamVjdCBhbmQgcmVzdG9yZSBpdC4gIAotICogMikgICBUaGUgY2xhc3MgZm9yIGFuIG9iamVjdCBtYXkgYmUgYWJzZW50LiAgSWYgc28gd2Ugd291bGQgCi0gKiAgICAgIGxpa2UgdG8gc2tpcCB0aGUgb2JqZWN0IGFuZCBrZWVwIHJlYWRpbmcuIAotICogMykgICBUaGUgY2xhc3MgZm9yIGFuIG9iamVjdCBtYXkgY2hhbmdlLiAgSWYgc28gdGhlIG5ldyBjbGFzcyAKLSAqICAgICAgc2hvdWxkIGJlIGFibGUgdG8gcmVhZCB0aGUgb2xkIHBlcnNpc3RlbmNlIGluZm8uCi0gKgotICogV2UgY291bGQgYXNrIHRoZSBvYmplY3RzIHRvIHNlcmlhbGl6ZSB0aGVtc2VsdmVzIGludG8gYW4gCi0gKiBPYmplY3RPdXRwdXRTdHJlYW0sIERhdGFPdXRwdXRTdHJlYW0sIG9yIEhhc2h0YWJsZS4gIEhvd2V2ZXIgCi0gKiBhbGwgb2YgdGhlc2UgYXBwcm9hY2hlcyBmYWlsIHRvIG1lZXQgdGhlIHNlY29uZCByZXF1aXJlbWVudC4KLSAqCi0gKiBNZW1lbnRvIHN1cHBvcnRzIGJpbmFyeSBwZXJzaXN0YW5jZSB3aXRoIGEgdmVyc2lvbiBJRC4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFhNTE1lbWVudG8gaW1wbGVtZW50cyBJTWVtZW50byB7Ci0JcHJpdmF0ZSBEb2N1bWVudCBmYWN0b3J5OwotCXByaXZhdGUgRWxlbWVudCBlbGVtZW50OwotCi0JLyoqCi0JICogQW5zd2VyIGEgbWVtZW50byBmb3IgdGhlIGRvY3VtZW50IGFuZCBlbGVtZW50LiAgRm9yIHNpbXBsaWNpdHkKLQkgKiB5b3Ugc2hvdWxkIHVzZSBjcmVhdGVSZWFkUm9vdCBhbmQgY3JlYXRlV3JpdGVSb290IHRvIGNyZWF0ZSB0aGUgaW5pdGlhbAotCSAqIG1lbWVudG9zIG9uIGEgZG9jdW1lbnQuCi0JICovCi0JcHJpdmF0ZSBYTUxNZW1lbnRvKERvY3VtZW50IGRvYywgRWxlbWVudCBlbCkgewotCQlmYWN0b3J5ID0gZG9jOwotCQllbGVtZW50ID0gZWw7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElNZW1lbnRvCi0JICovCi0JcHVibGljIElNZW1lbnRvIGNyZWF0ZUNoaWxkKFN0cmluZyB0eXBlKSB7Ci0JCUVsZW1lbnQgY2hpbGQgPSBmYWN0b3J5LmNyZWF0ZUVsZW1lbnQodHlwZSk7Ci0JCWVsZW1lbnQuYXBwZW5kQ2hpbGQoY2hpbGQpOwotCQlyZXR1cm4gbmV3IFhNTE1lbWVudG8oZmFjdG9yeSwgY2hpbGQpOwotCX0KLQotCS8qCi0JICogQHNlZSBJTWVtZW50bwotCSAqLwotCXB1YmxpYyBJTWVtZW50byBjcmVhdGVDaGlsZChTdHJpbmcgdHlwZSwgU3RyaW5nIGlkKSB7Ci0JCUVsZW1lbnQgY2hpbGQgPSBmYWN0b3J5LmNyZWF0ZUVsZW1lbnQodHlwZSk7Ci0JCWNoaWxkLnNldEF0dHJpYnV0ZShUQUdfSUQsIGlkKTsKLQkJZWxlbWVudC5hcHBlbmRDaGlsZChjaGlsZCk7Ci0JCXJldHVybiBuZXcgWE1MTWVtZW50byhmYWN0b3J5LCBjaGlsZCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgRG9jdW1lbnQgZnJvbSBhIFJlYWRlciBhbmQgYW5zd2VyIGEgcm9vdCBtZW1lbnRvIGZvciByZWFkaW5nIAotCSAqIGEgZG9jdW1lbnQuCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBYTUxNZW1lbnRvIGNyZWF0ZVJlYWRSb290KElucHV0U3RyZWFtIGluKSB7Ci0JCURvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCURvY3VtZW50QnVpbGRlckZhY3RvcnkgZmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLQkJCURvY3VtZW50QnVpbGRlciBwYXJzZXIgPSBmYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOwotCQkJZG9jdW1lbnQgPSBwYXJzZXIucGFyc2UobmV3IElucHV0U291cmNlKGluKSk7Ci0JCQlOb2RlIG5vZGUgPSBkb2N1bWVudC5nZXRGaXJzdENoaWxkKCk7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpCi0JCQkJcmV0dXJuIG5ldyBYTUxNZW1lbnRvKGRvY3VtZW50LCAoRWxlbWVudCkgbm9kZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJaW4uY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIEFuc3dlciBhIHJvb3QgbWVtZW50byBmb3Igd3JpdGluZyBhIGRvY3VtZW50LgotCSAqIAotCSAqIEBwYXJhbSB0eXBlIGEgdHlwZQotCSAqIEByZXR1cm4gYSBtZW1lbnRvCi0JICovCi0JcHVibGljIHN0YXRpYyBYTUxNZW1lbnRvIGNyZWF0ZVdyaXRlUm9vdChTdHJpbmcgdHlwZSkgewotCQlEb2N1bWVudCBkb2N1bWVudDsKLQkJdHJ5IHsKLQkJCWRvY3VtZW50ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld0RvY3VtZW50QnVpbGRlcigpLm5ld0RvY3VtZW50KCk7Ci0JCQlFbGVtZW50IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHR5cGUpOwotCQkJZG9jdW1lbnQuYXBwZW5kQ2hpbGQoZWxlbWVudCk7Ci0JCQlyZXR1cm4gbmV3IFhNTE1lbWVudG8oZG9jdW1lbnQsIGVsZW1lbnQpOyAgICAgICAgICAgIAotCQl9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBFcnJvcihlKTsKLQkJfQotCX0KLQkKLQkvKgotCSAqIEBzZWUgSU1lbWVudG8KLQkgKi8KLQlwdWJsaWMgSU1lbWVudG8gZ2V0Q2hpbGQoU3RyaW5nIHR5cGUpIHsKLQkJLy8gR2V0IHRoZSBub2Rlcy4KLQkJTm9kZUxpc3Qgbm9kZXMgPSBlbGVtZW50LmdldENoaWxkTm9kZXMoKTsKLQkJaW50IHNpemUgPSBub2Rlcy5nZXRMZW5ndGgoKTsKLQkJaWYgKHNpemUgPT0gMCkKLQkJCXJldHVybiBudWxsOwotCQotCQkvLyBGaW5kIHRoZSBmaXJzdCBub2RlIHdoaWNoIGlzIGEgY2hpbGQgb2YgdGhpcyBub2RlLgotCQlmb3IgKGludCBuWCA9IDA7IG5YIDwgc2l6ZTsgblggKyspIHsKLQkJCU5vZGUgbm9kZSA9IG5vZGVzLml0ZW0oblgpOwotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0JCQkJRWxlbWVudCBlbGVtZW50MiA9IChFbGVtZW50KW5vZGU7Ci0JCQkJaWYgKGVsZW1lbnQyLmdldE5vZGVOYW1lKCkuZXF1YWxzKHR5cGUpKQotCQkJCQlyZXR1cm4gbmV3IFhNTE1lbWVudG8oZmFjdG9yeSwgZWxlbWVudDIpOwotCQkJfQotCQl9Ci0JCi0JCS8vIEEgY2hpbGQgd2FzIG5vdCBmb3VuZC4KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElNZW1lbnRvCi0JICovCi0JcHVibGljIElNZW1lbnRvIFtdIGdldENoaWxkcmVuKFN0cmluZyB0eXBlKSB7Ci0JCS8vIEdldCB0aGUgbm9kZXMuCi0JCU5vZGVMaXN0IG5vZGVzID0gZWxlbWVudC5nZXRDaGlsZE5vZGVzKCk7Ci0JCWludCBzaXplID0gbm9kZXMuZ2V0TGVuZ3RoKCk7Ci0JCWlmIChzaXplID09IDApCi0JCQlyZXR1cm4gbmV3IElNZW1lbnRvWzBdOwotCQotCQkvLyBFeHRyYWN0IGVhY2ggbm9kZSB3aXRoIGdpdmVuIHR5cGUuCi0JCUFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdChzaXplKTsKLQkJZm9yIChpbnQgblggPSAwOyBuWCA8IHNpemU7IG5YICsrKSB7Ci0JCQlOb2RlIG5vZGUgPSBub2Rlcy5pdGVtKG5YKTsKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJCUVsZW1lbnQgZWxlbWVudDIgPSAoRWxlbWVudClub2RlOwotCQkJCWlmIChlbGVtZW50Mi5nZXROb2RlTmFtZSgpLmVxdWFscyh0eXBlKSkKLQkJCQkJbGlzdC5hZGQoZWxlbWVudDIpOwotCQkJfQotCQl9Ci0JCi0JCS8vIENyZWF0ZSBhIG1lbWVudG8gZm9yIGVhY2ggbm9kZS4KLQkJc2l6ZSA9IGxpc3Quc2l6ZSgpOwotCQlJTWVtZW50byBbXSByZXN1bHRzID0gbmV3IElNZW1lbnRvW3NpemVdOwotCQlmb3IgKGludCB4ID0gMDsgeCA8IHNpemU7IHggKyspIHsKLQkJCXJlc3VsdHNbeF0gPSBuZXcgWE1MTWVtZW50byhmYWN0b3J5LCAoRWxlbWVudClsaXN0LmdldCh4KSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdHM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjb250ZW50cyBvZiB0aGlzIG1lbWVudG8gYXMgYSBieXRlIGFycmF5LgotCSAqCi0JICogQHJldHVybiBieXRlW10KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFueXRoaW5nIGdvZXMgd3JvbmcKLQkgKi8KLQlwdWJsaWMgYnl0ZVtdIGdldENvbnRlbnRzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJc2F2ZShvdXQpOwotCQlyZXR1cm4gb3V0LnRvQnl0ZUFycmF5KCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBpbnB1dCBzdHJlYW0gZm9yIHdyaXRpbmcgdG8gdGhlIGRpc2sgd2l0aCBhIGxvY2FsIGxvY2FsZS4KLQkgKgotCSAqIEByZXR1cm4gamF2YS5pby5JbnB1dFN0cmVhbQotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYW55dGhpbmcgZ29lcyB3cm9uZwotCSAqLwotCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCXNhdmUob3V0KTsKLQkJcmV0dXJuIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvdXQudG9CeXRlQXJyYXkoKSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElNZW1lbnRvCi0JICovCi0JcHVibGljIEZsb2F0IGdldEZsb2F0KFN0cmluZyBrZXkpIHsKLQkJQXR0ciBhdHRyID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVOb2RlKGtleSk7Ci0JCWlmIChhdHRyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgCi0JCVN0cmluZyBzdHJWYWx1ZSA9IGF0dHIuZ2V0VmFsdWUoKTsKLQkJdHJ5IHsKLQkJCXJldHVybiBuZXcgRmxvYXQoc3RyVmFsdWUpOwotCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgSU1lbWVudG8KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoVEFHX0lEKTsKLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIElNZW1lbnRvCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gZWxlbWVudC5nZXROb2RlTmFtZSgpOwotCX0KLQotCS8qCi0JICogQHNlZSBJTWVtZW50bwotCSAqLwotCXB1YmxpYyBJbnRlZ2VyIGdldEludGVnZXIoU3RyaW5nIGtleSkgewotCQlBdHRyIGF0dHIgPSBlbGVtZW50LmdldEF0dHJpYnV0ZU5vZGUoa2V5KTsKLQkJaWYgKGF0dHIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAKLQkJU3RyaW5nIHN0clZhbHVlID0gYXR0ci5nZXRWYWx1ZSgpOwotCQl0cnkgewotCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKHN0clZhbHVlKTsKLQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElNZW1lbnRvCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgewotCQlBdHRyIGF0dHIgPSBlbGVtZW50LmdldEF0dHJpYnV0ZU5vZGUoa2V5KTsKLQkJaWYgKGF0dHIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAKLQkJcmV0dXJuIGF0dHIuZ2V0VmFsdWUoKTsKLQl9Ci0JCi0JcHVibGljIExpc3QgZ2V0TmFtZXMoKSB7Ci0JCU5hbWVkTm9kZU1hcCBtYXAgPSBlbGVtZW50LmdldEF0dHJpYnV0ZXMoKTsKLQkJaW50IHNpemUgPSBtYXAuZ2V0TGVuZ3RoKCk7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCU5vZGUgbm9kZSA9IG1hcC5pdGVtKGkpOwotCQkJU3RyaW5nIG5hbWUgPSBub2RlLmdldE5vZGVOYW1lKCk7Ci0JCQlsaXN0LmFkZChuYW1lKTsKLQkJfQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkcyBhIG1lbWVudG8gZnJvbSB0aGUgZ2l2ZW4gZmlsZW5hbWUuCi0JICoKLQkgKiBAcGFyYW0gaW4gamF2YS5pby5JbnB1dFN0cmVhbQotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UudWkuSU1lbWVudG8KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElNZW1lbnRvIGxvYWRNZW1lbnRvKElucHV0U3RyZWFtIGluKSB7Ci0JCXJldHVybiBjcmVhdGVSZWFkUm9vdChpbik7Ci0JfQotCi0JLyoqCi0JICogTG9hZHMgYSBtZW1lbnRvIGZyb20gdGhlIGdpdmVuIGZpbGVuYW1lLgotCSAqCi0JICogQHBhcmFtIGZpbGVuYW1lIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLnVpLklNZW1lbnRvCi0JICogQGV4Y2VwdGlvbiBqYXZhLmlvLklPRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBJTWVtZW50byBsb2FkTWVtZW50byhTdHJpbmcgZmlsZW5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUZpbGVJbnB1dFN0cmVhbSBmaW4gPSBudWxsOwotCQl0cnkgewotCQkJZmluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlbmFtZSk7Ci0JCQlyZXR1cm4gWE1MTWVtZW50by5jcmVhdGVSZWFkUm9vdChmaW4pOwotCQl9IGZpbmFsbHkgewotCQkJdHJ5IHsKLQkJCQlpZiAoZmluICE9IG51bGwpCi0JCQkJCWZpbi5jbG9zZSgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBpZ25vcmUKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBJTWVtZW50bwotCSAqLwotCXByaXZhdGUgdm9pZCBwdXRFbGVtZW50KEVsZW1lbnQgZWxlbWVudDIpIHsKLQkJTmFtZWROb2RlTWFwIG5vZGVNYXAgPSBlbGVtZW50Mi5nZXRBdHRyaWJ1dGVzKCk7Ci0JCWludCBzaXplID0gbm9kZU1hcC5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspewotCQkJQXR0ciBhdHRyID0gKEF0dHIpbm9kZU1hcC5pdGVtKGkpOwotCQkJcHV0U3RyaW5nKGF0dHIuZ2V0TmFtZSgpLGF0dHIuZ2V0VmFsdWUoKSk7Ci0JCX0KLQkJCi0JCU5vZGVMaXN0IG5vZGVzID0gZWxlbWVudDIuZ2V0Q2hpbGROb2RlcygpOwotCQlzaXplID0gbm9kZXMuZ2V0TGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSArKykgewotCQkJTm9kZSBub2RlID0gbm9kZXMuaXRlbShpKTsKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJCVhNTE1lbWVudG8gY2hpbGQgPSAoWE1MTWVtZW50byljcmVhdGVDaGlsZChub2RlLmdldE5vZGVOYW1lKCkpOwotCQkJCWNoaWxkLnB1dEVsZW1lbnQoKEVsZW1lbnQpbm9kZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgSU1lbWVudG8KLQkgKi8KLQlwdWJsaWMgdm9pZCBwdXRGbG9hdChTdHJpbmcga2V5LCBmbG9hdCBmKSB7Ci0JCWVsZW1lbnQuc2V0QXR0cmlidXRlKGtleSwgU3RyaW5nLnZhbHVlT2YoZikpOwotCX0KLQotCS8qCi0JICogQHNlZSBJTWVtZW50bwotCSAqLwotCXB1YmxpYyB2b2lkIHB1dEludGVnZXIoU3RyaW5nIGtleSwgaW50IG4pIHsKLQkJZWxlbWVudC5zZXRBdHRyaWJ1dGUoa2V5LCBTdHJpbmcudmFsdWVPZihuKSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElNZW1lbnRvCi0JICovCi0JcHVibGljIHZvaWQgcHV0TWVtZW50byhJTWVtZW50byBtZW1lbnRvKSB7Ci0JCVhNTE1lbWVudG8geG1sTWVtZW50byA9IChYTUxNZW1lbnRvKSBtZW1lbnRvOwotCQlwdXRFbGVtZW50KHhtbE1lbWVudG8uZWxlbWVudCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElNZW1lbnRvCi0JICovCi0JcHVibGljIHZvaWQgcHV0U3RyaW5nKFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgewotCQlpZiAodmFsdWUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZWxlbWVudC5zZXRBdHRyaWJ1dGUoa2V5LCB2YWx1ZSk7Ci0JfQotCQotCS8qKgotCSAqIFNhdmUgdGhpcyBNZW1lbnRvIHRvIGEgV3JpdGVyLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNhdmUoT3V0cHV0U3RyZWFtIG9zKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlSZXN1bHQgcmVzdWx0ID0gbmV3IFN0cmVhbVJlc3VsdChvcyk7Ci0JCVNvdXJjZSBzb3VyY2UgPSBuZXcgRE9NU291cmNlKGZhY3RvcnkpOwotCQl0cnkgewotCQkJVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdUcmFuc2Zvcm1lcigpOwotCQkJdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5JTkRFTlQsICJ5ZXMiKTsKLQkJCXRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuTUVUSE9ELCAieG1sIik7Ci0JCQl0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLkVOQ09ESU5HLCAiVVRGLTgiKTsKLQkJCXRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KCJ7aHR0cDovL3htbC5hcGFjaGUub3JnL3hhbGFufWluZGVudC1hbW91bnQiLCAiMiIpOwotCQkJdHJhbnNmb3JtZXIudHJhbnNmb3JtKHNvdXJjZSwgcmVzdWx0KTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IChJT0V4Y2VwdGlvbikgKG5ldyBJT0V4Y2VwdGlvbigpLmluaXRDYXVzZShlKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB0aGUgbWVtZW50byB0byB0aGUgZ2l2ZW4gZmlsZS4KLQkgKgotCSAqIEBwYXJhbSBmaWxlbmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQGV4Y2VwdGlvbiBqYXZhLmlvLklPRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZVRvRmlsZShTdHJpbmcgZmlsZW5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUZpbGVPdXRwdXRTdHJlYW0gdyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl3ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZW5hbWUpOwotCQkJc2F2ZSh3KTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJdGhyb3cgZTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAodyAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJdy5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIGlnbm9yZQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIHNhdmVUb1N0cmluZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCXNhdmUob3V0KTsKLQkJcmV0dXJuIG91dC50b1N0cmluZygiVVRGLTgiKTsKLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIElNZW1lbnRvI2dldEJvb2xlYW4oU3RyaW5nKQotCSAqLwotCXB1YmxpYyBCb29sZWFuIGdldEJvb2xlYW4oU3RyaW5nIGtleSkgewotCQlBdHRyIGF0dHIgPSBlbGVtZW50LmdldEF0dHJpYnV0ZU5vZGUoa2V5KTsKLQkJaWYgKGF0dHIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmcgc3RyVmFsdWUgPSBhdHRyLmdldFZhbHVlKCk7Ci0JCWlmICgidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShzdHJWYWx1ZSkpCi0JCQlyZXR1cm4gbmV3IEJvb2xlYW4odHJ1ZSk7Ci0JCXJldHVybiBuZXcgQm9vbGVhbihmYWxzZSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElNZW1lbnRvI3B1dEJvb2xlYW4oU3RyaW5nLCBib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHB1dEJvb2xlYW4oU3RyaW5nIGtleSwgYm9vbGVhbiB2YWx1ZSkgewotCQllbGVtZW50LnNldEF0dHJpYnV0ZShrZXksIHZhbHVlID8gInRydWUiIDogImZhbHNlIik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL1NlcnZlckxvY2F0b3JEZWxlZ2F0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvU2VydmVyTG9jYXRvckRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0YjlhNjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvU2VydmVyTG9jYXRvckRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyV29ya2luZ0NvcHk7Ci0vKioKLSAqIEEgc2VydmVyIGxvY2F0b3IgcHJvdmlkZXMgdGhlIGFiaWxpdHkgdG8gbG9jYXRlIG9yIHNlYXJjaCBmb3IgYWRkaXRpb25hbAotICogc2VydmVyIG9mIGEgcGFydGljdWxhciB0eXBlLCBvbiBhIHBhcnRpY3VsYXIgaG9zdC4KLSAqIDxwPgotICogVGhpcyBhYnN0cmFjdCBjbGFzcyBpcyBpbnRlbmRlZCB0byBiZSBleHRlbmRlZCBvbmx5IGJ5IGNsaWVudHMKLSAqIHRvIGV4dGVuZCB0aGUgPGNvZGU+c2VydmVyTG9jYXRvcnM8L2NvZGU+IGV4dGVuc2lvbiBwb2ludC4KLSAqIDwvcD4KLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTZXJ2ZXJMb2NhdG9yRGVsZWdhdGUgewotCS8qKgotCSAqIEEgY2FsbGJhY2sgbGlzdGVuZXIgdXNlZCB0byByZXBvcnQgcHJvZ3Jlc3MuCi0JICovCi0JcHVibGljIGludGVyZmFjZSBJU2VydmVyU2VhcmNoTGlzdGVuZXIgewotCQkvKioKLQkJICogQ2FsbGVkIHdoZW4gYSBuZXcgc2VydmVyIGlzIGZvdW5kIGJ5IHRoZSBsb2NhdG9yLgotCQkgKiBUaGUgc2VydmVyIG11c3QgbmV2ZXIgYmUgbnVsbC4KLQkJICogCi0JCSAqIEBwYXJhbSBzZXJ2ZXIgdGhlIHJ1bnRpbWUgdGhhdCB3YXMgZm91bmQuCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXJ2ZXJGb3VuZChJU2VydmVyV29ya2luZ0NvcHkgc2VydmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWFyY2hlcyBmb3Igc2VydmVycy4gCi0JICogSXQgdXNlcyB0aGUgY2FsbGJhY2sgbGlzdGVuZXIgdG8gcmVwb3J0IHNlcnZlcnMgdGhhdCBhcmUgZm91bmQuCi0JICogCi0JICogQHBhcmFtIGhvc3QgYSBob3N0IHN0cmluZyBjb25mb3JtaW5nIHRvIFJGQyAyNzMyCi0JICogQHBhcmFtIGxpc3RlbmVyIGEgbGlzdGVuZXIgdG8gcmVwb3J0IHN0YXR1cyB0bwotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZWFyY2hGb3JTZXJ2ZXJzKFN0cmluZyBob3N0LCBJU2VydmVyU2VhcmNoTGlzdGVuZXIgbGlzdGVuZXIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcik7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvbW9kZWwvQ2xpZW50RGVsZWdhdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL21vZGVsL0NsaWVudERlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0MDMxZGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvbW9kZWwvQ2xpZW50RGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotLyoqCi0gKiBBIGxhdW5jaGFibGUgY2xpZW50IGlzIGEgY2xpZW50IHNpZGUgYXBwbGljYXRpb24gb3IgdGVzdCBoYXJuZXNzIHRoYXQgY2FuCi0gKiBiZSBsYXVuY2hlZCAocnVuKSBhZ2FpbnN0IGEgcmVzb3VyY2UgcnVubmluZyBvbiBhIHNlcnZlci4KLSAqIDxwPgotICogVGhpcyBhYnN0cmFjdCBjbGFzcyBpcyBpbnRlbmRlZCB0byBiZSBleHRlbmRlZCBvbmx5IGJ5IGNsaWVudHMKLSAqIHRvIGV4dGVuZCB0aGUgPGNvZGU+Y2xpZW50czwvY29kZT4gZXh0ZW5zaW9uIHBvaW50LgotICogPC9wPgotICogCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDbGllbnREZWxlZ2F0ZSB7Ci0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoaXMgbGF1bmNoYWJsZSBjYW4gYmUgcnVuIGJ5IHRoaXMgY2xpZW50LgotCSAqIAotCSAqIEBwYXJhbSBzZXJ2ZXIgdGhlIHNlcnZlciB0aGF0IHRoZSBjbGllbnQgaXMgYmVpbmcgcnVuIGFnYWluc3QKLQkgKiBAcGFyYW0gbGF1bmNoYWJsZSB0aGUgb2JqZWN0IHRvIHJ1biBvbiB0aGUgc2VydmVyCi0JICogQHBhcmFtIGxhdW5jaE1vZGUgdGhlIGxhdW5jaCBtb2RlCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY2xpZW50IHN1cHBvcnRzIHRoaXMgY29tYmluYXRpb24sIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiAgICBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhJU2VydmVyIHNlcnZlciwgT2JqZWN0IGxhdW5jaGFibGUsIFN0cmluZyBsYXVuY2hNb2RlKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIE9wZW5zIG9yIGV4ZWN1dGVzIG9uIHRoZSBsYXVuY2hhYmxlLgotCSAqIAotCSAqIEBwYXJhbSBzZXJ2ZXIgdGhlIHNlcnZlciB0aGF0IHRoZSBjbGllbnQgaXMgYmVpbmcgcnVuIGFnYWluc3QKLQkgKiBAcGFyYW0gbGF1bmNoYWJsZSB0aGUgb2JqZWN0IHRvIHJ1biBvbiB0aGUgc2VydmVyCi0JICogQHBhcmFtIGxhdW5jaE1vZGUgdGhlIGxhdW5jaCBtb2RlCi0JICogQHBhcmFtIGxhdW5jaCB0aGUgbGF1bmNoIG9mIHRoZSBzZXJ2ZXIsIGlmIGF2YWlsYWJsZQotCSAqIEByZXR1cm4gc3RhdHVzIGluZGljYXRpbmcgd2hhdCAoaWYgYW55dGhpbmcpIHdlbnQgd3JvbmcKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgSVN0YXR1cyBsYXVuY2goSVNlcnZlciBzZXJ2ZXIsIE9iamVjdCBsYXVuY2hhYmxlLCBTdHJpbmcgbGF1bmNoTW9kZSwgSUxhdW5jaCBsYXVuY2gpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL21vZGVsL0lNb2R1bGVGaWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9tb2RlbC9JTW9kdWxlRmlsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjhmMGVhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL21vZGVsL0lNb2R1bGVGaWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLaAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbDsKLS8qKgotICogQSBmaWxlIHdpdGhpbiBhIG1vZHVsZS4KLSAqIAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNb2R1bGVGaWxlIGV4dGVuZHMgSU1vZHVsZVJlc291cmNlIHsKLQkvKioKLQkgKiBSZXR1cm5zIGEgbW9kaWZpY2F0aW9uIHN0YW1wLiBXaGVuZXZlciB0aGUgbW9kaWZpY2F0aW9uCi0JICogc3RhbXAgY2hhbmdlcywgdGhlcmUgbWF5IGhhdmUgYmVlbiBhIGNoYW5nZSB0byB0aGUgZmlsZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtb2RpZmljYXRpb24gc3RhbXAKLQkgKi8KLQlwdWJsaWMgbG9uZyBnZXRNb2RpZmljYXRpb25TdGFtcCgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL21vZGVsL0lNb2R1bGVGb2xkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL21vZGVsL0lNb2R1bGVGb2xkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjhjMDgyMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9tb2RlbC9JTW9kdWxlRm9sZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLaAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbDsKLS8qKgotICogQSBmb2xkZXIgd2l0aGluIGEgbW9kdWxlLgotICogCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU1vZHVsZUZvbGRlciBleHRlbmRzIElNb2R1bGVSZXNvdXJjZSB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgbWVtYmVycyAoY29udGVudHMpIG9mIHRoaXMgZm9sZGVyLgotCSAqIAotCSAqIEByZXR1cm4gYW4gYXJyYXkgY29udGFpbmluZyB0aGUgbW9kdWxlIHJlc291cmNlcyBjb250YWluZWQgaW4gdGhpcyBmb2xkZXIKLQkgKi8KLQlwdWJsaWMgSU1vZHVsZVJlc291cmNlW10gbWVtYmVycygpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL21vZGVsL0lNb2R1bGVSZXNvdXJjZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvbW9kZWwvSU1vZHVsZVJlc291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjZWNhM2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvbW9kZWwvSU1vZHVsZVJlc291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLaAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLS8qKgotICogQSByZXNvdXJjZSAoZmlsZSBvciBmb2xkZXIpIHdpdGhpbiBhIG1vZHVsZS4KLSAqIAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNb2R1bGVSZXNvdXJjZSBleHRlbmRzIElBZGFwdGFibGUgewotCS8qKgotCSAqIFJldHVybnMgdGhlIG1vZHVsZSByZWxhdGl2ZSBwYXRoIHRvIHRoaXMgcmVzb3VyY2UuCi0JICogCi0JICogQHJldHVybiB0aGUgbW9kdWxlIHJlbGF0aXZlIHBhdGggdG8gdGhpcyByZXNvdXJjZQotCSAqLwotCXB1YmxpYyBJUGF0aCBnZXRNb2R1bGVSZWxhdGl2ZVBhdGgoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhpcyByZXNvdXJjZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoaXMgcmVzb3VyY2UKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9tb2RlbC9JTW9kdWxlUmVzb3VyY2VEZWx0YS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvbW9kZWwvSU1vZHVsZVJlc291cmNlRGVsdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY1MDI3MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9tb2RlbC9JTW9kdWxlUmVzb3VyY2VEZWx0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotoCogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotLyoqCi0gKiBBIG1vZHVsZSByZXNvdXJjZSBkZWx0YS4KLSAqIAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNb2R1bGVSZXNvdXJjZURlbHRhIHsKLQkvKioKLQkgKiBLaW5kIGNvbnN0YW50ICh2YWx1ZSAwKSBmb3Igbm8gY2hhbmdlLgotCSAqIAotCSAqIEBzZWUgI2dldEtpbmQoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PX0NIQU5HRSA9IDA7Ci0KLQkvKioKLQkgKiBLaW5kIGNvbnN0YW50ICh2YWx1ZSAxKSBmb3IgYWRkZWQgcmVzb3VyY2VzLgotCSAqIAotCSAqIEBzZWUgI2dldEtpbmQoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFEREVEID0gMTsKLQotCS8qKgotCSAqIEtpbmQgY29uc3RhbnQgKHZhbHVlIDIpIGZvciBjaGFuZ2VkIHJlc291cmNlcy4KLQkgKiAKLQkgKiBAc2VlICNnZXRLaW5kKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDSEFOR0VEID0gMjsKLQotCS8qKgotCSAqIEtpbmQgY29uc3RhbnQgKHZhbHVlIDMpIGZvciByZW1vdmVkIHJlc291cmNlcy4KLQkgKiAKLQkgKiBAc2VlICNnZXRLaW5kKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRU1PVkVEID0gMzsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1vZHVsZSByZXNvdXJjZSByZXByZXNlbnRlZCBieSB0aGlzIGRlbHRhLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgbW9kdWxlIHJlc291cmNlCi0JICovCi0JcHVibGljIElNb2R1bGVSZXNvdXJjZSBnZXRNb2R1bGVSZXNvdXJjZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUga2luZCBvZiB0aGlzIHJlc291cmNlIGRlbHRhLgotCSAqIE5vcm1hbGx5LCBvbmUgb2YgPGNvZGU+QURERUQ8L2NvZGU+LCAKLQkgKiA8Y29kZT5SRU1PVkVEPC9jb2RlPiwgPGNvZGU+Q0hBTkdFRDwvY29kZT4uCi0JICogCi0JICogQHJldHVybiB0aGUga2luZCBvZiB0aGlzIHJlc291cmNlIGRlbHRhCi0JICogCi0JICogQHNlZSBJTW9kdWxlUmVzb3VyY2VEZWx0YSNBRERFRAotCSAqIEBzZWUgSU1vZHVsZVJlc291cmNlRGVsdGEjUkVNT1ZFRAotCSAqIEBzZWUgSU1vZHVsZVJlc291cmNlRGVsdGEjQ0hBTkdFRAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0S2luZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBtb2R1bGUgcmVzb3VyY2UgZGVsdGFzIGZvciBhbGwgY2hpbGRyZW4gb2YgdGhpcyByZXNvdXJjZSAKLQkgKiB3aGljaCB3ZXJlIGFkZGVkLCByZW1vdmVkLCBvciBjaGFuZ2VkLiBSZXR1cm5zIGFuIGVtcHR5Ci0JICogYXJyYXkgaWYgdGhlcmUgYXJlIG5vIGFmZmVjdGVkIGNoaWxkcmVuLgotCSAqIDxwPgotCSAqIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QsIGZ1bGx5IGVxdWl2YWxlbnQgdG86Ci0JICogPHByZT4KLQkgKiAgIGdldEFmZmVjdGVkQ2hpbGRyZW4oQURERUQgfCBSRU1PVkVEIHwgQ0hBTkdFRCwgSVJlc291cmNlLk5PTkUpOwotCSAqIDwvcHJlPgotCSAqIDwvcD4KLQkgKgotCSAqIEByZXR1cm4gdGhlIHJlc291cmNlIGRlbHRhcyBmb3IgYWxsIGFmZmVjdGVkIGNoaWxkcmVuCi0JICogQHNlZSBJTW9kdWxlUmVzb3VyY2VEZWx0YSNBRERFRAotCSAqIEBzZWUgSU1vZHVsZVJlc291cmNlRGVsdGEjUkVNT1ZFRAotCSAqIEBzZWUgSU1vZHVsZVJlc291cmNlRGVsdGEjQ0hBTkdFRAotCSAqLwotCXB1YmxpYyBJTW9kdWxlUmVzb3VyY2VEZWx0YVtdIGdldEFmZmVjdGVkQ2hpbGRyZW4oKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtb2R1bGUtcmVsYXRpdmUgcGF0aCBvZiB0aGlzIHJlc291cmNlIGRlbHRhLgotCSAqIFJldHVybnMgdGhlIGVtcHR5IHBhdGggZm9yIHJlc291cmNlcyBpbiB0aGUgbW9kdWxlIHJvb3QuCi0JICogPHA+Ci0JICogQSByZXNvdXJjZSdzIG1vZHVsZS1yZWxhdGl2ZSBwYXRoIGluZGljYXRlcyB0aGUgcm91dGUgZnJvbSB0aGUgbW9kdWxlCi0JICogdG8gdGhlIHJlc291cmNlLiBXaXRoaW4gYSBtb2R1bGUsIHRoZXJlIGlzIGV4YWN0bHkgb25lIHN1Y2ggcGF0aAotCSAqIGZvciBhbnkgZ2l2ZW4gcmVzb3VyY2UuIFRoZSByZXR1cm5lZCBwYXRoIG5ldmVyIGhhcyBhIHRyYWlsaW5nIHNlcGFyYXRvci4KLQkgKiA8L3A+Ci0JICogQHJldHVybiB0aGUgbW9kdWxlLXJlbGF0aXZlIHBhdGggb2YgdGhpcyByZXNvdXJjZSBkZWx0YQotCSAqIEBzZWUgSU1vZHVsZVJlc291cmNlI2dldE1vZHVsZVJlbGF0aXZlUGF0aCgpCi0JICovCi0JcHVibGljIElQYXRoIGdldE1vZHVsZVJlbGF0aXZlUGF0aCgpOwotCQotCS8qKgotCSAqIEZpbmRzIGFuZCByZXR1cm5zIHRoZSBkZXNjZW5kZW50IGRlbHRhIGlkZW50aWZpZWQgYnkgdGhlIGdpdmVuIHBhdGggaW4KLQkgKiB0aGlzIGRlbHRhLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBzdWNoIGRlc2NlbmRlbnQgZXhpc3RzLgotCSAqIFRoZSBzdXBwbGllZCBwYXRoIG1heSBiZSBhYnNvbHV0ZSBvciByZWxhdGl2ZTsgaW4gZWl0aGVyIGNhc2UsIGl0IGlzCi0JICogaW50ZXJwcmV0ZWQgYXMgcmVsYXRpdmUgdG8gdGhpcyBkZWx0YS4gICBUcmFpbGluZyBzZXBhcmF0b3JzIGFyZSBpZ25vcmVkLgotCSAqIElmIHRoZSBwYXRoIGlzIGVtcHR5IHRoaXMgZGVsdGEgaXMgcmV0dXJuZWQuCi0JICogPHA+Ci0JICogVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCB0byBhdm9pZCBtYW51YWwgdHJhdmVyc2FsIG9mIHRoZSBkZWx0YQotCSAqIHRyZWUgaW4gY2FzZXMgd2hlcmUgdGhlIGxpc3RlbmVyIGlzIG9ubHkgaW50ZXJlc3RlZCBpbiBjaGFuZ2VzIHRvCi0JICogcGFydGljdWxhciByZXNvdXJjZXMuICBDYWxsaW5nIHRoaXMgbWV0aG9kIHdpbGwgZ2VuZXJhbGx5IGJlCi0JICogZmFzdGVyIHRoYW4gbWFudWFsbHkgdHJhdmVyc2luZyB0aGUgZGVsdGEgdG8gYSBwYXJ0aWN1bGFyIGRlc2NlbmRlbnQuCi0JICogPC9wPgotCSAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoIG9mIHRoZSBkZXNpcmVkIGRlc2NlbmRlbnQgZGVsdGEKLQkgKiBAcmV0dXJuIHRoZSBkZXNjZW5kZW50IGRlbHRhLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBzdWNoCi0JICogCQlkZXNjZW5kZW50IGV4aXN0cyBpbiB0aGUgZGVsdGEKLQkgKiBAcGxhbm5lZGZvciAyLjAKLQkgKi8KLQkvL3B1YmxpYyBJTW9kdWxlUmVzb3VyY2VEZWx0YSBmaW5kTWVtYmVyKElQYXRoIHBhdGgpOwotCQotCS8qKgotCSAqIFJldHVybnMgcmVzb3VyY2UgZGVsdGFzIGZvciBhbGwgY2hpbGRyZW4gb2YgdGhpcyByZXNvdXJjZSAKLQkgKiB3aG9zZSBraW5kIGlzIGluY2x1ZGVkIGluIHRoZSBnaXZlbiBtYXNrLiBLaW5kIG1hc2tzIGFyZSBmb3JtZWQKLQkgKiBieSB0aGUgYml0d2lzZSBvciBvZiA8Y29kZT5JUmVzb3VyY2VEZWx0YTwvY29kZT4ga2luZCBjb25zdGFudHMuCi0JICogUmV0dXJucyBhbiBlbXB0eSBhcnJheSBpZiB0aGVyZSBhcmUgbm8gYWZmZWN0ZWQgY2hpbGRyZW4uCi0JICogPHA+Ci0JICogVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCwgZnVsbHkgZXF1aXZhbGVudCB0bzoKLQkgKiA8cHJlPgotCSAqICAgZ2V0QWZmZWN0ZWRDaGlsZHJlbihraW5kTWFzaywgSVJlc291cmNlLk5PTkUpOwotCSAqIDwvcHJlPgotCSAqIFRlYW0tcHJpdmF0ZSBtZW1iZXIgcmVzb3VyY2VzIGFyZSA8Yj5ub3Q8L2I+IGluY2x1ZGVkIGluIHRoZSByZXN1bHQuCi0JICogPC9wPgotCSAqCi0JICogQHBhcmFtIGtpbmRNYXNrIGEgbWFzayBmb3JtZWQgYnkgdGhlIGJpdHdpc2Ugb3Igb2YgPGNvZGU+SVJlc291cmNlRGVsdGEgPC9jb2RlPiAKLQkgKiAgICBkZWx0YSBraW5kIGNvbnN0YW50cwotCSAqIEByZXR1cm4gdGhlIHJlc291cmNlIGRlbHRhcyBmb3IgYWxsIGFmZmVjdGVkIGNoaWxkcmVuCi0JICogQHNlZSBJUmVzb3VyY2VEZWx0YSNBRERFRAotCSAqIEBzZWUgSVJlc291cmNlRGVsdGEjUkVNT1ZFRAotCSAqIEBzZWUgSVJlc291cmNlRGVsdGEjQ0hBTkdFRAotCSAqIEBzZWUgI2dldEFmZmVjdGVkQ2hpbGRyZW4oaW50KQotCSAqLwotCS8vcHVibGljIElNb2R1bGVSZXNvdXJjZURlbHRhW10gZ2V0QWZmZWN0ZWRDaGlsZHJlbihpbnQga2luZE1hc2spOwotCQotCS8qKgotCSAqIEFjY2VwdHMgdGhlIGdpdmVuIHZpc2l0b3IuCi0JICogVGhlIG9ubHkga2luZHMgb2YgcmVzb3VyY2UgZGVsdGFzIHZpc2l0ZWQgCi0JICogYXJlIDxjb2RlPkFEREVEPC9jb2RlPiwgPGNvZGU+UkVNT1ZFRDwvY29kZT4sIAotCSAqIGFuZCA8Y29kZT5DSEFOR0VEPC9jb2RlPi4KLQkgKiBUaGUgdmlzaXRvcidzIDxjb2RlPnZpc2l0PC9jb2RlPiBtZXRob2QgaXMgY2FsbGVkIHdpdGggdGhpcwotCSAqIHJlc291cmNlIGRlbHRhIGlmIGFwcGxpY2FibGUuIElmIHRoZSB2aXNpdG9yIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4sCi0JICogdGhlIHJlc291cmNlIGRlbHRhJ3MgY2hpbGRyZW4gYXJlIGFsc28gdmlzaXRlZC4KLQkgKiA8cD4KLQkgKiBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kLCBmdWxseSBlcXVpdmFsZW50IHRvIAotCSAqIDxjb2RlPmFjY2VwdCh2aXNpdG9yLCBJUmVzb3VyY2UuTk9ORSk8L2NvZGU+LgotCSAqIEFsdGhvdWdoIHRoZSB2aXNpdG9yIHdpbGwgYmUgaW52b2tlZCBmb3IgdGhpcyByZXNvdXJjZSBkZWx0YSwgaXQgd2lsbCBub3QgYmUKLQkgKiBpbnZva2VkIGZvciBhbnkgdGVhbS1wcml2YXRlIG1lbWJlciByZXNvdXJjZXMuCi0JICogPC9wPgotCSAqCi0JICogQHBhcmFtIHZpc2l0b3IgdGhlIHZpc2l0b3IKLQkgKiBAZXhjZXB0aW9uIENvcmVFeGNlcHRpb24gaWYgdGhlIHZpc2l0b3IgZmFpbGVkIHdpdGggdGhpcyBleGNlcHRpb24uCi0JICogQHNlZSBJUmVzb3VyY2VEZWx0YVZpc2l0b3IjdmlzaXQoSVJlc291cmNlRGVsdGEpCi0JICovCi0JLy9wdWJsaWMgdm9pZCBhY2NlcHQoSU1vZHVsZVJlc291cmNlRGVsdGFWaXNpdG9yIHZpc2l0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL21vZGVsL0lVUkxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvbW9kZWwvSVVSTFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4NTczZTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvbW9kZWwvSVVSTFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbDsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotLyoqCi0gKiBBbiBpbnRlcmZhY2UgZm9yIGEgc2VydmVyIGRlbGVnYXRlIHRoYXQgY2FuIHByb3ZpZGUgVVJMcyBmb3IgYSBtb2R1bGUgcHVibGlzaGVkCi0gKiB0byB0aGUgc2VydmVyLgotICogCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVVSTFByb3ZpZGVyIHsKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGJhc2UgVVJMIG9mIHRoaXMgbW9kdWxlIG9uIHRoZSBzZXJ2ZXIuIChlLmcuIAotCSAqICJodHRwOi8vbG9jYWxob3N0OjgwODAvbXlQcm9qZWN0IikgCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgbWF5IHJldHVybiBudWxsIGlmIHRoaXMgc2VydmVyIGRvZXMgbm90IGhhdmUgYSB2YWxpZCBjb25maWd1cmF0aW9uCi0JICogb3IgaWYgdGhlIHNlcnZlciBpcyBub3QgcnVubmluZy4gVGhlIHJldHVybmVkIFVSTCBtdXN0IG5vdCBlbmQgaW4gYSB0cmFpbGluZwotCSAqIHNsYXNoLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbW9kdWxlIGlzIG51bGwsIHRoZSByZXR1cm5lZCBVUkwgd2lsbCBqdXN0IGJlIHRvIHRoZSByb290IG9mCi0JICogdGhlIHNlcnZlciAoZS5nLiAiaHR0cDovL2xvY2FsaG9zdDo4MDgwIikKLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1vZHVsZSBpcyBub3QgYWxyZWFkeSBhZGRlZCB0byB0aGUgc2VydmVyLCB0aGUgbWV0aG9kIHdpbGwgcmV0dXJuCi0JICogYXMgY2xvc2UgYW4gYXBwcm94aW1hdGlvbiBhcyBwb3NzaWJsZS4gKGZvciBpbnN0YW5jZSwgZm9yIGEgSjJFRSB3ZWIgcHJvamVjdAotCSAqIGl0IG1heSB1c2UgdGhlIHByb2plY3QncyBjb250ZXh0IHJvb3QsIHdoaWNoIG1heSBub3QgYmUgdGhlIHNhbWUgd2hlbiBkZXBsb3llZAotCSAqIHRvIGEgc2VydmVyKQotCSAqIDwvcD4KLQkgKgotCSAqIEBwYXJhbSBtb2R1bGUgY29tLmlibS5ldG9vbHMuc2VydmVyLmNvcmUuSU1vZHVsZQotCSAqIEByZXR1cm4gamF2YS5uZXQuVVJMCi0JICovCi0JcHVibGljIFVSTCBnZXRNb2R1bGVSb290VVJMKElNb2R1bGUgbW9kdWxlKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9tb2RlbC9JbnRlcm5hbEluaXRpYWxpemVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9tb2RlbC9JbnRlcm5hbEluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmZTQ0MWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvbW9kZWwvSW50ZXJuYWxJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuTW9kdWxlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuU2VydmVyOwotLyoqCi0gKiBUaGlzIGlzIGFuIGludGVybmFsIHV0aWxpdHkgY2xhc3MgdGhhdCBpcyB1c2VkIGJ5IHRoZSBzZXJ2ZXIgZnJhbWV3b3JrLgotICogSXQgaXMgbm90IEFQSSBhbmQgc2hvdWxkIG5ldmVyIGJlIHVzZWQgYnkgY2xpZW50cy4KLSAqLwotcHVibGljIGNsYXNzIEludGVybmFsSW5pdGlhbGl6ZXIgewotCS8qKgotCSAqIEludGVybmFsIG1ldGhvZCAtIGRvIG5vdCBjYWxsLgotCSAqIAotCSAqIEBwYXJhbSBkZWxlZ2F0ZQotCSAqIEBwYXJhbSBuZXdTZXJ2ZXIKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBpbml0aWFsaXplU2VydmVyRGVsZWdhdGUoU2VydmVyRGVsZWdhdGUgZGVsZWdhdGUsIFNlcnZlciBuZXdTZXJ2ZXIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlkZWxlZ2F0ZS5pbml0aWFsaXplKG5ld1NlcnZlciwgbW9uaXRvcik7Ci0JfQotCi0JLyoqCi0JICogSW50ZXJuYWwgbWV0aG9kIC0gZG8gbm90IGNhbGwuCi0JICogCi0JICogQHBhcmFtIGRlbGVnYXRlCi0JICogQHBhcmFtIG5ld1NlcnZlcgotCSAqIEBwYXJhbSBtb25pdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGluaXRpYWxpemVTZXJ2ZXJCZWhhdmlvdXJEZWxlZ2F0ZShTZXJ2ZXJCZWhhdmlvdXJEZWxlZ2F0ZSBkZWxlZ2F0ZSwgU2VydmVyIG5ld1NlcnZlciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWRlbGVnYXRlLmluaXRpYWxpemUobmV3U2VydmVyLCBtb25pdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnRlcm5hbCBtZXRob2QgLSBkbyBub3QgY2FsbC4KLQkgKiAKLQkgKiBAcGFyYW0gZGVsZWdhdGUKLQkgKiBAcGFyYW0gbmV3UnVudGltZQotCSAqIEBwYXJhbSBtb25pdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGluaXRpYWxpemVSdW50aW1lRGVsZWdhdGUoUnVudGltZURlbGVnYXRlIGRlbGVnYXRlLCBSdW50aW1lIG5ld1J1bnRpbWUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlkZWxlZ2F0ZS5pbml0aWFsaXplKG5ld1J1bnRpbWUsIG1vbml0b3IpOwotCX0KLQotCS8qKgotCSAqIEludGVybmFsIG1ldGhvZCAtIGRvIG5vdCBjYWxsLgotCSAqIAotCSAqIEBwYXJhbSBkZWxlZ2F0ZQotCSAqIEBwYXJhbSBuZXdNb2R1bGVGYWN0b3J5Ci0JICogQHBhcmFtIG1vbml0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgaW5pdGlhbGl6ZU1vZHVsZUZhY3RvcnlEZWxlZ2F0ZShNb2R1bGVGYWN0b3J5RGVsZWdhdGUgZGVsZWdhdGUsIE1vZHVsZUZhY3RvcnkgbmV3TW9kdWxlRmFjdG9yeSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWRlbGVnYXRlLmluaXRpYWxpemUobmV3TW9kdWxlRmFjdG9yeSwgbW9uaXRvcik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL21vZGVsL0xhdW5jaGFibGVBZGFwdGVyRGVsZWdhdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL21vZGVsL0xhdW5jaGFibGVBZGFwdGVyRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdmZDRlOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9tb2RlbC9MYXVuY2hhYmxlQWRhcHRlckRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci0vKioKLSAqIFRoaXMgaW50ZXJmYWNlLCB0eXBpY2FsbHkgaW1wbGVtZW50ZWQgYnkgdGhlIHNlcnZlciBjb2RlLCBjb252ZXJ0cyBmcm9tCi0gKiBhbiBJTW9kdWxlQXJ0aWZhY3QgdG8gYW4gb2JqZWN0IGxhdW5jaGFibGUgb24gdGhlIHNlcnZlci4KLSAqIAotICogPHA+VGhpcyBpcyB0aGUgaW1wbGVtZW50YXRpb24gb2YgYSBsYXVuY2hhYmxlQWRhcHRlciBleHRlbnNpb24gcG9pbnQuPC9wPgotICogPHA+Ci0gKiBUaGlzIGFic3RyYWN0IGNsYXNzIGlzIGludGVuZGVkIHRvIGJlIGV4dGVuZGVkIG9ubHkgYnkgY2xpZW50cwotICogdG8gZXh0ZW5kIHRoZSA8Y29kZT5sYXVuY2hhYmxlQWRhcHRlcnM8L2NvZGU+IGV4dGVuc2lvbiBwb2ludC4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTGF1bmNoYWJsZUFkYXB0ZXJEZWxlZ2F0ZSB7Ci0JLyoqCi0JICogUmV0dXJucyBhIGxhdW5jaGFibGUgb2JqZWN0IGZyb20gdGhpcyBtb2R1bGUgYXJ0aWZhY3QuCi0JICogCi0JICogQHBhcmFtIHNlcnZlciB0aGUgc2VydmVyCi0JICogQHBhcmFtIG1vZHVsZUFydGlmYWN0IGEgbW9kdWxlIGFydGlmYWN0Ci0JICogW2lzc3VlOiBpZiB0aGUgbGF1bmNoYWJsZSBvYmplY3QgY2Fubm90IGJlIGZvdW5kLCBzaG91bGQgaXQgdGhyb3cgYSBDb3JlRXhjcGV0aW9uIG9yIHJldHVybiBudWxsP10KLQkgKiBAcmV0dXJuIHRoZSBsYXVuY2hhYmxlIG9iamVjdAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiB0aGVyZSB3YXMgYW4gZXJyb3IgZG9pbmcgdGhlIGNvbnZlcnNpb24KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgT2JqZWN0IGdldExhdW5jaGFibGUoSVNlcnZlciBzZXJ2ZXIsIElNb2R1bGVBcnRpZmFjdCBtb2R1bGVBcnRpZmFjdCkgdGhyb3dzIENvcmVFeGNlcHRpb247Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvbW9kZWwvTW9kdWxlQXJ0aWZhY3RBZGFwdGVyRGVsZWdhdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL21vZGVsL01vZHVsZUFydGlmYWN0QWRhcHRlckRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNTI4YjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvbW9kZWwvTW9kdWxlQXJ0aWZhY3RBZGFwdGVyRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGVBcnRpZmFjdDsKLS8qKgotICogQSBtb2R1bGUgYXJ0aWZhY3QgYWRhcHRlciBjb252ZXJ0cyBmcm9tIHNvbWUgdmlldydzIG1vZGVsCi0gKiBvYmplY3QgaW50byBhIG1vZHVsZSBhcnRpZmFjdCB0aGF0IGlzIHJlY29nbml6ZWQgYnkgb25lIG9yCi0gKiBtb3JlIHNlcnZlciB0eXBlcy4KLSAqIAotICogPHA+VGhpcyBpcyB0aGUgaW1wbGVtZW50YXRpb24gb2YgYSBtb2R1bGVBcnRpZmFjdEFkYXB0ZXIKLSAqIGV4dGVuc2lvbiBwb2ludC48L3A+Ci0gKiA8cD4KLSAqIFRoaXMgYWJzdHJhY3QgY2xhc3MgaXMgaW50ZW5kZWQgdG8gYmUgZXh0ZW5kZWQgb25seSBieSBjbGllbnRzCi0gKiB0byBleHRlbmQgdGhlIDxjb2RlPm1vZHVsZUFydGlmYWN0QWRhcHRlcnM8L2NvZGU+IGV4dGVuc2lvbiBwb2ludC4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTW9kdWxlQXJ0aWZhY3RBZGFwdGVyRGVsZWdhdGUgewotCS8qKgotCSAqIENvbnZlcnRzIGZyb20gYW4gYXJiaXRyYXJ5IG9iamVjdCB0byBhbiBtb2R1bGUgYXJ0aWZhY3QuCi0JICoKLQkgKiBAcGFyYW0gb2JqIGFuIGFyYml0cmFyeSBvYmplY3QgZnJvbSBhIHZpZXcgb3IgZWRpdG9yCi0JICogQHJldHVybiBhbiBtb2R1bGUgYXJ0aWZhY3QsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMKLQkgKiAgICBhZGFwdGVyIGRvZXMgbm90IHJlY29nbml6ZSBvciBjYW5ub3QgYWRhcHQgdGhlIG9iamVjdAotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBJTW9kdWxlQXJ0aWZhY3QgZ2V0TW9kdWxlQXJ0aWZhY3QoT2JqZWN0IG9iaik7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvbW9kZWwvTW9kdWxlRGVsZWdhdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL21vZGVsL01vZHVsZURlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2M2Y3Y2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvbW9kZWwvTW9kdWxlRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotLyoqCi0gKiBBIG1vZHVsZSBkZWxlZ2F0ZSBwcm92aWRlcyBhIG1lY2hhbmlzbSBmb3IgZGlzY292ZXJpbmcgaW5mb3JtYXRpb24KLSAqIGFib3V0IGluZGl2aWR1YWwgbW9kdWxlcy4gTW9kdWxlcyBhcmUgcmV0dXJuZWQgZnJvbSBtb2R1bGUgZmFjdG9yeQotICogZGVsZWdhdGVzOyB0aGVpciBkZWxlZ2F0ZXMgYXJlIGNyZWF0ZWQgd2hlbgotICogTW9kdWxlRmFjdG9yeURlbGVnYXRlLmNyZWF0ZU1vZHVsZSgpIGlzIGNhbGxlZC4KLSAqIDxwPgotICogV2hlbiB0aGUgbW9kdWxlIG5lZWRzIHRvIGJlIGdpdmVuIGEgZGVsZWdhdGUsIHRoZSBkZWxlZ2F0ZSBjbGFzcwotICogc3BlY2lmaWVkIGZvciB0aGUgbW9kdWxlIGlzIGluc3RhbnRpYXRlZCB3aXRoIGEgMC1hcmd1bWVudAotICogY29uc3RydWN0b3IuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIE1vZHVsZSBkZWxlZ2F0ZXMgbWF5IGtlZXAgc3RhdGUgaW4gaW5zdGFuY2UgZmllbGRzLCBidXQgdGhhdCBzdGF0ZSBpcwotICogdHJhbnNpZW50IGFuZCB3aWxsIG5vdCBiZSBwZXJzaXN0ZWQgYWNyb3NzIHdvcmtiZW5jaCBzZXNzaW9ucy4KLSAqIDwvcD4KLSAqIDxwPgotICogVGhpcyBhYnN0cmFjdCBjbGFzcyBpcyBpbnRlbmRlZCB0byBiZSBleHRlbmRlZCBvbmx5IGJ5IGNsaWVudHMKLSAqIHRvIGV4dGVuZCB0aGUgPGNvZGU+bW9kdWxlRmFjdG9yaWVzPC9jb2RlPiBleHRlbnNpb24gcG9pbnQuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGUKLSAqIEBzZWUgTW9kdWxlRmFjdG9yeURlbGVnYXRlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBNb2R1bGVEZWxlZ2F0ZSB7Ci0JcHJpdmF0ZSBJTW9kdWxlIG1vZHVsZTsKLQotCS8qKgotCSAqIERlbGVnYXRlcyBtdXN0IGhhdmUgYSBwdWJsaWMgMC1hcmcgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIE1vZHVsZURlbGVnYXRlKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhpcyBtb2R1bGUgZGVsZWdhdGUgd2l0aCBpdHMgbGlmZS1sb25nIG1vZHVsZSBpbnN0YW5jZS4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIHNlcnZlciBjb3JlIGZyYW1ld29yay4KLQkgKiBDbGllbnRzIHNob3VsZCBuZXZlciBjYWxsIHRoaXMgbWV0aG9kLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbmV3TW9kdWxlIHRoZSBtb2R1bGUgaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBpbml0aWFsaXplKElNb2R1bGUgbmV3TW9kdWxlKSB7Ci0JCXRoaXMubW9kdWxlID0gbmV3TW9kdWxlOwotCQlpbml0aWFsaXplKCk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhpcyBtb2R1bGUgZGVsZWdhdGUuIFRoaXMgbWV0aG9kIGdpdmVzIGRlbGVnYXRlcyBhIGNoYW5jZQotCSAqIHRvIGRvIHRoZWlyIG93biBpbml0aWFsaXphdGlvbi4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIHNlcnZlciBjb3JlIGZyYW1ld29yay4KLQkgKiBDbGllbnRzIHNob3VsZCBuZXZlciBjYWxsIHRoaXMgbWV0aG9kLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbW9kdWxlIHRoYXQgdGhpcyBtb2R1bGUgZGVsZWdhdGUgY29ycmVzcG9uZHMgdG8uCi0JICogCi0JICogQHJldHVybiB0aGUgbW9kdWxlCi0JICovCi0JcHVibGljIElNb2R1bGUgZ2V0TW9kdWxlKCkgewotCQlyZXR1cm4gbW9kdWxlOwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGlzIG1vZHVsZSBpbnN0YW5jZS4gU3ViY2xhc3NlcyBzaG91bGQKLQkgKiBvdmVycmlkZSBhbmQgY2FsbCBzdXBlci52YWxpZGF0ZSgpIGZvciBiYXNpYyB2YWxpZGF0aW9uLiAKLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIHdlYiBzZXJ2ZXIgY29yZSBmcmFtZXdvcmsuCi0JICogQ2xpZW50cyBzaG91bGQgbmV2ZXIgY2FsbCB0aGlzIG1ldGhvZC4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcmV0dXJuIGEgc3RhdHVzIG9iamVjdCB3aXRoIGNvZGUgPGNvZGU+SVN0YXR1cy5PSzwvY29kZT4gaWYgdGhpcwotCSAqICAgbW9kdWxlIGlzIHZhbGlkLCBvdGhlcndpc2UgYSBzdGF0dXMgb2JqZWN0IGluZGljYXRpbmcgd2hhdCBpcwotCSAqICAgd3Jvbmcgd2l0aCBpdAotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBJU3RhdHVzIHZhbGlkYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjaGlsZCBtb2R1bGVzIG9mIHRoaXMgbW9kdWxlLgotCSAqCi0JICogQHJldHVybiBhIHBvc3NpYmx5IGVtcHR5IGFycmF5IG9mIGNoaWxkIG1vZHVsZXMKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgSU1vZHVsZVtdIGdldENoaWxkTW9kdWxlcygpOwotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGN1cnJlbnQgYXJyYXkgb2YgbW9kdWxlIGFydGlmYWN0cy4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgcG9zc2libHkgZW1wdHkgYXJyYXkgY29udGFpbmluZyB0aGUgbW9kdWxlIHJlc291cmNlcwotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB0aHJvd24gaWYgdGhlcmUgaXMgYSBwcm9ibGVtIGdldHRpbmcgdGhlIG1lbWJlcnMKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgSU1vZHVsZVJlc291cmNlW10gbWVtYmVycygpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL21vZGVsL01vZHVsZUZhY3RvcnlEZWxlZ2F0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvbW9kZWwvTW9kdWxlRmFjdG9yeURlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlYmVlODAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvbW9kZWwvTW9kdWxlRmFjdG9yeURlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5Nb2R1bGVGYWN0b3J5OwotLyoqCi0gKiBBIG1vZHVsZSBmYWN0b3J5IGRlbGVnYXRlIHByb3ZpZGVzIGEgbWVjaGFuaXNtIGZvciBkaXNjb3ZlcmluZwotICogbW9kdWxlcy4gQSBtb2R1bGUgZmFjdG9yeSBkZWxlZ2F0ZSBpcyBzcGVjaWZpZWQgYnkgdGhlCi0gKiA8Y29kZT5jbGFzczwvY29kZT4gYXR0cmlidXRlIG9mIGEgPGNvZGU+bW9kdWxlRmFjdG9yaWVzPC9jb2RlPiBleHRlbnNpb24uCi0gKiA8cD4KLSAqIFdoZW4gdGhlIG1vZHVsZSBmYWN0b3J5IG5lZWRzIHRvIGJlIGdpdmVuIGEgZGVsZWdhdGUsIHRoZSBkZWxlZ2F0ZSBjbGFzcwotICogc3BlY2lmaWVkIGZvciB0aGUgbW9kdWxlIGZhY3RvcnkgaXMgaW5zdGFudGlhdGVkIHdpdGggYSAwLWFyZ3VtZW50Ci0gKiBjb25zdHJ1Y3Rvci4KLSAqIDwvcD4KLSAqIDxwPgotICogTW9kdWxlIGZhY3RvcnkgZGVsZWdhdGVzIG1heSBrZWVwIHN0YXRlIGluIGluc3RhbmNlIGZpZWxkcywgYnV0IHRoYXQgc3RhdGUgaXMKLSAqIHRyYW5zaWVudCBhbmQgd2lsbCBub3QgYmUgcGVyc2lzdGVkIGFjcm9zcyB3b3JrYmVuY2ggc2Vzc2lvbnMuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRoaXMgYWJzdHJhY3QgY2xhc3MgaXMgaW50ZW5kZWQgdG8gYmUgZXh0ZW5kZWQgb25seSBieSBjbGllbnRzCi0gKiB0byBleHRlbmQgdGhlIDxjb2RlPm1vZHVsZUZhY3RvcmllczwvY29kZT4gZXh0ZW5zaW9uIHBvaW50LgotICogPC9wPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlCi0gKiBAc2VlIE1vZHVsZURlbGVnYXRlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBNb2R1bGVGYWN0b3J5RGVsZWdhdGUgewotCXByaXZhdGUgTW9kdWxlRmFjdG9yeSBmYWN0b3J5OwotCQotCS8qKgotCSAqIERlbGVnYXRlcyBtdXN0IGhhdmUgYSBwdWJsaWMgMC1hcmcgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIE1vZHVsZUZhY3RvcnlEZWxlZ2F0ZSgpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoaXMgbW9kdWxlIGZhY3RvcnkgZGVsZWdhdGUgd2l0aCBpdHMgbGlmZS1sb25nIG1vZHVsZQotCSAqIGZhY3RvcnkgaW5zdGFuY2UuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBzZXJ2ZXIgY29yZSBmcmFtZXdvcmsuCi0JICogQ2xpZW50cyBzaG91bGQgbmV2ZXIgY2FsbCB0aGlzIG1ldGhvZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIG5ld0ZhY3RvcnkgdGhlIG1vZHVsZSBmYWN0b3J5IGluc3RhbmNlCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqLwotCWZpbmFsIHZvaWQgaW5pdGlhbGl6ZShNb2R1bGVGYWN0b3J5IG5ld0ZhY3RvcnksIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlmYWN0b3J5ID0gbmV3RmFjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpZCBvZiB0aGlzIGZhY3RvcnkuCi0JICogRWFjaCBmYWN0b3J5IGhhcyBhIGRpc3RpbmN0IGlkLCBmaXhlZCBmb3IgaXRzIGxpZmV0aW1lLiBJZHMgYXJlIGludGVuZGVkIHRvCi0JICogYmUgdXNlZCBpbnRlcm5hbGx5IGFzIGtleXM7IHRoZXkgYXJlIG5vdCBpbnRlbmRlZCB0byBiZSBzaG93biB0byBlbmQgdXNlcnMuCi0JICogCi0JICogQHJldHVybiB0aGUgZmFjdG9yeSBpZAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBmYWN0b3J5LmdldElkKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG1vZHVsZSBpbnN0YW5jZSB3aXRoIHRoZSBnaXZlbiBzdGF0aWMgaW5mb3JtYXRpb24uIFRoaXMgbWV0aG9kIGlzIHVzZWQKLQkgKiBieSBtb2R1bGUgZmFjdG9yeSBkZWxlZ2F0ZXMgdG8gY3JlYXRlIG1vZHVsZSBpbnN0YW5jZXMuCi0JICogIAotCSAqIEBwYXJhbSBpZCB0aGUgbW9kdWxlIGlkCi0JICogQHBhcmFtIG5hbWUgdGhlIG1vZHVsZSBuYW1lCi0JICogQHBhcmFtIHR5cGUgdGhlIG1vZHVsZSB0eXBlIGlkCi0JICogQHBhcmFtIHZlcnNpb24gdGhlIG1vZHVsZSB2ZXJzaW9uIGlkCi0JICogQHBhcmFtIHByb2plY3QgdGhlIHByb2plY3QgdGhhdCB0aGUgbW9kdWxlIGlzIGNvbnRhaW5lZCBpbgotCSAqIEByZXR1cm4gYSBtb2R1bGUgaW5zdGFuY2UKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgSU1vZHVsZSBjcmVhdGVNb2R1bGUoU3RyaW5nIGlkLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHR5cGUsIFN0cmluZyB2ZXJzaW9uLCBJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiBuZXcgTW9kdWxlKGZhY3RvcnksIGlkLCBuYW1lLCB0eXBlLCB2ZXJzaW9uLCBwcm9qZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBtb2R1bGUgZGVsZWdhdGUgZm9yIGEgbW9kdWxlIHdpdGggdGhlIGdpdmVuIGluZm9ybWF0aW9uLgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIGEgY2xpZW50IG5lZWRzIHRvIGFjY2VzcyB0aGUgbW9kdWxlIGRlbGVnYXRlCi0JICogYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBtb2R1bGUuCi0JICogCi0JICogQHBhcmFtIG1vZHVsZSBhIG1vZHVsZQotCSAqIEByZXR1cm4gdGhlIG1vZHVsZSBkZWxlZ2F0ZQotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBNb2R1bGVEZWxlZ2F0ZSBnZXRNb2R1bGVEZWxlZ2F0ZShJTW9kdWxlIG1vZHVsZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYWxsIG1vZHVsZXMgY3JlYXRlZCBieSB0aGlzIGZhY3RvcnkuIAotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGlzIG5vcm1hbGx5IGNhbGxlZCBieSB0aGUgd2ViIHNlcnZlciBjb3JlIGZyYW1ld29yay4KLQkgKiBDbGllbnRzIChvdGhlciB0aGFuIHRoZSBkZWxlZ2F0ZSkgc2hvdWxkIG5ldmVyIGNhbGwgdGhpcyBtZXRob2QuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIEEgbmV3IGFycmF5IGlzIHJldHVybmVkIG9uIGVhY2ggY2FsbCwgc28gY2xpZW50cyBtYXkgc3RvcmUgb3IgbW9kaWZ5IHRoZSByZXN1bHQuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gYSBwb3NzaWJseS1lbXB0eSBhcnJheSBvZiBtb2R1bGVzIHtAbGluayBJTW9kdWxlfQotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBJTW9kdWxlW10gZ2V0TW9kdWxlcygpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL21vZGVsL1B1Ymxpc2hPcGVyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL21vZGVsL1B1Ymxpc2hPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjkyMmY2Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9tb2RlbC9QdWJsaXNoT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuVGFza01vZGVsOwotLyoqCi0gKiBBbiBvcGVyYXRpb24gdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIGR1cmluZyBwdWJsaXNoaW5nLiAKLSAqIAotICogW2lzc3VlOiBFWSBJdCBpcyBub3QgY2xlYXIgdG8gbWUgdGhhdCB3aGVuIHRoaXMgdGFzayB3aWxsIGJlIHJ1bi4gV2lsbCB0aGUgcGxhY2Ugd2hlcmUgdGhlCi0gKiB0YXNrIGlzIGJlaW5nIHJ1biBkZXBlbmQgb24gdGhlIHNlcnZlciwgZS5nLiB0aGUgVERDIHRhc2tzIGZvciB0aGUgdjYgc2VydmVyIHNob3VsZCBiZSBydW4KLSAqIGFmdGVyIHRoZSBzZXJ2ZXIgaXMgc3RhcnRlZCB0aGUgbW9kdWxlcyBhcmUgYWRkZWQgdG8gdGhlIHNlcnZlcjsgaG93ZXZlciwgdGhlIEVKQiBkZXBsb3kgdGFzawotICogbWFrZXMgbW9yZSBzZW5zZSB0byBiZSBydW4gYmVmb3JlIGFkZGluZyB0aGUgcHJvamVjdCB0byB0aGUgc2VydmVyLl0KLSAqIAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUHVibGlzaE9wZXJhdGlvbiB7Ci0JcHJpdmF0ZSBUYXNrTW9kZWwgbW9kZWw7Ci0JcHJpdmF0ZSBTdHJpbmcgbGFiZWw7Ci0JcHJpdmF0ZSBTdHJpbmcgZGVzY3JpcHRpb247Ci0KLSAgIC8qKgotCSAqIE9wZXJhdGlvbiBraW5kIGNvbnN0YW50ICh2YWx1ZSAwKSBpbmRpY2F0aW5nIHRoYXQgdGhlIG9wZXJhdGlvbgotCSAqIGRvZXMgbm90IG5lZWQgYmUgZXhlY3V0ZWQuCi0JICogCi0JICogQHNlZSAjZ2V0S2luZCgpCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BUSU9OQUwgPSAwOwotCi0JLyoqCi0JICogT3BlcmF0aW9uIGtpbmQgY29uc3RhbnQgKHZhbHVlIDEpIGluZGljYXRpbmcgdGhhdCB0aGUgb3BlcmF0aW9uCi0JICogc2hvdWxkIGJlIGV4ZWN1dGVkLgotCSAqIAotCSAqIEBzZWUgI2dldEtpbmQoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSRUZFUlJFRCA9IDE7Ci0KLQkvKioKLQkgKiBPcGVyYXRpb24ga2luZCBjb25zdGFudCAodmFsdWUgMikgaW5kaWNhdGluZyB0aGF0IHRoZSBvcGVyYXRpb24KLQkgKiBtdXN0IGJlIGV4ZWN1dGVkLgotCSAqIAotCSAqIEBzZWUgI2dldEtpbmQoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFUVVJUkVEID0gMjsKLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBvcGVyYXRpb24uIFRoZSBsYWJlbCBhbmQgZGVzY3JpcHRpb24gbXVzdCBiZSBzdXBwbGllZAotCSAqIGJ5IG92ZXJyaWRpbmcgdGhlIGdldExhYmVsKCkgYW5kIGdldERlc2NyaXB0aW9uKCkgbWV0aG9kcy4KLQkgKi8KLQlwdWJsaWMgUHVibGlzaE9wZXJhdGlvbigpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBvcGVyYXRpb24gd2l0aCB0aGUgZ2l2ZW4gbGFiZWwgYW5kIGRlc2NyaXB0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBsYWJlbCBhIHRyYW5zbGF0ZWQgbGFiZWwgZm9yIHRoZSBvcGVyYXRpb24KLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24gdGhlIG9wZXJhdGlvbiBkZXNjcmlwdGlvbgotCSAqLwotCXB1YmxpYyBQdWJsaXNoT3BlcmF0aW9uKFN0cmluZyBsYWJlbCwgU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCXRoaXMubGFiZWwgPSBsYWJlbDsKLQkJdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGtpbmQgb2YgdGhpcyBvcGVyYXRpb24uIE9wZXJhdGlvbnMgY2FuIGVpdGhlciBiZSBPUFRJT05BTAotCSAqIChkbyBub3QgaGF2ZSB0byBiZSBleGVjdXRlZCksIFBSRUZFUlJFRCAoc2hvdWxkIGJlIGV4ZWN1dGVkKSwgb3IKLQkgKiBSRVFVSVJFRCAobXVzdCBiZSBleGVjdXRlZCkuCi0JICogCi0JICogQHJldHVybiBvbmUgb2YgdGhlIGtpbmQgY29uc3RhbnRzIChlLmcuIDxjb2RlPlJFUVVJUkVEPC9jb2RlPikKLQkgKiAgICBkZWNsYXJlZCBvbiB7QGxpbmsgUHVibGlzaE9wZXJhdGlvbn0KLQkgKi8KLQlwdWJsaWMgaW50IGdldEtpbmQoKSB7Ci0JCXJldHVybiBPUFRJT05BTDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBvcmRlciAoaW5kZXgvcHJpb3JpdHkpIG9mIHRoZSB0YXNrIHRoYXQgd2lsbCBiZSBydW4uIFRoZSB0YXNrIHdpdGgKLQkgKiBhIHNtYWxsZXIgb3JkZXIgdmFsdWUgd2lsbCBiZSBydW4gYmVmb3JlIHRoZSB0YXNrIHdpdGggYSBiaWdnZXIgb3JkZXIgdmFsdWUuCi0JICogRm9yIHRhc2tzIHRoYXQgaGF2ZSB0aGUgc2FtZSBvcmRlciB2YWx1ZSwgdGhlIG9yZGVyIG9mIHJ1bm5pbmcgdGhvc2UgdGFzayBhcmUgCi0JICogbm90IGd1YXJhbnRlZWQuICAKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBvcmRlciAoaW5kZXgvcHJpb3JpdHkpIG9mIHRoZSB0YXNrIHRoYXQgd2lsbCBiZSBydW4uCi0JICovCi0JcHVibGljIGFic3RyYWN0IGludCBnZXRPcmRlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGlzcGxheWFibGUgbGFiZWwgZm9yIHRoaXMgb3BlcmF0aW9uLgotCSAqIDxwPgotCSAqIE5vdGUgdGhhdCB0aGlzIGxhYmVsIGlzIGFwcHJvcHJpYXRlIGZvciB0aGUgY3VycmVudCBsb2NhbGUuCi0JICogPC9wPgotCSAqCi0JICogQHJldHVybiBhIGRpc3BsYXlhYmxlIGxhYmVsIGZvciB0aGlzIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkaXNwbGF5YWJsZSBkZXNjcmlwdGlvbiBmb3IgdGhpcyBvcGVyYXRpb24uCi0JICogPHA+Ci0JICogTm90ZSB0aGF0IHRoaXMgZGVzY3JpcHRpb24gaXMgYXBwcm9wcmlhdGUgZm9yIHRoZSBjdXJyZW50IGxvY2FsZS4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcmV0dXJuIGEgZGlzcGxheWFibGUgZGVzY3JpcHRpb24gZm9yIHRoaXMgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgdGFzayBtb2RlbC4KLQkgKiA8cD4KLQkgKiBBIHRhc2sgbW9kZWwgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG92ZXJhbGwgdGFzayBmbG93IGFuZCBhbGxvd3MKLQkgKiB0YXNrcyB0byBzdG9yZSBhbmQgcmV0cmVpdmUgZGF0YS4gSXRzIHVzYWdlIGFsbG93cyBtdXRsaXBsZSB0YXNrcyB0byBiZQotCSAqIGNoYWluZWQgdG9nZXRoZXIgYW5kIHNoYXJlIGRhdGEgZnJvbSB0aGUgb3V0cHV0IG9mIG9uZSB0YXNrIHRvIHRoZSBpbnB1dAotCSAqIG9mIGFub3RoZXIuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHRhc2sgbW9kZWwKLQkgKi8KLQlwdWJsaWMgVGFza01vZGVsIGdldFRhc2tNb2RlbCgpIHsKLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdGFzayBtb2RlbC4KLQkgKiA8cD4KLQkgKiBBIHRhc2sgbW9kZWwgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG92ZXJhbGwgdGFzayBmbG93IGFuZCBhbGxvd3MKLQkgKiB0YXNrcyB0byBzdG9yZSBhbmQgcmV0cmVpdmUgZGF0YS4gSXRzIHVzYWdlIGFsbG93cyBtdXRsaXBsZSB0YXNrcyB0byBiZQotCSAqIGNoYWluZWQgdG9nZXRoZXIgYW5kIHNoYXJlIGRhdGEgZnJvbSB0aGUgb3V0cHV0IG9mIG9uZSB0YXNrIHRvIHRoZSBpbnB1dAotCSAqIG9mIGFub3RoZXIuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSB0YXNrTW9kZWwgdGhlIHRhc2sgbW9kZWwKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUYXNrTW9kZWwoVGFza01vZGVsIHRhc2tNb2RlbCkgewotCQl0aGlzLm1vZGVsID0gdGFza01vZGVsOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGUgKHBlcmZvcm0pIHRoZSBvcGVyYXRpb24uCi0JICogCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqIEBwYXJhbSBpbmZvIHRoZSBJQWRhcHRhYmxlIChvciA8Y29kZT5udWxsPC9jb2RlPikgcHJvdmlkZWQgYnkgdGhlCi0JICogICAgY2FsbGVyIGluIG9yZGVyIHRvIHN1cHBseSBVSSBpbmZvcm1hdGlvbiBmb3IgcHJvbXB0aW5nIHRoZQotCSAqICAgIHVzZXIgaWYgbmVjZXNzYXJ5LiBXaGVuIHRoaXMgcGFyYW1ldGVyIGlzIG5vdAotCSAqICAgIDxjb2RlPm51bGw8L2NvZGU+LCBpdCBzaG91bGQgbWluaW1hbGx5IGNvbnRhaW4gYW4gYWRhcHRlcgotCSAqICAgIGZvciB0aGUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGwuY2xhc3MuCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIHRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSBleGVjdXRpbmcgdGhlIHRhc2sKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9tb2RlbC9QdWJsaXNoVGFza0RlbGVnYXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9tb2RlbC9QdWJsaXNoVGFza0RlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4NTI3MzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvbW9kZWwvUHVibGlzaFRhc2tEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotLyoqCi0gKiBBIHB1Ymxpc2ggdGFzayBkZWxlZ2F0ZS4KLSAqIAotICogPHA+VGhpcyBpcyB0aGUgaW1wbGVtZW50YXRpb24gb2YgYSBwdWJsaXNoVGFzayBleHRlbnNpb24gcG9pbnQuPC9wPgotICogPHA+Ci0gKiBUaGlzIGFic3RyYWN0IGNsYXNzIGlzIGludGVuZGVkIHRvIGJlIGV4dGVuZGVkIG9ubHkgYnkgY2xpZW50cwotICogdG8gZXh0ZW5kIHRoZSA8Y29kZT5wdWJsaXNoVGFzazwvY29kZT4gZXh0ZW5zaW9uIHBvaW50LgotICogPC9wPgotICogCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQdWJsaXNoVGFza0RlbGVnYXRlIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0YXNrcyB0aGF0IHNob3VsZCBiZSBwZXJmb3JtZWQgZHVyaW5nIHB1Ymxpc2hpbmcuCi0JICogCi0JICogQHBhcmFtIHNlcnZlciB0aGUgc2VydmVyCi0JICogQHBhcmFtIG1vZHVsZXMgYSBsaXN0IGNvbnRhaW5pbmcgSU1vZHVsZSBhcnJheXMKLQkgKiBAcmV0dXJuIHRoZSB0YXNrcyB0aGF0IHNob3VsZCBiZSBwZXJmb3JtZWQgb24gdGhlIHNlcnZlci4KLQkgKi8KLQlwdWJsaWMgUHVibGlzaE9wZXJhdGlvbltdIGdldFRhc2tzKElTZXJ2ZXIgc2VydmVyLCBMaXN0IG1vZHVsZXMpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGFza3MgdGhhdCBzaG91bGQgYmUgcGVyZm9ybWVkIGR1cmluZyBwdWJsaXNoaW5nLgotCSAqIAotCSAqIEBwYXJhbSBzZXJ2ZXIgdGhlIHNlcnZlcgotCSAqIEBwYXJhbSBtb2R1bGVzIGEgbGlzdCBjb250YWluaW5nIElNb2R1bGUgYXJyYXlzCi0JICogQHBhcmFtIGtpbmQgb25lIG9mIHRoZSBJU2VydmVyLlBVQkxJU0hfWFggY29uc3RhbnRzLgotCSAqIEBwYXJhbSBraW5kTGlzdCBvbmUgb2YgdGhlIElTZXJ2ZXIgcHVibGlzaCBjaGFuZ2UgY29uc3RhbnRzLgotCSAqIEByZXR1cm4gdGhlIHRhc2tzIHRoYXQgc2hvdWxkIGJlIHBlcmZvcm1lZCBvbiB0aGUgc2VydmVyLgotCSAqLwotCXB1YmxpYyBQdWJsaXNoT3BlcmF0aW9uW10gZ2V0VGFza3MoSVNlcnZlciBzZXJ2ZXIsIGludCBraW5kLCBMaXN0IG1vZHVsZXMsIExpc3Qga2luZExpc3QpIHsKLQkJcmV0dXJuIGdldFRhc2tzKHNlcnZlciwgbW9kdWxlcyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL21vZGVsL1J1bnRpbWVEZWxlZ2F0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvbW9kZWwvUnVudGltZURlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjYWM4ZjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvbW9kZWwvUnVudGltZURlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZVdvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuUnVudGltZVdvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5TZXJ2ZXJQbHVnaW47Ci0vKioKLSAqIEEgcnVudGltZSBkZWxlZ2F0ZSBwcm92aWRlcyB0aGUgaW1wbGVtZW50YXRpb24gZm9yIHZhcmlvdXMgCi0gKiBnZW5lcmljIGFuZCBzZXJ2ZXItdHlwZS1zcGVjaWZpYyBvcGVyYXRpb25zIGZvciBhIHNwZWNpZmljIHR5cGUgb2YgcnVudGltZS4KLSAqIEEgcnVudGltZSBkZWxlZ2F0ZSBpcyBzcGVjaWZpZWQgYnkgdGhlCi0gKiA8Y29kZT5jbGFzczwvY29kZT4gYXR0cmlidXRlIG9mIGEgPGNvZGU+cnVudGltZVR5cGVzPC9jb2RlPiBleHRlbnNpb24uCi0gKiA8cD4KLSAqIFdoZW4gdGhlIHJ1bnRpbWUgaW5zdGFuY2UgbmVlZHMgdG8gYmUgZ2l2ZW4gYSBkZWxlZ2F0ZSwgdGhlIGRlbGVnYXRlIGNsYXNzCi0gKiBzcGVjaWZpZWQgZm9yIHRoZSBydW50aW1lIHR5cGUgaXMgaW5zdGFudGlhdGVkIHdpdGggYSAwLWFyZ3VtZW50IGNvbnN0cnVjdG9yCi0gKiBhbmQgcHJpbWVkIHdpdGggPGNvZGU+ZGVsZWdhdGUuaW5pdGlhbGl6ZShydW50aW1lKTwvY29kZT4sIAotICogd2hpY2ggaXQgaXMgZXhwZWN0ZWQgdG8gaGFuZyBvbiB0by4gTGF0ZXIsIHdoZW4KLSAqIDxjb2RlPmRlbGVnYXRlLmRpc3Bvc2UoKTwvY29kZT4gaXMgY2FsbGVkIGFzIHRoZSBydW50aW1lIGluc3RhbmNlIGlzCi0gKiBiZWluZyBkaXNjYXJkZWQsIHRoZSBkZWxlZ2F0ZSBpcyBleHBlY3RlZCB0byBsZXQgZ28gb2YgdGhlIHJ1bnRpbWUgaW5zdGFuY2UuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFJ1bnRpbWVEZWxlZ2F0ZSBzdXBwb3J0cyBhbiBvcGVuLWVuZGVkIHNldCBvZiBhdHRyaWJ1dGUtdmFsdWUgcGFpcnMuIEFsbAotICogc3RhdGUgc3RvcmVkIGluIHRoaXMgbWFubmVyIHdpbGwgYmUgc2F2ZWQgd2hlbiB0aGUgcnVudGltZSB3b3JraW5nIGNvcHkgaXMKLSAqIHNhdmVkLCBhbmQgcGVyc2lzdGVkIGFjcm9zcyB3b3JrYmVuY2ggc2Vzc2lvbnMuCi0gKiBSdW50aW1lIGRlbGVnYXRlcyBtYXkga2VlcCBzdGF0ZSBpbiBpbnN0YW5jZSBmaWVsZHMsIGJ1dCB0aGF0IHN0YXRlIGlzCi0gKiB0cmFuc2llbnQgYW5kIHdpbGwgbm90IGJlIHBlcnNpc3RlZCBhY3Jvc3Mgd29ya2JlbmNoIHNlc3Npb25zLiBUbyBzYXZlIHN0YXRlCi0gKiBhY3Jvc3Mgd29ya2JlbmNoIHNlc3Npb25zLCBpdCBtdXN0IGJlIHBlcnNpc3RlZCB1c2luZyB0aGUgYXR0cmlidXRlcy4KLSAqIDwvcD4KLSAqIDxwPgotICogVGhpcyBhYnN0cmFjdCBjbGFzcyBpcyBpbnRlbmRlZCB0byBiZSBleHRlbmRlZCBvbmx5IGJ5IGNsaWVudHMKLSAqIHRvIGV4dGVuZCB0aGUgPGNvZGU+cnVudGltZVR5cGVzPC9jb2RlPiBleHRlbnNpb24gcG9pbnQuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgSVJ1bnRpbWUKLSAqIEBzZWUgSVJ1bnRpbWVXb3JraW5nQ29weQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUnVudGltZURlbGVnYXRlIHsKLQlwcml2YXRlIFJ1bnRpbWUgcnVudGltZTsKLQlwcml2YXRlIFJ1bnRpbWVXb3JraW5nQ29weSBydW50aW1lV0M7Ci0JCi0JLyoqCi0JICogRGVsZWdhdGVzIG11c3QgaGF2ZSBhIHB1YmxpYyAwLWFyZyBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgUnVudGltZURlbGVnYXRlKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhpcyBydW50aW1lIGRlbGVnYXRlIHdpdGggaXRzIGxpZmUtbG9uZyBydW50aW1lIGluc3RhbmNlLgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgc2VydmVyIGNvcmUgZnJhbWV3b3JrLgotCSAqIENsaWVudHMgc2hvdWxkIG5ldmVyIGNhbGwgdGhpcyBtZXRob2QuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBuZXdSdW50aW1lIHRoZSBydW50aW1lIGluc3RhbmNlCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqLwotCWZpbmFsIHZvaWQgaW5pdGlhbGl6ZShSdW50aW1lIG5ld1J1bnRpbWUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlydW50aW1lID0gbmV3UnVudGltZTsKLQkJaWYgKHJ1bnRpbWUgaW5zdGFuY2VvZiBSdW50aW1lV29ya2luZ0NvcHkpCi0JCQlydW50aW1lV0MgPSAoUnVudGltZVdvcmtpbmdDb3B5KSBydW50aW1lOwotCQlpbml0aWFsaXplKCk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhpcyBydW50aW1lIGRlbGVnYXRlLiBUaGlzIG1ldGhvZCBnaXZlcyBkZWxlZ2F0ZXMgYSBjaGFuY2UKLQkgKiB0byBkbyB0aGVpciBvd24gaW5pdGlhbGl6YXRpb24uCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBzZXJ2ZXIgY29yZSBmcmFtZXdvcmsuCi0JICogQ2xpZW50cyBzaG91bGQgbmV2ZXIgY2FsbCB0aGlzIG1ldGhvZC4KLQkgKiA8L3A+Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJ1bnRpbWUgdGhhdCB0aGlzIHJ1bnRpbWUgZGVsZWdhdGUgY29ycmVzcG9uZHMgdG8uCi0JICogCi0JICogQHJldHVybiB0aGUgcnVudGltZQotCSAqLwotCXB1YmxpYyBmaW5hbCBJUnVudGltZSBnZXRSdW50aW1lKCkgewotCQlyZXR1cm4gcnVudGltZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBydW50aW1lIHdvcmtpbmcgY29weSB0aGF0IHRoaXMgcnVudGltZSBkZWxlZ2F0ZSBjb3JyZXNwb25kcyB0by4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBydW50aW1lCi0JICovCi0JcHVibGljIGZpbmFsIElSdW50aW1lV29ya2luZ0NvcHkgZ2V0UnVudGltZVdvcmtpbmdDb3B5KCkgewotCQlyZXR1cm4gcnVudGltZVdDOwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGlzIHJ1bnRpbWUgaW5zdGFuY2UuIFN1YmNsYXNzZXMgc2hvdWxkCi0JICogb3ZlcnJpZGUgYW5kIGNhbGwgc3VwZXIudmFsaWRhdGUoKSBmb3IgYmFzaWMgdmFsaWRhdGlvbi4gCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSB3ZWIgc2VydmVyIGNvcmUgZnJhbWV3b3JrLAotCSAqIGluIHJlc3BvbnNlIHRvIGEgY2FsbCB0byA8Y29kZT5JUnVudGltZS52YWxpZGF0ZShJUHJvZ3Jlc3NNb25pdG9yKTwvY29kZT4uCi0JICogQ2xpZW50cyBzaG91bGQgbmV2ZXIgY2FsbCB0aGlzIG1ldGhvZC4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcmV0dXJuIGEgc3RhdHVzIG9iamVjdCB3aXRoIGNvZGUgPGNvZGU+SVN0YXR1cy5PSzwvY29kZT4gaWYgdGhpcwotCSAqIHJ1bnRpbWUgaXMgdmFsaWQsIG90aGVyd2lzZSBhIHN0YXR1cyBvYmplY3QgaW5kaWNhdGluZyB3aGF0IGlzCi0JICogd3Jvbmcgd2l0aCBpdAotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKCkgewotCQlpZiAocnVudGltZS5nZXROYW1lKCkgPT0gbnVsbCB8fCBydW50aW1lLmdldE5hbWUoKS5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTWVzc2FnZXMuZXJyb3JSdW50aW1lTmFtZSwgbnVsbCk7Ci0KLQkJaWYgKGlzTmFtZUluVXNlKCkpCi0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCBNZXNzYWdlcy5lcnJvckR1cGxpY2F0ZVJ1bnRpbWVOYW1lLCBudWxsKTsKLQkKLQkJSVBhdGggcGF0aCA9IHJ1bnRpbWUuZ2V0TG9jYXRpb24oKTsKLQkJaWYgKHBhdGggPT0gbnVsbCB8fCBwYXRoLmlzRW1wdHkoKSkKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsICIiLCBudWxsKTsKLQkJCi0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGN1cnJlbnQgbmFtZSBpcyBhbHJlYWR5IGluIHVzZS4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBuYW1lIGlzIGluIHVzZSwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqICAgIG90aGVyd2lzZQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc05hbWVJblVzZSgpIHsKLQkJSVJ1bnRpbWUgb3JpZyA9IHJ1bnRpbWU7Ci0JCWlmIChydW50aW1lV0MgIT0gbnVsbCkKLQkJCW9yaWcgPSBydW50aW1lV0MuZ2V0T3JpZ2luYWwoKTsKLQkJCi0JCUlSdW50aW1lW10gcnVudGltZXMgPSBTZXJ2ZXJDb3JlLmdldFJ1bnRpbWVzKCk7Ci0JCWlmIChydW50aW1lcyAhPSBudWxsKSB7Ci0JCQlpbnQgc2l6ZSA9IHJ1bnRpbWVzLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJaWYgKG9yaWcgIT0gcnVudGltZXNbaV0gJiYgcnVudGltZS5nZXROYW1lKCkuZXF1YWxzKHJ1bnRpbWVzW2ldLmdldE5hbWUoKSkpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGludC12YWx1ZWQgYXR0cmlidXRlLgotCSAqIAotCSAqIEBwYXJhbSBpZCB0aGUgYXR0cmlidXRlIGlkCi0JICogQHBhcmFtIGRlZmF1bHRWYWx1ZSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZQotCSAqIEByZXR1cm4gdGhlIGF0dHJpYnV0ZSB2YWx1ZQotCSAqIEBzZWUgI3NldEF0dHJpYnV0ZShTdHJpbmcsIGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgaW50IGdldEF0dHJpYnV0ZShTdHJpbmcgaWQsIGludCBkZWZhdWx0VmFsdWUpIHsKLQkJcmV0dXJuIHJ1bnRpbWUuZ2V0QXR0cmlidXRlKGlkLCBkZWZhdWx0VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgYm9vbGVhbi12YWx1ZWQgYXR0cmlidXRlLgotCSAqIAotCSAqIEBwYXJhbSBpZCB0aGUgYXR0cmlidXRlIGlkCi0JICogQHBhcmFtIGRlZmF1bHRWYWx1ZSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZQotCSAqIEByZXR1cm4gdGhlIGF0dHJpYnV0ZSB2YWx1ZQotCSAqIEBzZWUgI3NldEF0dHJpYnV0ZShTdHJpbmcsIGJvb2xlYW4pCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gZ2V0QXR0cmlidXRlKFN0cmluZyBpZCwgYm9vbGVhbiBkZWZhdWx0VmFsdWUpIHsKLQkJcmV0dXJuIHJ1bnRpbWUuZ2V0QXR0cmlidXRlKGlkLCBkZWZhdWx0VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgU3RyaW5nLXZhbHVlZCBhdHRyaWJ1dGUuCi0JICogCi0JICogQHBhcmFtIGlkIHRoZSBhdHRyaWJ1dGUgaWQKLQkgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlCi0JICogQHJldHVybiB0aGUgYXR0cmlidXRlIHZhbHVlCi0JICogQHNlZSAjc2V0QXR0cmlidXRlKFN0cmluZywgU3RyaW5nKQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgZ2V0QXR0cmlidXRlKFN0cmluZyBpZCwgU3RyaW5nIGRlZmF1bHRWYWx1ZSkgewotCQlyZXR1cm4gcnVudGltZS5nZXRBdHRyaWJ1dGUoaWQsIGRlZmF1bHRWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBMaXN0LXZhbHVlZCBhdHRyaWJ1dGUuCi0JICogCi0JICogQHBhcmFtIGlkIHRoZSBhdHRyaWJ1dGUgaWQKLQkgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlCi0JICogQHJldHVybiB0aGUgYXR0cmlidXRlIHZhbHVlCi0JICogQHNlZSAjc2V0QXR0cmlidXRlKFN0cmluZywgTGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgTGlzdCBnZXRBdHRyaWJ1dGUoU3RyaW5nIGlkLCBMaXN0IGRlZmF1bHRWYWx1ZSkgewotCQlyZXR1cm4gcnVudGltZS5nZXRBdHRyaWJ1dGUoaWQsIGRlZmF1bHRWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBNYXAtdmFsdWVkIGF0dHJpYnV0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gaWQgdGhlIGF0dHJpYnV0ZSBpZAotCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGUKLQkgKiBAcmV0dXJuIHRoZSBhdHRyaWJ1dGUgdmFsdWUKLQkgKiBAc2VlICNzZXRBdHRyaWJ1dGUoU3RyaW5nLCBNYXApCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIE1hcCBnZXRBdHRyaWJ1dGUoU3RyaW5nIGlkLCBNYXAgZGVmYXVsdFZhbHVlKSB7Ci0JCXJldHVybiBydW50aW1lLmdldEF0dHJpYnV0ZShpZCwgZGVmYXVsdFZhbHVlKTsKLQl9Ci0JCi0JLyoqCi0JICogRGlzcG9zZXMgb2YgdGhpcyBydW50aW1lIGRlbGVnYXRlLgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgd2ViIHNlcnZlciBjb3JlIGZyYW1ld29yay4KLQkgKiBDbGllbnRzIHNob3VsZCBuZXZlciBjYWxsIHRoaXMgbWV0aG9kLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBJbXBsZW1lbnRhdGlvbnMgYXJlIGV4cGVjdGVkIHRvIGxldCBnbyBvZiB0aGUgZGVsZWdhdGUncyByZWZlcmVuY2UKLQkgKiB0byB0aGUgcnVudGltZSwgZGVyZWdpc3RlciBsaXN0ZW5lcnMsIGV0Yy4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoaXMgcnVudGltZSB3aXRoIGRlZmF1bHQgdmFsdWVzLiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbgotCSAqIGEgbmV3IHJ1bnRpbWUgaXMgY3JlYXRlZCBzbyB0aGF0IHRoZSBydW50aW1lIGNhbiBiZSBpbml0aWFsaXplZCB3aXRoCi0JICogbWVhbmluZ2Z1bCB2YWx1ZXMuCi0JICogCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBpbnRlZ2VyLXZhbHVlZCBhdHRyaWJ1dGUgb2YgdGhpcwotCSAqIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGlkIHRoZSBhdHRyaWJ1dGUgaWQKLQkgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlCi0JICogQHNlZSAjZ2V0QXR0cmlidXRlKFN0cmluZywgaW50KQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIHNldEF0dHJpYnV0ZShTdHJpbmcgaWQsIGludCB2YWx1ZSkgewotCQlydW50aW1lV0Muc2V0QXR0cmlidXRlKGlkLCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBib29sZWFuLXZhbHVlZCBhdHRyaWJ1dGUgb2YgdGhpcwotCSAqIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGlkIHRoZSBhdHRyaWJ1dGUgaWQKLQkgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlCi0JICogQHNlZSAjZ2V0QXR0cmlidXRlKFN0cmluZywgYm9vbGVhbikKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBzZXRBdHRyaWJ1dGUoU3RyaW5nIGlkLCBib29sZWFuIHZhbHVlKSB7Ci0JCXJ1bnRpbWVXQy5zZXRBdHRyaWJ1dGUoaWQsIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHN0cmluZy12YWx1ZWQgYXR0cmlidXRlIG9mIHRoaXMKLQkgKiBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBpZCB0aGUgYXR0cmlidXRlIGlkCi0JICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZQotCSAqIEBzZWUgI2dldEF0dHJpYnV0ZShTdHJpbmcsIFN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBzZXRBdHRyaWJ1dGUoU3RyaW5nIGlkLCBTdHJpbmcgdmFsdWUpIHsKLQkJcnVudGltZVdDLnNldEF0dHJpYnV0ZShpZCwgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgbGlzdC12YWx1ZWQgYXR0cmlidXRlIG9mIHRoaXMKLQkgKiBlbGVtZW50LiBUaGUgbGlzdCBtYXkgb25seSBjb250YWluIFN0cmluZyB2YWx1ZXMuCi0JICogCi0JICogQHBhcmFtIGlkIHRoZSBhdHRyaWJ1dGUgaWQKLQkgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlCi0JICogQHNlZSAjZ2V0QXR0cmlidXRlKFN0cmluZywgTGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBzZXRBdHRyaWJ1dGUoU3RyaW5nIGlkLCBMaXN0IHZhbHVlKSB7Ci0JCXJ1bnRpbWVXQy5zZXRBdHRyaWJ1dGUoaWQsIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIG1hcC12YWx1ZWQgYXR0cmlidXRlIG9mIHRoaXMKLQkgKiBlbGVtZW50LiBUaGUgbWFwIG1heSBvbmx5IGNvbnRhaW4gU3RyaW5nIHZhbHVlcy4KLQkgKiAKLQkgKiBAcGFyYW0gaWQgdGhlIGF0dHJpYnV0ZSBpZAotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGUKLQkgKiBAc2VlICNnZXRBdHRyaWJ1dGUoU3RyaW5nLCBNYXApCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBpZCwgTWFwIHZhbHVlKSB7Ci0JCXJ1bnRpbWVXQy5zZXRBdHRyaWJ1dGUoaWQsIHZhbHVlKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvbW9kZWwvUnVudGltZUxvY2F0b3JEZWxlZ2F0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvbW9kZWwvUnVudGltZUxvY2F0b3JEZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmE5MDI3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL21vZGVsL1J1bnRpbWVMb2NhdG9yRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZVdvcmtpbmdDb3B5OwotLyoqCi0gKiBBIHJ1bnRpbWUgbG9jYXRvciBwcm92aWRlcyB0aGUgYWJpbGl0eSB0byBsb2NhdGUgb3Igc2VhcmNoIGZvciBhZGRpdGlvbmFsCi0gKiBydW50aW1lcyBvZiBhIHBhcnRpY3VsYXIgdHlwZS4KLSAqIDxwPgotICogVGhpcyBhYnN0cmFjdCBjbGFzcyBpcyBpbnRlbmRlZCB0byBiZSBleHRlbmRlZCBvbmx5IGJ5IGNsaWVudHMKLSAqIHRvIGV4dGVuZCB0aGUgPGNvZGU+cnVudGltZUxvY2F0b3JzPC9jb2RlPiBleHRlbnNpb24gcG9pbnQuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFJ1bnRpbWVMb2NhdG9yRGVsZWdhdGUgewotCS8qKgotCSAqIEEgY2FsbGJhY2sgbGlzdGVuZXIgdXNlZCB0byByZXBvcnQgcHJvZ3Jlc3MuCi0JICogCi0JICogQHNpbmNlIDEuMAotCSAqLwotCXB1YmxpYyBpbnRlcmZhY2UgSVJ1bnRpbWVTZWFyY2hMaXN0ZW5lciB7Ci0JCS8qKgotCQkgKiBDYWxsZWQgd2hlbiBhIG5ldyBydW50aW1lIGlzIGZvdW5kIGJ5IHRoZSBsb2NhdG9yLgotCQkgKiBUaGUgcnVudGltZSBtdXN0IG5ldmVyIGJlIG51bGwuCi0JCSAqIAotCQkgKiBAcGFyYW0gcnVudGltZSB0aGUgcnVudGltZSB0aGF0IHdhcyBmb3VuZC4KLQkJICovCi0JCXB1YmxpYyB2b2lkIHJ1bnRpbWVGb3VuZChJUnVudGltZVdvcmtpbmdDb3B5IHJ1bnRpbWUpOwotCX0KLQotCS8qKgotCSAqIFNlYXJjaGVzIGZvciBsb2NhbCBydW50aW1lcy4gCi0JICogSXQgdXNlcyB0aGUgY2FsbGJhY2sgbGlzdGVuZXIgdG8gcmVwb3J0IHJ1bnRpbWVzIHRoYXQgYXJlIGZvdW5kLgotCSAqIFRoZSBwYXRoIGNvbnRhaW5zIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBmb2xkZXIgdG8gc2VhcmNoIGluLAotCSAqIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvIHNlYXJjaCB0aGUgZW50aXJlIG1hY2hpbmUuCi0JICogCi0JICogQHBhcmFtIHBhdGggdGhlIHBhdGggdG8gc2VhcmNoIGZvciBydW50aW1lcyBpbgotCSAqIEBwYXJhbSBsaXN0ZW5lciBhIGxpc3RlbmVyIHRvIHJlcG9ydCBzdGF0dXMgdG8KLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCi0JICogICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCi0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgc2VhcmNoRm9yUnVudGltZXMoSVBhdGggcGF0aCwgSVJ1bnRpbWVTZWFyY2hMaXN0ZW5lciBsaXN0ZW5lciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9tb2RlbC9SdW50aW1lVGFyZ2V0SGFuZGxlckRlbGVnYXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9tb2RlbC9SdW50aW1lVGFyZ2V0SGFuZGxlckRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0MTM5MmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvbW9kZWwvUnVudGltZVRhcmdldEhhbmRsZXJEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lVGFyZ2V0SGFuZGxlcjsKLS8qKgotICogQSBydW50aW1lIHRhcmdldCBoYW5kbGVyIGlzIHVzZWQgd2hlbiBhc3NvY2lhdGluZyBhIHJ1bnRpbWUgd2l0aAotICogYSBwYXJ0aWN1bGFyIHByb2plY3QuIEl0IGhhcyB0aGUgYWJpbGl0eSB0byBtYWtlIGFueSBjaGFuZ2VzIGl0IHJlcXVpcmVzCi0gKiBvbiB0aGUgcHJvamVjdHMgLSBhZGRpbmcgb3IgcmVtb3ZpbmcgZmlsZXMsIHNldHRpbmcgdXAgdGhlIGNsYXNzcGF0aCwgZXRjLgotICogPHA+Ci0gKiBUaGlzIGFic3RyYWN0IGNsYXNzIGlzIGludGVuZGVkIHRvIGJlIGV4dGVuZGVkIG9ubHkgYnkgY2xpZW50cwotICogdG8gZXh0ZW5kIHRoZSA8Y29kZT5ydW50aW1lVGFyZ2V0SGFuZGxlcnM8L2NvZGU+IGV4dGVuc2lvbiBwb2ludC4KLSAqIDwvcD4KLSAqIDxwPgotICogCi0gKiBAZGVwcmVjYXRlZCBUaGlzIGZ1bmN0aW9uIGlzIGRlcHJlY2F0ZWQuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBSdW50aW1lVGFyZ2V0SGFuZGxlckRlbGVnYXRlIHsKLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGUgcnVudGltZSB0YXJnZXQgaGFuZGxlci4KLQkgKiAKLQkgKiBAcGFyYW0gbmV3SGFuZGxlciB0aGUgbmV3IGhhbmRsZXIKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBpbml0aWFsaXplKElSdW50aW1lVGFyZ2V0SGFuZGxlciBuZXdIYW5kbGVyKSB7Ci0JCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJBdHRlbXB0IHRvIHVzZSBkZXByZWNhdGVkIGNvZGUiKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBydW50aW1lIHRhcmdldCBoYW5kbGVyIHRoYXQgdGhpcyBkZWxlZ2F0ZSBpcyBhc3NvY2lhdGVkIHdpdGguCi0JICogCi0JICogQHJldHVybiB0aGUgcnVudGltZSB0YXJnZXQgaGFuZGxlcgotCSAqLwotCXB1YmxpYyBJUnVudGltZVRhcmdldEhhbmRsZXIgZ2V0UnVudGltZVRhcmdldEhhbmRsZXIoKSB7Ci0JCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJBdHRlbXB0IHRvIHVzZSBkZXByZWNhdGVkIGNvZGUiKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHJ1bnRpbWUgdGFyZ2V0IG9uIHRoZSBnaXZlbiBwcm9qZWN0LgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0IHRoZSBwcm9qZWN0IHRvIHNldCB0aGUgcnVudGltZSBvbgotCSAqIEBwYXJhbSBydW50aW1lIHRoZSB0YXJnZXQgcnVudGltZQotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gdGhyb3duIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSBzZXR0aW5nIHRoZSBydW50aW1lCi0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgc2V0UnVudGltZVRhcmdldChJUHJvamVjdCBwcm9qZWN0LCBJUnVudGltZSBydW50aW1lLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBydW50aW1lIHRhcmdldCBmcm9tIHRoZSBnaXZlbiBwcm9qZWN0LgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0IHRoZSBwcm9qZWN0IHRvIHJlbW92ZSB0aGUgcnVudGltZSBmcm9tCi0JICogQHBhcmFtIHJ1bnRpbWUgdGhlIHRhcmdldCBydW50aW1lCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB0aHJvd24gaWYgdGhlcmUgaXMgYSBwcm9ibGVtIHJlbW92aW5nIHRoZSBydW50aW1lCi0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgcmVtb3ZlUnVudGltZVRhcmdldChJUHJvamVjdCBwcm9qZWN0LCBJUnVudGltZSBydW50aW1lLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL21vZGVsL1NlcnZlckJlaGF2aW91ckRlbGVnYXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9tb2RlbC9TZXJ2ZXJCZWhhdmlvdXJEZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjZmMWNkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL21vZGVsL1NlcnZlckJlaGF2aW91ckRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi2gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlByb2dyZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5TZXJ2ZXJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlRyYWNlOwotLyoqCi0gKiBBIHNlcnZlciBkZWxlZ2F0ZSBwcm92aWRlcyB0aGUgaW1wbGVtZW50YXRpb24gZm9yIHZhcmlvdXMgCi0gKiBnZW5lcmljIGFuZCBzZXJ2ZXItdHlwZS1zcGVjaWZpYyBvcGVyYXRpb25zIGZvciBhIHNwZWNpZmljIHR5cGUgb2Ygc2VydmVyLgotICogQSBzZXJ2ZXIgZGVsZWdhdGUgaXMgc3BlY2lmaWVkIGJ5IHRoZQotICogPGNvZGU+Y2xhc3M8L2NvZGU+IGF0dHJpYnV0ZSBvZiBhIDxjb2RlPnNlcnZlclR5cGVzPC9jb2RlPiBleHRlbnNpb24uCi0gKiA8cD4KLSAqIFdoZW4gdGhlIHNlcnZlciBpbnN0YW5jZSBuZWVkcyB0byBiZSBnaXZlbiBhIGRlbGVnYXRlLCB0aGUgZGVsZWdhdGUgY2xhc3MKLSAqIHNwZWNpZmllZCBmb3IgdGhlIHNlcnZlciB0eXBlIGlzIGluc3RhbnRpYXRlZCB3aXRoIGEgMC1hcmd1bWVudCBjb25zdHJ1Y3RvcgotICogYW5kIHByaW1lZCB3aXRoIDxjb2RlPmRlbGVnYXRlLmluaXRpYWxpemUoKChJU2VydmVyU3RhdGUpc2VydmVyKTwvY29kZT4sIAotICogd2hpY2ggaXQgaXMgZXhwZWN0ZWQgdG8gaGFuZyBvbiB0by4gTGF0ZXIsIHdoZW4KLSAqIDxjb2RlPmRlbGVnYXRlLmRpc3Bvc2UoKTwvY29kZT4gaXMgY2FsbGVkIGFzIHRoZSBzZXJ2ZXIgaW5zdGFuY2UgaXMKLSAqIGJlaW5nIGRpc2NhcmRlZCwgdGhlIGRlbGVnYXRlIGlzIGV4cGVjdGVkIHRvIGxldCBnbyBvZiB0aGUgc2VydmVyIGluc3RhbmNlLgotICogPC9wPgotICogPHA+Ci0gKiBTZXJ2ZXIgZGVsZWdhdGVzIG1heSBrZWVwIHN0YXRlIGluIGluc3RhbmNlIGZpZWxkcywgYnV0IHRoYXQgc3RhdGUgaXMKLSAqIHRyYW5zaWVudCBhbmQgd2lsbCBub3QgYmUgcGVyc2lzdGVkIGFjcm9zcyB3b3JrYmVuY2ggc2Vzc2lvbnMuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRoaXMgYWJzdHJhY3QgY2xhc3MgaXMgaW50ZW5kZWQgdG8gYmUgZXh0ZW5kZWQgb25seSBieSBjbGllbnRzCi0gKiB0byBleHRlbmQgdGhlIDxjb2RlPnNlcnZlclR5cGVzPC9jb2RlPiBleHRlbnNpb24gcG9pbnQuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXIKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJXb3JraW5nQ29weQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2VydmVyQmVoYXZpb3VyRGVsZWdhdGUgewotCXByaXZhdGUgU2VydmVyIHNlcnZlcjsKLQotCS8qKgotCSAqIFB1Ymxpc2gga2luZCBjb25zdGFudCAodmFsdWUgMCkgZm9yIG5vIGNoYW5nZS4KLQkgKiAKLQkgKiBAc2VlICNwdWJsaXNoTW9kdWxlKGludCwgaW50LCBJTW9kdWxlW10sIElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9fQ0hBTkdFID0gMDsKLQotCS8qKgotCSAqIFB1Ymxpc2gga2luZCBjb25zdGFudCAodmFsdWUgMSkgZm9yIGFkZGVkIHJlc291cmNlcy4KLQkgKiAKLQkgKiBAc2VlICNwdWJsaXNoTW9kdWxlKGludCwgaW50LCBJTW9kdWxlW10sIElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQURERUQgPSAxOwotCi0JLyoqCi0JICogUHVibGlzaCBraW5kIGNvbnN0YW50ICh2YWx1ZSAyKSBmb3IgY2hhbmdlZCByZXNvdXJjZXMuCi0JICogCi0JICogQHNlZSAjcHVibGlzaE1vZHVsZShpbnQsIGludCwgSU1vZHVsZVtdLCBJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENIQU5HRUQgPSAyOwotCi0JLyoqCi0JICogUHVibGlzaCBraW5kIGNvbnN0YW50ICh2YWx1ZSAzKSBmb3IgcmVtb3ZlZCByZXNvdXJjZXMuCi0JICogCi0JICogQHNlZSAjcHVibGlzaE1vZHVsZShpbnQsIGludCwgSU1vZHVsZVtdLCBJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFTU9WRUQgPSAzOwotCi0JLyoqCi0JICogRGVsZWdhdGVzIG11c3QgaGF2ZSBhIHB1YmxpYyAwLWFyZyBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgU2VydmVyQmVoYXZpb3VyRGVsZWdhdGUoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGlzIHNlcnZlciBkZWxlZ2F0ZSB3aXRoIGl0cyBsaWZlLWxvbmcgc2VydmVyIGluc3RhbmNlLgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgc2VydmVyIGNvcmUgZnJhbWV3b3JrLgotCSAqIENsaWVudHMgc2hvdWxkIG5ldmVyIGNhbGwgdGhpcyBtZXRob2QuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBuZXdTZXJ2ZXIgdGhlIHNlcnZlciBpbnN0YW5jZQotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLQkgKi8KLQlmaW5hbCB2b2lkIGluaXRpYWxpemUoU2VydmVyIG5ld1NlcnZlciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXNlcnZlciA9IG5ld1NlcnZlcjsKLQkJaW5pdGlhbGl6ZShtb25pdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGlzIHNlcnZlciBkZWxlZ2F0ZS4gVGhpcyBtZXRob2QgZ2l2ZXMgZGVsZWdhdGVzIGEgY2hhbmNlCi0JICogdG8gZG8gdGhlaXIgb3duIGluaXRpYWxpemF0aW9uLgotCSAqIDxwPgotCSAqIElmIHRoZSBzZXJ2ZXIgc3RhdGUgaXMgaW5pdGlhbGx5IHVua25vd24sIHRoaXMgbWV0aG9kIHNob3VsZCBhdHRlbXB0Ci0JICogdG8gY29ubmVjdCB0byB0aGUgc2VydmVyIGFuZCB1cGRhdGUgdGhlIHN0YXRlLiBPbiBzZXJ2ZXJzIHdoZXJlIHRoZQotCSAqIHN0YXRlIG1heSBjaGFuZ2UsIHRoaXMgaXMgYWxzbyBhbiBleGNlbGxlbnQgcGxhY2UgdG8gY3JlYXRlIGEgYmFja2dyb3VuZAotCSAqIHRocmVhZCB0aGF0IHdpbGwgY29uc3RhbnRseSBwaW5nIHRoZSBzZXJ2ZXIgKG9yIGhhdmUgYSBsaXN0ZW5lcikgdG8KLQkgKiB1cGRhdGUgdGhlIHNlcnZlciBzdGF0ZSBhcyBjaGFuZ2VzIG9jY3VyLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIHNlcnZlciBjb3JlIGZyYW1ld29yay4KLQkgKiBDbGllbnRzIHNob3VsZCBuZXZlciBjYWxsIHRoaXMgbWV0aG9kLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCi0JICogICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNlcnZlciB0aGF0IHRoaXMgc2VydmVyIGRlbGVnYXRlIGNvcnJlc3BvbmRzIHRvLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHNlcnZlcgotCSAqLwotCXB1YmxpYyBmaW5hbCBJU2VydmVyIGdldFNlcnZlcigpIHsKLQkJcmV0dXJuIHNlcnZlcjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoaXMgc2VydmVyLgotCSAqCi0JICogQHBhcmFtIHN0YXRlIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBzZXJ2ZXIsIG9uZSBvZiB0aGUgc3RhdGUKLQkgKiAgICBjb25zdGFudHMgZGVmaW5lZCBieSB7QGxpbmsgSVNlcnZlcn0KLQkgKiBAc2VlIElTZXJ2ZXIjZ2V0U2VydmVyU3RhdGUoKQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIHNldFNlcnZlclN0YXRlKGludCBzdGF0ZSkgewotCQlzZXJ2ZXIuc2V0U2VydmVyU3RhdGUoc3RhdGUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIElMYXVuY2hNYW5hZ2VyIG1vZGUgdGhhdCB0aGUgc2VydmVyIGlzIHJ1bm5pbmcgaW4uIFRoZSBzZXJ2ZXIKLQkgKiBpbXBsZW1lbnRhdGlvbiB3aWxsIGF1dG9tYXRpY2FsbHkgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IHRvIGNsaWVudHMKLQkgKiB3aGVuIHRoZSBzZXJ2ZXIgaXMgc3RvcHBlZCwgc28geW91IG9ubHkgbmVlZCB0byB1cGRhdGUgdGhlIG1vZGUgd2hlbgotCSAqIGl0IGNoYW5nZXMuCi0JICogCi0JICogQHBhcmFtIG1vZGUgdGhlIG1vZGUgaW4gd2hpY2ggYSBzZXJ2ZXIgaXMgcnVubmluZywgb25lIG9mIHRoZSBtb2RlIGNvbnN0YW50cwotCSAqICAgIGRlZmluZWQgYnkge0BsaW5rIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaE1hbmFnZXJ9Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgc2V0TW9kZShTdHJpbmcgbW9kZSkgewotCQlzZXJ2ZXIuc2V0TW9kZShtb2RlKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBzZXJ2ZXIgcmVzdGFydCBzdGF0ZS4KLQkgKgotCSAqIEBwYXJhbSBzdGF0ZSA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc2VydmVyIG5lZWRzIHRvIGJlIHJlc3RhcnRlZCwKLQkgKiAgICBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIHNldFNlcnZlclJlc3RhcnRTdGF0ZShib29sZWFuIHN0YXRlKSB7Ci0JCXNlcnZlci5zZXRTZXJ2ZXJSZXN0YXJ0U3RhdGUoc3RhdGUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHNlcnZlciBwdWJsaXNoIHN0YXRlLgotCSAqCi0JICogQHBhcmFtIHN0YXRlIHRoZSBjdXJyZW50IHB1Ymxpc2ggc3RhdGUgb2YgdGhlIHNlcnZlciwgb25lIG9mIHRoZQotCSAqICAgIHB1Ymxpc2ggY29uc3RhbnRzIGRlZmluZWQgYnkge0BsaW5rIElTZXJ2ZXJ9Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgc2V0U2VydmVyUHVibGlzaFN0YXRlKGludCBzdGF0ZSkgewotCQlzZXJ2ZXIuc2V0U2VydmVyUHVibGlzaFN0YXRlKHN0YXRlKTsKLQl9Ci0KLQkvKioKLQkgKiBIb29rIHRvIGZpcmUgYW4gZXZlbnQgd2hlbiBhIG1vZHVsZSBzdGF0ZSBjaGFuZ2VzLgotCSAqIAotCSAqIEBwYXJhbSBtb2R1bGUgdGhlIG1vZHVsZQotCSAqIEBwYXJhbSBzdGF0ZSB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgbW9kdWxlLCBvbmUgb2YgdGhlIHN0YXRlCi0JICogICAgY29uc3RhbnRzIGRlZmluZWQgYnkge0BsaW5rIElTZXJ2ZXJ9Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgc2V0TW9kdWxlU3RhdGUoSU1vZHVsZVtdIG1vZHVsZSwgaW50IHN0YXRlKSB7Ci0JCXNlcnZlci5zZXRNb2R1bGVTdGF0ZShtb2R1bGUsIHN0YXRlKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBtb2R1bGUgcHVibGlzaCBzdGF0ZS4KLQkgKgotCSAqIEBwYXJhbSBtb2R1bGUgdGhlIG1vZHVsZQotCSAqIEBwYXJhbSBzdGF0ZSB0aGUgY3VycmVudCBwdWJsaXNoIHN0YXRlIG9mIHRoZSBtb2R1bGUsIG9uZSBvZiB0aGUKLQkgKiAgICBwdWJsaXNoIGNvbnN0YW50cyBkZWZpbmVkIGJ5IHtAbGluayBJU2VydmVyfQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIHNldE1vZHVsZVB1Ymxpc2hTdGF0ZShJTW9kdWxlW10gbW9kdWxlLCBpbnQgc3RhdGUpIHsKLQkJc2VydmVyLnNldE1vZHVsZVB1Ymxpc2hTdGF0ZShtb2R1bGUsIHN0YXRlKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBtb2R1bGUgcmVzdGFydCBzdGF0ZS4KLQkgKgotCSAqIEBwYXJhbSBtb2R1bGUgdGhlIG1vZHVsZQotCSAqIEBwYXJhbSBzdGF0ZSA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbW9kdWxlIG5lZWRzIHRvIGJlIHJlc3RhcnRlZCwKLQkgKiAgICBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIHNldE1vZHVsZVJlc3RhcnRTdGF0ZShJTW9kdWxlW10gbW9kdWxlLCBib29sZWFuIHN0YXRlKSB7Ci0JCXNlcnZlci5zZXRNb2R1bGVSZXN0YXJ0U3RhdGUobW9kdWxlLCBzdGF0ZSk7Ci0JfQotCi0JLyoqCi0JICogRGlzcG9zZXMgb2YgdGhpcyBzZXJ2ZXIgZGVsZWdhdGUuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSB3ZWIgc2VydmVyIGNvcmUgZnJhbWV3b3JrLgotCSAqIENsaWVudHMgc2hvdWxkIG5ldmVyIGNhbGwgdGhpcyBtZXRob2QuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIEltcGxlbWVudGF0aW9ucyBhcmUgZXhwZWN0ZWQgdG8gbGV0IGdvIG9mIHRoZSBkZWxlZ2F0ZSdzIHJlZmVyZW5jZQotCSAqIHRvIHRoZSBzZXJ2ZXIsIGRlcmVnaXN0ZXIgbGlzdGVuZXJzLCBldGMuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBNZXRob2RzIGNhbGxlZCB0byBub3RpZnkgdGhhdCBwdWJsaXNoaW5nIGlzIGFib3V0IHRvIGJlZ2luLgotCSAqIFRoaXMgYWxsb3dzIHRoZSBzZXJ2ZXIgdG8gb3BlbiBhIGNvbm5lY3Rpb24gdG8gdGhlIHNlcnZlcgotCSAqIG9yIGdldCBhbnkgZ2xvYmFsIGluZm9ybWF0aW9uIHJlYWR5LgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgc2VydmVyIGNvcmUgZnJhbWV3b3JrLAotCSAqIGluIHJlc3BvbnNlIHRvIGEgY2FsbCB0byA8Y29kZT5JU2VydmVyLnB1Ymxpc2goKTwvY29kZT4uCi0JICogQ2xpZW50cyBzaG91bGQgbmV2ZXIgY2FsbCB0aGlzIG1ldGhvZC4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCi0JICogICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSBzdGFydGluZyB0aGUgcHVibGlzaAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHB1Ymxpc2hTdGFydChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIFB1Ymxpc2ggdGhlIHNlcnZlci4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIHNlcnZlciBjb3JlIGZyYW1ld29yaywKLQkgKiBpbiByZXNwb25zZSB0byBhIGNhbGwgdG8gPGNvZGU+SVNlcnZlci5wdWJsaXNoKCk8L2NvZGU+LgotCSAqIENsaWVudHMgc2hvdWxkIG5ldmVyIGNhbGwgdGhpcyBtZXRob2QuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBraW5kIG9uZSBvZiB0aGUgSVNlcnZlci5QVUJMSVNIX1hYIGNvbnN0YW50cy4gVmFsaWQgdmFsdWVzIGFyZQotCSAqICAgIDx1bD4KLQkgKiAgICA8bGk+PGNvZGU+UFVCTFNJSF9GVUxMPC9jb2RlPi0gaW5kaWNhdGVzIGEgZnVsbCBwdWJsaXNoLjwvbGk+Ci0JICogICAgPGxpPjxjb2RlPlBVQkxJU0hfSU5DUkVNRU5UQUw8L2NvZGU+LSBpbmRpY2F0ZXMgYSBpbmNyZW1lbnRhbCBwdWJsaXNoLgotCSAqICAgIDxsaT48Y29kZT5QVUJMU0lIX0FVVE88L2NvZGU+LSBpbmRpY2F0ZXMgYW4gYXV0b21hdGljIGluY3JlbWVudGFsIHB1Ymxpc2guPC9saT4KLQkgKiAgICA8bGk+PGNvZGU+UFVCTElTSF9DTEVBTjwvY29kZT4tIGluZGljYXRlcyBhIGNsZWFuIHJlcXVlc3QuIENsZWFuIHRocm93cwotCSAqICAgICAgb3V0IGFsbCBzdGF0ZSBhbmQgY2xlYW5zIHVwIHRoZSBtb2R1bGUgb24gdGhlIHNlcnZlciBiZWZvcmUgZG9pbmcgYQotCSAqICAgICAgZnVsbCBwdWJsaXNoLgotCSAqICAgIDwvdWw+Ci0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHByb2JsZW0gcHVibGlzaGluZyB0aGUgc2VydmVyCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHVibGlzaFNlcnZlcihpbnQga2luZCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBQdWJsaXNoIGEgc2luZ2xlIG1vZHVsZSB0byB0aGUgc2VydmVyLgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgc2VydmVyIGNvcmUgZnJhbWV3b3JrLAotCSAqIGluIHJlc3BvbnNlIHRvIGEgY2FsbCB0byA8Y29kZT5JU2VydmVyLnB1Ymxpc2goKTwvY29kZT4uCi0JICogQ2xpZW50cyBzaG91bGQgbmV2ZXIgY2FsbCB0aGlzIG1ldGhvZCBkaXJlY3RseS4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogSWYgdGhlIGRlbHRhS2luZCBpcyBJU2VydmVyLlJFTU9WRUQsIHRoZSBtb2R1bGUgbWF5IGhhdmUgYmVlbiBjb21wbGV0ZWx5Ci0JICogZGVsZXRlZCBhbmQgZG9lcyBub3QgZXhpc3QgYW55bW9yZS4gSW4gdGhpcyBjYXNlLCBhIGR1bW15IG1vZHVsZSAod2l0aCB0aGUKLQkgKiBjb3JyZWN0IGlkKSB3aWxsIGJlIHBhc3NlZCB0byB0aGlzIG1ldGhvZC4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogSXQgaXMgcmVjb21tZW5kZWQgdGhhdCBjbGllbnRzIGltcGxlbWVudGluZyB0aGlzIG1ldGhvZCBiZSByZXNwb25zaWJsZSBmb3IKLQkgKiBzZXR0aW5nIHRoZSBtb2R1bGUgc3RhdGUuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBraW5kIG9uZSBvZiB0aGUgSVNlcnZlci5QVUJMSVNIX1hYIGNvbnN0YW50cy4gVmFsaWQgdmFsdWVzIGFyZToKLQkgKiAgICA8dWw+Ci0JICogICAgPGxpPjxjb2RlPlBVQkxTSUhfRlVMTDwvY29kZT4tIGluZGljYXRlcyBhIGZ1bGwgcHVibGlzaC48L2xpPgotCSAqICAgIDxsaT48Y29kZT5QVUJMSVNIX0lOQ1JFTUVOVEFMPC9jb2RlPi0gaW5kaWNhdGVzIGEgaW5jcmVtZW50YWwgcHVibGlzaC4KLQkgKiAgICA8bGk+PGNvZGU+UFVCTFNJSF9BVVRPPC9jb2RlPi0gaW5kaWNhdGVzIGFuIGF1dG9tYXRpYyBpbmNyZW1lbnRhbCBwdWJsaXNoLjwvbGk+Ci0JICogICAgPGxpPjxjb2RlPlBVQkxJU0hfQ0xFQU48L2NvZGU+LSBpbmRpY2F0ZXMgYSBjbGVhbiByZXF1ZXN0LiBDbGVhbiB0aHJvd3MKLQkgKiAgICAgIG91dCBhbGwgc3RhdGUgYW5kIGNsZWFucyB1cCB0aGUgbW9kdWxlIG9uIHRoZSBzZXJ2ZXIgYmVmb3JlIGRvaW5nIGEKLQkgKiAgICAgIGZ1bGwgcHVibGlzaC4KLQkgKiAgICA8L3VsPgotCSAqIEBwYXJhbSBtb2R1bGUgdGhlIG1vZHVsZSB0byBwdWJsaXNoCi0JICogQHBhcmFtIGRlbHRhS2luZCBvbmUgb2YgdGhlIElTZXJ2ZXIgcHVibGlzaCBjaGFuZ2UgY29uc3RhbnRzLiBWYWxpZCB2YWx1ZXMgYXJlOgotCSAqICAgIDx1bD4KLQkgKiAgICA8bGk+PGNvZGU+QURERUQ8L2NvZGU+LSBpbmRpY2F0ZXMgdGhlIG1vZHVsZSBoYXMganVzdCBiZWVuIGFkZGVkIHRvIHRoZSBzZXJ2ZXIKLQkgKiAgICAgIGFuZCB0aGlzIGlzIHRoZSBmaXJzdCBwdWJsaXNoLgotCSAqICAgIDxsaT48Y29kZT5OT19DSEFOR0U8L2NvZGU+LSBpbmRpY2F0ZXMgdGhhdCBub3RoaW5nIGhhcyBjaGFuZ2VkIGluIHRoZSBtb2R1bGUKLQkgKiAgICAgIHNpbmNlIHRoZSBsYXN0IHB1Ymxpc2guPC9saT4KLQkgKiAgICA8bGk+PGNvZGU+Q0hBTkdFRDwvY29kZT4tIGluZGljYXRlcyB0aGF0IHRoZSBtb2R1bGUgaGFzIGJlZW4gY2hhbmdlZCBzaW5jZQotCSAqICAgICAgdGhlIGxhc3QgcHVibGlzaC4gQ2FsbCA8Y29kZT5nZXRQdWJsaXNoZWRSZXNvdXJjZURlbHRhKCk8L2NvZGU+IGZvcgotCSAqICAgICAgZGV0YWlscyBvZiB0aGUgY2hhbmdlLgotCSAqICAgIDxsaT48Y29kZT5SRU1PVkVEPC9jb2RlPi0gaW5kaWNhdGVzIHRoZSBtb2R1bGUgaGFzIGJlZW4gcmVtb3ZlZCBhbmQgc2hvdWxkIGJlCi0JICogICAgICByZW1vdmVkL2NsZWFuZWQgdXAgZnJvbSB0aGUgc2VydmVyLgotCSAqICAgIDwvdWw+Ci0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHByb2JsZW0gcHVibGlzaGluZyB0aGUgbW9kdWxlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHVibGlzaE1vZHVsZShpbnQga2luZCwgaW50IGRlbHRhS2luZCwgSU1vZHVsZVtdIG1vZHVsZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBNZXRob2RzIGNhbGxlZCB0byBub3RpZnkgdGhhdCBwdWJsaXNoaW5nIGhhcyBmaW5pc2hlZC4KLQkgKiBUaGUgc2VydmVyIGNhbiBjbG9zZSBhbnkgb3BlbiBjb25uZWN0aW9ucyB0byB0aGUgc2VydmVyCi0JICogYW5kIGRvIGFueSBjbGVhbnVwIG9wZXJhdGlvbnMuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBzZXJ2ZXIgY29yZSBmcmFtZXdvcmssCi0JICogaW4gcmVzcG9uc2UgdG8gYSBjYWxsIHRvIDxjb2RlPklTZXJ2ZXIucHVibGlzaCgpPC9jb2RlPi4KLQkgKiBDbGllbnRzIHNob3VsZCBuZXZlciBjYWxsIHRoaXMgbWV0aG9kLgotCSAqIDwvcD4KLQkgKgotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBwcm9ibGVtIHN0b3BwaW5nIHRoZSBwdWJsaXNoCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHVibGlzaEZpbmlzaChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIENvbmZpZ3VyZSB0aGUgZ2l2ZW4gbGF1bmNoIGNvbmZpZ3VyYXRpb24gdG8gc3RhcnQgdGhpcyBzZXJ2ZXIuIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuZXZlcgotCSAqIHRoZSBzZXJ2ZXIgaXMgc3RhcnRlZCB0byBlbnN1cmUgdGhhdCB0aGUgbGF1bmNoIGNvbmZpZ3VyYXRpb24gaXMgYWNjdXJhdGUgYW5kIHVwIHRvIGRhdGUuCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBibGluZGx5IHVwZGF0ZSB0aGUgbGF1bmNoIGNvbmZpZ3VyYXRpb24gaW4gY2FzZXMgd2hlcmUgdGhlIHVzZXIgaGFzCi0JICogYWNjZXNzIHRvIGNoYW5nZSB0aGUgbGF1bmNoIGNvbmZpZ3VyYXRpb24gYnkgaGFuZC4KLQkgKiAKLQkgKiBAcGFyYW0gd29ya2luZ0NvcHkgYSBsYXVuY2ggY29uZmlndXJhdGlvbiB3b3JraW5nIGNvcHkKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCi0JICogICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGFuIGVycm9yIHNldHRpbmcgdXAgdGhlIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXR1cExhdW5jaENvbmZpZ3VyYXRpb24oSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSB3b3JraW5nQ29weSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBSZXN0YXJ0IHRoaXMgc2VydmVyLiBUaGUgc2VydmVyIHNob3VsZCB1c2UgdGhlIHNlcnZlcgotCSAqIGxpc3RlbmVyIHRvIG5vdGlmeSBwcm9ncmVzcy4gSXQgbXVzdCB1c2UgdGhlIHNhbWUgZGVidWcKLQkgKiBmbGFncyBhcyB3YXMgb3JpZ2luYWxseSBwYXNzZWQgaW50byB0aGUgc3RhcnQoKSBtZXRob2QuCi0JICogCi0JICogVGhpcyBtZXRob2QgaXMgdXNlZCBpZiB0aGVyZSBpcyBhIHF1aWNrL2JldHRlciB3YXkgdG8gcmVzdGFydAotCSAqIHRoZSBzZXJ2ZXIuIElmIGl0IHRocm93cyBhIENvcmVFeGNlcHRpb24sIHRoZSBub3JtYWwgc3RvcC9zdGFydAotCSAqIGFjdGlvbnMgd2lsbCBiZSB1c2VkLgotCSAqIAotCSAqIEBwYXJhbSBsYXVuY2hNb2RlIHRoZSBtb2RlIHRvIHJlc3RhcnQgaW4sIG9uZSBvZiB0aGUgbW9kZSBjb25zdGFudHMKLQkgKiAgICBkZWZpbmVkIGJ5IHtAbGluayBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hNYW5hZ2VyfQotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiB0aGVyZSB3YXMgYSBwcm9ibGVtIHJlc3RhcnRpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXN0YXJ0KFN0cmluZyBsYXVuY2hNb2RlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCSB0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsICJDb3VsZCBub3QgcmVzdGFydCIsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIG1vZHVsZSBjYW4gYmUgcmVzdGFydGVkLgotCSAqIDxwPgotCSAqIFtpc3N1ZTogSXQncyB1bmNsZWFyIHdoZXRoZXIgdGhpcyBvcGVyYXRpb25zIGlzIGd1YXJhbnRlZWQgdG8gYmUgZmFzdAotCSAqIG9yIHdoZXRoZXIgaXQgY291bGQgaW52b2x2ZSBjb21tdW5pY2F0aW9uIHdpdGggYW55IGFjdHVhbAotCSAqIHNlcnZlci4gSWYgaXQgaXMgbm90IGZhc3QsIHRoZSBtZXRob2Qgc2hvdWxkIHRha2UgYSBwcm9ncmVzcwotCSAqIG1vbml0b3IuXQotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kdWxlIHRoZSBtb2R1bGUKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnaXZlbiBtb2R1bGUgY2FuIGJlCi0JICogcmVzdGFydGVkLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZSAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5Db250cm9sTW9kdWxlKElNb2R1bGVbXSBtb2R1bGUpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBTdGFydHMgdGhlIGdpdmVuIG1vZHVsZSBvbiB0aGUgc2VydmVyLiBTZWUgdGhlIHNwZWNpZmljYXRpb24gb2YgCi0JICoge0BsaW5rIElTZXJ2ZXIjc3RhcnRNb2R1bGUoSU1vZHVsZVtdLCBJU2VydmVyLklPcGVyYXRpb25MaXN0ZW5lcil9Ci0JICogZm9yIGZ1cnRoZXIgZGV0YWlscy4gCi0JICogPHA+Ci0JICogVGhlIGltcGxlbWVudGF0aW9uIHNob3VsZCB1cGRhdGUgdGhlIG1vZHVsZSBzeW5jIHN0YXRlIGFuZCBmaXJlCi0JICogYW4gZXZlbnQgZm9yIHRoZSBtb2R1bGUuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBtb2R1bGUgZG9lcyBub3QgZXhpc3Qgb24KLQkgKiB0aGUgc2VydmVyLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBbaXNzdWU6IFNpbmNlIHRoaXMgbWV0aG9kIGlzIGFzY3luY2hyb25vdXMsIGlzIHRoZXJlCi0JICogYW55IG5lZWQgZm9yIHRoZSBwcm9ncmVzcyBtb25pdG9yP10KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIG1vZHVsZSB0aGUgbW9kdWxlIHRvIGJlIHN0YXJ0ZWQKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCi0JICogICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCi0JICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSB0cnlpbmcgdG8gcmVzdGFydCB0aGUgbW9kdWxlCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnRNb2R1bGUoSU1vZHVsZVtdIG1vZHVsZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBTdG9wcyB0aGUgZ2l2ZW4gbW9kdWxlIG9uIHRoZSBzZXJ2ZXIuIFNlZSB0aGUgc3BlY2lmaWNhdGlvbiBvZiAKLQkgKiB7QGxpbmsgSVNlcnZlciNzdG9wTW9kdWxlKElNb2R1bGVbXSwgSVNlcnZlci5JT3BlcmF0aW9uTGlzdGVuZXIpfQotCSAqIGZvciBmdXJ0aGVyIGRldGFpbHMuIAotCSAqIDxwPgotCSAqIFRoZSBpbXBsZW1lbnRhdGlvbiBzaG91bGQgdXBkYXRlIHRoZSBtb2R1bGUgc3luYyBzdGF0ZSBhbmQgZmlyZQotCSAqIGFuIGV2ZW50IGZvciB0aGUgbW9kdWxlLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgbW9kdWxlIGRvZXMgbm90IGV4aXN0IG9uCi0JICogdGhlIHNlcnZlci4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogW2lzc3VlOiBTaW5jZSB0aGlzIG1ldGhvZCBpcyBhc2N5bmNocm9ub3VzLCBpcyB0aGVyZQotCSAqIGFueSBuZWVkIGZvciB0aGUgcHJvZ3Jlc3MgbW9uaXRvcj9dCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBtb2R1bGUgdGhlIG1vZHVsZSB0byBiZSBzdG9wcGVkCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgdHJ5aW5nIHRvIHJlc3RhcnQgdGhlIG1vZHVsZQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3BNb2R1bGUoSU1vZHVsZVtdIG1vZHVsZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBTaHV0cyBkb3duIGFuZCBzdG9wcyB0aGlzIHNlcnZlci4gVGhlIHNlcnZlciBzaG91bGQgcmV0dXJuIGZyb20gdGhpcyBtZXRob2QKLQkgKiBxdWlja2x5IGFuZCB1c2UgdGhlIHNlcnZlciBsaXN0ZW5lciB0byBub3RpZnkgc2h1dGRvd24gcHJvZ3Jlc3MuCi0JICogPHA+IAotCSAqIElmIGZvcmNlIGlzIDxjb2RlPmZhbHNlPC9jb2RlPiwgaXQgd2lsbCBhdHRlbXB0IHRvIHN0b3AgdGhlIHNlcnZlcgotCSAqIG5vcm1hbGx5L2dyYWNlZnVsbHkuIElmIGZvcmNlIGlzIDxjb2RlPnRydWU8L2NvZGU+LCB0aGVuIHRoZSBzZXJ2ZXIKLQkgKiBwcm9jZXNzIHdpbGwgYmUgdGVybWluYXRlZCBhbnkgd2F5IHRoYXQgaXQgY2FuLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBbaXNzdWU6IFRoZXJlIGlzIG5vIHdheSB0byBjb21tdW5pY2F0ZSBmYWlsdXJlIHRvIHRoZQotCSAqIGNsaWVudC4gR2l2ZW4gdGhhdCB0aGlzIG9wZXJhdGlvbiBjYW4gZ28gYXdyeSwgdGhlcmUgcHJvYmFibHkKLQkgKiBzaG91bGQgYmUgYSBtZWNoYW5pc20gdGhhdCBhbGxvd3MgZmFpbGluZyBhc3luY2ggb3BlcmF0aW9ucwotCSAqIHRvIGJlIGRpYWdub3NlZC5dCi0JICogPC9wPgotCSAqIEBwYXJhbSBmb3JjZSA8Y29kZT50cnVlPC9jb2RlPiB0byBraWxsIHRoZSBzZXJ2ZXIsIG9yIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqICAgIHRvIHN0b3Agbm9ybWFsbHkKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzdG9wKGJvb2xlYW4gZm9yY2UpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY3VycmVudCBtb2R1bGUgcmVzb3VyY2VzLgotCSAqIAotCSAqIEBwYXJhbSBtb2R1bGUgdGhlIG1vZHVsZQotCSAqIEByZXR1cm4gYW4gYXJyYXkgY29udGFpbmluZyB0aGUgbW9kdWxlJ3MgcmVzb3VyY2VzCi0JICovCi0JcHJvdGVjdGVkIElNb2R1bGVSZXNvdXJjZVtdIGdldFJlc291cmNlcyhJTW9kdWxlW10gbW9kdWxlKSB7Ci0JCXJldHVybiBzZXJ2ZXIuZ2V0UmVzb3VyY2VzKG1vZHVsZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbW9kdWxlIHJlc291cmNlcyB0aGF0IGhhdmUgYmVlbiBwdWJsaXNoZWQgdG8gdGhlIHNlcnZlci4KLQkgKiAKLQkgKiA8cD4KLQkgKiBJZiB0aGUgbW9kdWxlIGhhcyBqdXN0IGJlZW4gYWRkZWQgdG8gdGhlIHNlcnZlciwgYW4gZW1wdHkgbGlzdCB3aWxsCi0JICogYmUgcmV0dXJuZWQuIElmIHRoZSBtb2R1bGUgaGFzIG5ldmVyIGV4aXN0ZWQgb24gdGhlIHNlcnZlciwgYSBDb3JlRXhjZXB0aW9uCi0JICogd2lsbCBiZSB0aHJvd24uCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBtb2R1bGUgdGhlIG1vZHVsZQotCSAqIEByZXR1cm4gYW4gYXJyYXkgY29udGFpbmluZyB0aGUgcHVibGlzaGVkIG1vZHVsZSByZXNvdXJjZQotCSAqLwotCXByb3RlY3RlZCBJTW9kdWxlUmVzb3VyY2VbXSBnZXRQdWJsaXNoZWRSZXNvdXJjZXMoSU1vZHVsZVtdIG1vZHVsZSkgewotCQlyZXR1cm4gc2VydmVyLmdldFB1Ymxpc2hlZFJlc291cmNlcyhtb2R1bGUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRlbHRhIG9mIHRoZSBjdXJyZW50IG1vZHVsZSByZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4KLQkgKiBwdWJsaXNoZWQgY29tcGFyZWQgdG8gdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIG1vZHVsZS4KLQkgKgotCSAqIEBwYXJhbSBtb2R1bGUgdGhlIG1vZHVsZQotCSAqIEByZXR1cm4gYW4gYXJyYXkgY29udGFpbmluZyB0aGUgcHVibGlzaCByZXNvdXJjZSBkZWx0YQotCSAqLwotCXByb3RlY3RlZCBJTW9kdWxlUmVzb3VyY2VEZWx0YVtdIGdldFB1Ymxpc2hlZFJlc291cmNlRGVsdGEoSU1vZHVsZVtdIG1vZHVsZSkgewotCQlyZXR1cm4gc2VydmVyLmdldFB1Ymxpc2hlZFJlc291cmNlRGVsdGEobW9kdWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSB0aGF0IHRoZSByZXF1ZXN0b3IgY2FuIHVzZQotCSAqIHRocm91Z2hvdXQgaXQncyBsaWZlY3ljbGUuIFRoaXMgaXMgcHJpbWFyeSB0byBiZSB1c2VkIGJ5Ci0JICogc2VydmVycyBmb3Igd29ya2luZyBkaXJlY3Rvcmllcywgc2VydmVyIHNwZWNpZmljCi0JICogZmlsZXMsIGV0Yy4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBkaXJlY3Rvcnkgd2lsbCByZXR1cm4gdGhlIHNhbWUgZGlyZWN0b3J5IG9uCi0JICogZWFjaCB1c2Ugb2YgdGhlIHdvcmtiZW5jaC4gSWYgdGhlIGRpcmVjdG9yeSBpcyBub3QgcmVxdWVzdGVkCi0JICogb3ZlciBhIHBlcmlvZCBvZiB0aW1lLCB0aGUgZGlyZWN0b3J5IG1heSBiZSBkZWxldGVkIGFuZCBhCi0JICogbmV3IG9uZSB3aWxsIGJlIGFzc2lnbmVkIG9uIHRoZSBuZXh0IHJlcXVlc3QuIEZvciB0aGlzCi0JICogcmVhc29uLCBhIHNlcnZlciBtYXkgd2FudCB0byByZXF1ZXN0IHRoZSB0ZW1wIGRpcmVjdG9yeSBvbgotCSAqIHN0YXJ0dXAgaWYgaXQgd2FudHMgdG8gc3RvcmUgZmlsZXMgdGhlcmUuIEluIGFueSBjYXNlLCB0aGUKLQkgKiBzZXJ2ZXIgc2hvdWxkIGhhdmUgYSBiYWNrdXAgcGxhbiB0byByZWZpbGwgdGhlIGRpcmVjdG9yeQotCSAqIGluIGNhc2UgaXQgaGFzIGJlZW4gZGVsZXRlZCBzaW5jZSBsYXN0IHVzZS48L3A+Ci0JICoKLQkgKiBAcmV0dXJuIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeQotCSAqLwotCXByb3RlY3RlZCBJUGF0aCBnZXRUZW1wRGlyZWN0b3J5KCkgewotCQlyZXR1cm4gc2VydmVyLmdldFRlbXBEaXJlY3RvcnkoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgYSBnbG9iYWwgc3RhdHVzIG9uIHRoZSBzZXJ2ZXIuCi0JICogIAotCSAqIEBwYXJhbSBzdGF0dXMgdGhlIHN0YXR1cwotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIHNldFNlcnZlclN0YXR1cyhJU3RhdHVzIHN0YXR1cykgewotCQlzZXJ2ZXIuc2V0U2VydmVyU3RhdHVzKHN0YXR1cyk7Ci0JfQotCi0JLyoqCi0JICogU2V0IGEgc3RhdHVzIG9uIGEgc3BlY2lmaWMgbW9kdWxlLgotCSAqIAotCSAqIEBwYXJhbSBtb2R1bGUgdGhlIG1vZHVsZQotCSAqIEBwYXJhbSBzdGF0dXMgdGhlIHN0YXR1cwotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIHNldE1vZHVsZVN0YXR1cyhJTW9kdWxlW10gbW9kdWxlLCBJU3RhdHVzIHN0YXR1cykgewotCQlzZXJ2ZXIuc2V0TW9kdWxlU3RhdHVzKG1vZHVsZSwgc3RhdHVzKTsKLQl9Ci0KLQkvKioKLQkgKiBQdWJsaXNoIHRvIHRoZSBzZXJ2ZXIuCi0JICogCi0JICogQHBhcmFtIGtpbmQgdGhlIHB1Ymxpc2gga2luZAotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLQkgKiBAcmV0dXJuIHRoZSBwdWJsaXNoIHN0YXR1cwotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHB1Ymxpc2goaW50IGtpbmQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICItLT4tLSBQdWJsaXNoaW5nIHRvIHNlcnZlcjogIiArIHRvU3RyaW5nKCkgKyAiIC0tPi0tIik7Ci0JCQotCQlpZiAoZ2V0U2VydmVyKCkuZ2V0U2VydmVyVHlwZSgpLmhhc1J1bnRpbWUoKSAmJiBnZXRTZXJ2ZXIoKS5nZXRSdW50aW1lKCkgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIE1lc3NhZ2VzLmVycm9yUHVibGlzaE5vUnVudGltZSwgbnVsbCk7Ci0JCQotCQlmaW5hbCBMaXN0IG1vZHVsZUxpc3QgPSBnZXRBbGxNb2R1bGVzKCk7Ci0JCWZpbmFsIExpc3QgZGVsdGFLaW5kTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbW9kdWxlTGlzdC5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlJTW9kdWxlW10gbW9kdWxlID0gKElNb2R1bGVbXSkgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKGhhc0JlZW5QdWJsaXNoZWQobW9kdWxlKSkgewotCQkJCWlmIChnZXRQdWJsaXNoZWRSZXNvdXJjZURlbHRhKG1vZHVsZSkubGVuZ3RoID09IDApCi0JCQkJCWRlbHRhS2luZExpc3QuYWRkKG5ldyBJbnRlZ2VyKFNlcnZlckJlaGF2aW91ckRlbGVnYXRlLk5PX0NIQU5HRSkpOwotCQkJCWVsc2UKLQkJCQkJZGVsdGFLaW5kTGlzdC5hZGQobmV3IEludGVnZXIoU2VydmVyQmVoYXZpb3VyRGVsZWdhdGUuQ0hBTkdFRCkpOwotCQkJfSBlbHNlCi0JCQkJZGVsdGFLaW5kTGlzdC5hZGQobmV3IEludGVnZXIoU2VydmVyQmVoYXZpb3VyRGVsZWdhdGUuQURERUQpKTsKLQkJfQotCQkKLQkJYWRkUmVtb3ZlZE1vZHVsZXMobW9kdWxlTGlzdCwgZGVsdGFLaW5kTGlzdCk7Ci0JCQotCQl3aGlsZSAobW9kdWxlTGlzdC5zaXplKCkgPiBkZWx0YUtpbmRMaXN0LnNpemUoKSkgewotCQkJZGVsdGFLaW5kTGlzdC5hZGQobmV3IEludGVnZXIoU2VydmVyQmVoYXZpb3VyRGVsZWdhdGUuUkVNT1ZFRCkpOwotCQl9Ci0JCQotCQlQdWJsaXNoT3BlcmF0aW9uW10gdGFza3MgPSBnZXRUYXNrcyhraW5kLCBtb2R1bGVMaXN0LCBkZWx0YUtpbmRMaXN0KTsKLQkJaW50IHNpemUgPSAyMDAwICsgMzUwMCAqIG1vZHVsZUxpc3Quc2l6ZSgpICsgNTAwICogdGFza3MubGVuZ3RoOwotCQkKLQkJbW9uaXRvciA9IFByb2dyZXNzVXRpbC5nZXRNb25pdG9yRm9yKG1vbml0b3IpOwotCQltb25pdG9yLmJlZ2luVGFzayhOTFMuYmluZChNZXNzYWdlcy5wdWJsaXNoaW5nLCBnZXRTZXJ2ZXIoKS5nZXROYW1lKCkpLCBzaXplKTsKLQotCQlNdWx0aVN0YXR1cyB0ZW1wTXVsdGkgPSBuZXcgTXVsdGlTdGF0dXMoU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgIiIsIG51bGwpOwotCi0JCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQkJCi0JCS8vIHN0YXJ0IHB1Ymxpc2hpbmcKLQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiQ2FsbGluZyBwdWJsaXNoU3RhcnQoKSIpOwotCQl0cnkgewotCQkJcHVibGlzaFN0YXJ0KFByb2dyZXNzVXRpbC5nZXRTdWJNb25pdG9yRm9yKG1vbml0b3IsIDEwMDApKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuSU5GTywgIkNvcmVFeGNlcHRpb24gcHVibGlzaGluZyB0byAiICsgdG9TdHJpbmcoKSwgY2UpOwotCQkJcmV0dXJuIGNlLmdldFN0YXR1cygpOwotCQl9Ci0JCQotCQkvLyBwZXJmb3JtIHRhc2tzCi0JCU11bHRpU3RhdHVzIHRhc2tTdGF0dXMgPSBwZXJmb3JtVGFza3ModGFza3MsIG1vbml0b3IpOwotCQlpZiAodGFza1N0YXR1cyAhPSBudWxsKQotCQkJdGVtcE11bHRpLmFkZEFsbCh0YXNrU3RhdHVzKTsKLQkJCi0JCS8vIHB1Ymxpc2ggdGhlIHNlcnZlcgotCQl0cnkgewotCQkJaWYgKCFtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJCXB1Ymxpc2hTZXJ2ZXIoa2luZCwgUHJvZ3Jlc3NVdGlsLmdldFN1Yk1vbml0b3JGb3IobW9uaXRvciwgMTAwMCkpOwotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5JTkZPLCAiQ29yZUV4Y2VwdGlvbiBwdWJsaXNoaW5nIHRvICIgKyB0b1N0cmluZygpLCBjZSk7Ci0JCQl0ZW1wTXVsdGkuYWRkKGNlLmdldFN0YXR1cygpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIHB1Ymxpc2hpbmcgY29uZmlndXJhdGlvbiB0byAiICsgdG9TdHJpbmcoKSwgZSk7Ci0JCQl0ZW1wTXVsdGkuYWRkKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTWVzc2FnZXMuZXJyb3JQdWJsaXNoaW5nLCBlKSk7Ci0JCX0KLQkJCi0JCS8vIHB1Ymxpc2ggbW9kdWxlcwotCQlpZiAoIW1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQl0cnkgewotCQkJCXB1Ymxpc2hNb2R1bGVzKGtpbmQsIG1vZHVsZUxpc3QsIGRlbHRhS2luZExpc3QsIHRlbXBNdWx0aSwgbW9uaXRvcik7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJFcnJvciB3aGlsZSBwdWJsaXNoaW5nIG1vZHVsZXMiLCBlKTsKLQkJCQl0ZW1wTXVsdGkuYWRkKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTWVzc2FnZXMuZXJyb3JQdWJsaXNoaW5nLCBlKSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIGVuZCB0aGUgcHVibGlzaGluZwotCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJDYWxsaW5nIHB1Ymxpc2hGaW5pc2goKSIpOwotCQl0cnkgewotCQkJcHVibGlzaEZpbmlzaChQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yLCA1MDApKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuSU5GTywgIkNvcmVFeGNlcHRpb24gcHVibGlzaGluZyB0byAiICsgdG9TdHJpbmcoKSwgY2UpOwotCQkJdGVtcE11bHRpLmFkZChjZS5nZXRTdGF0dXMoKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBzdG9wcGluZyBwdWJsaXNoIHRvICIgKyB0b1N0cmluZygpLCBlKTsKLQkJCXRlbXBNdWx0aS5hZGQobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCBNZXNzYWdlcy5lcnJvclB1Ymxpc2hpbmcsIGUpKTsKLQkJfQotCQkKLQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJcmV0dXJuIFN0YXR1cy5DQU5DRUxfU1RBVFVTOwotCQkKLQkJbW9uaXRvci5kb25lKCk7Ci0JCQotCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICItLTwtLSBEb25lIHB1Ymxpc2hpbmcgLS08LS0iKTsKLQkJCi0JCWlmICh0ZW1wTXVsdGkuZ2V0Q2hpbGRyZW4oKS5sZW5ndGggPT0gMSkKLQkJCXJldHVybiB0ZW1wTXVsdGkuZ2V0Q2hpbGRyZW4oKVswXTsKLQkJCi0JCU11bHRpU3RhdHVzIG11bHRpID0gbnVsbDsKLQkJaWYgKHRlbXBNdWx0aS5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuT0spCi0JCQltdWx0aSA9IG5ldyBNdWx0aVN0YXR1cyhTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCBNZXNzYWdlcy5wdWJsaXNoaW5nU3RhdHVzT2ssIG51bGwpOwotCQllbHNlIGlmICh0ZW1wTXVsdGkuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLklORk8pCi0JCQltdWx0aSA9IG5ldyBNdWx0aVN0YXR1cyhTZXJ2ZXJQbHVnaW4uUExVR0lOX0lELCAwLCBNZXNzYWdlcy5wdWJsaXNoaW5nU3RhdHVzSW5mbywgbnVsbCk7Ci0JCWVsc2UgaWYgKHRlbXBNdWx0aS5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuV0FSTklORykKLQkJCW11bHRpID0gbmV3IE11bHRpU3RhdHVzKFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIE1lc3NhZ2VzLnB1Ymxpc2hpbmdTdGF0dXNXYXJuaW5nLCBudWxsKTsKLQkJZWxzZSBpZiAodGVtcE11bHRpLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUikKLQkJCW11bHRpID0gbmV3IE11bHRpU3RhdHVzKFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIE1lc3NhZ2VzLnB1Ymxpc2hpbmdTdGF0dXNFcnJvciwgbnVsbCk7Ci0JCW11bHRpLmFkZEFsbCh0ZW1wTXVsdGkpOwotCQkKLQkJcmV0dXJuIG11bHRpOwotCX0KLQotCS8qKgotCSAqIFB1Ymxpc2ggYSBzaW5nbGUgbW9kdWxlLgotCSAqIAotCSAqIEBwYXJhbSBraW5kIGEgcHVibGlzaCBraW5kCi0JICogQHBhcmFtIG1vZHVsZSBhIG1vZHVsZQotCSAqIEBwYXJhbSBkZWx0YUtpbmQgdGhlIGRlbHRhIGtpbmQKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCi0JICogICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCi0JICogQHJldHVybiB0aGUgc3RhdHVzCi0JICovCi0JcHJvdGVjdGVkIElTdGF0dXMgcHVibGlzaE1vZHVsZShpbnQga2luZCwgSU1vZHVsZVtdIG1vZHVsZSwgaW50IGRlbHRhS2luZCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIlB1Ymxpc2hpbmcgbW9kdWxlOiAiICsgbW9kdWxlKTsKLQkJCi0JCWludCBzaXplID0gbW9kdWxlLmxlbmd0aDsKLQkJSU1vZHVsZSBtID0gbW9kdWxlW3NpemUgLSAxXTsKLQkJbW9uaXRvci5iZWdpblRhc2soTkxTLmJpbmQoTWVzc2FnZXMucHVibGlzaGluZ01vZHVsZSwgbS5nZXROYW1lKCkpLCAxMDAwKTsKLQkJCi0JCUlTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQkJdHJ5IHsKLQkJCXB1Ymxpc2hNb2R1bGUoa2luZCwgZGVsdGFLaW5kLCBtb2R1bGUsIG1vbml0b3IpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQlzdGF0dXMgPSBjZS5nZXRTdGF0dXMoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyUGx1Z2luLlBMVUdJTl9JRCwgMCwgTWVzc2FnZXMuZXJyb3JQdWJsaXNoaW5nLCBlKTsKLQkJfQotCQkKLQkJLypUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJEZWx0YToiKTsKLQkJSU1vZHVsZVJlc291cmNlRGVsdGFbXSBkZWx0YSA9IGdldFNlcnZlclB1Ymxpc2hJbmZvKCkuZ2V0RGVsdGEocGFyZW50cywgbW9kdWxlKTsKLQkJaW50IHNpemUgPSBkZWx0YS5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkoKE1vZHVsZVJlc291cmNlRGVsdGEpZGVsdGFbaV0pLnRyYWNlKCI+ICAiKTsKLQkJfSovCi0JCQotCQltb25pdG9yLmRvbmUoKTsKLQkJCi0JCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIkRvbmUgcHVibGlzaGluZzogIiArIG1vZHVsZSk7Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ2l2ZW4gbW9kdWxlIGhhcyBiZWVuIHB1Ymxpc2hlZCwgYW5kCi0JICogICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kdWxlIGEgbW9kdWxlCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ2l2ZW4gbW9kdWxlIGhhcyBiZWVuIHB1Ymxpc2hlZCwgYW5kCi0JICogICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhhc0JlZW5QdWJsaXNoZWQoSU1vZHVsZVtdIG1vZHVsZSkgewotCQlyZXR1cm4gc2VydmVyLmdldFNlcnZlclB1Ymxpc2hJbmZvKCkuaGFzTW9kdWxlUHVibGlzaEluZm8obW9kdWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHJlbW92ZWQgbW9kdWxlcy4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kdWxlTGlzdCBhIGxpc3Qgb2YgbW9kdWxlcwotCSAqIEBwYXJhbSBraW5kTGlzdCBhIGxpc3Qgb2YgcHVibGlzaCBraW5kcwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFJlbW92ZWRNb2R1bGVzKExpc3QgbW9kdWxlTGlzdCwgTGlzdCBraW5kTGlzdCkgewotCQlzZXJ2ZXIuZ2V0U2VydmVyUHVibGlzaEluZm8oKS5hZGRSZW1vdmVkTW9kdWxlcyhtb2R1bGVMaXN0LCBraW5kTGlzdCk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlIHRoZSBzdG9yZWQgcHVibGlzaCBpbmZvIGZvciB0aGUgZ2l2ZW4gbW9kdWxlLgotCSAqIAotCSAqIEBkZXByZWNhdGVkIHNob3VsZCBuZXZlciBuZWVkIHRvIGJlIGNhbGxlZCBkaXJlY3RseS4gV2lsbCBiZSByZW1vdmVkCi0JICogICAgaW4gYSBmdXR1cmUgdmVyc2lvbiBvZiBXVFAKLQkgKiBAcGFyYW0gZGVsdGFLaW5kIGEgcHVibGlzaCBkZWx0YSBraW5kCi0JICogQHBhcmFtIG1vZHVsZSBhIG1vZHVsZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVB1Ymxpc2hJbmZvKGludCBkZWx0YUtpbmQsIElNb2R1bGVbXSBtb2R1bGUpIHsKLQkJLy8gVE9ETyByZW1vdmUKLQl9Ci0KLQkvKioKLQkgKiBQdWJsaXNoZXMgdGhlIGdpdmVuIG1vZHVsZXMuIFJldHVybnMgdHJ1ZSBpZiB0aGUgcHVibGlzaGluZwotCSAqIHNob3VsZCBjb250aW51ZSwgb3IgZmFsc2UgaWYgcHVibGlzaGluZyBoYXMgZmFpbGVkIG9yIGlzIGNhbmNlbGxlZC4KLQkgKiAKLQkgKiBVc2VzIDUwMCB0aWNrcyBwbHVzIDM1MDAgdGlja3MgcGVyIG1vZHVsZQotCSAqIAotCSAqIEBwYXJhbSBraW5kIHRoZSBwdWJsaXNoIGtpbmQKLQkgKiBAcGFyYW0gbW9kdWxlcyBhIGxpc3Qgb2YgbW9kdWxlcwotCSAqIEBwYXJhbSBkZWx0YUtpbmQgYSBsaXN0IG9mIGRlbHRhIGtpbmRzCi0JICogQHBhcmFtIG11bHRpIGEgbXVsdGlzdGF0dXMgdG8gYWRkIHRoZSBzdGF0dXMgdG8KLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCi0JICogICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHVibGlzaE1vZHVsZXMoaW50IGtpbmQsIExpc3QgbW9kdWxlcywgTGlzdCBkZWx0YUtpbmQsIE11bHRpU3RhdHVzIG11bHRpLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKG1vZHVsZXMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCWludCBzaXplID0gbW9kdWxlcy5zaXplKCk7Ci0JCWlmIChzaXplID09IDApCi0JCQlyZXR1cm47Ci0JCQotCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQlyZXR1cm47Ci0JCQotCQkvLyBwdWJsaXNoIG1vZHVsZXMKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCUlTdGF0dXMgc3RhdHVzID0gcHVibGlzaE1vZHVsZShraW5kLCAoSU1vZHVsZVtdKSBtb2R1bGVzLmdldChpKSwgKChJbnRlZ2VyKWRlbHRhS2luZC5nZXQoaSkpLmludFZhbHVlKCksIFByb2dyZXNzVXRpbC5nZXRTdWJNb25pdG9yRm9yKG1vbml0b3IsIDMwMDApKTsKLQkJCW11bHRpLmFkZChzdGF0dXMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcHVibGlzaCB0YXNrcyB0aGF0IGhhdmUgYmVlbiB0YXJnZXR0ZWQgdG8gdGhpcyBzZXJ2ZXIuCi0JICogVGhlc2UgdGFza3Mgc2hvdWxkIGJlIHJ1biBkdXJpbmcgcHVibGlzaGluZy4KLQkgKiAKLQkgKiBAcGFyYW0ga2luZCBvbmUgb2YgdGhlIElTZXJ2ZXIuUFVCTElTSF9YWCBjb25zdGFudHMKLQkgKiBAcGFyYW0gbW9kdWxlTGlzdCBhIGxpc3Qgb2YgbW9kdWxlcwotCSAqIEBwYXJhbSBraW5kTGlzdCBsaXN0IG9mIG9uZSBvZiB0aGUgSVNlcnZlciBwdWJsaXNoIGNoYW5nZSBjb25zdGFudHMKLQkgKiBAcmV0dXJuIGEgcG9zc2libHkgZW1wdHkgYXJyYXkgb2YgSU9wdGlvbmFsVGFza3MKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgUHVibGlzaE9wZXJhdGlvbltdIGdldFRhc2tzKGludCBraW5kLCBMaXN0IG1vZHVsZUxpc3QsIExpc3Qga2luZExpc3QpIHsKLQkJcmV0dXJuIHNlcnZlci5nZXRUYXNrcyhraW5kLCBtb2R1bGVMaXN0LCBraW5kTGlzdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbGwgdGhlIG1vZHVsZXMgdGhhdCBhcmUgb24gdGhlIHNlcnZlciwgaW5jbHVkaW5nIHJvb3QKLQkgKiBtb2R1bGVzIGFuZCBhbGwgdGhlaXIgY2hpbGRyZW4uCi0JICogCi0JICogQHJldHVybiBhIGxpc3Qgb2YgSU1vZHVsZVtdcwotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBMaXN0IGdldEFsbE1vZHVsZXMoKSB7Ci0JCXJldHVybiBzZXJ2ZXIuZ2V0QWxsTW9kdWxlcygpOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm0gKGV4ZWN1dGUpIGFsbCB0aGUgZ2l2ZW4gdGFza3MuCi0JICogCi0JICogQHBhcmFtIHRhc2tzIGFuIGFycmF5IG9mIHRhc2tzCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqIEByZXR1cm4gdGhlIHN0YXR1cwotCSAqLwotCXByb3RlY3RlZCBNdWx0aVN0YXR1cyBwZXJmb3JtVGFza3MoUHVibGlzaE9wZXJhdGlvbltdIHRhc2tzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaW50IHNpemUgPSB0YXNrcy5sZW5ndGg7Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIlBlcmZvcm1pbmcgdGFza3M6ICIgKyBzaXplKTsKLQkJCi0JCWlmIChzaXplID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCU11bHRpU3RhdHVzIG11bHRpID0gbmV3IE11bHRpU3RhdHVzKFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsIE1lc3NhZ2VzLnRhc2tQZXJmb3JtaW5nLCBudWxsKTsKLQkJCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlQdWJsaXNoT3BlcmF0aW9uIHRhc2sgPSB0YXNrc1tpXTsKLQkJCW1vbml0b3Iuc3ViVGFzayhOTFMuYmluZChNZXNzYWdlcy50YXNrUGVyZm9ybWluZywgdGFzay50b1N0cmluZygpKSk7Ci0JCQl0cnkgewotCQkJCXRhc2suZXhlY3V0ZShQcm9ncmVzc1V0aWwuZ2V0U3ViTW9uaXRvckZvcihtb25pdG9yLCA1MDApLCBudWxsKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJUYXNrIGZhaWxlZCIsIGNlKTsKLQkJCQltdWx0aS5hZGQoY2UuZ2V0U3RhdHVzKCkpOwotCQkJfQotCQkJCi0JCQkvLyByZXR1cm4gZWFybHkgaWYgdGhlIG1vbml0b3IgaGFzIGJlZW4gY2FuY2VsbGVkCi0JCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJcmV0dXJuIG11bHRpOwotCQl9Ci0JCQotCQlyZXR1cm4gbXVsdGk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIHdoZW4gcmVzb3VyY2VzIGNoYW5nZSB3aXRoaW4gdGhlIHdvcmtzcGFjZS4KLQkgKiBUaGlzIGdpdmVzIHRoZSBzZXJ2ZXIgYW4gb3Bwb3J0dW5pdHkgdG8gdXBkYXRlIHRoZSBzZXJ2ZXIgb3IgbW9kdWxlCi0JICogcmVzdGFydCBzdGF0ZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVSZXNvdXJjZUNoYW5nZSgpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9tb2RlbC9TZXJ2ZXJEZWxlZ2F0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvbW9kZWwvU2VydmVyRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RkZDdlMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9tb2RlbC9TZXJ2ZXJEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotoCogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5TZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlcldvcmtpbmdDb3B5OwotLyoqCi0gKiBBIHNlcnZlciBkZWxlZ2F0ZSBwcm92aWRlcyB0aGUgaW1wbGVtZW50YXRpb24gZm9yIHZhcmlvdXMgCi0gKiBnZW5lcmljIGFuZCBzZXJ2ZXItdHlwZS1zcGVjaWZpYyBvcGVyYXRpb25zIGZvciBhIHNwZWNpZmljIHR5cGUgb2Ygc2VydmVyLgotICogQSBzZXJ2ZXIgZGVsZWdhdGUgaXMgc3BlY2lmaWVkIGJ5IHRoZQotICogPGNvZGU+Y2xhc3M8L2NvZGU+IGF0dHJpYnV0ZSBvZiBhIDxjb2RlPnNlcnZlclR5cGVzPC9jb2RlPiBleHRlbnNpb24uCi0gKiA8cD4KLSAqIFdoZW4gdGhlIHNlcnZlciBpbnN0YW5jZSBuZWVkcyB0byBiZSBnaXZlbiBhIGRlbGVnYXRlLCB0aGUgZGVsZWdhdGUgY2xhc3MKLSAqIHNwZWNpZmllZCBmb3IgdGhlIHNlcnZlciB0eXBlIGlzIGluc3RhbnRpYXRlZCB3aXRoIGEgMC1hcmd1bWVudCBjb25zdHJ1Y3RvcgotICogYW5kIHByaW1lZCB3aXRoIDxjb2RlPmRlbGVnYXRlLmluaXRpYWxpemUoKChJU2VydmVyU3RhdGUpc2VydmVyKTwvY29kZT4sIAotICogd2hpY2ggaXQgaXMgZXhwZWN0ZWQgdG8gaGFuZyBvbiB0by4gTGF0ZXIsIHdoZW4KLSAqIDxjb2RlPmRlbGVnYXRlLmRpc3Bvc2UoKTwvY29kZT4gaXMgY2FsbGVkIGFzIHRoZSBzZXJ2ZXIgaW5zdGFuY2UgaXMKLSAqIGJlaW5nIGRpc2NhcmRlZCwgdGhlIGRlbGVnYXRlIGlzIGV4cGVjdGVkIHRvIGxldCBnbyBvZiB0aGUgc2VydmVyIGluc3RhbmNlLgotICogPC9wPgotICogPHA+Ci0gKiBTZXJ2ZXJEZWxlZ2F0ZSBzdXBwb3J0cyBhbiBvcGVuLWVuZGVkIHNldCBvZiBhdHRyaWJ1dGUtdmFsdWUgcGFpcnMuIEFsbAotICogc3RhdGUgc3RvcmVkIGluIHRoaXMgbWFubmVyIHdpbGwgYmUgc2F2ZWQgd2hlbiB0aGUgc2VydmVyIHdvcmtpbmcgY29weSBpcwotICogc2F2ZWQsIGFuZCBwZXJzaXN0ZWQgYWNyb3NzIHdvcmtiZW5jaCBzZXNzaW9ucy4KLSAqIFNlcnZlciBkZWxlZ2F0ZXMgbWF5IGtlZXAgc3RhdGUgaW4gaW5zdGFuY2UgZmllbGRzLCBidXQgdGhhdCBzdGF0ZSBpcwotICogdHJhbnNpZW50IGFuZCB3aWxsIG5vdCBiZSBwZXJzaXN0ZWQgYWNyb3NzIHdvcmtiZW5jaCBzZXNzaW9ucy4gVG8gc2F2ZQotICogc3RhdGUgYWNyb3NzIHdvcmtiZW5jaCBzZXNzaW9ucywgaXQgbXVzdCBiZSBwZXJzaXN0ZWQgdXNpbmcgdGhlCi0gKiBhdHRyaWJ1dGVzLgotICogPC9wPgotICogPHA+Ci0gKiBUaGlzIGFic3RyYWN0IGNsYXNzIGlzIGludGVuZGVkIHRvIGJlIGV4dGVuZGVkIG9ubHkgYnkgY2xpZW50cwotICogdG8gZXh0ZW5kIHRoZSA8Y29kZT5zZXJ2ZXJUeXBlczwvY29kZT4gZXh0ZW5zaW9uIHBvaW50LgotICogPC9wPgotICogCi0gKiBAc2VlIElTZXJ2ZXIKLSAqIEBzZWUgSVNlcnZlcldvcmtpbmdDb3B5Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTZXJ2ZXJEZWxlZ2F0ZSB7Ci0JcHJpdmF0ZSBTZXJ2ZXIgc2VydmVyOwotCXByaXZhdGUgU2VydmVyV29ya2luZ0NvcHkgc2VydmVyV0M7Ci0KLQkvKioKLQkgKiBEZWxlZ2F0ZXMgbXVzdCBoYXZlIGEgcHVibGljIDAtYXJnIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBTZXJ2ZXJEZWxlZ2F0ZSgpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoaXMgc2VydmVyIGRlbGVnYXRlIHdpdGggaXRzIGxpZmUtbG9uZyBzZXJ2ZXIgaW5zdGFuY2UuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBzZXJ2ZXIgY29yZSBmcmFtZXdvcmsuCi0JICogQ2xpZW50cyBzaG91bGQgbmV2ZXIgY2FsbCB0aGlzIG1ldGhvZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIG5ld1NlcnZlciB0aGUgc2VydmVyIGluc3RhbmNlCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqLwotCWZpbmFsIHZvaWQgaW5pdGlhbGl6ZShTZXJ2ZXIgbmV3U2VydmVyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJc2VydmVyID0gbmV3U2VydmVyOwotCQlpZiAobmV3U2VydmVyIGluc3RhbmNlb2YgU2VydmVyV29ya2luZ0NvcHkpCi0JCQlzZXJ2ZXJXQyA9IChTZXJ2ZXJXb3JraW5nQ29weSkgbmV3U2VydmVyOwotCQlpbml0aWFsaXplKCk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhpcyBzZXJ2ZXIgZGVsZWdhdGUuIFRoaXMgbWV0aG9kIGdpdmVzIGRlbGVnYXRlcyBhIGNoYW5jZQotCSAqIHRvIGRvIHRoZWlyIG93biBpbml0aWFsaXphdGlvbi4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIHNlcnZlciBjb3JlIGZyYW1ld29yay4KLQkgKiBDbGllbnRzIHNob3VsZCBuZXZlciBjYWxsIHRoaXMgbWV0aG9kLgotCSAqIDwvcD4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2VydmVyIHRoYXQgdGhpcyBzZXJ2ZXIgZGVsZWdhdGUgY29ycmVzcG9uZHMgdG8uCi0JICogCi0JICogQHJldHVybiB0aGUgc2VydmVyCi0JICovCi0JcHVibGljIGZpbmFsIElTZXJ2ZXIgZ2V0U2VydmVyKCkgewotCQlyZXR1cm4gc2VydmVyOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNlcnZlciB3b3JraW5nIGNvcHkgdGhhdCB0aGlzIHNlcnZlciBkZWxlZ2F0ZSBjb3JyZXNwb25kcyB0by4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzZXJ2ZXIKLQkgKi8KLQlwdWJsaWMgZmluYWwgSVNlcnZlcldvcmtpbmdDb3B5IGdldFNlcnZlcldvcmtpbmdDb3B5KCkgewotCQlyZXR1cm4gc2VydmVyV0M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBpbnQtdmFsdWVkIGF0dHJpYnV0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gaWQgdGhlIGF0dHJpYnV0ZSBpZAotCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGUKLQkgKiBAcmV0dXJuIHRoZSBhdHRyaWJ1dGUgdmFsdWUKLQkgKiBAc2VlICNzZXRBdHRyaWJ1dGUoU3RyaW5nLCBpbnQpCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIGludCBnZXRBdHRyaWJ1dGUoU3RyaW5nIGlkLCBpbnQgZGVmYXVsdFZhbHVlKSB7Ci0JCXJldHVybiBzZXJ2ZXIuZ2V0QXR0cmlidXRlKGlkLCBkZWZhdWx0VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgYm9vbGVhbi12YWx1ZWQgYXR0cmlidXRlLgotCSAqIAotCSAqIEBwYXJhbSBpZCB0aGUgYXR0cmlidXRlIGlkCi0JICogQHBhcmFtIGRlZmF1bHRWYWx1ZSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZQotCSAqIEByZXR1cm4gdGhlIGF0dHJpYnV0ZSB2YWx1ZQotCSAqIEBzZWUgI3NldEF0dHJpYnV0ZShTdHJpbmcsIGJvb2xlYW4pCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gZ2V0QXR0cmlidXRlKFN0cmluZyBpZCwgYm9vbGVhbiBkZWZhdWx0VmFsdWUpIHsKLQkJcmV0dXJuIHNlcnZlci5nZXRBdHRyaWJ1dGUoaWQsIGRlZmF1bHRWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBTdHJpbmctdmFsdWVkIGF0dHJpYnV0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gaWQgdGhlIGF0dHJpYnV0ZSBpZAotCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGUKLQkgKiBAcmV0dXJuIHRoZSBhdHRyaWJ1dGUgdmFsdWUKLQkgKiBAc2VlICNzZXRBdHRyaWJ1dGUoU3RyaW5nLCBTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBnZXRBdHRyaWJ1dGUoU3RyaW5nIGlkLCBTdHJpbmcgZGVmYXVsdFZhbHVlKSB7Ci0JCXJldHVybiBzZXJ2ZXIuZ2V0QXR0cmlidXRlKGlkLCBkZWZhdWx0VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgTGlzdC12YWx1ZWQgYXR0cmlidXRlLgotCSAqIAotCSAqIEBwYXJhbSBpZCB0aGUgYXR0cmlidXRlIGlkCi0JICogQHBhcmFtIGRlZmF1bHRWYWx1ZSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZQotCSAqIEByZXR1cm4gdGhlIGF0dHJpYnV0ZSB2YWx1ZQotCSAqIEBzZWUgI3NldEF0dHJpYnV0ZShTdHJpbmcsIExpc3QpCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIExpc3QgZ2V0QXR0cmlidXRlKFN0cmluZyBpZCwgTGlzdCBkZWZhdWx0VmFsdWUpIHsKLQkJcmV0dXJuIHNlcnZlci5nZXRBdHRyaWJ1dGUoaWQsIGRlZmF1bHRWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBNYXAtdmFsdWVkIGF0dHJpYnV0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gaWQgdGhlIGF0dHJpYnV0ZSBpZAotCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGUKLQkgKiBAcmV0dXJuIHRoZSBhdHRyaWJ1dGUgdmFsdWUKLQkgKiBAc2VlICNzZXRBdHRyaWJ1dGUoU3RyaW5nLCBNYXApCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIE1hcCBnZXRBdHRyaWJ1dGUoU3RyaW5nIGlkLCBNYXAgZGVmYXVsdFZhbHVlKSB7Ci0JCXJldHVybiBzZXJ2ZXIuZ2V0QXR0cmlidXRlKGlkLCBkZWZhdWx0VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIERpc3Bvc2VzIG9mIHRoaXMgc2VydmVyIGRlbGVnYXRlLgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgd2ViIHNlcnZlciBjb3JlIGZyYW1ld29yay4KLQkgKiBDbGllbnRzIHNob3VsZCBuZXZlciBjYWxsIHRoaXMgbWV0aG9kLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBJbXBsZW1lbnRhdGlvbnMgYXJlIGV4cGVjdGVkIHRvIGxldCBnbyBvZiB0aGUgZGVsZWdhdGUncyByZWZlcmVuY2UKLQkgKiB0byB0aGUgc2VydmVyLCBkZXJlZ2lzdGVyIGxpc3RlbmVycywgZXRjLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgbW9kdWxlIG1vZGlmaWNhdGlvbnMgY291bGQgYmUgbWFkZSB0byB0aGlzCi0JICogc2VydmVyIGF0IHRoaXMgdGltZS4gU2VlIHRoZSBzcGVjaWZpY2F0aW9uIG9mCi0JICoge0BsaW5rIElTZXJ2ZXJBdHRyaWJ1dGVzI2Nhbk1vZGlmeU1vZHVsZXMoSU1vZHVsZVtdLCBJTW9kdWxlW10sIElQcm9ncmVzc01vbml0b3IpfQotCSAqIGZvciBmdXJ0aGVyIGRldGFpbHMuIAotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgd2ViIHNlcnZlciBjb3JlIGZyYW1ld29yaywKLQkgKiBpbiByZXNwb25zZSB0byBhIGNhbGwgdG8gPGNvZGU+SVNlcnZlci5jYW5Nb2RpZnlNb2R1bGVzPC9jb2RlPi4KLQkgKiBDbGllbnRzIHNob3VsZCBuZXZlciBjYWxsIHRoaXMgbWV0aG9kLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBbaXNzdWU6IFNlZSBJU2VydmVyQXR0cmlidXRlcy5jYW5Nb2RpZnlNb2R1bGVzKElNb2R1bGVbXSwgSU1vZHVsZVtdLCBJUHJvZ3Jlc3NNb25pdG9yKS5dCi0JICogPC9wPgotCSAqIFtpc3N1ZTogZG9jIHRoYXQgaXQgc2hvdWxkIGJlIHF1aWNrXQotCSAqCi0JICogQHBhcmFtIGFkZCBhIHBvc3NpYmx5LWVtcHR5IGxpc3Qgb2YgbW9kdWxlcyB0byBhZGQKLQkgKiBAcGFyYW0gcmVtb3ZlIGEgcG9zc2libHktZW1wdHkgbGlzdCBvZiBtb2R1bGVzIHRvIHJlbW92ZQotCSAqIEByZXR1cm4gYSBzdGF0dXMgb2JqZWN0IHdpdGggY29kZSA8Y29kZT5JU3RhdHVzLk9LPC9jb2RlPiBpZiB0aGUgbW9kdWxlcwotCSAqICAgY2FuIGJlIG1vZGlmaWVkLCBvdGhlcndpc2UgYSBzdGF0dXMgb2JqZWN0IGluZGljYXRpbmcgd2h5IHRoZXkgY2FuJ3QKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgSVN0YXR1cyBjYW5Nb2RpZnlNb2R1bGVzKElNb2R1bGVbXSBhZGQsIElNb2R1bGVbXSByZW1vdmUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY2hpbGQgbW9kdWxlKHMpIG9mIHRoaXMgbW9kdWxlLiBJZiB0aGlzCi0JICogbW9kdWxlIGNvbnRhaW5zIG90aGVyIG1vZHVsZXMsIGl0IHNob3VsZCBsaXN0IHRob3NlCi0JICogbW9kdWxlcy4gSWYgbm90LCBpdCBzaG91bGQgcmV0dXJuIGFuIGVtcHR5IGxpc3QuCi0JICoKLQkgKiA8cD5UaGlzIG1ldGhvZCBzaG91bGQgb25seSByZXR1cm4gdGhlIGRpcmVjdCBjaGlsZHJlbi4KLQkgKiBUbyBvYnRhaW4gdGhlIGZ1bGwgbW9kdWxlIHRyZWUsIHRoaXMgbWV0aG9kIG1heSBiZQotCSAqIHJlY3Vyc2l2ZWx5IGNhbGxlZCBvbiB0aGUgY2hpbGRyZW4uPC9wPgotCSAqCi0JICogQHBhcmFtIG1vZHVsZSBhIG1vZHVsZQotCSAqIEByZXR1cm4gdGhlIGNoaWxkIG1vZHVsZXMKLQkgKiBAc2VlIElTZXJ2ZXJBdHRyaWJ1dGVzI2dldENoaWxkTW9kdWxlcyhJTW9kdWxlW10sIElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIGFic3RyYWN0IElNb2R1bGVbXSBnZXRDaGlsZE1vZHVsZXMoSU1vZHVsZVtdIG1vZHVsZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYXJlbnQgbW9kdWxlKHMpIG9mIHRoaXMgbW9kdWxlLiBXaGVuIGRldGVybWluaW5nIGlmIGEgZ2l2ZW4KLQkgKiBwcm9qZWN0IGNhbiBydW4gb24gYSBzZXJ2ZXIsIHRoaXMgbWV0aG9kIHdpbGwgYmUgdXNlZCB0byBmaW5kIHRoZSBhY3R1YWwKLQkgKiBtb2R1bGUocykgdGhhdCBtYXkgYmUgcnVuIG9uIHRoZSBzZXJ2ZXIuIEZvciBpbnN0YW5jZSwgYSBXZWIgbW9kdWxlIG1heQotCSAqIHJldHVybiBhIGxpc3Qgb2YgRUFSIG1vZHVsZXMgdGhhdCBpdCBpcyBjb250YWluZWQgaW4gaWYgdGhlIHNlcnZlciBvbmx5Ci0JICogc3VwcG9ydHMgY29uZmlndXJpbmcgRUFSIG1vZHVsZXMuCi0JICoKLQkgKiA8cD5JZiB0aGUgbW9kdWxlIHR5cGUgaXMgbm90IHN1cHBvcnRlZCwgdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gbnVsbC4KLQkgKiBJZiB0aGUgdHlwZSBpcyBub3JtYWxseSBzdXBwb3J0ZWQgYnV0IHRoZXJlIGlzIGEgY29uZmlndXJhdGlvbgotCSAqIHByb2JsZW0gb3IgbWlzc2luZyBwYXJlbnQsIGV0Yy4sIHRoaXMgbWV0aG9kIHdpbGwgZmlyZSBhIENvcmVFeGNlcHRpb24KLQkgKiB0aGF0IG1heSB0aGVuIGJlIHByZXNlbnRlZCB0byB0aGUgdXNlci48L3A+Ci0JICoKLQkgKiA8cD5JZiBpdCBkb2VzIHJldHVybiB2YWxpZCBwYXJlbnQocyksIHRoaXMgbWV0aG9kIHdpbGwgYWx3YXlzIHJldHVybgotCSAqIHRoZSB0b3Btb3N0IHBhcmVudCBtb2R1bGUocyksIGV2ZW4gaWYgdGhlcmUgYXJlIGEgZmV3IGxldmVscwotCSAqIChhIGhlaXJhcmNoeSkgb2YgbW9kdWxlcy48L3A+Ci0JICogCi0JICogW2lzc3VlOiBzaG91bGQgdGhlIHBhcmFtZXRlciBiZSBJTW9kdWxlW10/XQotCSAqCi0JICogQHBhcmFtIG1vZHVsZSBhIG1vZHVsZQotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgcG9zc2libGUgcm9vdCBtb2R1bGVzCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIGFueXRoaW5nIHdlbnQgd3JvbmcKLQkgKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJBdHRyaWJ1dGVzI2dldFJvb3RNb2R1bGVzKElNb2R1bGUsIElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIGFic3RyYWN0IElNb2R1bGVbXSBnZXRSb290TW9kdWxlcyhJTW9kdWxlIG1vZHVsZSkgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIFNlcnZlclBvcnRzIHRoYXQgdGhpcyBzZXJ2ZXIgaGFzLgotCSAqCi0JICogQHJldHVybiB0aGUgc2VydmVyJ3MgcG9ydHMKLQkgKi8KLQlwdWJsaWMgU2VydmVyUG9ydFtdIGdldFNlcnZlclBvcnRzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGlzIHNlcnZlciB3aXRoIGRlZmF1bHQgdmFsdWVzLiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbgotCSAqIGEgbmV3IHNlcnZlciBpcyBjcmVhdGVkIHNvIHRoYXQgdGhlIHNlcnZlciBjYW4gYmUgaW5pdGlhbGl6ZWQgd2l0aAotCSAqIG1lYW5pbmdmdWwgdmFsdWVzLgotCSAqIAotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0cyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGludGVnZXItdmFsdWVkIGF0dHJpYnV0ZSBvZiB0aGlzCi0JICogZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gaWQgdGhlIGF0dHJpYnV0ZSBpZAotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGUKLQkgKiBAc2VlICNnZXRBdHRyaWJ1dGUoU3RyaW5nLCBpbnQpCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBpZCwgaW50IHZhbHVlKSB7Ci0JCXNlcnZlcldDLnNldEF0dHJpYnV0ZShpZCwgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgYm9vbGVhbi12YWx1ZWQgYXR0cmlidXRlIG9mIHRoaXMKLQkgKiBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBpZCB0aGUgYXR0cmlidXRlIGlkCi0JICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZQotCSAqIEBzZWUgI2dldEF0dHJpYnV0ZShTdHJpbmcsIGJvb2xlYW4pCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBpZCwgYm9vbGVhbiB2YWx1ZSkgewotCQlzZXJ2ZXJXQy5zZXRBdHRyaWJ1dGUoaWQsIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHN0cmluZy12YWx1ZWQgYXR0cmlidXRlIG9mIHRoaXMKLQkgKiBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBpZCB0aGUgYXR0cmlidXRlIGlkCi0JICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZQotCSAqIEBzZWUgI2dldEF0dHJpYnV0ZShTdHJpbmcsIFN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBzZXRBdHRyaWJ1dGUoU3RyaW5nIGlkLCBTdHJpbmcgdmFsdWUpIHsKLQkJc2VydmVyV0Muc2V0QXR0cmlidXRlKGlkLCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBsaXN0LXZhbHVlZCBhdHRyaWJ1dGUgb2YgdGhpcwotCSAqIGVsZW1lbnQuIFRoZSBsaXN0IG1heSBvbmx5IGNvbnRhaW4gU3RyaW5nIHZhbHVlcy4KLQkgKiAKLQkgKiBAcGFyYW0gaWQgdGhlIGF0dHJpYnV0ZSBpZAotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGUKLQkgKiBAc2VlICNnZXRBdHRyaWJ1dGUoU3RyaW5nLCBMaXN0KQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIHNldEF0dHJpYnV0ZShTdHJpbmcgaWQsIExpc3QgdmFsdWUpIHsKLQkJc2VydmVyV0Muc2V0QXR0cmlidXRlKGlkLCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBtYXAtdmFsdWVkIGF0dHJpYnV0ZSBvZiB0aGlzCi0JICogZWxlbWVudC4gVGhlIG1hcCBtYXkgb25seSBjb250YWluIFN0cmluZyB2YWx1ZXMuCi0JICogCi0JICogQHBhcmFtIGlkIHRoZSBhdHRyaWJ1dGUgaWQKLQkgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlCi0JICogQHNlZSAjZ2V0QXR0cmlidXRlKFN0cmluZywgTWFwKQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIHNldEF0dHJpYnV0ZShTdHJpbmcgaWQsIE1hcCB2YWx1ZSkgewotCQlzZXJ2ZXJXQy5zZXRBdHRyaWJ1dGUoaWQsIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBNb2RpZmllcyB0aGUgbGlzdCBvZiBtb2R1bGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2VydmVyLgotCSAqIFNlZSB0aGUgc3BlY2lmaWNhdGlvbiBvZgotCSAqIHtAbGluayBJU2VydmVyV29ya2luZ0NvcHkjbW9kaWZ5TW9kdWxlcyhJTW9kdWxlW10sIElNb2R1bGVbXSwgSVByb2dyZXNzTW9uaXRvcil9Ci0JICogZm9yIGZ1cnRoZXIgZGV0YWlscy4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIHdlYiBzZXJ2ZXIgY29yZSBmcmFtZXdvcmssCi0JICogaW4gcmVzcG9uc2UgdG8gYSBjYWxsIHRvIDxjb2RlPklTZXJ2ZXJXb3JraW5nQ29weS5tb2RpZnlNb2R1bGVzPC9jb2RlPi4KLQkgKiBDbGllbnRzIHNob3VsZCBuZXZlciBjYWxsIHRoaXMgbWV0aG9kLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdG8gdXBkYXRlIHRoZSBzZXJ2ZXIgY29uZmlndXJhdGlvbiAoaWYgYW55KQotCSAqIG9yIHVwZGF0ZSB0aGUgZGVsZWdhdGVzIGludGVybmFsIHN0YXRlLiBOb3RlIHRoYXQgdGhlIGFjdHVhbCBsaXN0Ci0JICogb2YgbW9kdWxlcyBpcyBzdG9yZWQgb24gdGhlIHNlcnZlciBhbmQgY2FuIGJlIGFjY2Vzc2VkIGF0IGFueSB0aW1lCi0JICogdXNpbmcgc2VydmVyLmdldE1vZHVsZXMoKS4gZ2V0TW9kdWxlcygpIHdpbGwgbm90IGJlIHVwZGF0ZWQgdW50aWwKLQkgKiBhZnRlciB0aGlzIG1ldGhvZCBzdWNjZXNzZnVsbHkgcmV0dXJucy4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVGhpcyBtZXRob2Qgd2lsbCBub3QgY29tbXVuaWNhdGUgd2l0aCB0aGUgc2VydmVyLiBBZnRlciBzYXZpbmcsCi0JICogcHVibGlzaCgpIGNhbiBiZSB1c2VkIHRvIHN5bmMgdXAgd2l0aCB0aGUgc2VydmVyLgotCSAqIDwvcD4KLQkgKgotCSAqIEBwYXJhbSBhZGQgYSBwb3NzaWJseS1lbXB0eSBsaXN0IG9mIG1vZHVsZXMgdG8gYWRkCi0JICogQHBhcmFtIHJlbW92ZSBhIHBvc3NpYmx5LWVtcHR5IGxpc3Qgb2YgbW9kdWxlcyB0byByZW1vdmUKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCi0JICogICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIFttaXNzaW5nXQotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIG1vZGlmeU1vZHVsZXMoSU1vZHVsZVtdIGFkZCwgSU1vZHVsZVtdIHJlbW92ZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB0byBpbXBvcnQgdGhlIHNlcnZlciBjb25maWd1cmF0aW9uIGZyb20gdGhlIGdpdmVuCi0JICogcnVudGltZS4KLQkgKiAKLQkgKiBAcGFyYW0gcnVudGltZSBhIHNlcnZlciBydW50aW1lCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqLwotCXB1YmxpYyB2b2lkIGltcG9ydENvbmZpZ3VyYXRpb24oSVJ1bnRpbWUgcnVudGltZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbmV2ZXIgdGhlIHNlcnZlciBjb25maWd1cmF0aW9uIHNob3VsZCBiZSBzYXZlZC4KLQkgKiAKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCi0JICogICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIHRoZXJlIHdhcyBhIHByb2JsZW0gc2F2aW5nCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZUNvbmZpZ3VyYXRpb24oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbmV2ZXIgdGhlIHNlcnZlciBjb25maWd1cmF0aW9uIGZvbGRlciBoYXMgY2hhbmdlZC4KLQkgKiBJdCBnaXZlcyB0aGUgc2VydmVyIGEgY2hhbmNlIHRvIHRocm93IG91dCBhbnkgb2xkIGRhdGEgYW5kIGJlIHJlYWR5IHRvCi0JICogcmVsb2FkIHRoZSBzZXJ2ZXIgY29uZmlndXJhdGlvbiB3aGVuIGl0IGlzIG5lZWRlZCBuZXh0LgotCSAqLwotCXB1YmxpYyB2b2lkIGNvbmZpZ3VyYXRpb25DaGFuZ2VkKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL21vZGVsL3BhY2thZ2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL21vZGVsL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBmZTQxMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9tb2RlbC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08aHRtbD4KLTxoZWFkPgotPE1FVEEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uLy4uLy4uLy4uLy4uLy9hcGlzdHlsZXMuY3NzIiB0eXBlPSJ0ZXh0L2NzcyI+Ci08dGl0bGU+V1RQIEFQSSBvdmVydmlldzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPlNQSSBzdXBwb3J0IGZvciB0aGUgc2VydmVyIHRvb2xzIGZyYW1ld29yay48L3A+Ci08dGFibGUgd2lkdGg9IjUwMCI+Ci08dHI+Ci08dGQ+Ci08cD5UaGUgY2xhc3NlcyBpbiB0aGlzIHBhY2thZ2Ugd291bGQgdHlwaWNhbGx5IGJlIGV4dGVuZGVkIG9yIHVzZWQgYnkKLVNQSSBjbGllbnRzIG9mIHRoZSBzZXJ2ZXIgdG9vbHMgZnJhbWV3b3JrIHdobyBhcmUgcHJvdmlkaW5nIGEgbmV3IHNlcnZlcgotdHlwZSwgcnVudGltZSB0eXBlLCBvciBvdGhlciBleHRlbnNpb24uIFRoZXNlIGRlbGVnYXRlcyBhcmUgbmV2ZXIgdmlzaWJsZQotdG8gcmVndWxhciBBUEkgY2xpZW50cyB1bmxlc3MgZXhwbGljaXRseSBleHBvc2VkIGJ5IHRoZSBwcm92aWRlci48L3A+Ci08L3RkPgotPC90cj4KLTwvdGFibGU+Ci08dGFibGUgd2lkdGg9IjUwMCI+Ci08dHI+Ci08dGQ+Ci08cD5UaGUgbWFqb3JpdHkgb2YgdGhlc2UgY2xhc3NlcyBhcmUgZGVsZWdhdGVzIHRvIGltcGxlbWVudCBvbmUgb2YgdGhlCi1leHRlbnNpb24gcG9pbnRzLiBWaWV3IHRoZSBleHRlbnNpb24gcG9pbnQgZG9jdW1lbnRhdGlvbiBmb3IgZnVydGhlcgotZGV0YWlscy48L3A+Ci08L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9tb2RlbC9wYWNrYWdlLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL21vZGVsL3BhY2thZ2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTMxMjAzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL21vZGVsL3BhY2thZ2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxodG1sPgotPGhlYWQ+Ci0JPCEtLSAgRXNjYXBlIHRvIHRoZSByb290IG9mIHlvdXIgc291cmNlIGZvbGRlciAgLS0+Ci0JPG1ldGEKLQkJbmFtZT0icm9vdCIKLQkJY29udGVudD0iLi4vLi4vLi4vLi4vLi4vLi4vIiAvPgotCTx0aXRsZT5XVFAgQVBJIG92ZXJ2aWV3PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHk+Ci0KLTxhYnN0cmFjdD5TUEkgc3VwcG9ydCBmb3IgdGhlIHNlcnZlciB0b29scyBmcmFtZXdvcmsuPC9hYnN0cmFjdD4KLQotPHA+VGhlIGNsYXNzZXMgaW4gdGhpcyBwYWNrYWdlIHdvdWxkIHR5cGljYWxseSBiZSBleHRlbmRlZCBvciB1c2VkIGJ5Ci1TUEkgY2xpZW50cyBvZiB0aGUgc2VydmVyIHRvb2xzIGZyYW1ld29yayB3aG8gYXJlIHByb3ZpZGluZyBhIG5ldyBzZXJ2ZXIKLXR5cGUsIHJ1bnRpbWUgdHlwZSwgb3Igb3RoZXIgZXh0ZW5zaW9uLiBUaGVzZSBkZWxlZ2F0ZXMgYXJlIG5ldmVyIHZpc2libGUKLXRvIHJlZ3VsYXIgQVBJIGNsaWVudHMgdW5sZXNzIGV4cGxpY2l0bHkgZXhwb3NlZCBieSB0aGUgcHJvdmlkZXIuPC9wPgotCi08cD5UaGUgbWFqb3JpdHkgb2YgdGhlc2UgY2xhc3NlcyBhcmUgZGVsZWdhdGVzIHRvIGltcGxlbWVudCBvbmUgb2YgdGhlCi1leHRlbnNpb24gcG9pbnRzLiBWaWV3IHRoZSBleHRlbnNpb24gcG9pbnQgZG9jdW1lbnRhdGlvbiBmb3IgZnVydGhlcgotZGV0YWlscy48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzNmNkYjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotPGh0bWw+Ci08aGVhZD4KLTxNRVRBIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi8uLi8uLi8uLi8uLi8vYXBpc3R5bGVzLmNzcyIgdHlwZT0idGV4dC9jc3MiPgotPHRpdGxlPldUUCBBUEkgb3ZlcnZpZXc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci08cD5UaGUgbWFpbiBzZXJ2ZXIgdG9vbHMgZnJhbWV3b3JrIGNsaWVudCBBUEkuPC9wPgotPHRhYmxlIHdpZHRoPSI1MDAiPgotPHRyPgotPHRkPgotPHA+U2VydmVyQ29yZSBpcyB0aGUgbWFpbiBlbnRyeS1wb2ludCBhbmQgcHJvdmlkZXMgYWNjZXNzIHRvIG1vc3Qgb2YgdGhlCi1yZW1haW5pbmcgQVBJLiBGcm9tIGhlcmUsIHlvdSBjYW4gZ2V0IHRoZSBleGlzdGluZyBzZXJ2ZXIgcnVudGltZXMgYW5kCi1zZXJ2ZXJzLCBnZXQgdGhlIGF2YWlsYWJsZSBzZXJ2ZXIgdHlwZXMsIGFuZCBhY2Nlc3MgaW50ZXJmYWNlcyBmb3IgYWxsCi1leHRlbnNpb24gcG9pbnRzLjwvcD4KLTwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTx0YWJsZSB3aWR0aD0iNTAwIj4KLTx0cj4KLTx0ZD4KLTxwPlNlcnZlclV0aWwgcHJvdmlkZXMgdXRpbGl0eSBhbmQgY29udmVuaWVuY2UgbWV0aG9kcyBmb3IgZGVhbGluZyB3aXRoCi1zZXJ2ZXIgdG9vbHMuIEl0IHByb3ZpZGVzIGVhc3kgYWNjZXNzIHRvIG1vZHVsZXMsIHNlcnZlciBydW50aW1lcywgYW5kCi13aGF0IGNvbWJpbmF0aW9ucyBhcmUgc3VwcG9ydGVkIChlLmcuIHdoaWNoIHJ1bnRpbWVzIGNhbiBiZSB1c2VkIHRvCi10YXJnZXQgYSBwYXJ0aWN1bGFyIHByb2plY3QpLjwvcD4KLTwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTx0YWJsZSB3aWR0aD0iNTAwIj4KLTx0cj4KLTx0ZD4KLTxwPklSdW50aW1lIGFuZCBJU2VydmVyIGFyZSB0aGUgdHdvIG1haW4gQVBJIG9iamVjdHMuIElSdW50aW1lIGlzIHVzZWQKLXRvIHRhcmdldCBwcm9qZWN0cyB0byBhIHBhcnRpY3VsYXIgc2VydmVyIGluc3RhbGxhdGlvbiBhbmQgY29tcGlsZS9idWlsZAotYWdhaW5zdCB0aGVtLiBXaGVuIGEgcnVudGltZSBpcyB0YXJnZXR0ZWQgdG8gYSBwYXJ0aWN1bGFyIHJ1bnRpbWUsCi1hbGwgb2YgdGhlIGFwcGxpY2FibGUgSVJ1bnRpbWVUYXJnZXRIYW5kbGVyIGV4dGVuc2lvbnMgYXJlIGNhbGxlZCB0bwotc2V0IHRoZSBjbGFzc3BhdGggb3IgbW9kaWZ5IG90aGVyIHByb2plY3Qgc2V0dGluZ3MgZm9yIHRoZSBydW50aW1lLjwvcD4KLTwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTx0YWJsZSB3aWR0aD0iNTAwIj4KLTx0cj4KLTx0ZD4KLTxwPklTZXJ2ZXIgaXMgdGhlIG1haW4gc2VydmVyIGNsYXNzIHRoYXQgY2xpZW50cyBjYW4gdXNlIHRvIHN0YXJ0L3N0b3AKLWFuZCBwdWJsaXNoIHRvIHNlcnZlcnMuPC9wPgotPC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPHRhYmxlIHdpZHRoPSI1MDAiPgotPHRyPgotPHRkPgotPHA+SU1vZHVsZXMgcHJvdmlkZSB0aGUgImNvbnRlbnQiIHRoYXQgY2FuIGJlIHB1Ymxpc2hlZCB0byBzZXJ2ZXJzLgotU2VlIHRoZSBzZXJ2ZXIgdG9vbHMgQVBJIG92ZXJ2aWV3IGZvciBtb3JlIGluZm9ybWF0aW9uLjwvcD4KLTwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL3BhY2thZ2UueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvcGFja2FnZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhMjU0ZDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvcGFja2FnZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGh0bWw+Ci08aGVhZD4KLQk8IS0tICBFc2NhcGUgdG8gdGhlIHJvb3Qgb2YgeW91ciBzb3VyY2UgZm9sZGVyICAtLT4KLQk8bWV0YQotCQluYW1lPSJyb290IgotCQljb250ZW50PSIuLi8uLi8uLi8uLi8uLi8uLi8iIC8+Ci0JPHRpdGxlPldUUCBBUEkgb3ZlcnZpZXc8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keT4KLQotPGFic3RyYWN0PlRoZSBtYWluIHNlcnZlciB0b29scyBmcmFtZXdvcmsgY2xpZW50IEFQSS48L2Fic3RyYWN0PgotCi08cD5TZXJ2ZXJDb3JlIGlzIHRoZSBtYWluIGVudHJ5LXBvaW50IGFuZCBwcm92aWRlcyBhY2Nlc3MgdG8gbW9zdCBvZiB0aGUKLXJlbWFpbmluZyBBUEkuIEZyb20gaGVyZSwgeW91IGNhbiBnZXQgdGhlIGV4aXN0aW5nIHNlcnZlciBydW50aW1lcyBhbmQKLXNlcnZlcnMsIGdldCB0aGUgYXZhaWxhYmxlIHNlcnZlciB0eXBlcywgYW5kIGFjY2VzcyBpbnRlcmZhY2VzIGZvciBhbGwKLWV4dGVuc2lvbiBwb2ludHMuPC9wPgotCi08cD5TZXJ2ZXJVdGlsIHByb3ZpZGVzIHV0aWxpdHkgYW5kIGNvbnZlbmllbmNlIG1ldGhvZHMgZm9yIGRlYWxpbmcgd2l0aAotc2VydmVyIHRvb2xzLiBJdCBwcm92aWRlcyBlYXN5IGFjY2VzcyB0byBtb2R1bGVzLCBzZXJ2ZXIgcnVudGltZXMsIGFuZAotd2hhdCBjb21iaW5hdGlvbnMgYXJlIHN1cHBvcnRlZCAoZS5nLiB3aGljaCBydW50aW1lcyBjYW4gYmUgdXNlZCB0bwotdGFyZ2V0IGEgcGFydGljdWxhciBwcm9qZWN0KS48L3A+Ci0KLTxwPklSdW50aW1lIGFuZCBJU2VydmVyIGFyZSB0aGUgdHdvIG1haW4gQVBJIG9iamVjdHMuIElSdW50aW1lIGlzIHVzZWQKLXRvIHRhcmdldCBwcm9qZWN0cyB0byBhIHBhcnRpY3VsYXIgc2VydmVyIGluc3RhbGxhdGlvbiBhbmQgY29tcGlsZS9idWlsZAotYWdhaW5zdCB0aGVtLiBXaGVuIGEgcnVudGltZSBpcyB0YXJnZXR0ZWQgdG8gYSBwYXJ0aWN1bGFyIHJ1bnRpbWUsCi1hbGwgb2YgdGhlIGFwcGxpY2FibGUgSVJ1bnRpbWVUYXJnZXRIYW5kbGVyIGV4dGVuc2lvbnMgYXJlIGNhbGxlZCB0bwotc2V0IHRoZSBjbGFzc3BhdGggb3IgbW9kaWZ5IG90aGVyIHByb2plY3Qgc2V0dGluZ3MgZm9yIHRoZSBydW50aW1lLjwvcD4KLQotPHA+SVNlcnZlciBpcyB0aGUgbWFpbiBzZXJ2ZXIgY2xhc3MgdGhhdCBjbGllbnRzIGNhbiB1c2UgdG8gc3RhcnQvc3RvcAotYW5kIHB1Ymxpc2ggdG8gc2VydmVycy48L3A+Ci0KLTxwPklNb2R1bGVzIHByb3ZpZGUgdGhlICJjb250ZW50IiB0aGF0IGNhbiBiZSBwdWJsaXNoZWQgdG8gc2VydmVycy4KLVNlZSB0aGUgc2VydmVyIHRvb2xzIEFQSSBvdmVydmlldyBmb3IgbW9yZSBpbmZvcm1hdGlvbi48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS91dGlsL0h0dHBMYXVuY2hhYmxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS91dGlsL0h0dHBMYXVuY2hhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhNGFjYzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvdXRpbC9IdHRwTGF1bmNoYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudXRpbDsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLS8qKgotICogQW4gSFRUUCBsYXVuY2hhYmxlIG9iamVjdC4gRW5jYXBzdWxhdGVzIGEgbGF1bmNoIG9mIGEgVVJMIGZvciB0aGUgUnVuIG9uIFNlcnZlcgotICogc3VwcG9ydC4KLSAqIAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSHR0cExhdW5jaGFibGUgewotCXByaXZhdGUgVVJMIHVybDsKLQotCS8qKgotCSAqIENyZWF0ZSBhIHJlZmVyZW5jZSB0byBzb21ldGhpbmcgYWNjZXNzaWJsZSB2aWEgSFRUUC4KLQkgKiAKLQkgKiBAcGFyYW0gdXJsIHRoZSBVUkwgdG8gdGhlIG9iamVjdAotCSAqLwotCXB1YmxpYyBIdHRwTGF1bmNoYWJsZShVUkwgdXJsKSB7Ci0JCXRoaXMudXJsID0gdXJsOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgVVJMIHRvIHRoZSBvYmplY3QuCi0JICogCi0JICogQHJldHVybiB0aGUgVVJMIHRvIHRoZSBvYmplY3QKLQkgKi8KLQlwdWJsaWMgVVJMIGdldFVSTCgpIHsKLQkJcmV0dXJuIHVybDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE9iamVjdCN0b1N0cmluZygpCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJIdHRwTGF1bmNoYWJsZVt1cmw9IiArIHVybC50b1N0cmluZygpICsgIl0iOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS91dGlsL0lTdGF0aWNXZWIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL3V0aWwvSVN0YXRpY1dlYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzQ3MWE0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL3V0aWwvSVN0YXRpY1dlYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudXRpbDsKLS8qKgotICogQSBzdGF0aWMgV2ViIG1vZHVsZSB0aGF0IGNvdWxkIGJlIGRlcGxveWVkIHRvIEFwYWNoZSBvciBhbm90aGVyCi0gKiBIVFRQIHNlcnZlci4KLSAqIAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTdGF0aWNXZWIgewotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbnRleHQgcm9vdCBvZiB0aGUgV2ViLgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGV4dFJvb3QoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS91dGlsL051bGxNb2R1bGVBcnRpZmFjdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvdXRpbC9OdWxsTW9kdWxlQXJ0aWZhY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhiZjQ5Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS91dGlsL051bGxNb2R1bGVBcnRpZmFjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlQXJ0aWZhY3Q7Ci0vKioKLSAqIEEgZHVtbXkgbW9kdWxlIGFydGlmYWN0LgotICogCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBOdWxsTW9kdWxlQXJ0aWZhY3QgaW1wbGVtZW50cyBJTW9kdWxlQXJ0aWZhY3QgewotCXByaXZhdGUgSU1vZHVsZSBtb2R1bGU7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgcmVmZXJlbmNlIHRvIGEgbW9kdWxlLgotCSAqIAotCSAqIEBwYXJhbSBtb2R1bGUgdGhlIG1vZHVsZQotCSAqLwotCXB1YmxpYyBOdWxsTW9kdWxlQXJ0aWZhY3QoSU1vZHVsZSBtb2R1bGUpIHsKLQkJdGhpcy5tb2R1bGUgPSBtb2R1bGU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJTW9kdWxlQXJ0aWZhY3QjZ2V0TW9kdWxlKCkKLQkgKi8KLQlwdWJsaWMgSU1vZHVsZSBnZXRNb2R1bGUoKSB7Ci0JCXJldHVybiBtb2R1bGU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPYmplY3QjdG9TdHJpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiTnVsbE1vZHVsZUFydGlmYWN0IFttb2R1bGU9IiArIG1vZHVsZSArICJdIjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvdXRpbC9Qcm9qZWN0TW9kdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS91dGlsL1Byb2plY3RNb2R1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVlZDc0Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS91dGlsL1Byb2plY3RNb2R1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLaAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuTW9kdWxlRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuTW9kdWxlRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC4qOwotLyoqCi0gKiBBIHNpbXBsZSBJTW9kdWxlUHJvamVjdCB0aGF0IG1hcHMgYSBmb2xkZXIgd2l0aGluIGEgcHJvamVjdAotICogKG9yIHRoZSByb290IG9mIHRoZSBwcm9qZWN0IGl0c2VsZikgdG8gdGhlIG1vZHVsZS4KLSAqIAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUHJvamVjdE1vZHVsZSBleHRlbmRzIE1vZHVsZURlbGVnYXRlIHsKLQlwcml2YXRlIElQcm9qZWN0IHByb2plY3Q7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgcHJvamVjdCBtb2R1bGUuCi0JICovCi0JcHVibGljIFByb2plY3RNb2R1bGUoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgcHJvamVjdCBtb2R1bGUgaW4gdGhlIGdpdmVuIHByb2plY3QuCi0JICogCi0JICogQHBhcmFtIHByb2plY3QgdGhlIHByb2plY3QgY29udGFpbmluZyB0aGUgbW9kdWxlCi0JICovCi0JcHVibGljIFByb2plY3RNb2R1bGUoSVByb2plY3QgcHJvamVjdCkgewotCQl0aGlzLnByb2plY3QgPSBwcm9qZWN0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHByb2plY3QgdGhhdCB0aGUgbW9kdWxlIGlzIGNvbnRhaW5lZCBpbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBwcm9qZWN0IHRoYXQgdGhlIG1vZHVsZSBpcyBjb250YWluZWQgaW4KLQkgKi8KLQlwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQkJcmV0dXJuIHByb2plY3Q7Ci0JfQotCi0JLyoqCi0JICogSGVscGVyIG1ldGhvZCAtIHJldHVybnMgdGhlIG1vZHVsZSdzIGlkLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1vZHVsZSBpZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBnZXRQcm9qZWN0KCkuZ2V0TmFtZSgpOwotCQkvL3JldHVybiBnZXRNb2R1bGUoKS5nZXRJZCgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgTW9kdWxlRGVsZWdhdGUjdmFsaWRhdGUoKQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBIZWxwZXIgbWV0aG9kIC0gcmV0dXJucyB0aGUgbW9kdWxlJ3MgbmFtZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtb2R1bGUgbmFtZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIGdldFByb2plY3QoKS5nZXROYW1lKCk7Ci0JCS8vcmV0dXJuIGdldE1vZHVsZSgpLmdldE5hbWUoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoaXMgbW9kdWxlIGN1cnJlbnRseSBleGlzdHMsIGFuZCBmYWxzZSBpZiBpdCBoYXMKLQkgKiBiZWVuIGRlbGV0ZWQgb3IgbW92ZWQgYW5kIGlzIG5vIGxvbmdlciByZXByZXNlbnRlZCBieSB0aGlzIG1vZHVsZS4KLQkgKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGV4aXN0cygpIHsKLQkJcmV0dXJuIChnZXRQcm9qZWN0KCkgIT0gbnVsbCAmJiBnZXRQcm9qZWN0KCkuZXhpc3RzKCkpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIE9iamVjdCNlcXVhbHMoT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogPT0gbnVsbCB8fCAhKG9iaiBpbnN0YW5jZW9mIFByb2plY3RNb2R1bGUpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJUHJvamVjdE1vZHVsZSBkcCA9IChQcm9qZWN0TW9kdWxlKSBvYmo7Ci0JCS8vaWYgKGdldEZhY3RvcnlJZCgpICE9IG51bGwgJiYgIWdldEZhY3RvcnlJZCgpLmVxdWFscyhkcC5nZXRGYWN0b3J5SWQoKSkpCi0JCS8vCXJldHVybiBmYWxzZTsKLQkJCi0JCWlmIChwcm9qZWN0ICE9IG51bGwgJiYgcHJvamVjdC5leGlzdHMoKSAmJiAhcHJvamVjdC5lcXVhbHMoZHAuZ2V0UHJvamVjdCgpKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCWlmIChnZXRJZCgpICE9IG51bGwgJiYgIWdldElkKCkuZXF1YWxzKGRwLmdldElkKCkpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY2hpbGQgbW9kdWxlcyBvZiB0aGlzIG1vZHVsZS4KLQkgKgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklNb2R1bGVbXQotCSAqLwotCXB1YmxpYyBJTW9kdWxlW10gZ2V0Q2hpbGRNb2R1bGVzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBCYXNpYyBpbXBsZW1lbnRhdGlvbiBvZiBtZW1iZXJzKCkgbWV0aG9kLiBBc3N1bWVzIHRoYXQgdGhlIGVudGlyZSBwcm9qZWN0IHNob3VsZAotCSAqIGJlIHB1Ymxpc2hlZCB0byBhIHNlcnZlci4KLQkgKiAKLQkgKiBAc2VlIE1vZHVsZURlbGVnYXRlI21lbWJlcnMoKQotCSAqLwotCXB1YmxpYyBJTW9kdWxlUmVzb3VyY2VbXSBtZW1iZXJzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0TW9kdWxlUmVzb3VyY2VzKFBhdGguRU1QVFksIGdldFByb2plY3QoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBtb2R1bGUgcmVzb3VyY2VzIGZvciBhIGdpdmVuIHBhdGguCi0JICogCi0JICogQHBhcmFtIHBhdGggYSBwYXRoCi0JICogQHBhcmFtIGNvbnRhaW5lciBhIGNvbnRhaW5lcgotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgbW9kdWxlIHJlc291cmNlcwotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgSU1vZHVsZVJlc291cmNlW10gZ2V0TW9kdWxlUmVzb3VyY2VzKElQYXRoIHBhdGgsIElDb250YWluZXIgY29udGFpbmVyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlJUmVzb3VyY2VbXSByZXNvdXJjZXMgPSBjb250YWluZXIubWVtYmVycygpOwotCQlpZiAocmVzb3VyY2VzICE9IG51bGwpIHsKLQkJCWludCBzaXplID0gcmVzb3VyY2VzLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJSVJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VzW2ldOwotCQkJCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElDb250YWluZXIpIHsKLQkJCQkJSUNvbnRhaW5lciBjb250YWluZXIyID0gKElDb250YWluZXIpIHJlc291cmNlOwotCQkJCQlpZiAoY29udGFpbmVyMiAhPSBudWxsICYmIGNvbnRhaW5lcjIuZXhpc3RzKCkpIHsKLQkJCQkJCU1vZHVsZUZvbGRlciBtZiA9IG5ldyBNb2R1bGVGb2xkZXIoY29udGFpbmVyLCBjb250YWluZXIyLmdldE5hbWUoKSwgcGF0aCk7Ci0JCQkJCQltZi5zZXRNZW1iZXJzKGdldE1vZHVsZVJlc291cmNlcyhwYXRoLmFwcGVuZChjb250YWluZXIyLmdldE5hbWUoKSksIGNvbnRhaW5lcjIpKTsKLQkJCQkJCWxpc3QuYWRkKG1mKTsKLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJRmlsZSkgewotCQkJCQlJRmlsZSBmaWxlID0gKElGaWxlKSByZXNvdXJjZTsKLQkJCQkJaWYgKGZpbGUgIT0gbnVsbCAmJiBmaWxlLmV4aXN0cygpKQotCQkJCQkJbGlzdC5hZGQobmV3IE1vZHVsZUZpbGUoZmlsZSwgZmlsZS5nZXROYW1lKCksIHBhdGgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlJTW9kdWxlUmVzb3VyY2VbXSBtb2R1bGVSZXNvdXJjZXMgPSBuZXcgSU1vZHVsZVJlc291cmNlW2xpc3Quc2l6ZSgpXTsKLQkJbGlzdC50b0FycmF5KG1vZHVsZVJlc291cmNlcyk7Ci0JCXJldHVybiBtb2R1bGVSZXNvdXJjZXM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL3V0aWwvUHJvamVjdE1vZHVsZUZhY3RvcnlEZWxlZ2F0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvdXRpbC9Qcm9qZWN0TW9kdWxlRmFjdG9yeURlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0ZDhhMjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvdXRpbC9Qcm9qZWN0TW9kdWxlRmFjdG9yeURlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi2gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLk1vZHVsZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuVHJhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLk1vZHVsZUZhY3RvcnlEZWxlZ2F0ZTsKLS8qKgotICogQSBoZWxwZXIgY2xhc3MgZm9yIGRlZmluaW5nIGEgbW9kdWxlIGZhY3RvcnkgdGhhdCBwcm92aWRlcyBtb2R1bGVzCi0gKiBiYXNlZCBvbiBwcm9qZWN0cy4KLSAqIAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUHJvamVjdE1vZHVsZUZhY3RvcnlEZWxlZ2F0ZSBleHRlbmRzIE1vZHVsZUZhY3RvcnlEZWxlZ2F0ZSB7Ci0JcHJpdmF0ZSBzdGF0aWMgTGlzdCBmYWN0b3JpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkvLyBsaXN0IG9mIElNb2R1bGVzCi0JcHJpdmF0ZSBMaXN0IG1vZHVsZXM7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBuZXcgUHJvamVjdE1vZHVsZUZhY3RvcnlEZWxlZ2F0ZS4KLQkgKi8KLQlwdWJsaWMgUHJvamVjdE1vZHVsZUZhY3RvcnlEZWxlZ2F0ZSgpIHsKLQkJc3VwZXIoKTsKLQkJCi0JCWZhY3Rvcmllcy5hZGQodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogQ2FjaGUgYW55IHByZWV4aXN0aW5nIG1vZHVsZXMuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCB2b2lkIGNhY2hlTW9kdWxlcygpIHsKLQkJaWYgKG1vZHVsZXMgIT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCXRyeSB7Ci0JCQljbGVhckNhY2hlKCk7Ci0JCQlJUHJvamVjdFtdIHByb2plY3RzMiA9IGdldFdvcmtzcGFjZVJvb3QoKS5nZXRQcm9qZWN0cygpOwotCQkJaW50IHNpemUgPSBwcm9qZWN0czIubGVuZ3RoOwotCQkJbW9kdWxlcyA9IG5ldyBBcnJheUxpc3Qoc2l6ZSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCS8vVHJhY2UudHJhY2UoImNhY2hpbmc6ICIgKyB0aGlzICsgIiAiICsgcHJvamVjdHNbaV0gKyAiICIgKyBpc1ZhbGlkTW9kdWxlKHByb2plY3RzW2ldKSk7Ci0JCQkJaWYgKHByb2plY3RzMltpXS5pc0FjY2Vzc2libGUoKSkgewotCQkJCQl0cnkgewotCQkJCQkJSU1vZHVsZSBtb2R1bGUgPSBjcmVhdGVNb2R1bGUocHJvamVjdHMyW2ldKTsKLQkJCQkJCWlmIChtb2R1bGUgIT0gbnVsbCkKLQkJCQkJCQltb2R1bGVzLmFkZChtb2R1bGUpOwotCQkJCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgY3JlYXRpbmcgbW9kdWxlIiwgdCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBjYWNoaW5nIG1vZHVsZXMiLCBlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgd29ya3NwYWNlIHJvb3QuCi0JICogCi0JICogQHJldHVybiB0aGUgd29ya3NwYWNlIHJvb3QKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBJV29ya3NwYWNlUm9vdCBnZXRXb3Jrc3BhY2VSb290KCkgewotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG1vZHVsZXMgcHJvdmlkZWQgYnkgdGhpcyBmYWN0b3J5LgotCSAqIAotCSAqIEByZXR1cm4gYSBwb3NzaWJseS1lbXB0eSBhcnJheSBvZiBtb2R1bGVzCi0JICovCi0JcHVibGljIGZpbmFsIElNb2R1bGVbXSBnZXRNb2R1bGVzKCkgewotCQljYWNoZU1vZHVsZXMoKTsKLQkJCi0JCUlNb2R1bGVbXSBtb2R1bGVzMiA9IG5ldyBJTW9kdWxlW21vZHVsZXMuc2l6ZSgpXTsKLQkJbW9kdWxlcy50b0FycmF5KG1vZHVsZXMyKTsKLQkJcmV0dXJuIG1vZHVsZXMyOwotCX0KLQotCS8qKgotCSAqIEhhbmRsZSBjaGFuZ2VzIHRvIGEgcHJvamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdCBhIHByb2plY3QKLQkgKiBAcGFyYW0gZGVsdGEgYSByZXNvdXJjZSBkZWx0YQotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgdm9pZCBoYW5kbGVHbG9iYWxQcm9qZWN0Q2hhbmdlKGZpbmFsIElQcm9qZWN0IHByb2plY3QsIElSZXNvdXJjZURlbHRhIGRlbHRhKSB7Ci0JCU1vZHVsZUZhY3RvcnlbXSBmYWN0b3JpZXMyID0gU2VydmVyUGx1Z2luLmdldE1vZHVsZUZhY3RvcmllcygpOwotCQlpbnQgc2l6ZSA9IGZhY3RvcmllczIubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJaWYgKGZhY3RvcmllczJbaV0uZGVsZWdhdGUgIT0gbnVsbCAmJiBmYWN0b3JpZXMyW2ldLmRlbGVnYXRlIGluc3RhbmNlb2YgUHJvamVjdE1vZHVsZUZhY3RvcnlEZWxlZ2F0ZSkgewotCQkJCVByb2plY3RNb2R1bGVGYWN0b3J5RGVsZWdhdGUgcG1mZCA9IChQcm9qZWN0TW9kdWxlRmFjdG9yeURlbGVnYXRlKSBmYWN0b3JpZXMyW2ldLmRlbGVnYXRlOwotCQkJCWlmIChwbWZkLmRlbHRhQWZmZWN0c01vZHVsZXMoZGVsdGEpKSB7Ci0JCQkJCXBtZmQubW9kdWxlcyA9IG51bGw7Ci0JCQkJCWZhY3RvcmllczJbaV0uY2xlYXJNb2R1bGVDYWNoZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGRlbHRhIG1heSBoYXZlIGNoYW5nZWQgbW9kdWxlcywKLQkgKiBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLQkgKiAKLQkgKiBAcGFyYW0gZGVsdGEgYSByZXNvdXJjZSBkZWx0YQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGRlbHRhIG1heSBoYXZlIGNoYW5nZWQgbW9kdWxlcywKLQkgKiAgICBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXByaXZhdGUgZmluYWwgYm9vbGVhbiBkZWx0YUFmZmVjdHNNb2R1bGVzKElSZXNvdXJjZURlbHRhIGRlbHRhKSB7Ci0JCWNsYXNzIFRlbXAgewotCQkJYm9vbGVhbiBiID0gZmFsc2U7Ci0JCX0KLQkJZmluYWwgVGVtcCB0ID0gbmV3IFRlbXAoKTsKLQkJCi0JCWZpbmFsIElQYXRoW10gbGlzdGVuZXJQYXRocyA9IGdldExpc3RlbmVyUGF0aHMoKTsKLQkJaWYgKGxpc3RlbmVyUGF0aHMgPT0gbnVsbCB8fCBsaXN0ZW5lclBhdGhzLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuIGZhbHNlOwotCQlmaW5hbCBpbnQgc2l6ZSA9IGxpc3RlbmVyUGF0aHMubGVuZ3RoOwotCQkKLQkJdHJ5IHsKLQkJCWRlbHRhLmFjY2VwdChuZXcgSVJlc291cmNlRGVsdGFWaXNpdG9yKCkgewotCQkJCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZURlbHRhIGRlbHRhMikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCQlpZiAodC5iKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkvL1RyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgZGVsdGEyLmdldFJlc291cmNlKCkgKyAiICAiICsgZGVsdGEyLmdldEtpbmQoKSArICIgIiArIGRlbHRhMi5nZXRGbGFncygpKTsKLQkJCQkJYm9vbGVhbiBvayA9IGZhbHNlOwotCQkJCQlJUGF0aCBwYXRoID0gZGVsdGEyLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQkJCWlmIChsaXN0ZW5lclBhdGhzW2ldLmVxdWFscyhwYXRoKSkgewotCQkJCQkJCXQuYiA9IHRydWU7Ci0JCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJfSBlbHNlIGlmIChwYXRoLmlzUHJlZml4T2YobGlzdGVuZXJQYXRoc1tpXSkpIHsKLQkJCQkJCQlvayA9IHRydWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIG9rOwotCQkJCX0KLQkJCX0pOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQkJLy9UcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJEZWx0YSBjb250YWlucyBjaGFuZ2U6ICIgKyB0LmIpOwotCQlyZXR1cm4gdC5iOwotCX0KLQotCS8qKgotCSAqIENsZWFyIGFuZCBjYWNoZWQgbWV0YWRhdGEuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY2xlYXJDYWNoZSgpIHsKLQkJLy8gaWdub3JlCi0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgbW9kdWxlIGZvciBhIGdpdmVuIHByb2plY3QuCi0JICogCi0JICogQHBhcmFtIHByb2plY3QgYSBwcm9qZWN0IHRvIGNyZWF0ZSBtb2R1bGVzIGZvcgotCSAqIEByZXR1cm4gYSBtb2R1bGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIHdhcyBubyBtb2R1bGUgaW4gdGhlIHByb2plY3QKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgSU1vZHVsZSBjcmVhdGVNb2R1bGUoSVByb2plY3QgcHJvamVjdCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIHJlc291cmNlcyB0aGF0IHRoZSBtb2R1bGUgc2hvdWxkIGxpc3RlbiB0bwotCSAqIGZvciBzdGF0ZSBjaGFuZ2VzLiBUaGUgcGF0aHMgc2hvdWxkIGJlIHByb2plY3QgcmVsYXRpdmUgcGF0aHMuCi0JICogU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gcHJvdmlkZSB0aGUgcGF0aHMuCi0JICoKLQkgKiBAcmV0dXJuIGEgcG9zc2libHkgZW1wdHkgYXJyYXkgb2YgcGF0aHMKLQkgKi8KLQlwcm90ZWN0ZWQgSVBhdGhbXSBnZXRMaXN0ZW5lclBhdGhzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvdXRpbC9QdWJsaXNoQWRhcHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvdXRpbC9QdWJsaXNoQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzY0NjdiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL3V0aWwvUHVibGlzaEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVB1Ymxpc2hMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLS8qKgotICogSGVscGVyIGNsYXNzIHdoaWNoIGltcGxlbWVudHMgdGhlIElQdWJsaXNoTGlzdGVuZXIgaW50ZXJmYWNlCi0gKiB3aXRoIGVtcHR5IG1ldGhvZHMuCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklQdWJsaXNoTGlzdGVuZXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFB1Ymxpc2hBZGFwdGVyIGltcGxlbWVudHMgSVB1Ymxpc2hMaXN0ZW5lciB7Ci0JLyoqCi0JICogQHNlZSBJUHVibGlzaExpc3RlbmVyI3B1Ymxpc2hTdGFydGVkKElTZXJ2ZXIpCi0JICovCi0JcHVibGljIHZvaWQgcHVibGlzaFN0YXJ0ZWQoSVNlcnZlciBzZXJ2ZXIpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVB1Ymxpc2hMaXN0ZW5lciNwdWJsaXNoRmluaXNoZWQoSVNlcnZlciwgSVN0YXR1cykKLQkgKi8KLQlwdWJsaWMgdm9pZCBwdWJsaXNoRmluaXNoZWQoSVNlcnZlciBzZXJ2ZXIsIElTdGF0dXMgc3RhdHVzKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvdXRpbC9SdW50aW1lTGlmZWN5Y2xlQWRhcHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvdXRpbC9SdW50aW1lTGlmZWN5Y2xlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzZjZjhhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL3V0aWwvUnVudGltZUxpZmVjeWNsZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lTGlmZWN5Y2xlTGlzdGVuZXI7Ci0vKioKLSAqIEhlbHBlciBjbGFzcyB3aGljaCBpbXBsZW1lbnRzIHRoZSBJUnVudGltZUxpZmVjeWNsZUxpc3RlbmVyIGludGVyZmFjZQotICogd2l0aCBlbXB0eSBtZXRob2RzLgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZUxpZmVjeWNsZUxpc3RlbmVyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSdW50aW1lTGlmZWN5Y2xlQWRhcHRlciBpbXBsZW1lbnRzIElSdW50aW1lTGlmZWN5Y2xlTGlzdGVuZXIgewotCS8qKgotCSAqIEBzZWUgSVJ1bnRpbWVMaWZlY3ljbGVMaXN0ZW5lciNydW50aW1lQWRkZWQoSVJ1bnRpbWUpCi0JICovCi0JcHVibGljIHZvaWQgcnVudGltZUFkZGVkKElSdW50aW1lIHJ1bnRpbWUpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVJ1bnRpbWVMaWZlY3ljbGVMaXN0ZW5lciNydW50aW1lQ2hhbmdlZChJUnVudGltZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW50aW1lQ2hhbmdlZChJUnVudGltZSBydW50aW1lKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElSdW50aW1lTGlmZWN5Y2xlTGlzdGVuZXIjcnVudGltZVJlbW92ZWQoSVJ1bnRpbWUpCi0JICovCi0JcHVibGljIHZvaWQgcnVudGltZVJlbW92ZWQoSVJ1bnRpbWUgcnVudGltZSkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL3V0aWwvU2VydmVyTGlmZWN5Y2xlQWRhcHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvdXRpbC9TZXJ2ZXJMaWZlY3ljbGVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1NTI3OWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvdXRpbC9TZXJ2ZXJMaWZlY3ljbGVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJMaWZlY3ljbGVMaXN0ZW5lcjsKLS8qKgotICogSGVscGVyIGNsYXNzIHdoaWNoIGltcGxlbWVudHMgdGhlIElTZXJ2ZXJMaWZlY3ljbGVMaXN0ZW5lciBpbnRlcmZhY2UKLSAqIHdpdGggZW1wdHkgbWV0aG9kcy4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlckxpZmVjeWNsZUxpc3RlbmVyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJMaWZlY3ljbGVBZGFwdGVyIGltcGxlbWVudHMgSVNlcnZlckxpZmVjeWNsZUxpc3RlbmVyIHsKLQkvKioKLQkgKiBAc2VlIElTZXJ2ZXJMaWZlY3ljbGVMaXN0ZW5lciNzZXJ2ZXJBZGRlZChJU2VydmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHNlcnZlckFkZGVkKElTZXJ2ZXIgc2VydmVyKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElTZXJ2ZXJMaWZlY3ljbGVMaXN0ZW5lciNzZXJ2ZXJDaGFuZ2VkKElTZXJ2ZXIpCi0JICovCi0JcHVibGljIHZvaWQgc2VydmVyQ2hhbmdlZChJU2VydmVyIHNlcnZlcikgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogQHNlZSBJU2VydmVyTGlmZWN5Y2xlTGlzdGVuZXIjc2VydmVyUmVtb3ZlZChJU2VydmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHNlcnZlclJlbW92ZWQoSVNlcnZlciBzZXJ2ZXIpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS91dGlsL1NvY2tldFV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL3V0aWwvU29ja2V0VXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzA5YTRjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL3V0aWwvU29ja2V0VXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKLWltcG9ydCBqYXZhLm5ldC5TZXJ2ZXJTb2NrZXQ7Ci1pbXBvcnQgamF2YS5uZXQuU29ja2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SYW5kb207Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuVHJhY2U7Ci0vKioKLSAqIEEgdXRpbGl0eSBjbGFzcyBmb3Igc29ja2V0LXJlbGF0ZWQgZnVuY3Rpb24uIEl0J3MgbWFpbiBwdXJwb3NlcyBhcmUgdG8gZmluZAotICogdW51c2VkIHBvcnRzLCBjaGVjayB3aGV0aGVyIGEgcG9ydCBpcyBpbiB1c2UsIGFuZCBjaGVjayB3aGV0aGVyIGEgZ2l2ZW4KLSAqIGFkZHJlc3MgaXMgYSBsb2NhbChob3N0KSBhZGRyZXNzLgotICogCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTb2NrZXRVdGlsIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBSYW5kb20gcmFuZCA9IG5ldyBSYW5kb20oU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOwotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRuc0hvc3RuYW1lOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBETlNOQU1FU0VSVklDRV9DTEFTUyA9ICJzdW4ubmV0LnNwaS5uYW1lc2VydmljZS5kbnMuRE5TTmFtZVNlcnZpY2UiOwotCi0JLyoqCi0JICogU3RhdGljIHV0aWxpdHkgY2xhc3MgLSBjYW5ub3QgY3JlYXRlIGFuIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgU29ja2V0VXRpbCgpIHsKLQkJLy8gY2Fubm90IGNyZWF0ZQotCX0KLQotCS8qKgotCSAqIEZpbmRzIGFuIHVudXNlZCBwb3J0IGJldHdlZW4gdGhlIGdpdmVuIGZyb20gYW5kIHRvIHZhbHVlcy4KLQkgKiAKLQkgKiBAcGFyYW0gbG93IGxvd2VzdCBwb3NzaWJsZSBwb3J0IG51bWJlcgotCSAqIEBwYXJhbSBoaWdoIGhpZ2hlc3QgcG9zc2libGUgcG9ydCBudW1iZXIKLQkgKiBAcmV0dXJuIGFuIHVzdXNlZCBwb3J0IG51bWJlciwgb3IgPGNvZGU+LTE8L2NvZGU+IGlmIG5vIHVzZWQgcG9ydHMgY291bGQgYmUgZm91bmQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBmaW5kVW51c2VkUG9ydChpbnQgbG93LCBpbnQgaGlnaCkgewotCQlpZiAoaGlnaCA8IGxvdykKLQkJCXJldHVybiAtMTsKLQkJCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgewotCQkJaW50IHBvcnQgPSBnZXRSYW5kb21Qb3J0KGxvdywgaGlnaCk7Ci0JCQlpZiAoIWlzUG9ydEluVXNlKHBvcnQpKQotCQkJCXJldHVybiBwb3J0OwotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSByYW5kb20gcG9ydCBudW1iZXIgaW4gdGhlIGdpdmVuIHJhbmdlLgotCSAqIAotCSAqIEBwYXJhbSBsb3cgbG93ZXN0IHBvc3NpYmxlIHBvcnQgbnVtYmVyCi0JICogQHBhcmFtIGhpZ2ggaGlnaGVzdCBwb3NzaWJsZSBwb3J0IG51bWJlcgotCSAqIEByZXR1cm4gYSByYW5kb20gcG9ydCBudW1iZXIgaW4gdGhlIGdpdmVuIHJhbmdlCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGdldFJhbmRvbVBvcnQoaW50IGxvdywgaW50IGhpZ2gpIHsKLQkJcmV0dXJuIHJhbmQubmV4dEludChoaWdoIC0gbG93KSArIGxvdzsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgdG8gc2VlIGlmIHRoZSBnaXZlbiBwb3J0IG51bWJlciBpcyBiZWluZyB1c2VkLiAKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnaXZlbiBwb3J0IGlzIGluIHVzZSwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqIG90aGVyd2lzZS4gUmV0cmllcyBldmVyeSA1MDBtcyBmb3IgImNvdW50IiB0cmllcy4KLQkgKgotCSAqIEBwYXJhbSBwb3J0IHRoZSBwb3J0IG51bWJlciB0byBjaGVjawotCSAqIEBwYXJhbSBjb3VudCB0aGUgbnVtYmVyIG9mIHRpbWVzIHRvIHJldHJ5Ci0JICogQHJldHVybiBib29sZWFuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwb3J0IGlzIGluIHVzZSwgYW5kCi0JICogICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1BvcnRJblVzZShpbnQgcG9ydCwgaW50IGNvdW50KSB7Ci0JCWJvb2xlYW4gaW5Vc2UgPSBpc1BvcnRJblVzZShwb3J0KTsKLQkJd2hpbGUgKGluVXNlICYmIGNvdW50ID4gMCkgewotCQkJdHJ5IHsKLQkJCQlUaHJlYWQuc2xlZXAoNTAwKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCQlpblVzZSA9IGlzUG9ydEluVXNlKHBvcnQpOwotCQkJY291bnQgLS07Ci0JCX0KLQkKLQkJcmV0dXJuIGluVXNlOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyB0byBzZWUgaWYgdGhlIGdpdmVuIHBvcnQgbnVtYmVyIGlzIGJlaW5nIHVzZWQuCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ2l2ZW4gcG9ydCBpcyBpbiB1c2UsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiBvdGhlcndpc2UuCi0JICoKLQkgKiBAcGFyYW0gcG9ydCB0aGUgcG9ydCBudW1iZXIgdG8gY2hlY2sKLQkgKiBAcmV0dXJuIGJvb2xlYW4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHBvcnQgaXMgaW4gdXNlLCBhbmQKLQkgKiAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzUG9ydEluVXNlKGludCBwb3J0KSB7Ci0JCVNlcnZlclNvY2tldCBzID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXMgPSBuZXcgU2VydmVyU29ja2V0KHBvcnQpOwotCQl9IGNhdGNoIChTb2NrZXRFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAocyAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJcy5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIGlnbm9yZQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGdpdmVuIGhvc3QgKG5hbWUgb3IgSVAgYWRkcmVzcykgaXMgcG9pbnRpbmcgdG8gdGhlIGxvY2FsCi0JICogbWFjaGluZS4KLQkgKiBBbHRob3VnaCB0aGlzIG1ldGhvZCBpcyBub3QgZm9vbHByb29mIChlc3BlY2lhbGx5IGlmIHRoZSBuZXR3b3JrCi0JICogY29uZmlndXJhdGlvbiBvZiB0aGUgY3VycmVudCBtYWNoaW5lIGlzIGluY29ycmVjdCBvciBmYWlsaW5nKSwgaXQgd2lsbAotCSAqIGNvcnJlY3RseSBpZGVudGlmeSBqdXN0IGFib3V0IGFsbCBsb29wYmFjayBhZGFwdGVycyBhbmQgdGhlIGxvY2FsIGhvc3RuYW1lCi0JICogb3IgSVAgYWRkcmVzcy4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCB3aWxsIG5vdCBhdHRlbXB0IHRvIG1ha2UgYW4gZXh0ZXJuYWwgbmV0d29yayBjb25uZWN0aW9uLCBzbwotCSAqIGl0IHJldHVybnMgcXVpY2tseSBhbmQgaXMgc2FmZSB0byB1c2UgaW4gVUkgaW50ZXJmYWNlcy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGhvc3QgYSBob3N0bmFtZSBvciBJUCBhZGRyZXNzCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ2l2ZW4gaG9zdCBpcyBsb2NhbGhvc3QsIGFuZAotCSAqICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNMb2NhbGhvc3QoU3RyaW5nIGhvc3QpIHsKLQkJaWYgKGhvc3QgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJdHJ5IHsKLQkJCWlmICgibG9jYWxob3N0Ii5lcXVhbHMoaG9zdCkgfHwgIjEyNy4wLjAuMSIuZXF1YWxzKGhvc3QpKQotCQkJCXJldHVybiB0cnVlOwotCQkJCi0JCQlJbmV0QWRkcmVzcyBsb2NhbEhvc3RhZGRyID0gSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCk7Ci0JCQlpZiAobG9jYWxIb3N0YWRkci5nZXRIb3N0TmFtZSgpLmVxdWFscyhob3N0KSB8fCBob3N0LmVxdWFscyhsb2NhbEhvc3RhZGRyLmdldENhbm9uaWNhbEhvc3ROYW1lKCkpKQotCQkJCXJldHVybiB0cnVlOwotCQkJCi0JCQlpZiAobG9jYWxIb3N0YWRkci5nZXRIb3N0QWRkcmVzcygpLmVxdWFscyhob3N0KSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQotCQkJaWYgKGRuc0hvc3RuYW1lID09IG51bGwpCi0JCQkJdHJ5IHsKLQkJCQkJLy8Jd29ya2Fyb3VuZCB0byBicmVhayBkZXBlbmRlbmN5IHdpdGggU3VuJ3MgY2xhc3NlcwotCQkJCQlDbGFzcyBjbCA9IENsYXNzLmZvck5hbWUoRE5TTkFNRVNFUlZJQ0VfQ0xBU1MpOwotCQkJCQlNZXRob2QgZ2V0SG9zdEJ5QWRkck1ldGggPSBjbC5nZXRNZXRob2QoImdldEhvc3RCeUFkZHIiLCBuZXcgQ2xhc3NbXSB7Ynl0ZVtdLmNsYXNzfSk7Ci0JCQkJCU9iamVjdCBkbnMgPSBjbC5uZXdJbnN0YW5jZSgpOwotCQkJCQkKLQkJCQkJZG5zSG9zdG5hbWUgPSAoU3RyaW5nKWdldEhvc3RCeUFkZHJNZXRoLmludm9rZShkbnMsCi0JCQkJCQluZXcgT2JqZWN0W10geyBsb2NhbEhvc3RhZGRyLmdldEFkZHJlc3MoKSB9KTsKLQkJCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJCQlkbnNIb3N0bmFtZSA9ICIqKioqKioqKioqKioqKioqKiI7Ci0JCQkJfQotCQkJCi0JCQlpZiAoZG5zSG9zdG5hbWUgIT0gbnVsbCAmJiBkbnNIb3N0bmFtZS5lcXVhbHMoaG9zdCkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiRXJyb3IgY2hlY2tpbmcgZm9yIGxvY2FsaG9zdCIsIGUpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvdXRpbC9XZWJSZXNvdXJjZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvdXRpbC9XZWJSZXNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODYzZjc1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL3V0aWwvV2ViUmVzb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZUFydGlmYWN0OwotLyoqCi0gKiBBIFdlYiBtb2R1bGUgcmVzb3VyY2UuCi0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFdlYlJlc291cmNlIGltcGxlbWVudHMgSU1vZHVsZUFydGlmYWN0IHsKLQlwcml2YXRlIElNb2R1bGUgbW9kdWxlOwotCXByaXZhdGUgSVBhdGggcGF0aDsKLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyByZWZlcmVuY2UgdG8gYSBXZWIgcmVzb3VyY2UgKEhUTUwsIEdJRiwgZXRjLiBvbiBhIHNlcnZlcikuCi0JICogCi0JICogQHBhcmFtIG1vZHVsZSBhIG1vZHVsZQotCSAqIEBwYXJhbSBwYXRoIGEgcmVsYXRpdmUgcGF0aCB3aXRoaW4gdGhlIG1vZHVsZQotCSAqLwotCXB1YmxpYyBXZWJSZXNvdXJjZShJTW9kdWxlIG1vZHVsZSwgSVBhdGggcGF0aCkgewotCQl0aGlzLm1vZHVsZSA9IG1vZHVsZTsKLQkJdGhpcy5wYXRoID0gcGF0aDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElNb2R1bGVBcnRpZmFjdCNnZXRNb2R1bGUoKQotCSAqLwotCXB1YmxpYyBJTW9kdWxlIGdldE1vZHVsZSgpIHsKLQkJcmV0dXJuIG1vZHVsZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlbGF0aXZlIHBhdGggdG8gdGhlIGFydGlmYWN0IHdpdGhpbiB0aGUgbW9kdWxlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHJlbGF0aXZlIHBhdGgKLQkgKi8KLQlwdWJsaWMgSVBhdGggZ2V0UGF0aCgpIHsKLQkJcmV0dXJuIHBhdGg7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPYmplY3QjdG9TdHJpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiV2ViUmVzb3VyY2UgW21vZHVsZT0iICsgbW9kdWxlICsgIiwgcGF0aD0iICsgcGF0aCArICJdIjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvdXRpbC9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS91dGlsL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFkM2VkNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS9zZXJ2ZXJjb3JlL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvY29yZS91dGlsL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLTxodG1sPgotPGhlYWQ+Ci08TUVUQSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vLi4vLi4vLi4vLi4vL2FwaXN0eWxlcy5jc3MiIHR5cGU9InRleHQvY3NzIj4KLTx0aXRsZT5XVFAgQVBJIG92ZXJ2aWV3PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotPHA+VXRpbGl0eSBjbGFzc2VzIGZvciB0aGUgc2VydmVyIHRvb2xzIGZyYW1ld29yay48L3A+Ci08dGFibGUgd2lkdGg9IjUwMCI+Ci08dHI+Ci08dGQ+Ci08cD5QaW5nVGhyZWFkIGlzIGEgdXRpbGl0eSBjbGFzcyBmb3IgcGluZ2luZyBhIHNlcnZlciB0byBkZXRlcm1pbmUgaWYKLWl0IGlzIHJ1bm5pbmcgYW5kIHVwZGF0aW5nIHRoZSBzZXJ2ZXIncyBzdGF0ZS48L3A+Ci08L3RkPgotPC90cj4KLTwvdGFibGU+Ci08dGFibGUgd2lkdGg9IjUwMCI+Ci08dHI+Ci08dGQ+Ci08cD5Tb2NrZXRVdGlsIGNvbnRhaW5zIHV0aWxpdHkgbWV0aG9kcyBmb3IgZGV0ZXJtaW5pbmcgaWYgcG9ydHMgYXJlCi1mcmVlIGFuZCB3aGV0aGVyIGEgZ2l2ZW4gaG9zdG5hbWUgaXMgYSBsb2NhbCBob3N0bmFtZS48L3A+Ci08L3RkPgotPC90cj4KLTwvdGFibGU+Ci08dGFibGUgd2lkdGg9IjUwMCI+Ci08dHI+Ci08dGQ+Ci08cD5UaGUgZm91ciBYWFhBZGFwdGVyIGNsYXNzZXMgYXJlIGltcGxlbWVudGF0aW9ucyBvZiBzZXJ2ZXIgdG9vbHMKLWxpc3RlbmVyIGludGVyZmFjZXMgd2l0aCB0aGUgbWV0aG9kIGJvZGllcyBzdHViYmVkIGluOyB0aGV5IGNhbiBiZQotc3ViY2xhc3NlZCBieSBjbGllbnRzIHdobyBvbmx5IHdhbnQgdG8gaW1wbGVtZW50IGEgc2luZ2xlIGxpc3RlbmVyCi1pbnRlcmZhY2UgbWV0aG9kLjwvcD4KLTwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTx0YWJsZSB3aWR0aD0iNTAwIj4KLTx0cj4KLTx0ZD4KLTxwPlNlcnZlclBvcnQsIFRhc2ssIGFuZCBUYXNrTW9kZWwgYXJlIHN0YW5kYXJkIGltcGxlbWVudGF0aW9ucyBvZgotb3RoZXIgaW50ZXJmYWNlIGNsYXNzZXMuPC9wPgotPC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvdXRpbC9wYWNrYWdlLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlL3NlcnZlcmNvcmUvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci9jb3JlL3V0aWwvcGFja2FnZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmYjI0NDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUvc2VydmVyY29yZS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL2NvcmUvdXRpbC9wYWNrYWdlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08aHRtbD4KLTxoZWFkPgotCTwhLS0gIEVzY2FwZSB0byB0aGUgcm9vdCBvZiB5b3VyIHNvdXJjZSBmb2xkZXIgIC0tPgotCTxtZXRhCi0JCW5hbWU9InJvb3QiCi0JCWNvbnRlbnQ9Ii4uLy4uLy4uLy4uLy4uLy4uLyIgLz4KLQk8dGl0bGU+V1RQIEFQSSBvdmVydmlldzwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5PgotCi08YWJzdHJhY3Q+VXRpbGl0eSBjbGFzc2VzIGZvciB0aGUgc2VydmVyIHRvb2xzIGZyYW1ld29yay48L2Fic3RyYWN0PgotCi08cD5QaW5nVGhyZWFkIGlzIGEgdXRpbGl0eSBjbGFzcyBmb3IgcGluZ2luZyBhIHNlcnZlciB0byBkZXRlcm1pbmUgaWYKLWl0IGlzIHJ1bm5pbmcgYW5kIHVwZGF0aW5nIHRoZSBzZXJ2ZXIncyBzdGF0ZS48L3A+Ci0KLTxwPlNvY2tldFV0aWwgY29udGFpbnMgdXRpbGl0eSBtZXRob2RzIGZvciBkZXRlcm1pbmluZyBpZiBwb3J0cyBhcmUKLWZyZWUgYW5kIHdoZXRoZXIgYSBnaXZlbiBob3N0bmFtZSBpcyBhIGxvY2FsIGhvc3RuYW1lLjwvcD4KLQotPHA+VGhlIGZvdXIgWFhYQWRhcHRlciBjbGFzc2VzIGFyZSBpbXBsZW1lbnRhdGlvbnMgb2Ygc2VydmVyIHRvb2xzCi1saXN0ZW5lciBpbnRlcmZhY2VzIHdpdGggdGhlIG1ldGhvZCBib2RpZXMgc3R1YmJlZCBpbjsgdGhleSBjYW4gYmUKLXN1YmNsYXNzZWQgYnkgY2xpZW50cyB3aG8gb25seSB3YW50IHRvIGltcGxlbWVudCBhIHNpbmdsZSBsaXN0ZW5lcgotaW50ZXJmYWNlIG1ldGhvZC48L3A+Ci0KLTxwPlNlcnZlclBvcnQsIFRhc2ssIGFuZCBUYXNrTW9kZWwgYXJlIHN0YW5kYXJkIGltcGxlbWVudGF0aW9ucyBvZgotb3RoZXIgaW50ZXJmYWNlIGNsYXNzZXMuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLy5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA1OGQ0NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic2VydmVydWkvIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxZTRlOWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLWJpbgotc2VydmVydWkuamFyCi1idWlsZC54bWwKLXRlbXAuZm9sZGVyCi1vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpXzMuMC4wLmphcgotQGRvdAotc3JjLnppcApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLy5vcHRpb25zIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLy5vcHRpb25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjA0N2UxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotIyBEZWJ1Z2dpbmcgb3B0aW9ucyBmb3IgdGhlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkgcGx1Z2luCi0KLSMgVHVybiBvbiBnZW5lcmFsIGRlYnVnZ2luZwotb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9kZWJ1Zz10cnVlCi0KLSMgUHJpbnRzIG91dCB2YWx1ZXMKLW9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvZWRpdG9yPWZhbHNlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlZWJhNzAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4YWMyMjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWk7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5TZXJ2ZXJVSVBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aSwKLSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmVkaXRvciwKLSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5hY3Rpb25zO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5jb21tYW5kO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5lZGl0b3I7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnByb3Zpc2lvbmFsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3LnNlcnZlcnM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXdlcnM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLmZyYWdtZW50O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQucGFnZTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkud2l6YXJkCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotIG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMsCi0gb3JnLmVjbGlwc2UudWksCi0gb3JnLmVjbGlwc2UudWkuaWRlLAotIG9yZy5lY2xpcHNlLnVpLmZvcm1zLAotIG9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yLAotIG9yZy5lY2xpcHNlLnVpLmJyb3dzZXIsCi0gb3JnLmVjbGlwc2UuZGVidWcuY29yZSwKLSBvcmcuZWNsaXBzZS5kZWJ1Zy51aSwKLSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUsCi0gb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZQotRWNsaXBzZS1BdXRvU3RhcnQ6IHRydWUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9hYm91dC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNmI5NmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+RmVicnVhcnkgMjQsIDIwMDU8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwOGEyNmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICAub3B0aW9ucyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbAotYmluLmV4Y2x1ZGVzID0gYmluLyoqLFwKLSAgICAgICAgICAgICAgIEBkb3QvKiosXAotICAgICAgICAgICAgICAgdGVtcC5mb2xkZXIvKioKLXNyYy5pbmNsdWRlcyA9IHNjaGVtYS8KLXNvdXJjZS4uID0gc2VydmVydWkvCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvY2xjbDE2L2xhdW5jaF9kZWJ1Zy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvY2xjbDE2L2xhdW5jaF9kZWJ1Zy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MTRkN2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2NsY2wxNi9sYXVuY2hfZGVidWcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2NsY2wxNi9sYXVuY2hfZGlzY29ubmVjdC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvY2xjbDE2L2xhdW5jaF9kaXNjb25uZWN0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmUwZDM4My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvY2xjbDE2L2xhdW5jaF9kaXNjb25uZWN0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9jbGNsMTYvbGF1bmNoX3Byb2ZpbGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2NsY2wxNi9sYXVuY2hfcHJvZmlsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5YzMzNDAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2NsY2wxNi9sYXVuY2hfcHJvZmlsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvY2xjbDE2L2xhdW5jaF9wdWJsaXNoLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9jbGNsMTYvbGF1bmNoX3B1Ymxpc2guZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzgyN2FmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9jbGNsMTYvbGF1bmNoX3B1Ymxpc2guZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2NsY2wxNi9sYXVuY2hfcmVzdGFydC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvY2xjbDE2L2xhdW5jaF9yZXN0YXJ0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmMwYWM2ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvY2xjbDE2L2xhdW5jaF9yZXN0YXJ0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9jbGNsMTYvbGF1bmNoX3J1bi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvY2xjbDE2L2xhdW5jaF9ydW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2Y0MTAyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9jbGNsMTYvbGF1bmNoX3J1bi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvY2xjbDE2L2xhdW5jaF9zdG9wLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9jbGNsMTYvbGF1bmNoX3N0b3AuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmYxNjg2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9jbGNsMTYvbGF1bmNoX3N0b3AuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2N0b29sMTYvZGVidWdfb25fc2VydmVyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9jdG9vbDE2L2RlYnVnX29uX3NlcnZlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0NjUwYmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2N0b29sMTYvZGVidWdfb25fc2VydmVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9jdG9vbDE2L3Byb2ZpbGVfb25fc2VydmVyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9jdG9vbDE2L3Byb2ZpbGVfb25fc2VydmVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNhOTUyMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvY3Rvb2wxNi9wcm9maWxlX29uX3NlcnZlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvY3Rvb2wxNi9ydW5fb25fc2VydmVyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9jdG9vbDE2L3J1bl9vbl9zZXJ2ZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWQ3ZDk4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9jdG9vbDE2L3J1bl9vbl9zZXJ2ZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2N0b29sMTYvd2l6X2ltcG9ydF9jb25maWd1cmF0aW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9jdG9vbDE2L3dpel9pbXBvcnRfY29uZmlndXJhdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0ZjZiMzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2N0b29sMTYvd2l6X2ltcG9ydF9jb25maWd1cmF0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9jdG9vbDE2L3dpel9tb2RpZnlfbW9kdWxlcy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvY3Rvb2wxNi93aXpfbW9kaWZ5X21vZHVsZXMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTA3MDEyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9jdG9vbDE2L3dpel9tb2RpZnlfbW9kdWxlcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvY3Rvb2wxNi93aXpfbmV3X3NlcnZlci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvY3Rvb2wxNi93aXpfbmV3X3NlcnZlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1YmFjYjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2N0b29sMTYvd2l6X25ld19zZXJ2ZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2N0b29sMTYvd2l6X25ld19zZXJ2ZXJfcHJvamVjdC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvY3Rvb2wxNi93aXpfbmV3X3NlcnZlcl9wcm9qZWN0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNmZDExYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvY3Rvb2wxNi93aXpfbmV3X3NlcnZlcl9wcm9qZWN0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9jdmlldzE2L3NlcnZlcl9wZXJzcGVjdGl2ZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvY3ZpZXcxNi9zZXJ2ZXJfcGVyc3BlY3RpdmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGI2NDhjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9jdmlldzE2L3NlcnZlcl9wZXJzcGVjdGl2ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvY3ZpZXcxNi9zZXJ2ZXJzX3ZpZXcuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2N2aWV3MTYvc2VydmVyc192aWV3LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJhYmZiYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvY3ZpZXcxNi9zZXJ2ZXJzX3ZpZXcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2RsY2wxNi9sYXVuY2hfZGVidWcuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2RsY2wxNi9sYXVuY2hfZGVidWcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMmY5YzNhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9kbGNsMTYvbGF1bmNoX2RlYnVnLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9kbGNsMTYvbGF1bmNoX2Rpc2Nvbm5lY3QuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2RsY2wxNi9sYXVuY2hfZGlzY29ubmVjdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5NTYwOTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2RsY2wxNi9sYXVuY2hfZGlzY29ubmVjdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZGxjbDE2L2xhdW5jaF9wcm9maWxlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9kbGNsMTYvbGF1bmNoX3Byb2ZpbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzA5YjBkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9kbGNsMTYvbGF1bmNoX3Byb2ZpbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2RsY2wxNi9sYXVuY2hfcHVibGlzaC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZGxjbDE2L2xhdW5jaF9wdWJsaXNoLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjYzMjJmZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZGxjbDE2L2xhdW5jaF9wdWJsaXNoLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9kbGNsMTYvbGF1bmNoX3Jlc3RhcnQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2RsY2wxNi9sYXVuY2hfcmVzdGFydC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5ZDkwOGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2RsY2wxNi9sYXVuY2hfcmVzdGFydC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZGxjbDE2L2xhdW5jaF9ydW4uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2RsY2wxNi9sYXVuY2hfcnVuLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM2MmU2Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZGxjbDE2L2xhdW5jaF9ydW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2RsY2wxNi9sYXVuY2hfc3RvcC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZGxjbDE2L2xhdW5jaF9zdG9wLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNjNWZhZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZGxjbDE2L2xhdW5jaF9zdG9wLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9kdG9vbDE2L2RlYnVnX29uX3NlcnZlci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZHRvb2wxNi9kZWJ1Z19vbl9zZXJ2ZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjRjZjI3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9kdG9vbDE2L2RlYnVnX29uX3NlcnZlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZHRvb2wxNi9wcm9maWxlX29uX3NlcnZlci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZHRvb2wxNi9wcm9maWxlX29uX3NlcnZlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxNGM4OWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2R0b29sMTYvcHJvZmlsZV9vbl9zZXJ2ZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2R0b29sMTYvcnVuX29uX3NlcnZlci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZHRvb2wxNi9ydW5fb25fc2VydmVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQyMmE4Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZHRvb2wxNi9ydW5fb25fc2VydmVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9kdG9vbDE2L3dpel9pbXBvcnRfY29uZmlndXJhdGlvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZHRvb2wxNi93aXpfaW1wb3J0X2NvbmZpZ3VyYXRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWY1N2IzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9kdG9vbDE2L3dpel9pbXBvcnRfY29uZmlndXJhdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZHRvb2wxNi93aXpfbW9kaWZ5X21vZHVsZXMuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2R0b29sMTYvd2l6X21vZGlmeV9tb2R1bGVzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE0ZmVkMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZHRvb2wxNi93aXpfbW9kaWZ5X21vZHVsZXMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2R0b29sMTYvd2l6X25ld19zZXJ2ZXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2R0b29sMTYvd2l6X25ld19zZXJ2ZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTZmY2IwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9kdG9vbDE2L3dpel9uZXdfc2VydmVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9kdG9vbDE2L3dpel9uZXdfc2VydmVyX3Byb2plY3QuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2R0b29sMTYvd2l6X25ld19zZXJ2ZXJfcHJvamVjdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNTIzMTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2R0b29sMTYvd2l6X25ld19zZXJ2ZXJfcHJvamVjdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZWxjbDE2L2xhdW5jaF9kZWJ1Zy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZWxjbDE2L2xhdW5jaF9kZWJ1Zy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MTRkN2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2VsY2wxNi9sYXVuY2hfZGVidWcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2VsY2wxNi9sYXVuY2hfZGlzY29ubmVjdC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZWxjbDE2L2xhdW5jaF9kaXNjb25uZWN0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmUwZDM4My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZWxjbDE2L2xhdW5jaF9kaXNjb25uZWN0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9lbGNsMTYvbGF1bmNoX3Byb2ZpbGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2VsY2wxNi9sYXVuY2hfcHJvZmlsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5YzMzNDAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2VsY2wxNi9sYXVuY2hfcHJvZmlsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZWxjbDE2L2xhdW5jaF9wdWJsaXNoLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9lbGNsMTYvbGF1bmNoX3B1Ymxpc2guZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWU5YTZkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9lbGNsMTYvbGF1bmNoX3B1Ymxpc2guZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2VsY2wxNi9sYXVuY2hfcmVzdGFydC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZWxjbDE2L2xhdW5jaF9yZXN0YXJ0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmMwYWM2ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZWxjbDE2L2xhdW5jaF9yZXN0YXJ0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9lbGNsMTYvbGF1bmNoX3J1bi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZWxjbDE2L2xhdW5jaF9ydW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2Y0MTAyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9lbGNsMTYvbGF1bmNoX3J1bi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZWxjbDE2L2xhdW5jaF9zdG9wLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9lbGNsMTYvbGF1bmNoX3N0b3AuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmYxNjg2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9lbGNsMTYvbGF1bmNoX3N0b3AuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2V0b29sMTYvZGVidWdfb25fc2VydmVyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9ldG9vbDE2L2RlYnVnX29uX3NlcnZlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0NjUwYmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2V0b29sMTYvZGVidWdfb25fc2VydmVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9ldG9vbDE2L3Byb2ZpbGVfb25fc2VydmVyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9ldG9vbDE2L3Byb2ZpbGVfb25fc2VydmVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNhOTUyMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZXRvb2wxNi9wcm9maWxlX29uX3NlcnZlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZXRvb2wxNi9ydW5fb25fc2VydmVyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9ldG9vbDE2L3J1bl9vbl9zZXJ2ZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWQ3ZDk4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9ldG9vbDE2L3J1bl9vbl9zZXJ2ZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2V0b29sMTYvd2l6X2ltcG9ydF9jb25maWd1cmF0aW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9ldG9vbDE2L3dpel9pbXBvcnRfY29uZmlndXJhdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0ZjZiMzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2V0b29sMTYvd2l6X2ltcG9ydF9jb25maWd1cmF0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9ldG9vbDE2L3dpel9tb2RpZnlfbW9kdWxlcy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZXRvb2wxNi93aXpfbW9kaWZ5X21vZHVsZXMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTA3MDEyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9ldG9vbDE2L3dpel9tb2RpZnlfbW9kdWxlcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZXRvb2wxNi93aXpfbmV3X3NlcnZlci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZXRvb2wxNi93aXpfbmV3X3NlcnZlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1YmFjYjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2V0b29sMTYvd2l6X25ld19zZXJ2ZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2V0b29sMTYvd2l6X25ld19zZXJ2ZXJfcHJvamVjdC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZXRvb2wxNi93aXpfbmV3X3NlcnZlcl9wcm9qZWN0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNmZDExYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZXRvb2wxNi93aXpfbmV3X3NlcnZlcl9wcm9qZWN0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9ldmlldzE2L3NlcnZlcl9wZXJzcGVjdGl2ZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZXZpZXcxNi9zZXJ2ZXJfcGVyc3BlY3RpdmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGI2NDhjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9ldmlldzE2L3NlcnZlcl9wZXJzcGVjdGl2ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZXZpZXcxNi9zZXJ2ZXJzX3ZpZXcuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL2V2aWV3MTYvc2VydmVyc192aWV3LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJhYmZiYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvZXZpZXcxNi9zZXJ2ZXJzX3ZpZXcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL29iajE2L2F1ZGlvX2NhdGVnb3J5LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vYmoxNi9hdWRpb19jYXRlZ29yeS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0YTUzODguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL29iajE2L2F1ZGlvX2NhdGVnb3J5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vYmoxNi9hdWRpb19zb3VuZC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvYXVkaW9fc291bmQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWQ4NTUzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vYmoxNi9hdWRpb19zb3VuZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvY29uZmlndXJhdGlvbl9taXNzaW5nLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vYmoxNi9jb25maWd1cmF0aW9uX21pc3NpbmcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGVmNGM5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vYmoxNi9jb25maWd1cmF0aW9uX21pc3NpbmcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL29iajE2L2NvbmZpZ3VyYXRpb25fbm9uZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvY29uZmlndXJhdGlvbl9ub25lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JkMjc1Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvY29uZmlndXJhdGlvbl9ub25lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vYmoxNi9pbnRlcm5hbF9icm93c2VyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vYmoxNi9pbnRlcm5hbF9icm93c2VyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDlmNjA5ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvaW50ZXJuYWxfYnJvd3Nlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvbW9uaXRvck9mZi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvbW9uaXRvck9mZi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyZTVmMzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL29iajE2L21vbml0b3JPZmYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL29iajE2L21vbml0b3JPbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvbW9uaXRvck9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZmMzk3NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvbW9uaXRvck9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vYmoxNi9wcm9qZWN0X21pc3NpbmcuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL29iajE2L3Byb2plY3RfbWlzc2luZy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjYjRjMTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL29iajE2L3Byb2plY3RfbWlzc2luZy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvcHVibGlzaF9kaXNhYmxlZC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvcHVibGlzaF9kaXNhYmxlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxOWI4NDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL29iajE2L3B1Ymxpc2hfZGlzYWJsZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL29iajE2L3B1Ymxpc2hfZW5hYmxlZC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvcHVibGlzaF9lbmFibGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI5MDBlZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvcHVibGlzaF9lbmFibGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vYmoxNi9yZXBhaXJfY29uZmlnLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vYmoxNi9yZXBhaXJfY29uZmlnLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU2OTBlYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvcmVwYWlyX2NvbmZpZy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvc2VydmVyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vYmoxNi9zZXJ2ZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTFhZTM5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vYmoxNi9zZXJ2ZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL29iajE2L3NlcnZlcl9zdGFydGVkLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vYmoxNi9zZXJ2ZXJfc3RhcnRlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzNzAwNTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL29iajE2L3NlcnZlcl9zdGFydGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vYmoxNi9zZXJ2ZXJfc3RhcnRlZF9kZWJ1Zy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvc2VydmVyX3N0YXJ0ZWRfZGVidWcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWUxNzc4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vYmoxNi9zZXJ2ZXJfc3RhcnRlZF9kZWJ1Zy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvc2VydmVyX3N0YXJ0ZWRfcHJvZmlsZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvc2VydmVyX3N0YXJ0ZWRfcHJvZmlsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3ZTI1ODQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL29iajE2L3NlcnZlcl9zdGFydGVkX3Byb2ZpbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL29iajE2L3NlcnZlcl9zdGFydGluZzEuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL29iajE2L3NlcnZlcl9zdGFydGluZzEuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjI2M2FhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vYmoxNi9zZXJ2ZXJfc3RhcnRpbmcxLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vYmoxNi9zZXJ2ZXJfc3RhcnRpbmcyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vYmoxNi9zZXJ2ZXJfc3RhcnRpbmcyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzAzYmJmZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvc2VydmVyX3N0YXJ0aW5nMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvc2VydmVyX3N0YXJ0aW5nMy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvc2VydmVyX3N0YXJ0aW5nMy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxNTFlNTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL29iajE2L3NlcnZlcl9zdGFydGluZzMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL29iajE2L3NlcnZlcl9zdG9wcGVkLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vYmoxNi9zZXJ2ZXJfc3RvcHBlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2YzNiNjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL29iajE2L3NlcnZlcl9zdG9wcGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vYmoxNi9zZXJ2ZXJfc3RvcHBpbmcxLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vYmoxNi9zZXJ2ZXJfc3RvcHBpbmcxLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA2YzU3ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvc2VydmVyX3N0b3BwaW5nMS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvc2VydmVyX3N0b3BwaW5nMi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvc2VydmVyX3N0b3BwaW5nMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2YzNiNjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL29iajE2L3NlcnZlcl9zdG9wcGluZzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL29iajE2L3NlcnZlcl9zdG9wcGluZzMuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL29iajE2L3NlcnZlcl9zdG9wcGluZzMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDZjNTdkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vYmoxNi9zZXJ2ZXJfc3RvcHBpbmczLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vYmoxNi93ZWJfbW9kdWxlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vYmoxNi93ZWJfbW9kdWxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmYyMGY3MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb2JqMTYvd2ViX21vZHVsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvb3ZyMTYvZGVmYXVsdF9zZXJ2ZXJfb3ZyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vdnIxNi9kZWZhdWx0X3NlcnZlcl9vdnIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmZjYmMwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vdnIxNi9kZWZhdWx0X3NlcnZlcl9vdnIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL292cjE2L3NlcnZlcl9vdnIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL292cjE2L3NlcnZlcl9vdnIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYThkNTJlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy9vdnIxNi9zZXJ2ZXJfb3ZyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy93aXpiYW4vaW1wb3J0X2NvbmZpZ3VyYXRpb25fd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy93aXpiYW4vaW1wb3J0X2NvbmZpZ3VyYXRpb25fd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ2ZTRlMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvd2l6YmFuL2ltcG9ydF9jb25maWd1cmF0aW9uX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvd2l6YmFuL25ld19zZXJ2ZXJfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy93aXpiYW4vbmV3X3NlcnZlcl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGRlOTFmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy93aXpiYW4vbmV3X3NlcnZlcl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL3dpemJhbi9wdWJfcmVzb3VyY2Vfc2VydmVyX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvd2l6YmFuL3B1Yl9yZXNvdXJjZV9zZXJ2ZXJfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc0ZDYxYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvd2l6YmFuL3B1Yl9yZXNvdXJjZV9zZXJ2ZXJfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy93aXpiYW4vc2VsZWN0X2NsaWVudF93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL3dpemJhbi9zZWxlY3RfY2xpZW50X3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViMTNkYjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL2ljb25zL3dpemJhbi9zZWxlY3RfY2xpZW50X3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvaWNvbnMvd2l6YmFuL3NlbGVjdF9zZXJ2ZXJfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy93aXpiYW4vc2VsZWN0X3NlcnZlcl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTlkYWRiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9pY29ucy93aXpiYW4vc2VsZWN0X3NlcnZlcl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzA5NmU1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wbHVnaW5OYW1lPVNlcnZlciBVSQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLWV4dGVuc2lvblBvaW50RWRpdG9yUGFnZXM9RWRpdG9yIFBhZ2VzCi1leHRlbnNpb25Qb2ludEVkaXRvclBhZ2VTZWN0aW9ucz1FZGl0b3IgUGFnZSBTZWN0aW9ucwotZXh0ZW5zaW9uUG9pbnRFZGl0b3JBY3Rpb25zPUVkaXRvciBBY3Rpb25zCi1leHRlbnNpb25Qb2ludFNlcnZlckltYWdlcz1TZXJ2ZXIgSW1hZ2VzCi1leHRlbnNpb25Qb2ludFdpemFyZEZyYWdtZW50cz1XaXphcmQgRnJhZ21lbnRzCi1leHRlbnNpb25Qb2ludEluaXRpYWxTZWxlY3Rpb25Qcm92aWRlcj1Jbml0aWFsIFNlbGVjdGlvbiBQcm92aWRlcgotZXh0ZW5zaW9uUG9pbnRBdWRpbz1BdWRpbwotCi0jIC0tLS0tLS0tLS0tLS0tLSBXaXphcmRzIGFuZCBWaWV3cyAtLS0tLS0tLS0tLS0tLS0KLQotY2F0ZWdvcnk9U2VydmVyCi1uZXdTZXJ2ZXI9U2VydmVyCi1uZXdTZXJ2ZXJEZXNjcmlwdGlvbj1EZWZpbmUgYSBuZXcgc2VydmVyCi0KLXZpZXdTZXJ2ZXJzPVNlcnZlcnMKLQotIyAtLS0tLS0tLS0tLS0tLS0gQWN0aW9uIFNldHMgKHRvb2xiYXIgaWNvbiBncm91cHMpIC0tLS0tLS0tLS0tLS0tLQotCi0jIFNlcnZlcnMgYWN0aW9uIHNldAotYWN0aW9uU2V0VGl0bGU9U2VydmVyCi1hY3Rpb25TZXROZXdTZXJ2ZXI9Q3JlYXRlIFNlcnZlcgotCi0jIFJ1biBvbiBTZXJ2ZXIgYWN0aW9ucwotYWN0aW9uUnVuT25TZXJ2ZXI9UnVuIG9uIFNlcnZlcgotYWN0aW9uRGVidWdPblNlcnZlcj1EZWJ1ZyBvbiBTZXJ2ZXIKLWFjdGlvblByb2ZpbGVPblNlcnZlcj1Qcm9maWxlIG9uIFNlcnZlcgotCi0jIC0tLS0tLS0tLS0tLS0tLSBQcmVmZXJlbmNlcyAtLS0tLS0tLS0tLS0tLS0KLQotcHJlZmVyZW5jZVNlcnZlcnNUaXRsZT1TZXJ2ZXIKLXByZWZlcmVuY2VSdW50aW1lc1RpdGxlPUluc3RhbGxlZCBSdW50aW1lcwotcHJlZmVyZW5jZVNlcnZlcktleXdvcmRzPXNlcnZlcnMgcnVudGltZSBlbnZpcm9ubWVudCBidWlsZCBpbnN0YWxsZWQgcHVibGlzaGluZyBkZXBsb3kgYXNzZW1ibHkKLQotIyBQcm9qZWN0IHByb3BlcnRpZXMgcHJlZmVyZW5jZXMKLXByb3BlcnRpZXNTZXJ2ZXI9U2VydmVyCi0KLSMgLS0tLS0tLS0tLS0tLS0tIEVkaXRvciAtLS0tLS0tLS0tLS0tLS0KLQotc2VydmVyRWRpdG9yPVNlcnZlciBFZGl0b3IKLXNlcnZlckVkaXRvck92ZXJ2aWV3UGFnZT1PdmVydmlldwotCi0jIC0tLS0tLS0tLS0tLS0tLSBBdWRpbyAtLS0tLS0tLS0tLS0tLS0KLQotZXh0ZW5zaW9uUG9pbnRBdWRpbz1BdWRpbwotCi1hdWRpb1ByZWZlcmVuY2VUaXRsZT1BdWRpbwotcHJlZmVyZW5jZUF1ZGlvS2V5d29yZHM9c291bmQgdm9sdW1lCi0KLWxhdW5jaGFibGVXZWJCcm93c2VyPVdlYiBicm93c2VyCi1sYXVuY2hhYmxlV2ViQnJvd3NlckRlc2NyaXB0aW9uPU9wZW4gdGhlIFJlc291cmNlIGluIGEgV2ViIEJyb3dzZXIKLQotYXVkaW9DYXRlZ29yeVNlcnZlcj1TZXJ2ZXIKLWF1ZGlvU2VydmVyU3RhcnRlZD1TZXJ2ZXIgU3RhcnRlZAotYXVkaW9TZXJ2ZXJTdG9wcGVkPVNlcnZlciBTdG9wcGVkCi0KLWF1ZGlvQ2F0ZWdvcnlQdWJsaXNoPVB1Ymxpc2hpbmcKLWF1ZGlvUHVibGlzaEZpbmlzaGVkPVB1Ymxpc2ggRmluaXNoZWQKLQotbW9uaXRvckxhYmVsPVRDUC9JUCBtb25pdG9yCi1tb25pdG9yRGVzY3JpcHRpb249VXNlcyB0aGUgaW50ZXJuYWwgVENQL0lQIG1vbml0b3IgdG8gbW9uaXRvciBzZXJ2ZXIgcmVxdWVzdHMuCi0KLSMgLS0tLS0tLS0tLS0tLS0tIEFjdGlvbiBTZXRzICh0b29sYmFyIGljb24gZ3JvdXBzKSAtLS0tLS0tLS0tLS0tLS0KLQotIyBXZWIgQnJvd3NlciBhY3Rpb24gc2V0Ci1hY3Rpb25TZXRXZWJCcm93c2VyVGl0bGU9V2ViIEJyb3dzZXIKLWFjdGlvblNldE9wZW5XZWJCcm93c2VyPU9wZW4gV2ViIEJyb3dzZXIKLWFjdGlvblNldFN3aXRjaEJyb3dzZXI9V2ViIEJyb3dzZXIKLQotIyAtLS0tLS0tLS0tLS0tLS0gUHJlZmVyZW5jZXMgLS0tLS0tLS0tLS0tLS0tCi0KLSMgTmFtZSBvZiB0aGUgcHJlZmVyZW5jZSBwYWdlcwotcHJlZmVyZW5jZUludGVybmV0VGl0bGU9SW50ZXJuZXQKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9wbHVnaW4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyY2VjNDAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLQotPHBsdWdpbj4KLSAgPGV4dGVuc2lvbi1wb2ludCBpZD0iZWRpdG9yUGFnZXMiIG5hbWU9IiVleHRlbnNpb25Qb2ludEVkaXRvclBhZ2VzIiBzY2hlbWE9InNjaGVtYS9lZGl0b3JQYWdlcy5leHNkIi8+Ci0gIDxleHRlbnNpb24tcG9pbnQgaWQ9ImVkaXRvclBhZ2VTZWN0aW9ucyIgbmFtZT0iJWV4dGVuc2lvblBvaW50RWRpdG9yUGFnZVNlY3Rpb25zIiBzY2hlbWE9InNjaGVtYS9lZGl0b3JQYWdlU2VjdGlvbnMuZXhzZCIvPgotICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJlZGl0b3JBY3Rpb25zIiBuYW1lPSIlZXh0ZW5zaW9uUG9pbnRFZGl0b3JBY3Rpb25zIiBzY2hlbWE9InNjaGVtYS9lZGl0b3JBY3Rpb25zLmV4c2QiLz4KLSAgPGV4dGVuc2lvbi1wb2ludCBpZD0ic2VydmVySW1hZ2VzIiBuYW1lPSIlZXh0ZW5zaW9uUG9pbnRTZXJ2ZXJJbWFnZXMiIHNjaGVtYT0ic2NoZW1hL3NlcnZlckltYWdlcy5leHNkIi8+Ci0gIDxleHRlbnNpb24tcG9pbnQgaWQ9IndpemFyZEZyYWdtZW50cyIgbmFtZT0iJWV4dGVuc2lvblBvaW50V2l6YXJkRnJhZ21lbnRzIiBzY2hlbWE9InNjaGVtYS93aXphcmRGcmFnbWVudHMuZXhzZCIvPgotICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJpbml0aWFsU2VsZWN0aW9uUHJvdmlkZXIiIG5hbWU9IiVleHRlbnNpb25Qb2ludEluaXRpYWxTZWxlY3Rpb25Qcm92aWRlciIgc2NoZW1hPSJzY2hlbWEvaW5pdGlhbFNlbGVjdGlvblByb3ZpZGVyLmV4c2QiLz4KLSAgPGV4dGVuc2lvbi1wb2ludCBpZD0iYXVkaW8iIG5hbWU9IiVleHRlbnNpb25Qb2ludEF1ZGlvIiBzY2hlbWE9InNjaGVtYS9hdWRpby5leHNkIi8+Ci0KLTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm5ld1dpemFyZHMiPgotICA8Y2F0ZWdvcnkKLSAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aSIKLSAgICBuYW1lPSIlY2F0ZWdvcnkiLz4KLQotICA8d2l6YXJkCi0gICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5uZXcuc2VydmVyIgotICAgICAgbmFtZT0iJW5ld1NlcnZlciIKLSAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZC5OZXdTZXJ2ZXJXaXphcmQiCi0gICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aSIKLSAgICAgIGljb249Imljb25zL2N0b29sMTYvd2l6X25ld19zZXJ2ZXIuZ2lmIj4KLSAgICA8ZGVzY3JpcHRpb24+JW5ld1NlcnZlckRlc2NyaXB0aW9uPC9kZXNjcmlwdGlvbj4KLSAgPC93aXphcmQ+Ci08L2V4dGVuc2lvbj4KLQotPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkudmlld3MiPiAKLSAgPGNhdGVnb3J5Ci0gICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkiCi0gICAgbmFtZT0iJWNhdGVnb3J5Ii8+Ci0KLSAgPHZpZXcKLSAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5TZXJ2ZXJzVmlldyIKLSAgICBuYW1lPSIldmlld1NlcnZlcnMiCi0gICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkiCi0gICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlldy5zZXJ2ZXJzLlNlcnZlcnNWaWV3IgotICAgIGljb249Imljb25zL2N2aWV3MTYvc2VydmVyc192aWV3LmdpZiIvPgotPC9leHRlbnNpb24+Ci0KLTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnBlcnNwZWN0aXZlRXh0ZW5zaW9ucyI+Ci0gIDxwZXJzcGVjdGl2ZUV4dGVuc2lvbgotICAgIHRhcmdldElEPSJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5EZWJ1Z1BlcnNwZWN0aXZlIj4KLSAgICA8dmlldwotICAgICAgcmVsYXRpdmU9Im9yZy5lY2xpcHNlLmRlYnVnLnVpLkRlYnVnVmlldyIKLSAgICAgIHJlbGF0aW9uc2hpcD0ic3RhY2siCi0gICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5TZXJ2ZXJzVmlldyI+Ci0gICAgPC92aWV3PgotICA8L3BlcnNwZWN0aXZlRXh0ZW5zaW9uPgotPC9leHRlbnNpb24+Ci0KLTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcyI+Ci0gIDxwYWdlCi0gICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkucHJlZmVyZW5jZVBhZ2UiCi0gICAgbmFtZT0iJXByZWZlcmVuY2VTZXJ2ZXJzVGl0bGUiCi0gICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuU2VydmVyUHJlZmVyZW5jZVBhZ2UiPgotICAgICAgPGtleXdvcmRSZWZlcmVuY2UgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJlZmVyZW5jZUtleXdvcmRzIi8+Ci0gIDwvcGFnZT4KLSAgPHBhZ2UKLSAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5ydW50aW1lLnByZWZlcmVuY2VQYWdlIgotICAgIG5hbWU9IiVwcmVmZXJlbmNlUnVudGltZXNUaXRsZSIKLSAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5wcmVmZXJlbmNlUGFnZSIKLSAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5SdW50aW1lUHJlZmVyZW5jZVBhZ2UiPgotICAgICAgPGtleXdvcmRSZWZlcmVuY2UgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJlZmVyZW5jZUtleXdvcmRzIi8+Ci0gIDwvcGFnZT4KLSAgPHBhZ2UKLSAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmF1ZGlvLnByZWZlcmVuY2VQYWdlIgotICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLnByZWZlcmVuY2VQYWdlIgotICAgIG5hbWU9IiVhdWRpb1ByZWZlcmVuY2VUaXRsZSIKLSAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5hdWRpby5BdWRpb1ByZWZlcmVuY2VQYWdlIj4KLSAgICAgIDxrZXl3b3JkUmVmZXJlbmNlIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmF1ZGlvLnByZWZlcmVuY2VLZXl3b3JkcyIvPgotICA8L3BhZ2U+Ci0gIDxwYWdlCi0gICAgaWQ9Im9yZy5lY2xpcHNlLmludGVybmV0IgotICAgIG5hbWU9IiVwcmVmZXJlbmNlSW50ZXJuZXRUaXRsZSIKLSAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53ZWJicm93c2VyLkludGVybmV0UHJlZmVyZW5jZVBhZ2UiLz4KLTwvZXh0ZW5zaW9uPgotCi08ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5rZXl3b3JkcyI+Ci0gIDxrZXl3b3JkCi0gICAgbGFiZWw9IiVwcmVmZXJlbmNlU2VydmVyS2V5d29yZHMiCi0gICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIucHJlZmVyZW5jZUtleXdvcmRzIi8+Ci0gIDxrZXl3b3JkCi0gICAgbGFiZWw9IiVwcmVmZXJlbmNlQXVkaW9LZXl3b3JkcyIKLSAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5hdWRpby5wcmVmZXJlbmNlS2V5d29yZHMiLz4KLTwvZXh0ZW5zaW9uPgotCi08ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzIj4KLSAgPGVkaXRvciBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5lZGl0b3IiCi0gICAgbmFtZT0iJXNlcnZlckVkaXRvciIKLSAgICBpY29uPSJpY29ucy9vYmoxNi9zZXJ2ZXIuZ2lmIgotICAgIGV4dGVuc2lvbnM9InNlcnZlciIKLSAgICBkZWZhdWx0PSJ0cnVlIgotICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmVkaXRvci5TZXJ2ZXJFZGl0b3IiCi0gICAgY29udHJpYnV0b3JDbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5lZGl0b3IuU2VydmVyRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IiLz4KLTwvZXh0ZW5zaW9uPgotCi08ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5lbGVtZW50RmFjdG9yaWVzIj4KLSAgPGZhY3RvcnkgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuZWRpdG9yLmlucHV0LmZhY3RvcnkiCi0gICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuZWRpdG9yLlNlcnZlckVkaXRvcklucHV0RmFjdG9yeSIvPgotPC9leHRlbnNpb24+Ci0KLTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByb3BlcnR5UGFnZXMiPgotICA8cGFnZQotICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLnByb2plY3QucHJvcGVydGllcyIKLSAgICBuYW1lPSIlcHJvcGVydGllc1NlcnZlciIKLSAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiCi0gICAgYWRhcHRhYmxlPSJ0cnVlIgotICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlByb2plY3RQcm9wZXJ0eVBhZ2UiPgotPCEtLSAgICA8ZmlsdGVyIG5hbWU9ImlzUnVubmFibGUiIHZhbHVlPSJ0cnVlIi8+IC0tPgotICA8L3BhZ2U+Ci08L2V4dGVuc2lvbj4KLQotPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuYWN0aW9uU2V0cyI+Ci0gIDxhY3Rpb25TZXQKLSAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5uZXcuYWN0aW9uU2V0IgotICAgIGxhYmVsPSIlYWN0aW9uU2V0VGl0bGUiCi0gICAgdmlzaWJsZT0iZmFsc2UiPgotICAgIDxhY3Rpb24KLSAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmFjdGlvbi5uZXcuc2VydmVyIgotICAgICAgdG9vbGJhclBhdGg9InNlcnZlcnMiCi0gICAgICBsYWJlbD0iJWFjdGlvblNldE5ld1NlcnZlciIKLSAgICAgIHRvb2x0aXA9IiVhY3Rpb25TZXROZXdTZXJ2ZXIiCi0gICAgICBpY29uPSJpY29ucy9jdG9vbDE2L3dpel9uZXdfc2VydmVyLmdpZiIKLSAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmFjdGlvbnMuTmV3U2VydmVyQWN0aW9uIi8+Ci0gIDwvYWN0aW9uU2V0PgotPC9leHRlbnNpb24+Ci0KLTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmRlYnVnLnVpLmxhdW5jaFNob3J0Y3V0cyI+Ci0gICA8c2hvcnRjdXQgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIubGF1bmNoU2hvcnRjdXQiCi0gICAgICBsYWJlbD0iJWFjdGlvblJ1bk9uU2VydmVyIgotICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuU2VydmVyTGF1bmNoU2hvcnRjdXQiCi0gICAgICBtb2Rlcz0icnVuLCBkZWJ1ZywgcHJvZmlsZSIKLSAgICAgIHBhdGg9ImFhIgotICAgICAgaWNvbj0iaWNvbnMvZXRvb2wxNi9ydW5fb25fc2VydmVyLmdpZiI+Ci0gICAgICA8Y29udGV4dHVhbExhdW5jaD4KLSAgICAgICAgPGVuYWJsZW1lbnQ+Ci0gICAgICAgICAgIDx3aXRoIHZhcmlhYmxlPSJzZWxlY3Rpb24iPgotICAgICAgICAgICAgIDxjb3VudCB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgIDxpdGVyYXRlPgotICAgICAgICAgICAgICAgIDx0ZXN0IHByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmlzUnVubmFibGUiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgPC9pdGVyYXRlPgotICAgICAgICAgICA8L3dpdGg+Ci0gICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgICAKLSAgICAgICAgPGNvbnRleHRMYWJlbAotICAgICAgICAgICBtb2RlPSJydW4iCi0gICAgICAgICAgIGxhYmVsPSIlYWN0aW9uUnVuT25TZXJ2ZXIiLz4KLSAgICAgICAgPGNvbnRleHRMYWJlbAotICAgICAgICAgICBtb2RlPSJkZWJ1ZyIKLSAgICAgICAgICAgbGFiZWw9IiVhY3Rpb25EZWJ1Z09uU2VydmVyIi8+Ci0gICAgICAgIDxjb250ZXh0TGFiZWwKLSAgICAgICAgICAgbW9kZT0icHJvZmlsZSIKLSAgICAgICAgICAgbGFiZWw9IiVhY3Rpb25Qcm9maWxlT25TZXJ2ZXIiLz4KLSAgICAgIDwvY29udGV4dHVhbExhdW5jaD4KLSAgICA8cGVyc3BlY3RpdmUgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkucGVyc3BlY3RpdmUiLz4KLSAgICA8cGVyc3BlY3RpdmUgaWQ9Im9yZy5lY2xpcHNlLmpkdC51aS5KYXZhUGVyc3BlY3RpdmUiLz4KLSAgICA8cGVyc3BlY3RpdmUgaWQ9Im9yZy5lY2xpcHNlLmpkdC51aS5KYXZhSGllcmFyY2h5UGVyc3BlY3RpdmUiLz4KLSAgICA8cGVyc3BlY3RpdmUgaWQ9Im9yZy5lY2xpcHNlLmpkdC51aS5KYXZhQnJvd3NpbmdQZXJzcGVjdGl2ZSIvPgotICAgIDxwZXJzcGVjdGl2ZSBpZD0ib3JnLmVjbGlwc2UuZGVidWcudWkuRGVidWdQZXJzcGVjdGl2ZSIvPgotICAgIDxwZXJzcGVjdGl2ZSBpZD0iY29tLmlibS5ldG9vbHMuajJlZS5KMkVFUGVyc3BlY3RpdmUiLz4KLSAgICA8cGVyc3BlY3RpdmUgaWQ9Im9yZy5lY2xpcHNlLnVpLnJlc291cmNlUGVyc3BlY3RpdmUiLz4KLSAgIDwvc2hvcnRjdXQ+Ci08L2V4dGVuc2lvbj4KLQotPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5wcm9wZXJ0eVRlc3RlcnMiPgotICAgPHByb3BlcnR5VGVzdGVyCi0gICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5wcm9wZXJ0eVRlc3RlciIKLSAgICAgIG5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aSIKLSAgICAgIHByb3BlcnRpZXM9ImlzUnVubmFibGUiCi0gICAgICB0eXBlPSJqYXZhLmxhbmcuT2JqZWN0IgotICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuU2VydmVyUHJvcGVydHlUZXN0ZXIiPgotICAgPC9wcm9wZXJ0eVRlc3Rlcj4KLSAgIDxwcm9wZXJ0eVRlc3RlcgotICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkucHJvcGVydHlUZXN0ZXIiCi0gICAgICBuYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkiCi0gICAgICBwcm9wZXJ0aWVzPSJzZXJ2ZXJUeXBlIgotICAgICAgdHlwZT0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXIiCi0gICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5TZXJ2ZXJQcm9wZXJ0eVRlc3RlciI+Ci0gICA8L3Byb3BlcnR5VGVzdGVyPgotPC9leHRlbnNpb24+Ci0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5lZGl0b3JQYWdlcyI+Ci0gICAgIDxwYWdlCi0gICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmVkaXRvci5vdmVydmlldyIKLSAgICAgICAgb3JkZXI9Ii0xMDAwMCIKLSAgICAgICAgbmFtZT0iJXNlcnZlckVkaXRvck92ZXJ2aWV3UGFnZSIKLSAgICAgICAgdHlwZUlkcz0iKiIKLSAgICAgICAgaW5zZXJ0aW9uSWRzPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmVkaXRvci5vdmVydmlldy5sZWZ0LCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmVkaXRvci5vdmVydmlldy5yaWdodCIKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuZWRpdG9yLk92ZXJ2aWV3RWRpdG9yUGFydCIvPgotICA8L2V4dGVuc2lvbj4KLQotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuYWRhcHRlcnMiPgotICAgIDxmYWN0b3J5Ci0gICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5TZXJ2ZXJBZGFwdGVyRmFjdG9yeSIKLSAgICAgIGFkYXB0YWJsZVR5cGU9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyIj4KLSAgICAgIDxhZGFwdGVyIHR5cGU9Im9yZy5lY2xpcHNlLnVpLklBY3Rpb25GaWx0ZXIiLz4KLSAgICA8L2ZhY3Rvcnk+Ci0gIDwvZXh0ZW5zaW9uPgotCi08ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuY2xpZW50cyI+Ci0gIDxjbGllbnQKLSAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53ZWIiCi0gICAgbmFtZT0iJWxhdW5jaGFibGVXZWJCcm93c2VyIgotICAgIGRlc2NyaXB0aW9uPSIlbGF1bmNoYWJsZVdlYkJyb3dzZXJEZXNjcmlwdGlvbiIKLSAgICBsYXVuY2hhYmxlPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudXRpbC5IdHRwTGF1bmNoYWJsZSIKLSAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5XZWJMYXVuY2hhYmxlQ2xpZW50Ii8+Ci08L2V4dGVuc2lvbj4KLQotPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkucGVyc3BlY3RpdmVFeHRlbnNpb25zIj4KLSAgPHBlcnNwZWN0aXZlRXh0ZW5zaW9uCi0gICAgdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkucGVyc3BlY3RpdmUiPgotICAgIDxhY3Rpb25TZXQgaWQ9Im9yZy5lY2xpcHNlLndzdC53ZWJicm93c2VyLmFjdGlvblNldCIvPgotICA8L3BlcnNwZWN0aXZlRXh0ZW5zaW9uPgotPC9leHRlbnNpb24+Ci0KLTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbFN0YXJ0dXAiPgotICA8c3RhcnR1cAotICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLnN0YXJ0dXAiCi0gICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuU3RhcnR1cCIvPgotPC9leHRlbnNpb24+Ci0KLTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuYXVkaW8iPgotICA8Y2F0ZWdvcnkgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuc291bmQuc2VydmVyIgotICAgIG5hbWU9IiVhdWRpb0NhdGVnb3J5U2VydmVyIi8+Ci0gIDxzb3VuZCBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5zb3VuZC5zZXJ2ZXJTdGFydCIKLSAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5zb3VuZC5zZXJ2ZXIiCi0gICAgbmFtZT0iJWF1ZGlvU2VydmVyU3RhcnRlZCIvPgotICA8c291bmQgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuc291bmQuc2VydmVyU3RvcCIKLSAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5zb3VuZC5zZXJ2ZXIiCi0gICAgbmFtZT0iJWF1ZGlvU2VydmVyU3RvcHBlZCIvPgotICA8Y2F0ZWdvcnkgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuc291bmQucHVibGlzaCIKLSAgICBuYW1lPSIlYXVkaW9DYXRlZ29yeVB1Ymxpc2giLz4KLSAgPHNvdW5kIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnNvdW5kLnB1Ymxpc2hGaW5pc2hlZCIKLSAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5zb3VuZC5wdWJsaXNoIgotICAgIG5hbWU9IiVhdWRpb1B1Ymxpc2hGaW5pc2hlZCIvPgotPC9leHRlbnNpb24+Ci0KLTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbFNlcnZlck1vbml0b3JzIj4KLSAgPG1vbml0b3IKLSAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5tb25pdG9yIgotICAgIG5hbWU9IiVtb25pdG9yTGFiZWwiCi0gICAgZGVzY3JpcHRpb249IiVtb25pdG9yRGVzY3JpcHRpb24iCi0gICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuRGVmYXVsdE1vbml0b3JEZWxlZ2F0ZSIvPgotPC9leHRlbnNpb24+Ci0KLTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmFjdGlvblNldHMiPgotICA8YWN0aW9uU2V0Ci0gICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2ViYnJvd3Nlci5hY3Rpb25TZXQiCi0gICAgbGFiZWw9IiVhY3Rpb25TZXRXZWJCcm93c2VyVGl0bGUiCi0gICAgdmlzaWJsZT0idHJ1ZSI+Ci0gICAgPGFjdGlvbgotICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2ViYnJvd3Nlci5hY3Rpb24ub3BlbiIKLSAgICAgIHRvb2xiYXJQYXRoPSJicm93c2VyIgotICAgICAgbGFiZWw9IiVhY3Rpb25TZXRPcGVuV2ViQnJvd3NlciIKLSAgICAgIHRvb2x0aXA9IiVhY3Rpb25TZXRPcGVuV2ViQnJvd3NlciIKLSAgICAgIGljb249Imljb25zL29iajE2L2ludGVybmFsX2Jyb3dzZXIuZ2lmIgotICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2ViYnJvd3Nlci5PcGVuQnJvd3NlcldvcmtiZW5jaEFjdGlvbiIvPgotICAgIDxhY3Rpb24KLSAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndlYmJyb3dzZXIuYWN0aW9uLnN3aXRjaCIKLSAgICAgIG1lbnViYXJQYXRoPSJ3aW5kb3cvYnJvd3NlciIKLSAgICAgIGxhYmVsPSIlYWN0aW9uU2V0U3dpdGNoQnJvd3NlciIKLSAgICAgIHRvb2x0aXA9IiVhY3Rpb25TZXRTd2l0Y2hCcm93c2VyIgotICAgICAgc3R5bGU9InB1bGxkb3duIgotICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2ViYnJvd3Nlci5Td2l0Y2hCcm93c2VyV29ya2JlbmNoQWN0aW9uIi8+Ci0gIDwvYWN0aW9uU2V0PgotPC9leHRlbnNpb24+Ci0KLTwhLS0KLTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmRlYnVnLnVpLmxhdW5jaEdyb3VwcyI+Ci0gIDxsYXVuY2hHcm91cAotICAgICBsYWJlbD0iJUV4dGVybmFsVG9vbHNMYXVuY2hHcm91cC5sYWJlbCIKLSAgICAgYmFubmVySW1hZ2U9Imljb25zL2Z1bGwvd2l6YmFuL2V4dF90b29sc193aXouZ2lmIgotICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scyIKLSAgICAgaW1hZ2U9Imljb25zL2Z1bGwvb2JqMTYvZXh0ZXJuYWxfdG9vbHMuZ2lmIgotICAgICBtb2RlPSJydW4iCi0gICAgIGlkPSJvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLmxhdW5jaEdyb3VwIgotICAgICB0aXRsZT0iJUV4dGVybmFsVG9vbHNMYXVuY2hHcm91cC50aXRsZSI+Ci0gIDwvbGF1bmNoR3JvdXA+Ci0gIDxsYXVuY2hHcm91cAotICAgICBsYWJlbD0iJUV4dGVybmFsVG9vbHNMYXVuY2hHcm91cC5sYWJlbCIKLSAgICAgYmFubmVySW1hZ2U9Imljb25zL2Z1bGwvd2l6YmFuL2V4dF90b29sc193aXouZ2lmIgotICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5idWlsZGVyIgotICAgICBpbWFnZT0iaWNvbnMvZnVsbC9vYmoxNi9leHRlcm5hbF90b29scy5naWYiCi0gICAgIHB1YmxpYz0iZmFsc2UiCi0gICAgIG1vZGU9InJ1biIKLSAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMubGF1bmNoR3JvdXAuYnVpbGRlciI+Ci0gICA8L2xhdW5jaEdyb3VwPgotPC9leHRlbnNpb24+Ci0tLT4KLQotPCEtLSBjb21tYW5kcyBhbmQgdGhlaXIgYmluZGluZ3MKLU5PVEU6Ci1NMSA9IENUUkwvQ09NTUFORAotTTIgPSBTSElGVAotTTMgPSBBTFQKLU00ID0gUGxhdGZvcm0tc3BlY2lmaWMgZm91cnRoIGtleQotLS0+Ci08ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5jb21tYW5kcyI+Ci0gIDxjb21tYW5kCi0gICAgbmFtZT0iJWFjdGlvbkRlYnVnT25TZXJ2ZXIiCi0gICAgZGVzY3JpcHRpb249IiVhY3Rpb25EZWJ1Z09uU2VydmVyIgotICAgIGNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLmRlYnVnLnVpLmNhdGVnb3J5LnJ1biIKLSAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5sYXVuY2hTaG9ydGN1dC5kZWJ1ZyI+Ci0gIDwvY29tbWFuZD4KLSAgPGNvbW1hbmQKLSAgICBuYW1lPSIlYWN0aW9uUnVuT25TZXJ2ZXIiCi0gICAgZGVzY3JpcHRpb249IiVhY3Rpb25SdW5PblNlcnZlciIKLSAgICBjYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5jYXRlZ29yeS5ydW4iCi0gICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIubGF1bmNoU2hvcnRjdXQucnVuIj4KLSAgPC9jb21tYW5kPgotICA8Y29tbWFuZAotICAgIG5hbWU9IiVhY3Rpb25Qcm9maWxlT25TZXJ2ZXIiCi0gICAgZGVzY3JpcHRpb249IiVhY3Rpb25Qcm9maWxlT25TZXJ2ZXIiCi0gICAgY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UuZGVidWcudWkuY2F0ZWdvcnkucnVuIgotICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmxhdW5jaFNob3J0Y3V0LnByb2ZpbGUiPgotICA8L2NvbW1hbmQ+Ci08L2V4dGVuc2lvbj4KLQotPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuYmluZGluZ3MiPgotICA8a2V5Ci0gICAgc2VxdWVuY2U9Ik0zK00yK0QgUiIKLSAgICBjb250ZXh0SWQ9Im9yZy5lY2xpcHNlLnVpLmdsb2JhbFNjb3BlIgotICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5sYXVuY2hTaG9ydGN1dC5kZWJ1ZyIKLSAgICBzY2hlbWVJZD0ib3JnLmVjbGlwc2UudWkuZGVmYXVsdEFjY2VsZXJhdG9yQ29uZmlndXJhdGlvbiIvPgotICA8a2V5Ci0gICAgc2VxdWVuY2U9Ik0zK00yK1ggUiIKLSAgICBjb250ZXh0SWQ9Im9yZy5lY2xpcHNlLnVpLmdsb2JhbFNjb3BlIgotICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5sYXVuY2hTaG9ydGN1dC5ydW4iCi0gICAgc2NoZW1lSWQ9Im9yZy5lY2xpcHNlLnVpLmRlZmF1bHRBY2NlbGVyYXRvckNvbmZpZ3VyYXRpb24iLz4KLSAgPGtleQotICAgIHNlcXVlbmNlPSJNMytNMitQIFIiCi0gICAgY29udGV4dElkPSJvcmcuZWNsaXBzZS51aS5nbG9iYWxTY29wZSIKLSAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIubGF1bmNoU2hvcnRjdXQucHJvZmlsZSIKLSAgICBzY2hlbWVJZD0ib3JnLmVjbGlwc2UudWkuZGVmYXVsdEFjY2VsZXJhdG9yQ29uZmlndXJhdGlvbiIvPgotPC9leHRlbnNpb24+Ci0KLTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuc2VydmVySW1hZ2VzIj4KLSAgPGltYWdlCi0gICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLndlYiIKLSAgICAgdHlwZUlkcz0id3N0LndlYiIKLSAgICAgaWNvbj0iaWNvbnMvb2JqMTYvd2ViX21vZHVsZS5naWYiLz4KLTwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2NoZW1hL2F1ZGlvLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2NoZW1hL2F1ZGlvLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkMzM3NmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NjaGVtYS9hdWRpby5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkiIGlkPSJhdWRpbyIgbmFtZT0iQXVkaW8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgcHJvdmlkZXMgYSB3YXkgdG8gc29ydCBydW50aW1lIHR5cGVzLCBydW50aW1lcywgc2VydmVyIHR5cGVzLCBhbmQgc2VydmVycy4gVGhlIGZpcnN0IGV4dGVuc2lvbiBmb3VuZCBpcyBhbHdheXMgdXNlZCBhbmQgaXQgaXMgZXhwZWN0ZWQgdGhhdCBvbmx5IG9uZSBjb21wYXJhdG9yIGV4aXN0cyBpbiBhbiBpbnN0YWxsYXRpb24uCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8Y2hvaWNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJjYXRlZ29yeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJzb3VuZCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJjYXRlZ29yeSI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCBsYWJlbEF0dHJpYnV0ZT0ibmFtZSIvPgotICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0ic291bmQiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjYXRlZ29yeSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLiZsdDsvYiZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGEgc29ydGVyIGV4dGVuc2lvbiBwb2ludDoKLQotJmx0O3ByZSZndDsKLSAgICZsdDtleHRlbnNpb24gCi0gICAgICAgICBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLnNvcnRlciZxdW90OyZndDsKLSAgICAgICZsdDtpbWFnZQotICAgICAgICAgICAgaWQ9JnF1b3Q7Y29tLmV4YW1wbGUmcXVvdDsKLSAgICAgICAgICAgIGNsYXNzPSZxdW90O2NvbS5leGFtcGxlLnJ1bnRpbWUuTXlDb21wYXJhdG9yJnF1b3Q7LyZndDsKLSAgICZsdDsvZXh0ZW5zaW9uJmd0OwotJmx0Oy9wcmUmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0gICAKLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NjaGVtYS9lZGl0b3JBY3Rpb25zLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2NoZW1hL2VkaXRvckFjdGlvbnMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGVhMmY0YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2NoZW1hL2VkaXRvckFjdGlvbnMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/Pg0KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+DQotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkiPg0KLTxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkiIGlkPSJlZGl0b3JBY3Rpb25zIiBuYW1lPSJFZGl0b3IgQWN0aW9ucyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBwcm92aWRlcyBhIHdheSB0byBhZGQgYWN0aW9ucyB0byB0aGUgdG9vbGJhciBvZiBhbiBleGlzdGluZyBzZXJ2ZXIgZWRpdG9yLg0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGluY2x1ZGUgc2NoZW1hTG9jYXRpb249InNjaGVtYTovL29yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMvc2NoZW1hL2V4cHJlc3Npb25MYW5ndWFnZS5leHNkIi8+DQotDQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZWRpdG9yQWN0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+DQotICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJlZGl0b3JBY3Rpb24iPg0KLSAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgbGFiZWxBdHRyaWJ1dGU9Im5hbWUiLz4NCi0gICAgICAgICA8L2FwcEluZm8+DQotICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJlbmFibGVtZW50Ii8+DQotICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIHNwZWNpZmllcyBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIGV4dGVuc2lvbiBwb2ludA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBKYXZhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyAmbHQ7c2FtcCZndDtvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLlNlcnZlckVkaXRvckFjdGlvbkZhY3RvcnlEZWxlZ2F0ZSZsdDsvc2FtcCZndDsuDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLlNlcnZlckVkaXRvckFjdGlvbkZhY3RvcnlEZWxlZ2F0ZSIvPg0KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0eXBlSWRzIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICA8YXBwSW5mbz4NCi0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+DQotICAgICAgICAgICAgICAgPC9hcHBJbmZvPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im9yZGVyIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLiZsdDsvYiZndDsNCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGFuIGVkaXRvciBhY3Rpb24gZXh0ZW5zaW9uIHBvaW50Og0KLQ0KLSZsdDtwcmUmZ3Q7DQotICAgJmx0O2V4dGVuc2lvbg0KLSAgICAgICAgIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuZWRpdG9yQWN0aW9ucyZxdW90OyZndDsNCi0gICAgICAmbHQ7cGFnZQ0KLSAgICAgICAgICAgIGlkPSZxdW90O2NvbS5leGFtcGxlJnF1b3Q7DQotICAgICAgICAgICAgb3JkZXI9JnF1b3Q7MjAmcXVvdDsNCi0gICAgICAgICAgICBuYW1lPSZxdW90OyVlZGl0b3JBY3Rpb24mcXVvdDsNCi0gICAgICAgICAgICB0eXBlSWRzPSZxdW90O2NvbS5leGFtcGxlLiomcXVvdDsNCi0gICAgICAgICAgICBjbGFzcz0mcXVvdDtjb20uZXhhbXBsZS5FeGFtcGxlRWRpdG9yQWN0aW9uJnF1b3Q7LyZndDsNCi0gICAmbHQ7L2V4dGVuc2lvbiZndDsNCi0mbHQ7L3ByZSZndDsNCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0Ow0KLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgDQotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIA0KLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IA0KLSZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi08L3NjaGVtYT4NCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2NoZW1hL2VkaXRvclBhZ2VTZWN0aW9ucy5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NjaGVtYS9lZGl0b3JQYWdlU2VjdGlvbnMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk4YjI5NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2NoZW1hL2VkaXRvclBhZ2VTZWN0aW9ucy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+DQotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4NCi08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aSI+DQotPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aSIgaWQ9ImVkaXRvclBhZ2VTZWN0aW9ucyIgbmFtZT0iRWRpdG9yIFBhZ2UgU2VjdGlvbnMiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgcHJvdmlkZXMgYSB3YXkgdG8gYWRkIGFkZGl0aW9uYWwgc2VjdGlvbnMgaW50byBhbiBleGlzdGluZyBzZXJ2ZXIgZWRpdG9yIHBhZ2UgdGhhdCBjb250YWlucyBpbnNlcnRpb24gcG9pbnRzLg0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGluY2x1ZGUgc2NoZW1hTG9jYXRpb249InNjaGVtYTovL29yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMvc2NoZW1hL2V4cHJlc3Npb25MYW5ndWFnZS5leHNkIi8+DQotDQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPGNob2ljZT4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InNlY3Rpb24iLz4NCi0gICAgICAgICA8L2Nob2ljZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJzZWN0aW9uIj4NCi0gICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICA8YXBwSW5mbz4NCi0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IGxhYmVsQXR0cmlidXRlPSJuYW1lIi8+DQotICAgICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZW5hYmxlbWVudCIvPg0KLSAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBleHRlbnNpb24gcG9pbnQNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgSmF2YSBjbGFzcyB0aGF0IGltcGxlbWVudHMgJmx0O3NhbXAmZ3Q7b3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5lZGl0b3IuSVNlcnZlckVkaXRvclNlY3Rpb24mbHQ7L3NhbXAmZ3Q7Lg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICA8YXBwSW5mbz4NCi0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5lZGl0b3IuSVNlcnZlckVkaXRvclNlY3Rpb24iLz4NCi0gICAgICAgICAgICAgICA8L2FwcEluZm8+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idHlwZUlkcyIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ib3JkZXIiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Imluc2VydGlvbklkIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAxLjANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGFuIGVkaXRvciBwYWdlIHNlY3Rpb24gZXh0ZW5zaW9uIHBvaW50Og0KLQ0KLSZsdDtwcmUmZ3Q7DQotICAgJmx0O2V4dGVuc2lvbiANCi0gICAgICAgICBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmVkaXRvclBhZ2VTZWN0aW9ucyZxdW90OyZndDsNCi0gICAgICAmbHQ7c2VjdGlvbg0KLSAgICAgICAgICAgIGlkPSZxdW90O2NvbS5leGFtcGxlJnF1b3Q7DQotICAgICAgICAgICAgb3JkZXI9JnF1b3Q7MCZxdW90Ow0KLSAgICAgICAgICAgIGluc2VydGlvbklkPSZxdW90O2NvbS5leGFtcGxlLmxlZnQmcXVvdDsNCi0gICAgICAgICAgICB0eXBlSWRzPSZxdW90O2NvbS5leGFtcGxlLiomcXVvdDsNCi0gICAgICAgICAgICBjbGFzcz0mcXVvdDtjb20uZXhhbXBsZS5FeGFtcGxlRWRpdG9yU2VjdGlvbkZhY3RvcnkmcXVvdDsvJmd0Ow0KLSAgICZsdDsvZXh0ZW5zaW9uJmd0Ow0KLSZsdDsvcHJlJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgJmx0O2ImZ3Q7Y2xhc3MmbHQ7L2ImZ3Q7IG11c3QgYmUgYSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhIEphdmEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSBpbnRlcmZhY2UgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5lZGl0b3IuU2VydmVyRWRpdG9yUGFnZVNlY3Rpb25GYWN0b3J5RGVsZWdhdGUmbHQ7L2NvZGUmZ3Q7Lg0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotICAgDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7DQotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSANCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgDQotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgDQotJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsNCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLTwvc2NoZW1hPg0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zY2hlbWEvZWRpdG9yUGFnZXMuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zY2hlbWEvZWRpdG9yUGFnZXMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTYxNjQyYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2NoZW1hL2VkaXRvclBhZ2VzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCi08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPg0KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpIj4NCi08YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpIiBpZD0iZWRpdG9yUGFnZXMiIG5hbWU9IkVkaXRvciBQYWdlcyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBwcm92aWRlcyBhIHdheSB0byBhZGQgYW4gYWRkaXRpb25hbCBwYWdlIHRvIGEgc2VydmVyIG9yIHNlcnZlciBjb25maWd1cmF0aW9uIGVkaXRvci4NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxpbmNsdWRlIHNjaGVtYUxvY2F0aW9uPSJzY2hlbWE6Ly9vcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zL3NjaGVtYS9leHByZXNzaW9uTGFuZ3VhZ2UuZXhzZCIvPg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxjaG9pY2U+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJwYWdlIi8+DQotICAgICAgICAgPC9jaG9pY2U+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50DQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGVsZW1lbnQgbmFtZT0icGFnZSI+DQotICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgPGFwcEluZm8+DQotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCBsYWJlbEF0dHJpYnV0ZT0ibmFtZSIvPg0KLSAgICAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8L2Fubm90YXRpb24+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImVuYWJsZW1lbnQiLz4NCi0gICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgZXh0ZW5zaW9uIHBvaW50DQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIHNwZWNpZmllcyB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIEphdmEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzICZsdDtzYW1wJmd0O29yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0Jmx0Oy9zYW1wJmd0Oy4NCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgPGFwcEluZm8+DQotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0Ii8+DQotICAgICAgICAgICAgICAgPC9hcHBJbmZvPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4NCi0gICAgICAgICAgICAgICA8L2FwcEluZm8+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idHlwZUlkcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ib3JkZXIiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Imluc2VydGlvbklkcyIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgMS4wDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiBhbiBlZGl0b3IgcGFnZSBleHRlbnNpb24gcG9pbnQ6DQotDQotJmx0O3ByZSZndDsNCi0gICAmbHQ7ZXh0ZW5zaW9uDQotICAgICAgICAgcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5lZGl0b3JQYWdlcyZxdW90OyZndDsNCi0gICAgICAmbHQ7cGFnZQ0KLSAgICAgICAgICAgIGlkPSZxdW90O2NvbS5leGFtcGxlJnF1b3Q7DQotICAgICAgICAgICAgb3JkZXI9JnF1b3Q7MjAmcXVvdDsNCi0gICAgICAgICAgICBuYW1lPSZxdW90OyVlZGl0b3JQYWdlJnF1b3Q7DQotICAgICAgICAgICAgdHlwZUlkcz0mcXVvdDtjb20uZXhhbXBsZS4qJnF1b3Q7DQotICAgICAgICAgICAgY2xhc3M9JnF1b3Q7Y29tLmV4YW1wbGUuRXhhbXBsZUVkaXRvckZhY3RvcnkmcXVvdDsvJmd0Ow0KLSAgICZsdDsvZXh0ZW5zaW9uJmd0Ow0KLSZsdDsvcHJlJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgJmx0O2ImZ3Q7Y2xhc3MmbHQ7L2ImZ3Q7IG11c3QgYmUgYSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhIEphdmEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSBpbnRlcmZhY2UgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5lZGl0b3IuU2VydmVyRWRpdG9yUGFydEZhY3RvcnlEZWxlZ2F0ZSZsdDsvY29kZSZndDsuDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0gICANCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsNCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIA0KLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyANCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCANCi0mbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotPC9zY2hlbWE+DQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NjaGVtYS9pbml0aWFsU2VsZWN0aW9uUHJvdmlkZXIuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zY2hlbWEvaW5pdGlhbFNlbGVjdGlvblByb3ZpZGVyLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0OTRlMWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NjaGVtYS9pbml0aWFsU2VsZWN0aW9uUHJvdmlkZXIuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpIiBpZD0iaW5pdGlhbFNlbGVjdGlvblByb3ZpZGVyIiBuYW1lPSJJbml0aWFsIFNlbGVjdGlvbiBQcm92aWRlciIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBwcm92aWRlcyBhIHdheSB0byBpbml0aWFsbHkgc2VsZWN0IHJ1bnRpbWUgdHlwZXMsIHJ1bnRpbWVzLCBzZXJ2ZXIgdHlwZXMsIGFuZCBzZXJ2ZXJzIGluIHRoZSBzZXJ2ZXIgd2l6YXJkcy4gVGhlIGZpcnN0IGV4dGVuc2lvbiBmb3VuZCBpcyBhbHdheXMgdXNlZCBhbmQgaXQgaXMgZXhwZWN0ZWQgdGhhdCBvbmx5IG9uZSBpbml0aWFsU2VsZWN0aW9uUHJvdmlkZXIgZXhpc3RzIGluIGFuIGluc3RhbGxhdGlvbi4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ic2VsZWN0aW9uUHJvdmlkZXIiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJzZWxlY3Rpb25Qcm92aWRlciI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCBsYWJlbEF0dHJpYnV0ZT0ibmFtZSIvPgotICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgSmF2YSBjbGFzcyB0aGF0IGV4dGVuZHMgJmx0O3NhbXAmZ3Q7b3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3ZXJzLkluaXRpYWxTZWxlY3Rpb25Qcm92aWRlciZsdDsvc2FtcCZndDsuIFRoZSBjbGFzcyBtdXN0IGhhdmUgYSBwdWJsaWMgMC1hcmcgY29uc3RydWN0b3IuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuJmx0Oy9iJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgdGhlIGV4dGVuc2lvbiBwb2ludDoKLQotJmx0O3ByZSZndDsKLSAgICZsdDtleHRlbnNpb24gCi0gICAgICAgICBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmluaXRpYWxTZWxlY3Rpb25Qcm92aWRlciZxdW90OyZndDsKLSAgICAgICZsdDtzZWxlY3Rpb25Qcm92aWRlcgotICAgICAgICAgICAgaWQ9JnF1b3Q7Y29tLmV4YW1wbGUmcXVvdDsKLSAgICAgICAgICAgIGNsYXNzPSZxdW90O2NvbS5leGFtcGxlLnJ1bnRpbWUuTXlTZWxlY3Rpb25Qcm92aWRlciZxdW90Oy8mZ3Q7Ci0gICAmbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotICAgCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0mbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zY2hlbWEvc2VydmVySW1hZ2VzLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2NoZW1hL3NlcnZlckltYWdlcy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OGIyZjk1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zY2hlbWEvc2VydmVySW1hZ2VzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCi08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPg0KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpIj4NCi08YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpIiBpZD0ic2VydmVySW1hZ2VzIiBuYW1lPSJTZXJ2ZXIgSW1hZ2VzIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IHByb3ZpZGVzIGEgd2F5IHRvIHByb3ZpZGUgYW4gaW1hZ2UgZm9yIGEgcnVudGltZSwgc2VydmVyLCBzZXJ2ZXIgY29uZmlndXJhdGlvbiBvciBtb2R1bGUgdHlwZS4NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxjaG9pY2U+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJpbWFnZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPg0KLSAgICAgICAgIDwvY2hvaWNlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9ImltYWdlIj4NCi0gICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICA8YXBwSW5mbz4NCi0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IGxhYmVsQXR0cmlidXRlPSJuYW1lIi8+DQotICAgICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBleHRlbnNpb24gcG9pbnQNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWNvbiIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgPGFwcEluZm8+DQotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9InJlc291cmNlIi8+DQotICAgICAgICAgICAgICAgPC9hcHBJbmZvPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InR5cGVJZHMiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIDEuMA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgYSBzZXJ2ZXIgaW1hZ2UgZXh0ZW5zaW9uIHBvaW50Og0KLQ0KLSZsdDtwcmUmZ3Q7DQotICAgJmx0O2V4dGVuc2lvbiANCi0gICAgICAgICBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLnNlcnZlckltYWdlcyZxdW90OyZndDsNCi0gICAgICAmbHQ7aW1hZ2UNCi0gICAgICAgICAgICBpZD0mcXVvdDtjb20uZXhhbXBsZSZxdW90Ow0KLSAgICAgICAgICAgIGljb249JnF1b3Q7aWNvbnMvb2JqMTYvcnVudGltZS5naWYmcXVvdDsNCi0gICAgICAgICAgICB0eXBlSWRzPSZxdW90O2NvbS5leGFtcGxlLnJ1bnRpbWUmcXVvdDsvJmd0Ow0KLSAgICZsdDsvZXh0ZW5zaW9uJmd0Ow0KLSZsdDsvcHJlJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotICAgDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7DQotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSANCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgDQotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgDQotJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsNCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLTwvc2NoZW1hPg0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zY2hlbWEvd2l6YXJkRnJhZ21lbnRzLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2NoZW1hL3dpemFyZEZyYWdtZW50cy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWEyNzM0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zY2hlbWEvd2l6YXJkRnJhZ21lbnRzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCi08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPg0KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpIj4NCi08YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpIiBpZD0id2l6YXJkRnJhZ21lbnRzIiBuYW1lPSJXaXphcmQgRnJhZ21lbnRzIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IHByb3ZpZGVzIGEgd2F5IHRvIGFkZCBwYWdlcyBvciBsb2dpYyBpbnRvIHdpemFyZHMgZm9yIGEgc3BlY2lmaWMgcnVudGltZSwgc2VydmVyLCBvciBzZXJ2ZXIgY29uZmlndXJhdGlvbiB0eXBlLg0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZnJhZ21lbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4NCi0gICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9ImZyYWdtZW50Ij4NCi0gICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICA8YXBwSW5mbz4NCi0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IGxhYmVsQXR0cmlidXRlPSJuYW1lIi8+DQotICAgICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBleHRlbnNpb24gcG9pbnQNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgSmF2YSBjbGFzcyB0aGF0IGltcGxlbWVudHMgJmx0O3NhbXAmZ3Q7b3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuV2l6YXJkRnJhZ21lbnQmbHQ7L3NhbXAmZ3Q7Lg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICA8YXBwSW5mbz4NCi0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuV2l6YXJkRnJhZ21lbnQiLz4NCi0gICAgICAgICAgICAgICA8L2FwcEluZm8+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idHlwZUlkcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgMS4wDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiBhIHdpemFyZCBmcmFnbWVudCBleHRlbnNpb24gcG9pbnQ6DQotDQotJmx0O3ByZSZndDsNCi0gICAmbHQ7ZXh0ZW5zaW9uIA0KLSAgICAgICAgIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkud2l6YXJkRnJhZ21lbnRzJnF1b3Q7Jmd0Ow0KLSAgICAgICZsdDtmcmFnbWVudA0KLSAgICAgICAgICAgIGlkPSZxdW90O2NvbS5leGFtcGxlJnF1b3Q7DQotICAgICAgICAgICAgdHlwZUlkcz0mcXVvdDtjb20uZXhhbXBsZS5ydW50aW1lJnF1b3Q7DQotICAgICAgICAgICAgY2xhc3M9JnF1b3Q7Y29tLmV4YW1wbGUuRXhhbXBsZVdpemFyZEZyYWdtZW50JnF1b3Q7LyZndDsNCi0gICAmbHQ7L2V4dGVuc2lvbiZndDsNCi0mbHQ7L3ByZSZndDsNCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBWYWx1ZSBvZiB0aGUgYXR0cmlidXRlICZsdDtiJmd0O2NsYXNzJmx0Oy9iJmd0OyBtdXN0IGJlIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBKYXZhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgaW50ZXJmYWNlICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkud2l6YXJkLldpemFyZEZyYWdtZW50Jmx0Oy9jb2RlJmd0Oy4NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLSAgIA0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0Ow0KLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgDQotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIA0KLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IA0KLSZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi08L3NjaGVtYT4NCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9TZXJ2ZXJMYXVuY2hDb25maWd1cmF0aW9uVGFiLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9TZXJ2ZXJMYXVuY2hDb25maWd1cmF0aW9uVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3NzczM2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvU2VydmVyTGF1bmNoQ29uZmlndXJhdGlvblRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5BYnN0cmFjdExhdW5jaENvbmZpZ3VyYXRpb25UYWI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLio7Ci0vKioKLSAqIFNlcnZlciBsYXVuY2ggY29uZmlndXJhdGlvbiB0YWIuCi0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFNlcnZlckxhdW5jaENvbmZpZ3VyYXRpb25UYWIgZXh0ZW5kcyBBYnN0cmFjdExhdW5jaENvbmZpZ3VyYXRpb25UYWIgewotCXByaXZhdGUgU3RyaW5nW10gc2VydmVyVHlwZUlkczsKLQotCXByaXZhdGUgQ29tYm8gc2VydmVyQ29tYm87Ci0KLQlwcml2YXRlIExhYmVsIHJ1bnRpbWVMYWJlbDsKLQlwcml2YXRlIExhYmVsIGhvc3RuYW1lOwotCi0JcHJpdmF0ZSBJU2VydmVyIHNlcnZlcjsKLQotCS8vIGxpc3Qgb2Ygc2VydmVycyB0aGF0IGFyZSBpbiBjb21ibwotCXByaXZhdGUgTGlzdCBzZXJ2ZXJzOwotCi0JLy8gZmxhZyB0byBiZSB1c2VkIHRvIGRlY2lkZSB3aGV0aGVyIHRvIGVuYWJsZSBjb21ibyBpbiBsYXVuY2ggY29uZmlnIGRpYWxvZwotCS8vIGFmdGVyIHRoZSB1c2VyIHJlcXVlc3RzIGEgbGF1bmNoLCB0aGV5IGNhbm5vdCBjaGFuZ2UgaXQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVBRF9PTkxZID0gInJlYWQtb25seSI7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgc2VydmVyIGxhdW5jaCBjb25maWd1cmF0aW9uIHRhYi4KLQkgKi8KLQlwdWJsaWMgU2VydmVyTGF1bmNoQ29uZmlndXJhdGlvblRhYigpIHsKLQkJdGhpcyhuZXcgU3RyaW5nW10geyIqIn0pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBzZXJ2ZXIgbGF1bmNoIGNvbmZpZ3VyYXRpb24gdGFiIHdpdGggdGhlIGdpdmVuIHNlcnZlciB0eXBlIGlkcy4KLQkgKiAKLQkgKiBAcGFyYW0gc2VydmVyVHlwZUlkcyBhbiBhcnJheSBvZiBzZXJ2ZXIgdHlwZSBpZHMKLQkgKi8KLQlwdWJsaWMgU2VydmVyTGF1bmNoQ29uZmlndXJhdGlvblRhYihTdHJpbmdbXSBzZXJ2ZXJUeXBlSWRzKSB7Ci0JCXRoaXMuc2VydmVyVHlwZUlkcyA9IHNlcnZlclR5cGVJZHM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5JTGF1bmNoQ29uZmlndXJhdGlvblRhYiNjcmVhdGVDb250cm9sKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gNTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDU7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCi0JCS8vR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQkvL2RhdGEud2lkdGhIaW50ID0gMjAwOwotCQkvL2NvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULldSQVApOwotCQlsYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLnNlcnZlckxhdW5jaERlc2NyaXB0aW9uKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0JCWRhdGEud2lkdGhIaW50ID0gMzAwOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkKLQkJbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoTWVzc2FnZXMuc2VydmVyTGF1bmNoU2VydmVyKTsKLQkJc2VydmVyQ29tYm8gPSBuZXcgQ29tYm8oY29tcG9zaXRlLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUiB8IFNXVC5SRUFEX09OTFkpOwotCQlzZXJ2ZXJDb21iby5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJc2VydmVyQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQl3aWRnZXRTZWxlY3RlZChlKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQloYW5kbGVTZXJ2ZXJTZWxlY3Rpb24oKTsKLQkJCX0KLQkJfSk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoc2VydmVyQ29tYm8sIENvbnRleHRJZHMuTEFVTkNIX0NPTkZJR1VSQVRJT05fU0VSVkVSX0NPTUJPKTsKLQotCQlsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChNZXNzYWdlcy5zZXJ2ZXJMYXVuY2hSdW50aW1lKTsKLQkJcnVudGltZUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlydW50aW1lTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCQotCQlsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChNZXNzYWdlcy5zZXJ2ZXJMYXVuY2hIb3N0KTsKLQkJaG9zdG5hbWUgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWhvc3RuYW1lLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkKLQkJLy8gaW5pdGlhbGl6ZQotCQlJU2VydmVyW10gc2VydmVyczIgPSBTZXJ2ZXJDb3JlLmdldFNlcnZlcnMoKTsKLQkJc2VydmVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKHNlcnZlcnMyICE9IG51bGwpIHsKLQkJCWludCBzaXplID0gc2VydmVyczIubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlJU2VydmVyIHNlcnZlcjIgPSBzZXJ2ZXJzMltpXTsKLQkJCQlpZiAoc2VydmVyMi5nZXRTZXJ2ZXJUeXBlKCkgIT0gbnVsbCAmJiBpc1N1cHBvcnRlZFNlcnZlcihzZXJ2ZXIyLmdldFNlcnZlclR5cGUoKS5nZXRJZCgpKSkgewotCQkJCQlzZXJ2ZXJDb21iby5hZGQoc2VydmVyMi5nZXROYW1lKCkpOwotCQkJCQlzZXJ2ZXJzLmFkZChzZXJ2ZXIyKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBzZWxlY3QgZmlyc3QgaXRlbSBpbiBsaXN0Ci0JCWlmIChzZXJ2ZXJDb21iby5nZXRJdGVtQ291bnQoKSA+IDApCi0JCQlzZXJ2ZXJDb21iby5zZWxlY3QoMCk7Ci0KLQkJaGFuZGxlU2VydmVyU2VsZWN0aW9uKCk7Ci0KLQkJc2VydmVyQ29tYm8uZm9yY2VGb2N1cygpOwotCi0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQoY29tcG9zaXRlKTsKLQkJc2V0Q29udHJvbChjb21wb3NpdGUpOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gaXNTdXBwb3J0ZWRTZXJ2ZXIoU3RyaW5nIHNlcnZlclR5cGVJZCkgewotCQlpZiAoc2VydmVyVHlwZUlkcyA9PSBudWxsKQotCQkJcmV0dXJuIHRydWU7Ci0JCWludCBzaXplID0gc2VydmVyVHlwZUlkcy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlpZiAobWF0Y2hlcyhzZXJ2ZXJUeXBlSWQsIHNlcnZlclR5cGVJZHNbaV0pKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBtYXRjaGVzKFN0cmluZyBhLCBTdHJpbmcgYikgewotCQlpZiAoYSA9PSBudWxsIHx8IGIgPT0gbnVsbCB8fCAiKiIuZXF1YWxzKGEpIHx8ICIqIi5lcXVhbHMoYikgfHwgYS5zdGFydHNXaXRoKGIpIHx8IGIuc3RhcnRzV2l0aChhKSkKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIENhbGxlZCB3aGVuIGEgc2VydmVyIGlzIHNlbGVjdGVkLgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgY2FsbGVkIGRpcmVjdGx5LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVNlcnZlclNlbGVjdGlvbigpIHsKLQkJaWYgKHNlcnZlcnMuaXNFbXB0eSgpKQotCQkJc2VydmVyID0gbnVsbDsKLQkJZWxzZQotCQkJc2VydmVyID0gKElTZXJ2ZXIpIHNlcnZlcnMuZ2V0KHNlcnZlckNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkpOwotCQlJUnVudGltZSBydW50aW1lID0gbnVsbDsKLQkJaWYgKHNlcnZlciAhPSBudWxsKSB7Ci0JCQlydW50aW1lID0gc2VydmVyLmdldFJ1bnRpbWUoKTsKLQkJCWhvc3RuYW1lLnNldFRleHQoc2VydmVyLmdldEhvc3QoKSk7Ci0JCX0gZWxzZQotCQkJaG9zdG5hbWUuc2V0VGV4dCgiIik7Ci0JCQotCQlpZiAocnVudGltZSAhPSBudWxsKQotCQkJcnVudGltZUxhYmVsLnNldFRleHQocnVudGltZS5nZXROYW1lKCkpOwotCQllbHNlCi0JCQlydW50aW1lTGFiZWwuc2V0VGV4dCgiIik7Ci0KLQkJaWYgKHNlcnZlciA9PSBudWxsKQotCQkJc2V0RXJyb3JNZXNzYWdlKE1lc3NhZ2VzLmVycm9yTm9TZXJ2ZXJTZWxlY3RlZCk7Ci0JCWVsc2UgaWYgKHNlcnZlci5nZXRTZXJ2ZXJTdGF0ZSgpICE9IElTZXJ2ZXIuU1RBVEVfU1RPUFBFRCkKLQkJCXNldEVycm9yTWVzc2FnZShNZXNzYWdlcy5lcnJvclNlcnZlckFscmVhZHlSdW5uaW5nKTsKLQkJZWxzZQotCQkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCQkvKmlmIChzZXJ2ZXIgIT0gbnVsbCkgewotCQkgc2VydmVyLnNldExhdW5jaERlZmF1bHRzKGNvbmZpZ3VyYXRpb24pOwotCQkgfSovCi0JCXVwZGF0ZUxhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2coKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLnVpLklMYXVuY2hDb25maWd1cmF0aW9uVGFiI3NldERlZmF1bHRzKElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdHMoSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBjb25maWd1cmF0aW9uKSB7Ci0JCXNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJaWYgKHNlcnZlckNvbWJvICE9IG51bGwpIHsJCi0JCQlzZXJ2ZXJDb21iby5zZXRFbmFibGVkKHRydWUpOwotCQkJaWYgKHNlcnZlckNvbWJvLmdldEl0ZW1Db3VudCgpID4gMCkKLQkJCQlzZXJ2ZXJDb21iby5zZWxlY3QoMCk7Ci0JCX0KLQkJCi0JCWlmIChzZXJ2ZXJzICE9IG51bGwpIHsKLQkJCXNlcnZlciA9IChJU2VydmVyKSBzZXJ2ZXJzLmdldChzZXJ2ZXJDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLQkJCWlmIChzZXJ2ZXIgIT0gbnVsbCkKLQkJCQkoKFNlcnZlcikgc2VydmVyKS5zZXR1cExhdW5jaENvbmZpZ3VyYXRpb24oY29uZmlndXJhdGlvbiwgbnVsbCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLnVpLklMYXVuY2hDb25maWd1cmF0aW9uVGFiI2luaXRpYWxpemVGcm9tKElMYXVuY2hDb25maWd1cmF0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHsKLQkJc2VydmVyQ29tYm8uc2V0RW5hYmxlZCh0cnVlKTsKLQkJLy9yZW1vdmUgZXJyb3IgbWVzc2FnZSB0aGF0IG90aGVyIGluc3RhbmNlcyBtYXkgaGF2ZSBzZXQKLQkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCi0JCXRyeSB7Ci0JCQlTdHJpbmcgc2VydmVySWQgPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShTZXJ2ZXIuQVRUUl9TRVJWRVJfSUQsICIiKTsKLQkJCWlmIChzZXJ2ZXJJZCAhPSBudWxsICYmICFzZXJ2ZXJJZC5lcXVhbHMoIiIpKSB7Ci0JCQkJc2VydmVyID0gU2VydmVyQ29yZS5maW5kU2VydmVyKHNlcnZlcklkKTsKLQotCQkJCWlmIChzZXJ2ZXIgPT0gbnVsbCkgeyAvL3NlcnZlciBubyBsb25nZXIgZXhpc3RzCQkJCQotCQkJCQlzZXRFcnJvck1lc3NhZ2UoTWVzc2FnZXMuZXJyb3JJbnZhbGlkU2VydmVyKTsKLQkJCQkJLy9zZXJ2ZXJDb21iby5jbGVhclNlbGVjdGlvbigpOyAgLy9hcHBlYXJzIHRvIGJlIGJyb2tlbi4uLmRvZXNuJ3Qgd29yayB3aXRoIHJlYWQgb25seT8JCQkJCQkJCQkJCQkKLQkJCQkJc2VydmVyQ29tYm8uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0KLQkJCQlzZXJ2ZXJDb21iby5zZXRUZXh0KHNlcnZlci5nZXROYW1lKCkpOwotCQkJCWlmIChzZXJ2ZXIuZ2V0U2VydmVyU3RhdGUoKSAhPSBJU2VydmVyLlNUQVRFX1NUT1BQRUQpCi0JCQkJCXNldEVycm9yTWVzc2FnZShNZXNzYWdlcy5lcnJvclNlcnZlckFscmVhZHlSdW5uaW5nKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKHNlcnZlckNvbWJvLmdldEl0ZW1Db3VudCgpID4gMCkKLQkJCQkJc2VydmVyQ29tYm8uc2VsZWN0KDApOwotCQkJfQotCQkJLy9mbGFnIHNob3VsZCBvbmx5IGJlIHNldCBpZiBsYXVuY2ggaGFzIGJlZW4gYXR0ZW1wdGVkIG9uIHRoZSBjb25maWcKLQkJCWlmIChjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShSRUFEX09OTFksIGZhbHNlKSkKLQkJCQlzZXJ2ZXJDb21iby5zZXRFbmFibGVkKGZhbHNlKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcudWkuSUxhdW5jaENvbmZpZ3VyYXRpb25UYWIjcGVyZm9ybUFwcGx5KElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkpCi0JICovCi0JcHVibGljIHZvaWQgcGVyZm9ybUFwcGx5KElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29uZmlndXJhdGlvbikgewotCQlpZiAoc2VydmVyICE9IG51bGwpCi0JCQljb25maWd1cmF0aW9uLnNldEF0dHJpYnV0ZShTZXJ2ZXIuQVRUUl9TRVJWRVJfSUQsIHNlcnZlci5nZXRJZCgpKTsKLQkJZWxzZQotCQkJY29uZmlndXJhdGlvbi5zZXRBdHRyaWJ1dGUoU2VydmVyLkFUVFJfU0VSVkVSX0lELCAoU3RyaW5nKW51bGwpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcudWkuSUxhdW5jaENvbmZpZ3VyYXRpb25UYWIjaXNWYWxpZChJTGF1bmNoQ29uZmlndXJhdGlvbikgCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNWYWxpZChJTGF1bmNoQ29uZmlndXJhdGlvbiBsYXVuY2hDb25maWcpIHsKLQkJdHJ5IHsKLQkJCVN0cmluZyBpZCA9IGxhdW5jaENvbmZpZy5nZXRBdHRyaWJ1dGUoU2VydmVyLkFUVFJfU0VSVkVSX0lELCAiIik7Ci0JCQlpZiAoaWQgIT0gbnVsbCAmJiAhaWQuZXF1YWxzKCIiKSkgewotCQkJCUlTZXJ2ZXIgc2VydmVyMiA9IFNlcnZlckNvcmUuZmluZFNlcnZlcihpZCk7Ci0JCQkJaWYgKHNlcnZlcjIgPT0gbnVsbCkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCWlmIChzZXJ2ZXIyLmdldFNlcnZlclN0YXRlKCkgPT0gSVNlcnZlci5TVEFURV9TVE9QUEVEKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5JTGF1bmNoQ29uZmlndXJhdGlvblRhYiNnZXRJbWFnZSgpCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlyZXR1cm4gSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZShJbWFnZVJlc291cmNlLklNR19TRVJWRVIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcudWkuSUxhdW5jaENvbmZpZ3VyYXRpb25UYWIjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gTWVzc2FnZXMuc2VydmVyTGF1bmNoQ29uZmlndXJhdGlvblRhYjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvU2VydmVyVUlDb3JlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9TZXJ2ZXJVSUNvcmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWExYmMwZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9TZXJ2ZXJVSUNvcmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlNlcnZlckxhYmVsUHJvdmlkZXI7Ci0vKioKLSAqIFNlcnZlciBVSSBjb3JlLgotICogCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJVSUNvcmUgewotCXByaXZhdGUgc3RhdGljIFNlcnZlckxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcjsKLQotCS8qKgotCSAqIFNlcnZlclVJQ29yZSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXByaXZhdGUgU2VydmVyVUlDb3JlKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBsYWJlbCBwcm92aWRlciB0aGF0IGNhbiBiZSB1c2VkIGZvciBhbGwgc2VydmVyCi0JICogb2JqZWN0cyBpbiB0aGUgVUkuCi0JICogCi0JICogQHJldHVybiBhIGxhYmVsIHByb3ZpZGVyCi0JICovCi0JcHVibGljIHN0YXRpYyBJTGFiZWxQcm92aWRlciBnZXRMYWJlbFByb3ZpZGVyKCkgewotCQlpZiAobGFiZWxQcm92aWRlciA9PSBudWxsKQotCQkJbGFiZWxQcm92aWRlciA9IG5ldyBTZXJ2ZXJMYWJlbFByb3ZpZGVyKCk7Ci0JCXJldHVybiBsYWJlbFByb3ZpZGVyOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9TZXJ2ZXJVSVV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL1NlcnZlclVJVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjdlYjg0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL1NlcnZlclVJVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi2gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5TZXJ2ZXJVSVBsdWdpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotLyoqCi0gKiBTZXJ2ZXIgVUkgdXRpbGl0eSBtZXRob2RzLgotICogCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJVSVV0aWwgewotCS8qKgotCSAqIFNlcnZlclVJVXRpbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXByaXZhdGUgU2VydmVyVUlVdGlsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIE9wZW4gdGhlIG5ldyBydW50aW1lIHdpemFyZC4KLQkgKiAKLQkgKiBAcGFyYW0gc2hlbGwgYSBzaGVsbCB0byB1c2Ugd2hlbiBjcmVhdGluZyB0aGUgd2l6YXJkCi0JICogQHBhcmFtIHR5cGUgdGhlIHR5cGUgb2YgbW9kdWxlIHRvIGNyZWF0ZSBhIHJ1bnRpbWUgZm9yCi0JICogQHBhcmFtIHZlcnNpb24gdGhlIHZlcnNpb24gb2YgbW9kdWxlIHRvIGNyZWF0ZSBhIHJ1bnRpbWUgZm9yCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhIHJ1bnRpbWUgd2FzIGNyZWF0ZWQsIG9yCi0JICogICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzaG93TmV3UnVudGltZVdpemFyZChTaGVsbCBzaGVsbCwgZmluYWwgU3RyaW5nIHR5cGUsIGZpbmFsIFN0cmluZyB2ZXJzaW9uKSB7Ci0JCXJldHVybiBTZXJ2ZXJVSVBsdWdpbi5zaG93TmV3UnVudGltZVdpemFyZChzaGVsbCwgdHlwZSwgdmVyc2lvbiwgbnVsbCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2VkaXRvci9JU2VydmVyRWRpdG9yUGFydElucHV0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9lZGl0b3IvSVNlcnZlckVkaXRvclBhcnRJbnB1dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTRjOWQ3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2VkaXRvci9JU2VydmVyRWRpdG9yUGFydElucHV0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuZWRpdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJXb3JraW5nQ29weTsKLS8qKgotICogQW4gaW5wdXQgaW50byBhIHNlcnZlciBwYXJ0IG9yIHNlY3Rpb24gZWRpdG9yLgotICoKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJU2VydmVyRWRpdG9yUGFydElucHV0IGV4dGVuZHMgSUVkaXRvcklucHV0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZXJ2ZXIgdG8gYmUgZWRpdGVkLgotCSAqCi0JICogQHJldHVybiBhIHdvcmtpbmcgY29weSBvZiB0aGUgc2VydmVyCi0JICovCi0JcHVibGljIElTZXJ2ZXJXb3JraW5nQ29weSBnZXRTZXJ2ZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc2VydmVyIGlzIHJlYWQtb25seS4KLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNlcnZlciBpcyByZWFkLW9ubHksCi0JICogICAgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NlcnZlclJlYWRPbmx5KCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvZWRpdG9yL1NlcnZlckVkaXRvclBhcnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2VkaXRvci9TZXJ2ZXJFZGl0b3JQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1MTZlMmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvZWRpdG9yL1NlcnZlckVkaXRvclBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuZWRpdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuSVVuZG9hYmxlT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1Ub29sa2l0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuZWRpdG9yLio7Ci0vKioKLSAqIEFuIGFic3RyYWN0IHNlcnZlciBlZGl0b3Igd2hpY2ggaW1wbGVtZW50cyB0aGUgbW9zdCBjb21tb24gbWV0aG9kcwotICogZnJvbSBJRWRpdG9yUGFydC4KLSAqIAotICogVGhpcyBjbGFzcyBhbHNvIHByb3ZpZGVzIGVhY2ggZWRpdG9yIHBhZ2Ugd2l0aCBhbiBlcnJvciBtZXNzYWdlIHdoaWNoCi0gKiB3aWxsIGJlIGRpc3BsYXllZCBvbiB0aGUgc3RhdHVzIGJhciBvZiB0aGUgZWRpdG9yLgotICogCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTZXJ2ZXJFZGl0b3JQYXJ0IGV4dGVuZHMgRWRpdG9yUGFydCB7Ci0JLyoqCi0JICogUHJvcGVydHkgY2hhbmdlIGlkIGZvciB0aGUgZXJyb3IgbWVzc2FnZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QX0VSUk9SID0gNTsKLQotCXByaXZhdGUgU3RyaW5nIGVycm9yTWVzc2FnZSA9IG51bGw7Ci0JcHJpdmF0ZSBNYXAgc2VjdGlvblRvSW5zZXJ0aW9uSWQgPSBudWxsOwotCXByaXZhdGUgTGlzdCBzZWN0aW9ucyA9IG51bGw7Ci0JcHJpdmF0ZSBTZXJ2ZXJSZXNvdXJjZUNvbW1hbmRNYW5hZ2VyIGNvbW1hbmRNYW5hZ2VyOwotCXByaXZhdGUgRm9ybVRvb2xraXQgdG9vbGtpdDsKLQkKLQkvKioKLQkgKiBUaGUgc2VydmVyIGN1cnJlbnRseSBiZWluZyBlZGl0ZWQuCi0JICovCi0JcHJvdGVjdGVkIElTZXJ2ZXJXb3JraW5nQ29weSBzZXJ2ZXI7Ci0JCi0JLyoqCi0JICogPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNlcnZlciBpcyByZWFkLW9ubHksIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiBvdGhlcndpc2UuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVhZE9ubHk7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgc2VydmVyIGVkaXRvciBwYXJ0LgotCSAqLwotCXB1YmxpYyBTZXJ2ZXJFZGl0b3JQYXJ0KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQjZG9TYXZlKElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgZG9TYXZlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydCNkb1NhdmVBcygpCi0JICovCi0JcHVibGljIHZvaWQgZG9TYXZlQXMoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0I2lzRGlydHkoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGlydHkoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0I2lzU2F2ZUFzQWxsb3dlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTYXZlQXNBbGxvd2VkKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogU2V0IGFuIGVycm9yIG1lc3NhZ2UgZm9yIHRoaXMgcGFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gZXJyb3IgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVycm9yTWVzc2FnZShTdHJpbmcgZXJyb3IpIHsKLQkJaWYgKGVycm9yID09IG51bGwgJiYgZXJyb3JNZXNzYWdlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQlpZiAoZXJyb3IgIT0gbnVsbCAmJiBlcnJvci5lcXVhbHMoZXJyb3JNZXNzYWdlKSkKLQkJCXJldHVybjsKLQkJCi0JCWVycm9yTWVzc2FnZSA9IGVycm9yOwotCQlzdXBlci5maXJlUHJvcGVydHlDaGFuZ2UoUFJPUF9FUlJPUik7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgZXJyb3IgbWVzc2FnZSBzaG93biBpbiB0aGUgZWRpdG9yLgotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZUVycm9yTWVzc2FnZSgpIHsKLQkJc3VwZXIuZmlyZVByb3BlcnR5Q2hhbmdlKFBST1BfRVJST1IpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgZXJyb3IgbWVzc2FnZSBmb3IgdGhpcyBwYWdlLgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlKCkgewotCQlpZiAoZXJyb3JNZXNzYWdlID09IG51bGwpIHsKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZ2V0U2VjdGlvbnMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCVNlcnZlckVkaXRvclNlY3Rpb24gc2VjdGlvbiA9IChTZXJ2ZXJFZGl0b3JTZWN0aW9uKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJU3RyaW5nIGVycm9yID0gc2VjdGlvbi5nZXRFcnJvck1lc3NhZ2UoKTsKLQkJCQlpZiAoZXJyb3IgIT0gbnVsbCkKLQkJCQkJcmV0dXJuIGVycm9yOwotCQkJfQotCQl9Ci0JCXJldHVybiBlcnJvck1lc3NhZ2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBlcnJvciBvciBzdGF0dXMgbWVzc2FnZXMgdGhhdCB3aWxsIGJlIGRpc3BsYXllZCB3aGVuIHRoZQotCSAqIHNlcnZlciByZXNvdXJjZSBpcyBzYXZlZC4gSWYgdGhlcmUgYXJlIGFueSBlcnJvciBtZXNzYWdlcywgdGhlCi0JICogdXNlciB3aWxsIGJlIHVuYWJsZSB0byBzYXZlIHRoZSBlZGl0b3IuCi0JICogCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cwotCSAqLwotCXB1YmxpYyBJU3RhdHVzW10gZ2V0U2F2ZVN0YXR1cygpIHsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBnZXRTZWN0aW9ucygpLml0ZXJhdG9yKCk7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJU2VydmVyRWRpdG9yU2VjdGlvbiBzZWN0aW9uID0gKFNlcnZlckVkaXRvclNlY3Rpb24pIGl0ZXJhdG9yLm5leHQoKTsKLQkJCUlTdGF0dXNbXSBzdGF0dXMgPSBzZWN0aW9uLmdldFNhdmVTdGF0dXMoKTsKLQkJCWlmIChzdGF0dXMgIT0gbnVsbCkgewotCQkJCWludCBzaXplID0gc3RhdHVzLmxlbmd0aDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLQkJCQkJbGlzdC5hZGQoc3RhdHVzW2ldKTsKLQkJCX0KLQkJfQotCQkKLQkJaW50IHNpemUgPSBsaXN0LnNpemUoKTsKLQkJSVN0YXR1c1tdIHN0YXR1cyA9IG5ldyBJU3RhdHVzW3NpemVdOwotCQlsaXN0LnRvQXJyYXkoc3RhdHVzKTsKLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0KLQlwcml2YXRlIExpc3QgZ2V0U2VjdGlvbnMoKSB7Ci0JCWlmIChzZWN0aW9ucyA9PSBudWxsKSB7Ci0JCQlzZWN0aW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCXNlY3Rpb25Ub0luc2VydGlvbklkID0gbmV3IEhhc2hNYXAoKTsKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gU2VydmVyRWRpdG9yQ29yZS5nZXRTZXJ2ZXJFZGl0b3JQYWdlU2VjdGlvbkZhY3RvcmllcygpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJSVNlcnZlckVkaXRvclBhZ2VTZWN0aW9uRmFjdG9yeSBmYWN0b3J5ID0gKElTZXJ2ZXJFZGl0b3JQYWdlU2VjdGlvbkZhY3RvcnkpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlTdHJpbmcgaW5zZXJ0aW9uSWQgPSBmYWN0b3J5LmdldEluc2VydGlvbklkKCk7Ci0JCQkJCi0JCQkJSVNlcnZlckVkaXRvclBhcnRGYWN0b3J5IHBhZ2VGYWN0b3J5ID0gU2VydmVyRWRpdG9yLmdldFBhZ2VGYWN0b3J5KHRoaXMpOwotCQkJCWlmIChwYWdlRmFjdG9yeS5zdXBwb3J0c0luc2VydGlvbklkKGluc2VydGlvbklkKSkgewotCQkJCQlTdHJpbmcgc2VydmVyVHlwZUlkID0gbnVsbDsKLQkJCQkJaWYgKHNlcnZlciAhPSBudWxsKSAKLQkJCQkJCXNlcnZlclR5cGVJZCA9IHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkuZ2V0SWQoKTsKLQkJCQkJaWYgKHNlcnZlclR5cGVJZCAhPSBudWxsICYmIGZhY3Rvcnkuc3VwcG9ydHNUeXBlKHNlcnZlclR5cGVJZCkKLQkJCQkJCQkmJiBmYWN0b3J5LnNob3VsZENyZWF0ZVNlY3Rpb24oc2VydmVyKSkgewotCQkJCQkJU2VydmVyRWRpdG9yU2VjdGlvbiBzZWN0aW9uID0gZmFjdG9yeS5jcmVhdGVTZWN0aW9uKCk7Ci0JCQkJCQlpZiAoc2VjdGlvbiAhPSBudWxsKSB7Ci0JCQkJCQkJc2VjdGlvbi5zZXRTZXJ2ZXJFZGl0b3JQYXJ0KHRoaXMpOwotCQkJCQkJCXNlY3Rpb25zLmFkZChzZWN0aW9uKTsKLQkJCQkJCQlMaXN0IGxpc3QgPSBudWxsOwotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCWxpc3QgPSAoTGlzdCkgc2VjdGlvblRvSW5zZXJ0aW9uSWQuZ2V0KGluc2VydGlvbklkKTsKLQkJCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCQkvLyBpZ25vcmUKLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKGxpc3QgPT0gbnVsbCkKLQkJCQkJCQkJbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCQlsaXN0LmFkZChzZWN0aW9uKTsKLQkJCQkJCQlzZWN0aW9uVG9JbnNlcnRpb25JZC5wdXQoaW5zZXJ0aW9uSWQsIGxpc3QpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBzZWN0aW9uczsKLQl9Ci0JCi0JcHJpdmF0ZSBMaXN0IGdldFNlY3Rpb25zKFN0cmluZyBpbnNlcnRpb25JZCkgewotCQlpZiAoaW5zZXJ0aW9uSWQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkKLQkJZ2V0U2VjdGlvbnMoKTsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQl0cnkgewotCQkJTGlzdCBzZWN0aW9uczIgPSAoTGlzdCkgc2VjdGlvblRvSW5zZXJ0aW9uSWQuZ2V0KGluc2VydGlvbklkKTsKLQkJCWlmIChzZWN0aW9uczIgIT0gbnVsbCkgewotCQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gc2VjdGlvbnMyLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQlsaXN0LmFkZChpdGVyYXRvci5uZXh0KCkpOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXNldFNpdGUoc2l0ZSk7Ci0JCXNldElucHV0KGlucHV0KTsKLQkJaWYgKGlucHV0IGluc3RhbmNlb2YgSVNlcnZlckVkaXRvclBhcnRJbnB1dCkgewotCQkJSVNlcnZlckVkaXRvclBhcnRJbnB1dCBzZXBpID0gKElTZXJ2ZXJFZGl0b3JQYXJ0SW5wdXQpIGlucHV0OwotCQkJc2VydmVyID0gc2VwaS5nZXRTZXJ2ZXIoKTsKLQkJCWNvbW1hbmRNYW5hZ2VyID0gKChTZXJ2ZXJFZGl0b3JQYXJ0SW5wdXQpIHNlcGkpLmdldFNlcnZlckNvbW1hbmRNYW5hZ2VyKCk7Ci0JCQlyZWFkT25seSA9IHNlcGkuaXNTZXJ2ZXJSZWFkT25seSgpOwotCQl9Ci0JCQotCQlJdGVyYXRvciBpdGVyYXRvciA9IGdldFNlY3Rpb25zKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJU2VydmVyRWRpdG9yU2VjdGlvbiBzZWN0aW9uID0gKFNlcnZlckVkaXRvclNlY3Rpb24pIGl0ZXJhdG9yLm5leHQoKTsKLQkJCXNlY3Rpb24uaW5pdChzaXRlLCBpbnB1dCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIGdpdmVuIG9wZXJhdGlvbiBhbmQgYWRkcyBpdCB0byB0aGUgb3BlcmF0aW9uIGhpc3RvcnkKLQkgKiB3aXRoIHRoZSBjb3JyZWN0IGNvbnRleHQuCi0JICogCi0JICogQHBhcmFtIG9wZXJhdGlvbiBhbiBvcGVyYXRpb24gcmVhZHkgdG8gYmUgZXhlY3V0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKElVbmRvYWJsZU9wZXJhdGlvbiBvcGVyYXRpb24pIHsKLQkJY29tbWFuZE1hbmFnZXIuZXhlY3V0ZShvcGVyYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2VydmVyIHRoYXQgaXMgYmVpbmcgZWRpdHRlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgc2VydmVyIHdvcmtpbmcgY29weQotCSAqLwotCXB1YmxpYyBJU2VydmVyV29ya2luZ0NvcHkgZ2V0U2VydmVyKCkgewotCQlyZXR1cm4gc2VydmVyOwotCX0KLQotCS8qKgotCSAqIEluc2VydHMgZWRpdG9yIHNlY3Rpb25zIGludG8gdGhlIGdpdmVuIGNvbXBvc2l0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50IHRoZSBjb21wb3NpdGUgdG8gYWRkIHRoZSBzZWN0aW9uKHMpIHRvCi0JICogQHBhcmFtIGlkIHRoZSBzZWN0aW9uIGluc2VydGlvbiBpZAotCSAqLwotCXB1YmxpYyB2b2lkIGluc2VydFNlY3Rpb25zKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBpZCkgewotCQlpZiAoaWQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZ2V0U2VjdGlvbnMoaWQpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVNlcnZlckVkaXRvclNlY3Rpb24gc2VjdGlvbiA9IChTZXJ2ZXJFZGl0b3JTZWN0aW9uKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlzZWN0aW9uLmNyZWF0ZVNlY3Rpb24ocGFyZW50KTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBEaXNwb3NlIG9mIHRoZSBlZGl0b3IuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZ2V0U2VjdGlvbnMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlTZXJ2ZXJFZGl0b3JTZWN0aW9uIHNlY3Rpb24gPSAoU2VydmVyRWRpdG9yU2VjdGlvbikgaXRlcmF0b3IubmV4dCgpOwotCQkJc2VjdGlvbi5kaXNwb3NlKCk7Ci0JCX0KLQkJCi0JCWlmICh0b29sa2l0ICE9IG51bGwpCi0JCQl0b29sa2l0LmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgYSBmb3JtIHRvb2xraXQgdG8gY3JlYXRlIHdpZGdldHMuIEl0IHdpbGwgYXV0b21hdGljYWxseSBiZSBkaXNwb3NlZAotCSAqIHdoZW4gdGhlIGVkaXRvciBpcyBkaXNwb3NlZC4KLQkgKiAKLQkgKiBAcGFyYW0gZGlzcGxheSB0aGUgZGlzcGxheQotCSAqIEByZXR1cm4gRm9ybVRvb2xraXQKLQkgKi8KLQlwcm90ZWN0ZWQgRm9ybVRvb2xraXQgZ2V0Rm9ybVRvb2xraXQoRGlzcGxheSBkaXNwbGF5KSB7Ci0JCWlmICh0b29sa2l0ID09IG51bGwpCi0JCQl0b29sa2l0ID0gbmV3IEZvcm1Ub29sa2l0KGRpc3BsYXkpOwotCQlyZXR1cm4gdG9vbGtpdDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvZWRpdG9yL1NlcnZlckVkaXRvclNlY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2VkaXRvci9TZXJ2ZXJFZGl0b3JTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxOGQ5MjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvZWRpdG9yL1NlcnZlckVkaXRvclNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuZWRpdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLklVbmRvYWJsZU9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuZWRpdG9yLlNlcnZlckVkaXRvclBhcnRJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmVkaXRvci5TZXJ2ZXJSZXNvdXJjZUNvbW1hbmRNYW5hZ2VyOwotLyoqCi0gKiBBbiBhYnN0cmFjdCBzZXJ2ZXIgZWRpdG9yIHNlY3Rpb24uCi0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFNlcnZlckVkaXRvclNlY3Rpb24gewotCXByaXZhdGUgU3RyaW5nIGVycm9yTWVzc2FnZSA9IG51bGw7Ci0KLQlwcml2YXRlIFNlcnZlclJlc291cmNlQ29tbWFuZE1hbmFnZXIgY29tbWFuZE1hbmFnZXI7Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBwYXJlbnRDb21wOwotCXByaXZhdGUgU2VydmVyRWRpdG9yUGFydCBlZGl0b3I7Ci0KLQkvKioKLQkgKiBUaGUgc2VydmVyIGN1cnJlbnRseSBiZWluZyBlZGl0ZWQuCi0JICovCi0JcHJvdGVjdGVkIElTZXJ2ZXJXb3JraW5nQ29weSBzZXJ2ZXI7Ci0KLQkvKioKLQkgKiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc2VydmVyIGlzIHJlYWQtb25seSwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqIG90aGVyd2lzZS4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZWFkT25seTsKLQotCS8qKgotCSAqIEluaXRpYWxpemUgdGhlIHNlY3Rpb24uCi0JICogCi0JICogQHBhcmFtIHNpdGUgdGhlIGVkaXRvciBzaXRlCi0JICogQHBhcmFtIGlucHV0IHRoZSBlZGl0b3IgaW5wdXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBJU2VydmVyRWRpdG9yUGFydElucHV0KSB7Ci0JCQlJU2VydmVyRWRpdG9yUGFydElucHV0IHNlcGkgPSAoSVNlcnZlckVkaXRvclBhcnRJbnB1dCkgaW5wdXQ7Ci0JCQlzZXJ2ZXIgPSBzZXBpLmdldFNlcnZlcigpOwotCQkJY29tbWFuZE1hbmFnZXIgPSAoKFNlcnZlckVkaXRvclBhcnRJbnB1dCkgc2VwaSkuZ2V0U2VydmVyQ29tbWFuZE1hbmFnZXIoKTsKLQkJCXJlYWRPbmx5ID0gc2VwaS5pc1NlcnZlclJlYWRPbmx5KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgZ2l2ZW4gb3BlcmF0aW9uIGFuZCBhZGRzIGl0IHRvIHRoZSBvcGVyYXRpb24gaGlzdG9yeQotCSAqIHdpdGggdGhlIGNvcnJlY3QgY29udGV4dC4KLQkgKiAKLQkgKiBAcGFyYW0gb3BlcmF0aW9uIGFuIG9wZXJhdGlvbiByZWFkeSB0byBiZSBleGVjdXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVVuZG9hYmxlT3BlcmF0aW9uIG9wZXJhdGlvbikgewotCQljb21tYW5kTWFuYWdlci5leGVjdXRlKG9wZXJhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBzZWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVTZWN0aW9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcy5wYXJlbnRDb21wID0gcGFyZW50OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2hlbGwgb2YgdGhlIHNlY3Rpb24uCi0JICogCi0JICogQHJldHVybiB0aGUgc2hlbGwKLQkgKi8KLQlwdWJsaWMgU2hlbGwgZ2V0U2hlbGwoKSB7Ci0JCXJldHVybiBwYXJlbnRDb21wLmdldFNoZWxsKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBlcnJvciBtZXNzYWdlIGZvciB0aGlzIHBhZ2UuCi0JICogCi0JICogQHJldHVybiB0aGUgZXJyb3IgbWVzc2FnZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlKCkgewotCQlyZXR1cm4gZXJyb3JNZXNzYWdlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgZXJyb3Igb3Igc3RhdHVzIG1lc3NhZ2VzIHRoYXQgd2lsbCBiZSBkaXNwbGF5ZWQgd2hlbiB0aGUKLQkgKiBzZXJ2ZXIgcmVzb3VyY2UgaXMgc2F2ZWQuIElmIHRoZXJlIGFyZSBhbnkgZXJyb3IgbWVzc2FnZXMsIHRoZQotCSAqIHVzZXIgd2lsbCBiZSB1bmFibGUgdG8gc2F2ZSB0aGUgZWRpdG9yLgotCSAqIAotCSAqIEByZXR1cm4gYSBzdGF0dXMgb2JqZWN0IHdpdGggY29kZSA8Y29kZT5JU3RhdHVzLk9LPC9jb2RlPiBpZiB0aGlzCi0JICogICBzZXJ2ZXIgY2FuIGJlIHNhdmVkLCBvdGhlcndpc2UgYSBzdGF0dXMgb2JqZWN0IGluZGljYXRpbmcgd2h5Ci0JICogICBpdCBjYW4ndCBiZQotCSAqLwotCXB1YmxpYyBJU3RhdHVzW10gZ2V0U2F2ZVN0YXR1cygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBlZGl0b3IgcGFydCB0aGF0IHRoaXMgc2VjdGlvbiBiZWxvbmdzIHRvLgotCSAqIAotCSAqIEBwYXJhbSBlZGl0b3IgdGhlIGVkaXRvcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlcnZlckVkaXRvclBhcnQoU2VydmVyRWRpdG9yUGFydCBlZGl0b3IpIHsKLQkJdGhpcy5lZGl0b3IgPSBlZGl0b3I7Ci0JfQotCi0JLyoqCi0JICogU2V0IGFuIGVycm9yIG1lc3NhZ2UgZm9yIHRoaXMgcGFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gZXJyb3IgYW4gZXJyb3IgbWVzc2FnZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVycm9yTWVzc2FnZShTdHJpbmcgZXJyb3IpIHsKLQkJaWYgKGVycm9yID09IG51bGwgJiYgZXJyb3JNZXNzYWdlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQlpZiAoZXJyb3IgIT0gbnVsbCAmJiBlcnJvci5lcXVhbHMoZXJyb3JNZXNzYWdlKSkKLQkJCXJldHVybjsKLQkJCi0JCWVycm9yTWVzc2FnZSA9IGVycm9yOwotCQlpZiAoZWRpdG9yICE9IG51bGwpCi0JCQllZGl0b3IudXBkYXRlRXJyb3JNZXNzYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0IGEgZm9ybSB0b29sa2l0IHRvIGNyZWF0ZSB3aWRnZXRzLiBJdCB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgZGlzcG9zZWQKLQkgKiB3aGVuIHRoZSBlZGl0b3IgaXMgZGlzcG9zZWQuCi0JICogCi0JICogQHBhcmFtIGRpc3BsYXkgdGhlIGRpc3BsYXkKLQkgKiBAcmV0dXJuIEZvcm1Ub29sa2l0Ci0JICovCi0JcHJvdGVjdGVkIEZvcm1Ub29sa2l0IGdldEZvcm1Ub29sa2l0KERpc3BsYXkgZGlzcGxheSkgewotCQlyZXR1cm4gZWRpdG9yLmdldEZvcm1Ub29sa2l0KGRpc3BsYXkpOwotCX0KLQotCS8qKgotCSAqIERpc3Bvc2VzIG9mIHRoZSBzZWN0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIGlnbm9yZQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9lZGl0b3IvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvZWRpdG9yL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ2NGMxOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9lZGl0b3IvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPGh0bWw+Ci08aGVhZD4KLTxNRVRBIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi8uLi8uLi8uLi8uLi8vYXBpc3R5bGVzLmNzcyIgdHlwZT0idGV4dC9jc3MiPgotPHRpdGxlPldUUCBBUEkgb3ZlcnZpZXc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci08cD5Qcm92aWRlcyBlZGl0b3Igc3VwcG9ydCBmb3IgdGhlIHNlcnZlciB0b29scyBVSS48L3A+Ci08dGFibGUgd2lkdGg9IjUwMCI+Ci08dHI+Ci08dGQ+Ci08cD5Vc2luZyBleHRlbnNpb24gcG9pbnRzLCBjbGllbnRzIGNhbiBwcm92aWRlIHBhZ2VzLCBzZWN0aW9ucywgYW5kCi1hY3Rpb25zIHRvIGJlIGFkZGVkIHRvIHRoZSBlZGl0b3IgZm9yIGEgc3BlY2lmaWMgc2VydmVyIHR5cGUuIFRoaXMKLXBhY2thZ2UgY29udGFpbnMgdGhlIGRlbGVnYXRlIGNsYXNzZXMgZm9yIHRoZXNlIGV4dGVuc2lvbiBwb2ludHMsIGFzCi13ZWxsIGFzIHRoZSBBUEkgdGhhdCB0aGV5IGNhbiB1c2UgdG8gcHV0IGNvbW1hbmRzIG9uIHRoZSBzaGFyZWQKLWVkaXRvciBjb21tYW5kIGhpc3Rvcnkgc3RhY2sgYW5kIGludGVyYWN0IHdpdGggdGhlIGVkaXRpbmcgZnJhbWV3b3JrLjwvcD4KLTwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2VkaXRvci9wYWNrYWdlLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2VkaXRvci9wYWNrYWdlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDI0YzRhMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9lZGl0b3IvcGFja2FnZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGh0bWw+Ci08aGVhZD4KLQk8IS0tICBFc2NhcGUgdG8gdGhlIHJvb3Qgb2YgeW91ciBzb3VyY2UgZm9sZGVyICAtLT4KLQk8bWV0YQotCQluYW1lPSJyb290IgotCQljb250ZW50PSIuLi8uLi8uLi8uLi8uLi8uLi8iIC8+Ci0JPHRpdGxlPldUUCBBUEkgb3ZlcnZpZXc8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keT4KLQotPGFic3RyYWN0PlByb3ZpZGVzIGVkaXRvciBzdXBwb3J0IGZvciB0aGUgc2VydmVyIHRvb2xzIFVJLjwvYWJzdHJhY3Q+Ci0KLTxwPlVzaW5nIGV4dGVuc2lvbiBwb2ludHMsIGNsaWVudHMgY2FuIHByb3ZpZGUgcGFnZXMsIHNlY3Rpb25zLCBhbmQKLWFjdGlvbnMgdG8gYmUgYWRkZWQgdG8gdGhlIGVkaXRvciBmb3IgYSBzcGVjaWZpYyBzZXJ2ZXIgdHlwZS4gVGhpcwotcGFja2FnZSBjb250YWlucyB0aGUgZGVsZWdhdGUgY2xhc3NlcyBmb3IgdGhlc2UgZXh0ZW5zaW9uIHBvaW50cywgYXMKLXdlbGwgYXMgdGhlIEFQSSB0aGF0IHRoZXkgY2FuIHVzZSB0byBwdXQgY29tbWFuZHMgb24gdGhlIHNoYXJlZAotZWRpdG9yIGNvbW1hbmQgaGlzdG9yeSBzdGFjayBhbmQgaW50ZXJhY3Qgd2l0aCB0aGUgZWRpdGluZyBmcmFtZXdvcmsuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvQ29udGV4dElkcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvQ29udGV4dElkcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWYzMTdkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL0NvbnRleHRJZHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbDsKLS8qKgotICogQ29udGV4dCBoZWxwIGlkIGNvbnN0YW50cy4KLSAqLwotcHVibGljIGludGVyZmFjZSBDb250ZXh0SWRzIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRUxFQ1RfU0VSVkVSX1dJWkFSRCA9IFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCArICIuc3dzaTAwMDAiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFTEVDVF9TRVJWRVJfRVhJU1RJTkcgPSBTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLnN3c2kwMDAyIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRUxFQ1RfU0VSVkVSX0VYSVNUSU5HX1RBQkxFID0gU2VydmVyVUlQbHVnaW4uUExVR0lOX0lEICsgIi5zd3NpMDAwNCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VMRUNUX1NFUlZFUl9DUkVBVEUgPSBTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLnN3c2kwMDEwIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRUxFQ1RfU0VSVkVSX0NSRUFURV9UQUJMRSA9IFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCArICIuc3dzaTAwMTIiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFTEVDVF9TRVJWRVJfUFJFRkVSRU5DRSA9IFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCArICIuc3dzaTAwMTQiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VMRUNUX0NMSUVOVF9XSVpBUkQgPSBTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLnN3c2MwMDAwIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRUxFQ1RfQ0xJRU5UID0gU2VydmVyVUlQbHVnaW4uUExVR0lOX0lEICsgIi5zd3NjMDAwMiI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfU0VSVkVSX1dJWkFSRCA9IFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCArICIuc3duczAwMDAiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19TRVJWRVJfVFlQRSA9IFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCArICIuc3duczAwMDYiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFVTkNIX0NPTkZJR1VSQVRJT05fU0VSVkVSX0NPTUJPID0gU2VydmVyVUlQbHVnaW4uUExVR0lOX0lEICsgIi5zd3NsMDAwMCI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRUxFQ1RfVEFTS19XSVpBUkQgPSBTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLnNzdHcwMDAwIjsKLQotCS8qcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1QT1JUX0NPTkZJR1VSQVRJT05fV0laQVJEID0gU2VydmVyVUlQbHVnaW4uUExVR0lOX0lEICsgIi5zd2ljMDAwMCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1QT1JUX0NPTkZJR1VSQVRJT05fTkFNRSA9IFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCArICIuc3dpYzAwMDIiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNUE9SVF9DT05GSUdVUkFUSU9OX0ZPTERFUiA9IFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCArICIuc3dpYzAwMDQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNUE9SVF9DT05GSUdVUkFUSU9OX0ZBQ1RPUlkgPSBTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLnN3aWMwMDA2IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTVBPUlRfQ09ORklHVVJBVElPTl9MT0NBVElPTiA9IFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCArICIuc3dpYzAwMDgiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNUE9SVF9DT05GSUdVUkFUSU9OX0xPQ0FUSU9OX0JST1dTRSA9IFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCArICIuc3dpYzAwMTAiOyovCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9ESUZZX01PRFVMRVNfQ09NUE9TSVRFID0gU2VydmVyVUlQbHVnaW4uUExVR0lOX0lEICsgIi5zd21tMDAwMCI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVJNSU5BVEVfU0VSVkVSX0RJQUxPRyA9IFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCArICIuc2R0aTAwMDAiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9HRU5FUkFMID0gU2VydmVyVUlQbHVnaW4uUExVR0lOX0lEICsgIi5zcGdlMDAwMCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9HRU5FUkFMX0FVVE9QVUJMSVNIX0xPQ0FMID0gU2VydmVyVUlQbHVnaW4uUExVR0lOX0lEICsgIi5zcGdlMDAwMiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9HRU5FUkFMX0FVVE9QVUJMSVNIX1JFTU9URSA9IFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCArICIuc3BnZTAwMDYiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfR0VORVJBTF9QVUJMSVNIX0JFRk9SRV9TVEFSVCA9IFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCArICIuc3BnZTAwMTIiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfR0VORVJBTF9BVVRPX1JFU1RBUlQgPSBTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLnNwZ2UwMDE0IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX0dFTkVSQUxfUFJPTVBUX0lSUkVWRVJTSUJMRSA9IFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCArICIuc3BnZTAwMjAiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfR0VORVJBTF9TSE9XX09OX0FDVElWSVRZID0gU2VydmVyVUlQbHVnaW4uUExVR0lOX0lEICsgIi5zcGdlMDAyMiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9HRU5FUkFMX1NBVkVfRURJVE9SUyA9IFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCArICIuc3BnZTAwMjQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfR0VORVJBTF9USU1FT1VUX0RFTEFZID0gU2VydmVyVUlQbHVnaW4uUExVR0lOX0lEICsgIi5zcGdlMDAyNiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9HRU5FUkFMX1NZTkNfU1RBUlRVUCA9IFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCArICIuc3BnZTAwMjgiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklFV19TRVJWRVJTID0gU2VydmVyVUlQbHVnaW4uUExVR0lOX0lEICsgIi5zdmNwMDAwMCI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSVNIX0RFVEFJTFNfRElBTE9HID0gU2VydmVyVUlQbHVnaW4uUExVR0lOX0lEICsgIi5zZHBkMDAwMCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElTSF9ERVRBSUxTX0RJQUxPR19TVEFUVVMgPSBTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLnNkcGQwMDAyIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSVNIX0RFVEFJTFNfRElBTE9HX0RFVEFJTFNfQlVUVE9OID0gU2VydmVyVUlQbHVnaW4uUExVR0lOX0lEICsgIi5zZHBkMDAwNCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElTSF9ERVRBSUxTX0RJQUxPR19ERVRBSUxTID0gU2VydmVyVUlQbHVnaW4uUExVR0lOX0lEICsgIi5zZHBkMDAwNiI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9NUFRfSVJSRVZFUlNJQkxFX0RJQUxPRyA9IFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCArICIuc2RwaTAwMDAiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRURJVE9SX09WRVJWSUVXX1BBR0UgPSBTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLnNlb3AwMDAwIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUT1JfU0VSVkVSID0gU2VydmVyVUlQbHVnaW4uUExVR0lOX0lEICsgIi5zZW9wMDAwMiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRURJVE9SX0NPTkZJR1VSQVRJT04gPSBTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLnNlb3AwMDA0IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUT1JfSE9TVE5BTUUgPSBTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLnNlb3AwMDA2IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUT1JfUlVOVElNRSA9IFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCArICIuc2VvcDAwMDgiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVESVRPUl9BVVRPUFVCTElTSF9ERUZBVUxUID0gU2VydmVyVUlQbHVnaW4uUExVR0lOX0lEICsgIi5zZW9wMDAxMCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRURJVE9SX0FVVE9QVUJMSVNIX09WRVJSSURFID0gU2VydmVyVUlQbHVnaW4uUExVR0lOX0lEICsgIi5zZW9wMDAxMiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRURJVE9SX0FVVE9QVUJMSVNIX0RJU0FCTEUgPSBTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLnNlb3AwMDE2IjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFVRElPX1BSRUZFUkVOQ0VTID0gU2VydmVyVUlQbHVnaW4uUExVR0lOX0lEICsgIi5hdXByMDAwMCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVVESU9fUFJFRkVSRU5DRVNfRU5BQkxFID0gU2VydmVyVUlQbHVnaW4uUExVR0lOX0lEICsgIi5hdXByMDAwMiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVVESU9fUFJFRkVSRU5DRVNfVk9MVU1FID0gU2VydmVyVUlQbHVnaW4uUExVR0lOX0lEICsgIi5hdXByMDAwNCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVVESU9fUFJFRkVSRU5DRVNfU09VTkRTX1RBQkxFID0gU2VydmVyVUlQbHVnaW4uUExVR0lOX0lEICsgIi5hdXByMDAwNiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVVESU9fUFJFRkVSRU5DRVNfUExBWSA9IFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCArICIuYXVwcjAwMDgiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFVRElPX1BSRUZFUkVOQ0VTX0JST1dTRSA9IFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCArICIuYXVwcjAwMTAiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFVRElPX1BSRUZFUkVOQ0VTX1JFU0VUID0gU2VydmVyVUlQbHVnaW4uUExVR0lOX0lEICsgIi5hdXByMDAxMiI7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvRGVmYXVsdE1vbml0b3JEZWxlZ2F0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvRGVmYXVsdE1vbml0b3JEZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWVkZTQwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL0RlZmF1bHRNb25pdG9yRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotoCoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9uaXRvcldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuTW9uaXRvckNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlck1vbml0b3JEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudXRpbC5Tb2NrZXRVdGlsOwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIERlZmF1bHRNb25pdG9yRGVsZWdhdGUgZXh0ZW5kcyBTZXJ2ZXJNb25pdG9yRGVsZWdhdGUgewotCXByb3RlY3RlZCBNYXAgbW9uaXRvcnMgPSBuZXcgSGFzaE1hcCgpOwotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLlNlcnZlck1vbml0b3JEZWxlZ2F0ZSNzdGFydE1vbml0b3Jpbmcob3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclBvcnQpCi0JICovCi0JcHVibGljIGludCBzdGFydE1vbml0b3JpbmcoSVNlcnZlciBzZXJ2ZXIsIFNlcnZlclBvcnQgcG9ydCwgaW50IG1vbml0b3JQb3J0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlJTW9uaXRvciBtb25pdG9yID0gKElNb25pdG9yKSBtb25pdG9ycy5nZXQocG9ydCk7Ci0JCQlpbnQgbXBvcnQgPSAtMTsKLQkJCWlmIChtb25pdG9yID09IG51bGwpIHsKLQkJCQltcG9ydCA9IG1vbml0b3JQb3J0OwotCQkJCWlmIChtcG9ydCA9PSAtMSkKLQkJCQkJbXBvcnQgPSBTb2NrZXRVdGlsLmZpbmRVbnVzZWRQb3J0KDUwMDAsIDE1MDAwKTsKLQkJCQkKLQkJCQkvLyBzaG91bGQgc2VhcmNoIGZvciBhIG1vbml0b3IgZmlyc3QgLi4KLQkJCQlJTW9uaXRvcldvcmtpbmdDb3B5IHdjID0gTW9uaXRvckNvcmUuY3JlYXRlTW9uaXRvcigpOwotCQkJCXdjLnNldExvY2FsUG9ydChtcG9ydCk7Ci0JCQkJd2Muc2V0UmVtb3RlSG9zdChzZXJ2ZXIuZ2V0SG9zdCgpKTsKLQkJCQl3Yy5zZXRSZW1vdGVQb3J0KHBvcnQuZ2V0UG9ydCgpKTsKLQkJCQlpZiAoIkhUVFAiLmVxdWFscyhwb3J0LmdldFByb3RvY29sKCkpKQotCQkJCQl3Yy5zZXRQcm90b2NvbCgiSFRUUCIpOwotCQkJCW1vbml0b3IgPSB3Yy5zYXZlKCk7Ci0JCQl9IGVsc2UKLQkJCQltcG9ydCA9IG1vbml0b3IuZ2V0TG9jYWxQb3J0KCk7Ci0JCQltb25pdG9yLnN0YXJ0KCk7Ci0JCQltb25pdG9ycy5wdXQocG9ydCwgbW9uaXRvcik7Ci0JCQlyZXR1cm4gbXBvcnQ7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3Qgc3RhcnQgbW9uaXRvcmluZyIsIGUpOwotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yU3RhcnRpbmdNb25pdG9yLCBlLmdldExvY2FsaXplZE1lc3NhZ2UoKSksIG51bGwpKTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5TZXJ2ZXJNb25pdG9yRGVsZWdhdGUjc3RvcE1vbml0b3Jpbmcob3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclBvcnQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcE1vbml0b3JpbmcoSVNlcnZlciBzZXJ2ZXIsIFNlcnZlclBvcnQgcG9ydCkgewotCQl0cnkgewotCQkJSU1vbml0b3IgbW9uaXRvciA9IChJTW9uaXRvcikgbW9uaXRvcnMuZ2V0KHBvcnQpOwotCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkKLQkJCQltb25pdG9yLnN0b3AoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBzdG9wIG1vbml0b3JpbmciLCBlKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9EZWZhdWx0U2VydmVySW1hZ2VEZXNjcmlwdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9EZWZhdWx0U2VydmVySW1hZ2VEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjMjViNmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvRGVmYXVsdFNlcnZlckltYWdlRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkNvbXBvc2l0ZUltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci0vKioKLSAqIEEgT3ZlcmxheUltYWdlRGVzY3JpcHRvciBjb25zaXN0cyBvZiBhIG1haW4gaWNvbiBhbmQgb25lIG9yIG1vcmUgb3ZlcmxheXMuCi0gKiBUaGUgb3ZlcmxheXMgYXJlIGNvbXB1dGVkIGFjY29yZGluZyB0byBmbGFncyBzZXQgb24gY3JlYXRpb24gb2YgdGhlIGRlc2NyaXB0b3IuCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWZhdWx0U2VydmVySW1hZ2VEZXNjcmlwdG9yIGV4dGVuZHMgQ29tcG9zaXRlSW1hZ2VEZXNjcmlwdG9yIHsKLQlwcml2YXRlIEltYWdlIGZCYXNlSW1hZ2U7Ci0JcHJpdmF0ZSBQb2ludCBmU2l6ZTsKLQlwcml2YXRlIEltYWdlIG92ZXJsYXk7Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IE92ZXJsYXlJbWFnZURlc2NyaXB0b3IuCi0JICogCi0JICogQHBhcmFtIGJhc2VJbWFnZSBhbiBpbWFnZSBkZXNjcmlwdG9yIHVzZWQgYXMgdGhlIGJhc2UgaW1hZ2UKLQkgKi8KLQlwdWJsaWMgRGVmYXVsdFNlcnZlckltYWdlRGVzY3JpcHRvcihJbWFnZSBiYXNlSW1hZ2UpIHsKLQkJdGhpcyhiYXNlSW1hZ2UsIEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2UoSW1hZ2VSZXNvdXJjZS5JTUdfREVGQVVMVF9TRVJWRVJfT1ZFUkxBWSkpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBiYXNlSW1hZ2UKLQkgKiBAcGFyYW0gb3ZlcmxheQotCSAqLwotCXB1YmxpYyBEZWZhdWx0U2VydmVySW1hZ2VEZXNjcmlwdG9yKEltYWdlIGJhc2VJbWFnZSwgSW1hZ2Ugb3ZlcmxheSkgewotCQlzZXRCYXNlSW1hZ2UoYmFzZUltYWdlKTsKLQkJdGhpcy5vdmVybGF5ID0gb3ZlcmxheTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENvbXBvc2l0ZUltYWdlRGVzY3JpcHRvciNnZXRTaXplKCkKLQkgKi8KLQlwcm90ZWN0ZWQgUG9pbnQgZ2V0U2l6ZSgpIHsKLQkJaWYgKGZTaXplID09IG51bGwpIHsKLQkJCUltYWdlRGF0YSBkYXRhID0gZ2V0QmFzZUltYWdlKCkuZ2V0SW1hZ2VEYXRhKCk7Ci0JCQlzZXRTaXplKG5ldyBQb2ludChkYXRhLndpZHRoLCBkYXRhLmhlaWdodCkpOwotCQl9Ci0JCXJldHVybiBmU2l6ZTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBPYmplY3QjZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKCEob2JqZWN0IGluc3RhbmNlb2YgRGVmYXVsdFNlcnZlckltYWdlRGVzY3JpcHRvcikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQkKLQkJRGVmYXVsdFNlcnZlckltYWdlRGVzY3JpcHRvciBvdGhlciA9IChEZWZhdWx0U2VydmVySW1hZ2VEZXNjcmlwdG9yKSBvYmplY3Q7Ci0JCXJldHVybiAoZ2V0QmFzZUltYWdlKCkuZXF1YWxzKG90aGVyLmdldEJhc2VJbWFnZSgpKSk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgT2JqZWN0I2hhc2hDb2RlKCkKLQkgKi8KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gZ2V0QmFzZUltYWdlKCkuaGFzaENvZGUoKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBDb21wb3NpdGVJbWFnZURlc2NyaXB0b3IjZHJhd0NvbXBvc2l0ZUltYWdlKGludCwgaW50KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRyYXdDb21wb3NpdGVJbWFnZShpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLQkJSW1hZ2VEYXRhIGJnID0gZ2V0QmFzZUltYWdlKCkuZ2V0SW1hZ2VEYXRhKCk7Ci0JCWlmIChiZyA9PSBudWxsKQotCQkJYmcgPSBERUZBVUxUX0lNQUdFX0RBVEE7Ci0KLQkJZHJhd0ltYWdlKGJnLCAwLCAwKTsKLQkJZHJhd092ZXJsYXlzKCk7Ci0JfQotCi0JLyoqCi0JICogQWRkIGFueSBvdmVybGF5cyB0byB0aGUgaW1hZ2UgYXMgc3BlY2lmaWVkIGluIHRoZSBmbGFncy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkcmF3T3ZlcmxheXMoKSB7Ci0JCUltYWdlRGF0YSBkYXRhID0gb3ZlcmxheS5nZXRJbWFnZURhdGEoKTsKLQkJaW50IHggPSBnZXRTaXplKCkueCAtIGRhdGEud2lkdGg7Ci0JCWRyYXdJbWFnZShkYXRhLCB4LCAwKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEltYWdlIGdldEJhc2VJbWFnZSgpIHsKLQkJcmV0dXJuIGZCYXNlSW1hZ2U7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0QmFzZUltYWdlKEltYWdlIGJhc2VJbWFnZSkgewotCQlmQmFzZUltYWdlID0gYmFzZUltYWdlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNpemUoUG9pbnQgc2l6ZSkgewotCQlmU2l6ZSA9IHNpemU7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL0RlZmF1bHRTZXJ2ZXJMYWJlbERlY29yYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvRGVmYXVsdFNlcnZlckxhYmVsRGVjb3JhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNzY4YzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvRGVmYXVsdFNlcnZlckxhYmVsRGVjb3JhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbERlY29yYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTaGFyZWRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlcjsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWZhdWx0U2VydmVyTGFiZWxEZWNvcmF0b3IgaW1wbGVtZW50cyBJTGFiZWxEZWNvcmF0b3IgewotCXByb3RlY3RlZCBNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsRGVjb3JhdG9yI2RlY29yYXRlSW1hZ2Uob3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlLCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBJbWFnZSBkZWNvcmF0ZUltYWdlKEltYWdlIGltYWdlLCBPYmplY3QgZWxlbWVudCkgewotCQl0cnkgewotCQkJSW1hZ2UgaW1nID0gKEltYWdlKSBtYXAuZ2V0KGVsZW1lbnQpOwotCQkJaWYgKGltZyAhPSBudWxsKQotCQkJCXJldHVybiBpbWc7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQkKLQkJRGVmYXVsdFNlcnZlckltYWdlRGVzY3JpcHRvciBkc2lkID0gbnVsbDsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBTZXJ2ZXIpIHsKLQkJCUlTdGF0dXMgc3RhdHVzID0gKChTZXJ2ZXIpIGVsZW1lbnQpLmdldFNlcnZlclN0YXR1cygpOwotCQkJaWYgKHN0YXR1cyAhPSBudWxsKSB7Ci0JCQkJSVNoYXJlZEltYWdlcyBzaGFyZWRJbWFnZXMgPSBTZXJ2ZXJVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdvcmtiZW5jaCgpLmdldFNoYXJlZEltYWdlcygpOwotCQkJCWlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKQotCQkJCQlkc2lkID0gbmV3IERlZmF1bHRTZXJ2ZXJJbWFnZURlc2NyaXB0b3IoaW1hZ2UsIHNoYXJlZEltYWdlcy5nZXRJbWFnZShJU2hhcmVkSW1hZ2VzLklNR19PQkpTX0VSUk9SX1RTSykpOwotCQkJCWVsc2UgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuV0FSTklORykKLQkJCQkJZHNpZCA9IG5ldyBEZWZhdWx0U2VydmVySW1hZ2VEZXNjcmlwdG9yKGltYWdlLCBzaGFyZWRJbWFnZXMuZ2V0SW1hZ2UoSVNoYXJlZEltYWdlcy5JTUdfT0JKU19XQVJOX1RTSykpOwotCQkJCWVsc2UgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuSU5GTykKLQkJCQkJZHNpZCA9IG5ldyBEZWZhdWx0U2VydmVySW1hZ2VEZXNjcmlwdG9yKGltYWdlLCBzaGFyZWRJbWFnZXMuZ2V0SW1hZ2UoSVNoYXJlZEltYWdlcy5JTUdfT0JKU19JTkZPX1RTSykpOwotCQkJfQotCQl9Ci0JCQotCQlpZiAoZHNpZCA9PSBudWxsKQotCQkJZHNpZCA9IG5ldyBEZWZhdWx0U2VydmVySW1hZ2VEZXNjcmlwdG9yKGltYWdlKTsKLQkJSW1hZ2UgaW1hZ2UyID0gZHNpZC5jcmVhdGVJbWFnZSgpOwotCQltYXAucHV0KGVsZW1lbnQsIGltYWdlMik7Ci0JCXJldHVybiBpbWFnZTI7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxEZWNvcmF0b3IjZGVjb3JhdGVUZXh0KGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBkZWNvcmF0ZVRleHQoU3RyaW5nIHRleHQsIE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI2FkZExpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQl0cnkgewotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBtYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlJbWFnZSBpbWFnZSA9IChJbWFnZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCWltYWdlLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJDb3VsZCBub3QgZGlzcG9zZSBpbWFnZXMiLCBlKTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI2lzTGFiZWxQcm9wZXJ0eShqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNyZW1vdmVMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkvLyBkbyBub3RoaW5nCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL0RlbGV0ZVNlcnZlckRpYWxvZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvRGVsZXRlU2VydmVyRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkZTUxNDAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvRGVsZXRlU2VydmVyRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuUHJvZ3Jlc3NNb25pdG9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5Xb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXIuSU9wZXJhdGlvbkxpc3RlbmVyOwotLyoqCi0gKiBEaWFsb2cgdGhhdCBwcm9tcHRzIGEgdXNlciB0byBkZWxldGUgc2VydmVyKHMpIGFuZC9vciBzZXJ2ZXIgY29uZmlndXJhdGlvbihzKS4KLSAqLwotcHVibGljIGNsYXNzIERlbGV0ZVNlcnZlckRpYWxvZyBleHRlbmRzIERpYWxvZyB7Ci0JcHJvdGVjdGVkIElTZXJ2ZXJbXSBzZXJ2ZXJzOwotCXByb3RlY3RlZCBJRm9sZGVyW10gY29uZmlnczsKLQotCXByb3RlY3RlZCBMaXN0IHJ1bm5pbmdTZXJ2ZXJzTGlzdDsKLQotCXByb3RlY3RlZCBCdXR0b24gY2hlY2tEZWxldGVDb25maWdzOwotCXByb3RlY3RlZCBCdXR0b24gY2hlY2tEZWxldGVSdW5uaW5nOwotCXByb3RlY3RlZCBCdXR0b24gY2hlY2tEZWxldGVSdW5uaW5nU3RvcDsKLQotCS8qKgotCSAqIERlbGV0ZVNlcnZlckRpYWxvZyBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnRTaGVsbCBhIHNoZWxsCi0JICogQHBhcmFtIHNlcnZlcnMgYW4gYXJyYXkgb2Ygc2VydmVycwotCSAqIEBwYXJhbSBjb25maWdzIGFuIGFycmF5IG9mIHNlcnZlciBjb25maWd1cmF0aW9ucwotCSAqLwotCXB1YmxpYyBEZWxldGVTZXJ2ZXJEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIElTZXJ2ZXJbXSBzZXJ2ZXJzLCBJRm9sZGVyW10gY29uZmlncykgewotCQlzdXBlcihwYXJlbnRTaGVsbCk7Ci0JCQotCQlpZiAoc2VydmVycyA9PSBudWxsIHx8IGNvbmZpZ3MgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJCi0JCXRoaXMuc2VydmVycyA9IHNlcnZlcnM7Ci0JCXRoaXMuY29uZmlncyA9IGNvbmZpZ3M7Ci0JCQotCQlydW5uaW5nU2VydmVyc0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwIDsgaSA8IHNlcnZlcnMubGVuZ3RoIDsgKytpKSB7Ci0JCQlpZiAoc2VydmVyc1tpXS5nZXRTZXJ2ZXJTdGF0ZSgpICE9IElTZXJ2ZXIuU1RBVEVfU1RPUFBFRCkKLQkJCQlydW5uaW5nU2VydmVyc0xpc3QuYWRkKHNlcnZlcnNbaV0pOwotCQl9Ci0KLQkJc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICoKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBuZXdTaGVsbCkgewotCQlzdXBlci5jb25maWd1cmVTaGVsbChuZXdTaGVsbCk7Ci0JCW5ld1NoZWxsLnNldFRleHQoTWVzc2FnZXMuZGVsZXRlU2VydmVyRGlhbG9nVGl0bGUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyBjcmVhdGUgYSBjb21wb3NpdGUgd2l0aCBzdGFuZGFyZCBtYXJnaW5zIGFuZCBzcGFjaW5nCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSBjb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5WRVJUSUNBTF9NQVJHSU4pOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLkhPUklaT05UQUxfTUFSR0lOKTsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IGNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLlZFUlRJQ0FMX1NQQUNJTkcpOwotCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLkhPUklaT05UQUxfU1BBQ0lORyk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQljb21wb3NpdGUuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLQkJLy9Xb3JrYmVuY2hIZWxwLnNldEhlbHAoY29tcG9zaXRlLCBDb250ZXh0SWRzLlRFUk1JTkFURV9TRVJWRVJfRElBTE9HKTsKLQkKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWlmIChzZXJ2ZXJzLmxlbmd0aCA9PSAxKQotCQkJbGFiZWwuc2V0VGV4dChOTFMuYmluZChNZXNzYWdlcy5kZWxldGVTZXJ2ZXJEaWFsb2dNZXNzYWdlLCBzZXJ2ZXJzWzBdLmdldE5hbWUoKSkpOwotCQllbHNlCi0JCQlsYWJlbC5zZXRUZXh0KE5MUy5iaW5kKE1lc3NhZ2VzLmRlbGV0ZVNlcnZlckRpYWxvZ01lc3NhZ2VNYW55LCBzZXJ2ZXJzLmxlbmd0aCArICIiKSk7Ci0JCS8vbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0JCQotCQlpZiAoY29uZmlncy5sZW5ndGggPiAwKSB7Ci0JCQljaGVja0RlbGV0ZUNvbmZpZ3MgPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULkNIRUNLKTsKLQkJCWNoZWNrRGVsZXRlQ29uZmlncy5zZXRUZXh0KE5MUy5iaW5kKE1lc3NhZ2VzLmRlbGV0ZVNlcnZlckRpYWxvZ0xvb3NlQ29uZmlndXJhdGlvbnMsIGNvbmZpZ3NbMF0uZ2V0TmFtZSgpKSk7Ci0JCQljaGVja0RlbGV0ZUNvbmZpZ3Muc2V0U2VsZWN0aW9uKHRydWUpOwotCQl9Ci0JCQotCQkvLyBwcm9tcHQgZm9yIHN0b3BwaW5nIHJ1bm5pbmcgc2VydmVycwotCQlpbnQgc2l6ZSA9IHJ1bm5pbmdTZXJ2ZXJzTGlzdC5zaXplKCk7Ci0JCWlmIChzaXplID4gMCkgewotCQkJY2hlY2tEZWxldGVSdW5uaW5nID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0JCQljaGVja0RlbGV0ZVJ1bm5pbmcuc2V0VGV4dChOTFMuYmluZChNZXNzYWdlcy5kZWxldGVTZXJ2ZXJEaWFsb2dSdW5uaW5nU2VydmVyLCAoKElTZXJ2ZXIpcnVubmluZ1NlcnZlcnNMaXN0LmdldCgwKSkuZ2V0TmFtZSgpKSk7Ci0JCQljaGVja0RlbGV0ZVJ1bm5pbmcuc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJCi0JCQljaGVja0RlbGV0ZVJ1bm5pbmdTdG9wID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0JCQljaGVja0RlbGV0ZVJ1bm5pbmdTdG9wLnNldFRleHQoTkxTLmJpbmQoTWVzc2FnZXMuZGVsZXRlU2VydmVyRGlhbG9nUnVubmluZ1NlcnZlclN0b3AsICgoSVNlcnZlcilydW5uaW5nU2VydmVyc0xpc3QuZ2V0KDApKS5nZXROYW1lKCkpKTsKLQkJCWNoZWNrRGVsZXRlUnVubmluZ1N0b3Auc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMTU7Ci0JCQljaGVja0RlbGV0ZVJ1bm5pbmdTdG9wLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQkKLQkJCWNoZWNrRGVsZXRlUnVubmluZy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCWNoZWNrRGVsZXRlUnVubmluZ1N0b3Auc2V0RW5hYmxlZChjaGVja0RlbGV0ZVJ1bm5pbmcuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JCQotCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KGNvbXBvc2l0ZSk7Ci0JCQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpIHsKLQkJZmluYWwgYm9vbGVhbiBjaGVja2VkID0gKGNoZWNrRGVsZXRlQ29uZmlncyAhPSBudWxsICYmIGNoZWNrRGVsZXRlQ29uZmlncy5nZXRTZWxlY3Rpb24oKSk7Ci0JCWZpbmFsIGJvb2xlYW4gZGVsZXRlUnVubmluZyA9IChjaGVja0RlbGV0ZVJ1bm5pbmcgIT0gbnVsbCAmJiBjaGVja0RlbGV0ZVJ1bm5pbmcuZ2V0U2VsZWN0aW9uKCkpOwotCQlmaW5hbCBib29sZWFuIGRlbGV0ZVJ1bm5pbmdTdG9wID0gKGNoZWNrRGVsZXRlUnVubmluZ1N0b3AgIT0gbnVsbCAmJiBjaGVja0RlbGV0ZVJ1bm5pbmdTdG9wLmdldFNlbGVjdGlvbigpKTsKLQkJCi0JCWlmIChydW5uaW5nU2VydmVyc0xpc3Quc2l6ZSgpID4gMCkgewotCQkJLy8gc3RvcCBzZXJ2ZXJzIGFuZC9vciB1cGRhdGVzIHNlcnZlcnMnIGxpc3QKLQkJCXByZXBhcmVGb3JEZWxldGlvbihkZWxldGVSdW5uaW5nLCBkZWxldGVSdW5uaW5nU3RvcCk7Ci0JCQkvL21vbml0b3Iud29ya2VkKDEpOwotCQl9Ci0JCQotCQl0cnkgewotCQkJV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uIG9wID0gbmV3IFdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbigpIHsKLQkJCQlwcm90ZWN0ZWQgdm9pZCBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCQkvLyBzaW5jZSBzdG9wcGluZyBjYW4gYmUgbG9uZywgbGV0J3MgYW5pbWF0ZSBwcm9nZXNzRGlhbG9nCi0JCQkJCW1vbml0b3IuYmVnaW5UYXNrKE1lc3NhZ2VzLmRlbGV0ZVNlcnZlclRhc2ssIDIpOwotCQkJCQkKLQkJCQkJaWYgKHNlcnZlcnMubGVuZ3RoID09IDApIHsKLQkJCQkJCS8vIGFsbCBzZXJ2ZXJzIGhhdmUgYmVlbiBkZWxldGVkIGZyb20gbGlzdAotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCXRyeSB7Ci0JCQkJCQlpbnQgc2l6ZSA9IHNlcnZlcnMubGVuZ3RoOwotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQkJCQlzZXJ2ZXJzW2ldLmRlbGV0ZSgpOwotCQkJCQkJfQotCQkJCQkJCi0JCQkJCQlpZiAoY2hlY2tlZCkgewotCQkJCQkJCXNpemUgPSBjb25maWdzLmxlbmd0aDsKLQkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCQkJCQljb25maWdzW2ldLmRlbGV0ZSh0cnVlLCB0cnVlLCBtb25pdG9yKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciB3aGlsZSBkZWxldGluZyByZXNvdXJjZXMiLCBlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX07Ci0JCQluZXcgUHJvZ3Jlc3NNb25pdG9yRGlhbG9nKGdldFNoZWxsKCkpLnJ1bih0cnVlLCB0cnVlLCBvcCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBkZWxldGluZyByZXNvdXJjZXMiLCBlKTsKLQkJfQotCQkKLQkJc3VwZXIub2tQcmVzc2VkKCk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyBzZXJ2ZXJzJyAmIGNvbmZpZ3MnIGxpc3RzLiBJZiA8Y29kZT5kZWxldGVSdW5uaW5nPC9jb2RlPiBpcyA8Y29kZT50cnVlPC9jb2RlPgotCSAqIAlhbmQgYSBzZXJ2ZXIgY2FuJ3QgYmUgc3RvcHBlZCwgaXQgaXNuJ3QgcmVtb3ZlZC4KLQkgKiBAcGFyYW0gZGVsZXRlUnVubmluZyBpZiA8Y29kZT50cnVlPC9jb2RlPiBydW5uaW5nIHNlcnZlcnMgd2lsbCBiZSBzdG9wcGVkCi0JICogCWJlZm9yZSBiZWluZyBkZWxldGVkLCBpZiA8Y29kZT5mYWxzZTwvY29kZT4gcnVubmluZyBzZXJ2ZXJzIHdpbGwgYmUgcmVtb3ZlZAotCSAqICAgIGZyb20gZGVsZXRpb24gbGlzdC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcmVwYXJlRm9yRGVsZXRpb24oYm9vbGVhbiBkZWxldGVSdW5uaW5nLCBib29sZWFuIHN0b3BSdW5uaW5nKSB7Ci0JCS8vIGNvbnZlcnRzIHNlcnZlcnMgJiBjb25maWdzIHRvIGxpc3QgdG8gZmFjaWxpdGF0ZSByZW1vdmFsCi0JCUxpc3Qgc2VydmVyc0xpc3QgPSBuZXcgTGlua2VkTGlzdChBcnJheXMuYXNMaXN0KHNlcnZlcnMpKTsKLQkJTGlzdCBjb25maWdzTGlzdCA9IG5ldyBMaW5rZWRMaXN0KEFycmF5cy5hc0xpc3QoY29uZmlncykpOwotCQlpZiAoZGVsZXRlUnVubmluZyA9PSBmYWxzZSkgewotCQkJLy8gZG9uJ3QgZGVsZXRlIHNlcnZlcnMgb3IgY29uZmlndXJhdGlvbnMKLQkJCWludCBzaXplID0gcnVubmluZ1NlcnZlcnNMaXN0LnNpemUoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJSVNlcnZlciBzZXJ2ZXIgPSAoSVNlcnZlcikgcnVubmluZ1NlcnZlcnNMaXN0LmdldChpKTsKLQkJCQlzZXJ2ZXJzTGlzdC5yZW1vdmUoc2VydmVyKTsKLQkJCQlpZiAoc2VydmVyLmdldFNlcnZlckNvbmZpZ3VyYXRpb24oKSAhPSBudWxsKQotCQkJCQljb25maWdzTGlzdC5yZW1vdmUoc2VydmVyLmdldFNlcnZlckNvbmZpZ3VyYXRpb24oKSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoc3RvcFJ1bm5pbmcpIHsKLQkJCQkvLyBzdG9wIHJ1bm5pbmcgc2VydmVycyBhbmQgd2FpdCBmb3IgdGhlbSAoc3RvcCBpcyBhc3luY2hyb25vdXMpCi0JCQkJSVNlcnZlciBzOwotCQkJCU11bHRpU2VydmVyU3RvcExpc3RlbmVyIGxpc3RlbmVyID0gbmV3IE11bHRpU2VydmVyU3RvcExpc3RlbmVyKCk7Ci0JCQkJaW50IGV4cGVjdGVkID0gMDsKLQkJCQlJdGVyYXRvciBpdGVyID0gcnVubmluZ1NlcnZlcnNMaXN0Lml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJCXMgPSAoSVNlcnZlcikgaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChzLmNhblN0b3AoKS5pc09LKCkpIHsKLQkJCQkJCSsrZXhwZWN0ZWQ7Ci0JCQkJCQlzLnN0b3AoZmFsc2UsIGxpc3RlbmVyKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8vIHNlcnZlciBjYW4ndCBiZSBzdG9wcGVkLCBkb24ndCBkZWxldGUgaXQKLQkJCQkJCXNlcnZlcnNMaXN0LnJlbW92ZShzKTsKLQkJCQkJCWNvbmZpZ3NMaXN0LnJlbW92ZShzLmdldFNlcnZlckNvbmZpZ3VyYXRpb24oKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJdHJ5IHsKLQkJCQkJd2hpbGUgKGV4cGVjdGVkICE9IGxpc3RlbmVyLmdldE51bWJlclN0b3BwZWQoKSkgewotCQkJCQkJVGhyZWFkLnNsZWVwKDEwMCk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJJbnRlcnJ1cHRlZCB3aGlsZSB3YWl0aW5nIGZvciBzZXJ2ZXJzIHN0b3AiKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc2VydmVycyA9IG5ldyBJU2VydmVyW3NlcnZlcnNMaXN0LnNpemUoKV07Ci0JCXNlcnZlcnNMaXN0LnRvQXJyYXkoc2VydmVycyk7Ci0JCWNvbmZpZ3MgPSBuZXcgSUZvbGRlcltjb25maWdzTGlzdC5zaXplKCldOwotCQljb25maWdzTGlzdC50b0FycmF5KGNvbmZpZ3MpOwotCX0KLQotCS8qKgotCSAqIENsYXNzIHVzZWQgdG8gd2FpdCBhbGwgc2VydmVycyBzdG9wLiBVc2Ugb25lIGluc3RhbmNlCi0JICogZm9yIGEgZ3JvdXAgb2Ygc2VydmVycyBhbmQgbG9vcCB0byBzZWUgaWYgdGhlIG51bWJlciBzdG9wcGVkCi0JICogZXF1YWxzIHRoZSBudW1iZXIgb2Ygc2VydmVycyB3YWl0aW5nIHRvIHN0b3AuCi0JICovCi0JY2xhc3MgTXVsdGlTZXJ2ZXJTdG9wTGlzdGVuZXIgaW1wbGVtZW50cyBJT3BlcmF0aW9uTGlzdGVuZXIgewotCQlwcm90ZWN0ZWQgaW50IG51bTsgCi0KLQkJcHVibGljIHZvaWQgZG9uZShJU3RhdHVzIHJlc3VsdCkgewotCQkJbnVtKys7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldE51bWJlclN0b3BwZWQoKSB7Ci0JCQlyZXR1cm4gbnVtOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL0VjbGlwc2VVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9FY2xpcHNlVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkY2RhYmQ5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL0VjbGlwc2VVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLklXb3JrYmVuY2hBZGFwdGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlclBsdWdpbjsKLS8qKgotICogRWNsaXBzZSB1dGlsaXR5IG1ldGhvZHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlVXRpbCB7Ci0JLyoqCi0JICogRWNsaXBzZVV0aWwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwcml2YXRlIEVjbGlwc2VVdGlsKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHNlcnZlciBwcm9qZWN0IHdpdGggdGhlIGdpdmVuIG5hbWUuIElmIHBhdGggaXMKLQkgKiBudWxsLCBpdCB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIGRlZmF1bHQgbG9jYXRpb24uCi0JICoKLQkgKiBAcGFyYW0gbmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIHBhdGggb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZS5JUGF0aAotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cwotCSAqLwotCXByaXZhdGUgc3RhdGljIElTdGF0dXMgY3JlYXRlU2VydmVyUHJvamVjdChTdHJpbmcgbmFtZSwgSVBhdGggcGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCS8vbW9uaXRvciA9IFByb2dyZXNzVXRpbC5nZXRNb25pdG9yRm9yKG1vbml0b3IpOwotCQkvL21vbml0b3IuYmVnaW5UYXNrKFNlcnZlclBsdWdpbi5nZXRSZXNvdXJjZSgiJWNyZWF0ZVNlcnZlclByb2plY3RUYXNrIiksIDMwMDApOwotCQkKLQkJdHJ5IHsKLQkJCUlXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCQkJSVByb2plY3QgcHJvamVjdCA9IHdvcmtzcGFjZS5nZXRSb290KCkuZ2V0UHJvamVjdChuYW1lKTsKLQkJCQotCQkJLy8gZ2V0IGEgcHJvamVjdCBkZXNjcmlwdG9yCi0JCQlJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gd29ya3NwYWNlLm5ld1Byb2plY3REZXNjcmlwdGlvbihuYW1lKTsKLQkJCWRlc2NyaXB0aW9uLnNldExvY2F0aW9uKHBhdGgpOwotCQkJCi0JCQlwcm9qZWN0LmNyZWF0ZShkZXNjcmlwdGlvbiwgUHJvZ3Jlc3NVdGlsLmdldFN1Yk1vbml0b3JGb3IobW9uaXRvciwgMTAwMCkpOwotCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJCXJldHVybiBudWxsOwotCQkJcHJvamVjdC5vcGVuKFByb2dyZXNzVXRpbC5nZXRTdWJNb25pdG9yRm9yKG1vbml0b3IsIDEwMDApKTsKLQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCQotCQkJLy8gYWRkIHRoZSBzZXJ2ZXIgcHJvamVjdCBuYXR1cmUKLQkJCVNlcnZlclBsdWdpbi5nZXRQcm9qZWN0UHJvcGVydGllcyhwcm9qZWN0KS5zZXRTZXJ2ZXJQcm9qZWN0KHRydWUsIG1vbml0b3IpOwotCQkJCi0JCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQkKLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3QgY3JlYXRlIHNlcnZlciBwcm9qZWN0IG5hbWVkICIgKyBuYW1lLCBjZSk7Ci0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yQ291bGROb3RDcmVhdGVTZXJ2ZXJQcm9qZWN0U3RhdHVzLCBjZS5nZXRNZXNzYWdlKCkpLCBjZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3QgY3JlYXRlIHNlcnZlciBwcm9qZWN0ICgyKSBuYW1lZCAiICsgbmFtZSwgZSk7Ci0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQsIDAsIE1lc3NhZ2VzLmVycm9yQ291bGROb3RDcmVhdGVTZXJ2ZXJQcm9qZWN0LCBlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCW1vbml0b3IuZG9uZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBzZXJ2ZXIgcHJvamVjdCB3aXRoIHRoZSBnaXZlbiBuYW1lLiBJZiBwYXRoIGlzCi0JICogbnVsbCwgaXQgd2lsbCBiZSBjcmVhdGVkIGluIHRoZSBkZWZhdWx0IGxvY2F0aW9uLgotCSAqCi0JICogQHBhcmFtIHNoZWxsIGEgc2hlbGwKLQkgKiBAcGFyYW0gbmFtZSBhIG5hbWUKLQkgKiBAcGFyYW0gcGF0aCBhIHBhdGgKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIG51bGwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY3JlYXRlTmV3U2VydmVyUHJvamVjdChmaW5hbCBTaGVsbCBzaGVsbCwgU3RyaW5nIG5hbWUsIElQYXRoIHBhdGgsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlmaW5hbCBJU3RhdHVzIHN0YXR1cyA9IGNyZWF0ZVNlcnZlclByb2plY3QobmFtZSwgcGF0aCwgbW9uaXRvcik7Ci0JCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCVNoZWxsIHNoZWxsMiA9IHNoZWxsOwotCQkJCQlpZiAoc2hlbGwgPT0gbnVsbCkKLQkJCQkJCXNoZWxsMiA9IGdldFNoZWxsKCk7Ci0JCQkJCW9wZW5FcnJvcihzaGVsbDIsIE1lc3NhZ2VzLmVycm9yQ291bGROb3RDcmVhdGVTZXJ2ZXJQcm9qZWN0LCBzdGF0dXMpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW1hZ2UgZm9yIGEgcHJvamVjdC4KLQkgKgotCSAqIEBwYXJhbSBwcm9qZWN0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ci0JICogQHJldHVybiBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRQcm9qZWN0SW1hZ2VEZXNjcmlwdG9yKElQcm9qZWN0IHByb2plY3QpIHsKLQkJaWYgKHByb2plY3QgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQotCQlJV29ya2JlbmNoQWRhcHRlciBhZGFwdGVyID0gKElXb3JrYmVuY2hBZGFwdGVyKSBwcm9qZWN0LmdldEFkYXB0ZXIoSVdvcmtiZW5jaEFkYXB0ZXIuY2xhc3MpOwotCQotCQlpZiAoYWRhcHRlciAhPSBudWxsKQotCQkJcmV0dXJuIGFkYXB0ZXIuZ2V0SW1hZ2VEZXNjcmlwdG9yKHByb2plY3QpOwotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc2hlbGwgZm9yIHRoZSB3b3JrYmVuY2guCi0JICoKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsCi0JICovCi0JcHVibGljIHN0YXRpYyBTaGVsbCBnZXRTaGVsbCgpIHsKLQkJcmV0dXJuIGdldFN0YW5kYXJkRGlzcGxheSgpLmdldEFjdGl2ZVNoZWxsKCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0YW5kYXJkIGRpc3BsYXkgdG8gYmUgdXNlZC4gVGhlIG1ldGhvZCBmaXJzdCBjaGVja3MsIGlmCi0JICogdGhlIHRocmVhZCBjYWxsaW5nIHRoaXMgbWV0aG9kIGhhcyBhbiBhc3NvY2lhdGVkIGRpc3BsYXkuIElmIHNvLCB0aGlzCi0JICogZGlzcGxheSBpcyByZXR1cm5lZC4gT3RoZXJ3aXNlIHRoZSBtZXRob2QgcmV0dXJucyB0aGUgZGVmYXVsdCBkaXNwbGF5LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGRpc3BsYXkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIERpc3BsYXkgZ2V0U3RhbmRhcmREaXNwbGF5KCkgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLQkJaWYgKGRpc3BsYXkgPT0gbnVsbCkKLQkJCWRpc3BsYXkgPSBEaXNwbGF5LmdldERlZmF1bHQoKTsKLQotCQlyZXR1cm4gZGlzcGxheTsJCQotCX0JCi0JCi0JLyoqCi0JICogT3BlbiBhIGRpYWxvZyB3aW5kb3cuCi0JICoKLQkgKiBAcGFyYW0gbWVzc2FnZSBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG9wZW5FcnJvcihmaW5hbCBTdHJpbmcgbWVzc2FnZSkgewotCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVNoZWxsIHNoZWxsID0gZ2V0U2hlbGwoKTsKLQkJCQlNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihzaGVsbCwgTWVzc2FnZXMuZXJyb3JEaWFsb2dUaXRsZSwgbWVzc2FnZSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIE9wZW4gYSBkaWFsb2cgd2luZG93LgotCSAqCi0JICogQHBhcmFtIG1lc3NhZ2UgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBzdGF0dXMgSVN0YXR1cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBvcGVuRXJyb3IoZmluYWwgU3RyaW5nIG1lc3NhZ2UsIGZpbmFsIElTdGF0dXMgc3RhdHVzKSB7Ci0JCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJU2hlbGwgc2hlbGwgPSBnZXRTaGVsbCgpOwotCQkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcihzaGVsbCwgTWVzc2FnZXMuZXJyb3JEaWFsb2dUaXRsZSwgbWVzc2FnZSwgc3RhdHVzKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogT3BlbiBhIGRpYWxvZyB3aW5kb3cuCi0JICoKLQkgKiBAcGFyYW0gc2hlbGwgdGhlIHNoZWxsCi0JICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgb3BlbkVycm9yKFNoZWxsIHNoZWxsLCBTdHJpbmcgbWVzc2FnZSkgewotCQlNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihzaGVsbCwgTWVzc2FnZXMuZXJyb3JEaWFsb2dUaXRsZSwgbWVzc2FnZSk7Ci0JfQotCi0JLyoqCi0JICogT3BlbiBhIGRpYWxvZyB3aW5kb3cuCi0JICoKLQkgKiBAcGFyYW0gc2hlbGwgYSBzaGVsbAotCSAqIEBwYXJhbSBtZXNzYWdlIGEgbWVzc2FnZQotCSAqIEBwYXJhbSBzdGF0dXMgYSBzdGF0dXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgb3BlbkVycm9yKFNoZWxsIHNoZWxsLCBTdHJpbmcgbWVzc2FnZSwgSVN0YXR1cyBzdGF0dXMpIHsKLQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKHNoZWxsLCBNZXNzYWdlcy5lcnJvckRpYWxvZ1RpdGxlLCBtZXNzYWdlLCBzdGF0dXMpOwotCX0KLQotCS8qKgotCSAqIERvIGEgdmFsaWRhdGVFZGl0KCkgb24gdGhlIGdpdmVuIHNlcnZlci4KLQkgKiAKLQkgKiBAcGFyYW0gc2hlbGwgYSBzaGVsbAotCSAqIEBwYXJhbSBzZXJ2ZXIgYSBzZXJ2ZXIKLQkgKiBAcmV0dXJuIHRydWUgaWYgdmFsaWRhdGUgZWRpdCB3b3JrZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdmFsaWRhdGVFZGl0KFNoZWxsIHNoZWxsLCBJU2VydmVyIHNlcnZlcikgewotCQlJU3RhdHVzIHN0YXR1cyA9IFNlcnZlclV0aWwudmFsaWRhdGVFZGl0KHNoZWxsLCBzZXJ2ZXIpOwotCQlyZXR1cm4gdmFsaWRhdGVFZGl0KHNoZWxsLCBzdGF0dXMpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiB2YWxpZGF0ZUVkaXQoU2hlbGwgc2hlbGwsIElTdGF0dXMgc3RhdHVzKSB7Ci0JCWlmIChzdGF0dXMgIT0gbnVsbCAmJiBzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKSB7Ci0JCQkvLyBpbmZvcm0gdXNlcgotCQkJU3RyaW5nIG1lc3NhZ2UgPSBNZXNzYWdlcy5lZGl0b3JWYWxpZGF0ZUVkaXRGYWlsdXJlTWVzc2FnZTsKLQkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcihzaGVsbCwgTWVzc2FnZXMuZXJyb3JEaWFsb2dUaXRsZSwgbWVzc2FnZSwgc3RhdHVzKTsKLQotCQkJLy8gZG8gbm90IGV4ZWN1dGUgY29tbWFuZAotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9JbWFnZVJlc291cmNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9JbWFnZVJlc291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzYmJiOTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvSW1hZ2VSZXNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotoCogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbkRlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZVJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlclBsdWdpbjsKLS8qKgotICogVXRpbGl0eSBjbGFzcyB0byBoYW5kbGUgaW1hZ2UgcmVzb3VyY2VzLgotICovCi1wdWJsaWMgY2xhc3MgSW1hZ2VSZXNvdXJjZSB7Ci0JLy8gdGhlIGltYWdlIHJlZ2lzdHJ5Ci0JcHJpdmF0ZSBzdGF0aWMgSW1hZ2VSZWdpc3RyeSBpbWFnZVJlZ2lzdHJ5OwotCi0JLy8gbWFwIG9mIGltYWdlIGRlc2NyaXB0b3JzIHNpbmNlIHRoZXNlCi0JLy8gd2lsbCBiZSBsb3N0IGJ5IHRoZSBpbWFnZSByZWdpc3RyeQotCXByaXZhdGUgc3RhdGljIE1hcCBpbWFnZURlc2NyaXB0b3JzOwotCi0JLy8gYmFzZSB1cmxzIGZvciBpbWFnZXMKLQlwcml2YXRlIHN0YXRpYyBVUkwgSUNPTl9CQVNFX1VSTDsKLQotCXN0YXRpYyB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgcGF0aFN1ZmZpeCA9ICJpY29ucy8iOwotCQkJSUNPTl9CQVNFX1VSTCA9IFNlcnZlclVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0QnVuZGxlKCkuZ2V0RW50cnkocGF0aFN1ZmZpeCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3Qgc2V0IGljb24gYmFzZSBVUkwiLCBlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVUkxfQ0xDTCA9ICJjbGNsMTYvIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMX0NUT09MID0gImN0b29sMTYvIjsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMX0VMQ0wgPSAiZWxjbDE2LyI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTF9FVE9PTCA9ICJldG9vbDE2LyI7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTF9ETENMID0gImRsY2wxNi8iOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVUkxfRFRPT0wgPSAiZHRvb2wxNi8iOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTF9PQkogPSAib2JqMTYvIjsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMX09WUiA9ICJvdnIxNi8iOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTF9XSVpCQU4gPSAid2l6YmFuLyI7Ci0KLQkvLyAtLS0gY29uc3RhbnRzIGZvciBpbWFnZXMgLS0tCi0KLQkvLyBTZXJ2ZXIgU3RhdGUgSW1hZ2VzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0NMQ0xfU1RBUlQgPSAiSU1HX0NMQ0xfU1RBUlQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19DTENMX1NUQVJUX0RFQlVHID0gIklNR19DTENMX1NUQVJUX0RFQlVHIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfQ0xDTF9TVEFSVF9QUk9GSUxFID0gIklNR19DTENMX1NUQVJUX1BST0ZJTEUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19DTENMX1JFU1RBUlQgPSAiSU1HX0NMQ0xfUkVTVEFSVCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0NMQ0xfU1RPUCA9ICJJTUdfQ0xDTF9TVE9QIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfQ0xDTF9QVUJMSVNIID0gIklNR19DTENMX1BVQkxJU0giOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19DTENMX0RJU0NPTk5FQ1QgPSAiSU1HX0NMQ0xfRElTQ09OTkVDVCI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRUxDTF9TVEFSVCA9ICJJTUdfRUxDTF9TVEFSVCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0VMQ0xfU1RBUlRfREVCVUcgPSAiSU1HX0VMQ0xfU1RBUlRfREVCVUciOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19FTENMX1NUQVJUX1BST0ZJTEUgPSAiSU1HX0VMQ0xfU1RBUlRfUFJPRklMRSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0VMQ0xfUkVTVEFSVCA9ICJJTUdfRUxDTF9SRVNUQVJUIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRUxDTF9TVE9QID0gIklNR19FTENMX1NUT1AiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19FTENMX1BVQkxJU0ggPSAiSU1HX0VMQ0xfUFVCTElTSCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0VMQ0xfRElTQ09OTkVDVCA9ICJJTUdfRUxDTF9ESVNDT05ORUNUIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19ETENMX1NUQVJUID0gIklNR19ETENMX1NUQVJUIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRExDTF9TVEFSVF9ERUJVRyA9ICJJTUdfRExDTF9TVEFSVF9ERUJVRyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0RMQ0xfU1RBUlRfUFJPRklMRSA9ICJJTUdfRExDTF9TVEFSVF9QUk9GSUxFIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRExDTF9SRVNUQVJUID0gIklNR19ETENMX1JFU1RBUlQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19ETENMX1NUT1AgPSAiSU1HX0RMQ0xfU1RPUCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0RMQ0xfUFVCTElTSCA9ICJJTUdfRExDTF9QVUJMSVNIIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRExDTF9ESVNDT05ORUNUID0gIklNR19ETENMX0RJU0NPTk5FQ1QiOwotCi0JLy8gV2l6YXJkIEJhbm5lciBJbWFnZXMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfV0laQkFOX05FV19SVU5USU1FID0gIm5ld1NlcnZlcldpeiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1dJWkJBTl9ORVdfU0VSVkVSID0gIm5ld1NlcnZlcldpeiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1dJWkJBTl9TRUxFQ1RfU0VSVkVSX0NMSUVOVCA9ICJ3aXpDbGllbnQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19XSVpCQU5fU0VMRUNUX1NFUlZFUiA9ICJzZWxlY3RTZXJ2ZXIiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19XSVpCQU5fSU1QT1JUX1NFUlZFUl9DT05GSUdVUkFUSU9OID0gImltcG9ydENvbmZpZ1dpeiI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfU0VSVkVSX1NUQVRFX1NUQVJURUQgPSAic3RhdGVTdGFydGVkIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfU0VSVkVSX1NUQVRFX1NUQVJURURfREVCVUcgPSAic3RhdGVTdGFydGVkRGVidWciOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19TRVJWRVJfU1RBVEVfU1RBUlRFRF9QUk9GSUxFID0gInN0YXRlU3RhcnRlZFByb2ZpbGUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19TRVJWRVJfU1RBVEVfU1RPUFBFRCA9ICJzdGF0ZVN0b3BwZWQiOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19TRVJWRVJfU1RBVEVfU1RBUlRJTkdfMSA9ICJzdGF0ZVN0YXJ0aW5nMSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1NFUlZFUl9TVEFURV9TVEFSVElOR18yID0gInN0YXRlU3RhcnRpbmcyIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfU0VSVkVSX1NUQVRFX1NUQVJUSU5HXzMgPSAic3RhdGVTdGFydGluZzMiOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19TRVJWRVJfU1RBVEVfU1RPUFBJTkdfMSA9ICJzdGF0ZVN0b3BwaW5nMSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1NFUlZFUl9TVEFURV9TVE9QUElOR18yID0gInN0YXRlU3RvcHBpbmcyIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfU0VSVkVSX1NUQVRFX1NUT1BQSU5HXzMgPSAic3RhdGVTdG9wcGluZzMiOwotCi0JLy8gU2VydmVyIENsaWVudCBJbWFnZXMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfQ1RPT0xfUlVOX09OX1NFUlZFUiA9ICJJTUdfQ1RPT0xfQ0xJRU5UIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfQ1RPT0xfREVCVUdfT05fU0VSVkVSID0gIklNR19DVE9PTF9DTElFTlQyIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfQ1RPT0xfUFJPRklMRV9PTl9TRVJWRVIgPSAiSU1HX0NUT09MX0NMSUVOVDMiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19DVE9PTF9ORVdfU0VSVkVSID0gIklNR19DVE9PTF9ORVdfU0VSVkVSIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfQ1RPT0xfTkVXX1NFUlZFUl9JTlNUQU5DRSA9ICJJTUdfQ1RPT0xfTkVXX1NFUlZFUl9JTlNUQU5DRSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0NUT09MX01PRElGWV9NT0RVTEVTID0gIklNR19DVE9PTF9NT0RJRllfTU9EVUxFUyI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRVRPT0xfUlVOX09OX1NFUlZFUiA9ICJJTUdfRVRPT0xfQ0xJRU5UIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRVRPT0xfREVCVUdfT05fU0VSVkVSID0gIklNR19FVE9PTF9DTElFTlQyIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRVRPT0xfUFJPRklMRV9PTl9TRVJWRVIgPSAiSU1HX0VUT09MX0NMSUVOVDMiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19FVE9PTF9NT0RJRllfTU9EVUxFUyA9ICJJTUdfRVRPT0xfTU9ESUZZX01PRFVMRVMiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0RUT09MX1JVTl9PTl9TRVJWRVIgPSAiSU1HX0RUT09MX0NMSUVOVCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0RUT09MX0RFQlVHX09OX1NFUlZFUiA9ICJJTUdfRFRPT0xfQ0xJRU5UMiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0RUT09MX1BST0ZJTEVfT05fU0VSVkVSID0gIklNR19EVE9PTF9DTElFTlQzIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRFRPT0xfTU9ESUZZX01PRFVMRVMgPSAiSU1HX0RUT09MX01PRElGWV9NT0RVTEVTIjsKLQotCS8vIEdlbmVyYWwgT2JqZWN0IEltYWdlcwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19TRVJWRVIgPSAic2VydmVyIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfU0VSVkVSX0NPTkZJR1VSQVRJT05fTk9ORSA9ICJub0NvbmZpZ3VyYXRpb24iOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19TRVJWRVJfQ09ORklHVVJBVElPTl9NSVNTSU5HID0gImNvbmZpZ3VyYXRpb25NaXNzaW5nIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUFJPSkVDVF9NSVNTSU5HID0gInByb2plY3RNaXNzaW5nIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUkVQQUlSX0NPTkZJR1VSQVRJT04gPSAicmVwYWlyQ29uZmlndXJhdGlvbiI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUFVCTElTSF9FTkFCTEVEID0gInB1Ymxpc2hFbmFibGVkIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUFVCTElTSF9ESVNBQkxFRCA9ICJwdWJsaXNoRGlzYWJsZWQiOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19NT05JVE9SX09OID0gIm1vbml0b3JPbiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX01PTklUT1JfT0ZGID0gIm1vbml0b3JPZmYiOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19ERUZBVUxUX1NFUlZFUl9PVkVSTEFZID0gImRlZmF1bHRTZXJ2ZXJPdmVybGF5IjsKLQkKLQkvLyBBdWRpbyBpbWFnZXMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfQVVESU9fU09VTkQgPSAic291bmQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19BVURJT19DQVRFR09SWSA9ICJjYXRlZ29yeSI7Ci0KLQkvKioKLQkgKiBDYW5ub3QgY29uc3RydWN0IGFuIEltYWdlUmVzb3VyY2UuIFVzZSBzdGF0aWMgbWV0aG9kcyBvbmx5LgotCSAqLwotCXByaXZhdGUgSW1hZ2VSZXNvdXJjZSgpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQkKLQkvKioKLQkgKiBEaXNwb3NlIG9mIGVsZW1lbnQgaW1hZ2VzIHRoYXQgd2VyZSBjcmVhdGVkLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbWFnZSB3aXRoIHRoZSBnaXZlbiBrZXkuCi0JICoKLQkgKiBAcGFyYW0ga2V5IGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW1hZ2UgZ2V0SW1hZ2UoU3RyaW5nIGtleSkgewotCQlpZiAoaW1hZ2VSZWdpc3RyeSA9PSBudWxsKQotCQkJaW5pdGlhbGl6ZUltYWdlUmVnaXN0cnkoKTsKLQkJSW1hZ2UgaW1hZ2UgPSBpbWFnZVJlZ2lzdHJ5LmdldChrZXkpOwotCQlpZiAoaW1hZ2UgPT0gbnVsbCkgewotCQkJaW1hZ2VSZWdpc3RyeS5wdXQoa2V5LCBJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpKTsKLQkJCWltYWdlID0gaW1hZ2VSZWdpc3RyeS5nZXQoa2V5KTsKLQkJfQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbWFnZSBkZXNjcmlwdG9yIHdpdGggdGhlIGdpdmVuIGtleS4KLQkgKgotCSAqIEBwYXJhbSBrZXkgamF2YS5sYW5nLlN0cmluZwotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBrZXkpIHsKLQkJaWYgKGltYWdlUmVnaXN0cnkgPT0gbnVsbCkKLQkJCWluaXRpYWxpemVJbWFnZVJlZ2lzdHJ5KCk7Ci0JCUltYWdlRGVzY3JpcHRvciBpZCA9IChJbWFnZURlc2NyaXB0b3IpIGltYWdlRGVzY3JpcHRvcnMuZ2V0KGtleSk7Ci0JCWlmIChpZCAhPSBudWxsKQotCQkJcmV0dXJuIGlkOwotCQkKLQkJcmV0dXJuIEltYWdlRGVzY3JpcHRvci5nZXRNaXNzaW5nSW1hZ2VEZXNjcmlwdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZSB0aGUgaW1hZ2UgcmVzb3VyY2VzLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBpbml0aWFsaXplSW1hZ2VSZWdpc3RyeSgpIHsKLQkJaW1hZ2VSZWdpc3RyeSA9IG5ldyBJbWFnZVJlZ2lzdHJ5KCk7Ci0JCWltYWdlRGVzY3JpcHRvcnMgPSBuZXcgSGFzaE1hcCgpOwotCi0JCS8vIHdpemFyZCBiYW5uZXJzCi0JCXJlZ2lzdGVySW1hZ2UoSU1HX1dJWkJBTl9ORVdfU0VSVkVSLCBVUkxfV0laQkFOICsgIm5ld19zZXJ2ZXJfd2l6LmdpZiIpOwotCQlyZWdpc3RlckltYWdlKElNR19XSVpCQU5fSU1QT1JUX1NFUlZFUl9DT05GSUdVUkFUSU9OLCBVUkxfV0laQkFOICsgImltcG9ydF9jb25maWd1cmF0aW9uX3dpei5naWYiKTsKLQkJcmVnaXN0ZXJJbWFnZShJTUdfV0laQkFOX1NFTEVDVF9TRVJWRVJfQ0xJRU5ULCBVUkxfV0laQkFOICsgInNlbGVjdF9jbGllbnRfd2l6LmdpZiIpOwotCQlyZWdpc3RlckltYWdlKElNR19XSVpCQU5fU0VMRUNUX1NFUlZFUiwgVVJMX1dJWkJBTiArICJzZWxlY3Rfc2VydmVyX3dpei5naWYiKTsKLQotCQkvLyBjbGllbnQgaW1hZ2VzCi0JCXJlZ2lzdGVySW1hZ2UoSU1HX0VUT09MX1JVTl9PTl9TRVJWRVIsIFVSTF9FVE9PTCArICJydW5fb25fc2VydmVyLmdpZiIpOwotCQlyZWdpc3RlckltYWdlKElNR19FVE9PTF9ERUJVR19PTl9TRVJWRVIsIFVSTF9FVE9PTCArICJkZWJ1Z19vbl9zZXJ2ZXIuZ2lmIik7Ci0JCXJlZ2lzdGVySW1hZ2UoSU1HX0VUT09MX1BST0ZJTEVfT05fU0VSVkVSLCBVUkxfRVRPT0wgKyAicHJvZmlsZV9vbl9zZXJ2ZXIuZ2lmIik7Ci0JCXJlZ2lzdGVySW1hZ2UoSU1HX0VUT09MX01PRElGWV9NT0RVTEVTLCBVUkxfRVRPT0wgKyAid2l6X21vZGlmeV9tb2R1bGVzLmdpZiIpOwotCi0JCXJlZ2lzdGVySW1hZ2UoSU1HX0NUT09MX1JVTl9PTl9TRVJWRVIsIFVSTF9DVE9PTCArICJydW5fb25fc2VydmVyLmdpZiIpOwotCQlyZWdpc3RlckltYWdlKElNR19DVE9PTF9ERUJVR19PTl9TRVJWRVIsIFVSTF9DVE9PTCArICJkZWJ1Z19vbl9zZXJ2ZXIuZ2lmIik7Ci0JCXJlZ2lzdGVySW1hZ2UoSU1HX0NUT09MX1BST0ZJTEVfT05fU0VSVkVSLCBVUkxfQ1RPT0wgKyAicHJvZmlsZV9vbl9zZXJ2ZXIuZ2lmIik7Ci0JCXJlZ2lzdGVySW1hZ2UoSU1HX0NUT09MX05FV19TRVJWRVIsIFVSTF9DVE9PTCArICJ3aXpfbmV3X3NlcnZlci5naWYiKTsKLQkJcmVnaXN0ZXJJbWFnZShJTUdfQ1RPT0xfTkVXX1NFUlZFUl9JTlNUQU5DRSwgVVJMX0NUT09MICsgIndpel9uZXdfaW5zdGFuY2UuZ2lmIik7Ci0JCXJlZ2lzdGVySW1hZ2UoSU1HX0NUT09MX01PRElGWV9NT0RVTEVTLCBVUkxfQ1RPT0wgKyAid2l6X21vZGlmeV9tb2R1bGVzLmdpZiIpOwotCi0JCXJlZ2lzdGVySW1hZ2UoSU1HX0RUT09MX1JVTl9PTl9TRVJWRVIsIFVSTF9EVE9PTCArICJydW5fb25fc2VydmVyLmdpZiIpOwotCQlyZWdpc3RlckltYWdlKElNR19EVE9PTF9ERUJVR19PTl9TRVJWRVIsIFVSTF9EVE9PTCArICJkZWJ1Z19vbl9zZXJ2ZXIuZ2lmIik7Ci0JCXJlZ2lzdGVySW1hZ2UoSU1HX0RUT09MX1BST0ZJTEVfT05fU0VSVkVSLCBVUkxfRFRPT0wgKyAicHJvZmlsZV9vbl9zZXJ2ZXIuZ2lmIik7Ci0JCXJlZ2lzdGVySW1hZ2UoSU1HX0RUT09MX01PRElGWV9NT0RVTEVTLCBVUkxfRFRPT0wgKyAid2l6X21vZGlmeV9tb2R1bGVzLmdpZiIpOwotCQotCQkvLyBsb2FkIHNlcnZlciBzdGF0ZSBpbWFnZXMKLQkJcmVnaXN0ZXJJbWFnZShJTUdfU0VSVkVSX1NUQVRFX1NUQVJURUQsIFVSTF9PQkogKyAic2VydmVyX3N0YXJ0ZWQuZ2lmIik7Ci0JCXJlZ2lzdGVySW1hZ2UoSU1HX1NFUlZFUl9TVEFURV9TVEFSVEVEX0RFQlVHLCBVUkxfT0JKICsgInNlcnZlcl9zdGFydGVkX2RlYnVnLmdpZiIpOwotCQlyZWdpc3RlckltYWdlKElNR19TRVJWRVJfU1RBVEVfU1RBUlRFRF9QUk9GSUxFLCBVUkxfT0JKICsgInNlcnZlcl9zdGFydGVkX3Byb2ZpbGUuZ2lmIik7Ci0JCXJlZ2lzdGVySW1hZ2UoSU1HX1NFUlZFUl9TVEFURV9TVE9QUEVELCBVUkxfT0JKICsgInNlcnZlcl9zdG9wcGVkLmdpZiIpOwotCQkKLQkJcmVnaXN0ZXJJbWFnZShJTUdfU0VSVkVSX1NUQVRFX1NUQVJUSU5HXzEsIFVSTF9PQkogKyAic2VydmVyX3N0YXJ0aW5nMS5naWYiKTsKLQkJcmVnaXN0ZXJJbWFnZShJTUdfU0VSVkVSX1NUQVRFX1NUQVJUSU5HXzIsIFVSTF9PQkogKyAic2VydmVyX3N0YXJ0aW5nMi5naWYiKTsKLQkJcmVnaXN0ZXJJbWFnZShJTUdfU0VSVkVSX1NUQVRFX1NUQVJUSU5HXzMsIFVSTF9PQkogKyAic2VydmVyX3N0YXJ0aW5nMy5naWYiKTsKLQkJCi0JCXJlZ2lzdGVySW1hZ2UoSU1HX1NFUlZFUl9TVEFURV9TVE9QUElOR18xLCBVUkxfT0JKICsgInNlcnZlcl9zdG9wcGluZzEuZ2lmIik7Ci0JCXJlZ2lzdGVySW1hZ2UoSU1HX1NFUlZFUl9TVEFURV9TVE9QUElOR18yLCBVUkxfT0JKICsgInNlcnZlcl9zdG9wcGluZzIuZ2lmIik7Ci0JCXJlZ2lzdGVySW1hZ2UoSU1HX1NFUlZFUl9TVEFURV9TVE9QUElOR18zLCBVUkxfT0JKICsgInNlcnZlcl9zdG9wcGluZzMuZ2lmIik7Ci0JCi0JCS8vIGxvYWQgYWN0aW9uIGltYWdlcwotCQlyZWdpc3RlckltYWdlKElNR19FTENMX1BVQkxJU0gsIFVSTF9FTENMICsgImxhdW5jaF9wdWJsaXNoLmdpZiIpOwotCQlyZWdpc3RlckltYWdlKElNR19FTENMX1NUQVJULCBVUkxfRUxDTCArICJsYXVuY2hfcnVuLmdpZiIpOwotCQlyZWdpc3RlckltYWdlKElNR19FTENMX1NUQVJUX0RFQlVHLCBVUkxfRUxDTCArICJsYXVuY2hfZGVidWcuZ2lmIik7Ci0JCXJlZ2lzdGVySW1hZ2UoSU1HX0VMQ0xfU1RBUlRfUFJPRklMRSwgVVJMX0VMQ0wgKyAibGF1bmNoX3Byb2ZpbGUuZ2lmIik7Ci0JCXJlZ2lzdGVySW1hZ2UoSU1HX0VMQ0xfUkVTVEFSVCwgVVJMX0VMQ0wgKyAibGF1bmNoX3Jlc3RhcnQuZ2lmIik7Ci0JCXJlZ2lzdGVySW1hZ2UoSU1HX0VMQ0xfU1RPUCwgVVJMX0VMQ0wgKyAibGF1bmNoX3N0b3AuZ2lmIik7Ci0JCXJlZ2lzdGVySW1hZ2UoSU1HX0VMQ0xfRElTQ09OTkVDVCwgVVJMX0VMQ0wgKyAibGF1bmNoX2Rpc2Nvbm5lY3QuZ2lmIik7Ci0JCi0JCXJlZ2lzdGVySW1hZ2UoSU1HX0NMQ0xfUFVCTElTSCwgVVJMX0NMQ0wgKyAibGF1bmNoX3B1Ymxpc2guZ2lmIik7Ci0JCXJlZ2lzdGVySW1hZ2UoSU1HX0NMQ0xfU1RBUlQsIFVSTF9DTENMICsgImxhdW5jaF9ydW4uZ2lmIik7Ci0JCXJlZ2lzdGVySW1hZ2UoSU1HX0NMQ0xfU1RBUlRfREVCVUcsIFVSTF9DTENMICsgImxhdW5jaF9kZWJ1Zy5naWYiKTsKLQkJcmVnaXN0ZXJJbWFnZShJTUdfQ0xDTF9TVEFSVF9QUk9GSUxFLCBVUkxfQ0xDTCArICJsYXVuY2hfcHJvZmlsZS5naWYiKTsKLQkJcmVnaXN0ZXJJbWFnZShJTUdfQ0xDTF9SRVNUQVJULCBVUkxfQ0xDTCArICJsYXVuY2hfcmVzdGFydC5naWYiKTsKLQkJcmVnaXN0ZXJJbWFnZShJTUdfQ0xDTF9TVE9QLCBVUkxfQ0xDTCArICJsYXVuY2hfc3RvcC5naWYiKTsKLQkJcmVnaXN0ZXJJbWFnZShJTUdfQ0xDTF9ESVNDT05ORUNULCBVUkxfQ0xDTCArICJsYXVuY2hfZGlzY29ubmVjdC5naWYiKTsKLQkKLQkJcmVnaXN0ZXJJbWFnZShJTUdfRExDTF9QVUJMSVNILCBVUkxfRExDTCArICJsYXVuY2hfcHVibGlzaC5naWYiKTsKLQkJcmVnaXN0ZXJJbWFnZShJTUdfRExDTF9TVEFSVCwgVVJMX0RMQ0wgKyAibGF1bmNoX3J1bi5naWYiKTsKLQkJcmVnaXN0ZXJJbWFnZShJTUdfRExDTF9TVEFSVF9ERUJVRywgVVJMX0RMQ0wgKyAibGF1bmNoX2RlYnVnLmdpZiIpOwotCQlyZWdpc3RlckltYWdlKElNR19ETENMX1NUQVJUX1BST0ZJTEUsIFVSTF9ETENMICsgImxhdW5jaF9wcm9maWxlLmdpZiIpOwotCQlyZWdpc3RlckltYWdlKElNR19ETENMX1JFU1RBUlQsIFVSTF9ETENMICsgImxhdW5jaF9yZXN0YXJ0LmdpZiIpOwotCQlyZWdpc3RlckltYWdlKElNR19ETENMX1NUT1AsIFVSTF9ETENMICsgImxhdW5jaF9zdG9wLmdpZiIpOwotCQlyZWdpc3RlckltYWdlKElNR19ETENMX0RJU0NPTk5FQ1QsIFVSTF9ETENMICsgImxhdW5jaF9kaXNjb25uZWN0LmdpZiIpOwotCQotCQkvLyBsb2FkIGdlbmVyYWwgb2JqZWN0IGltYWdlcwotCQlyZWdpc3RlckltYWdlKElNR19TRVJWRVIsIFVSTF9PQkogKyAic2VydmVyLmdpZiIpOwotCQlyZWdpc3RlckltYWdlKElNR19TRVJWRVJfQ09ORklHVVJBVElPTl9OT05FLCBVUkxfT0JKICsgImNvbmZpZ3VyYXRpb25fbm9uZS5naWYiKTsKLQkJcmVnaXN0ZXJJbWFnZShJTUdfU0VSVkVSX0NPTkZJR1VSQVRJT05fTUlTU0lORywgVVJMX09CSiArICJjb25maWd1cmF0aW9uX21pc3NpbmcuZ2lmIik7Ci0JCXJlZ2lzdGVySW1hZ2UoSU1HX1BST0pFQ1RfTUlTU0lORywgVVJMX09CSiArICJwcm9qZWN0X21pc3NpbmcuZ2lmIik7Ci0JCXJlZ2lzdGVySW1hZ2UoSU1HX1JFUEFJUl9DT05GSUdVUkFUSU9OLCBVUkxfT0JKICsgInJlcGFpcl9jb25maWcuZ2lmIik7Ci0JCi0JCXJlZ2lzdGVySW1hZ2UoSU1HX1BVQkxJU0hfRU5BQkxFRCwgVVJMX09CSiArICJwdWJsaXNoX2VuYWJsZWQuZ2lmIik7Ci0JCXJlZ2lzdGVySW1hZ2UoSU1HX1BVQkxJU0hfRElTQUJMRUQsIFVSTF9PQkogKyAicHVibGlzaF9kaXNhYmxlZC5naWYiKTsKLQkJCi0JCXJlZ2lzdGVySW1hZ2UoSU1HX01PTklUT1JfT04sIFVSTF9PQkogKyAibW9uaXRvck9uLmdpZiIpOwotCQlyZWdpc3RlckltYWdlKElNR19NT05JVE9SX09GRiwgVVJMX09CSiArICJtb25pdG9yT2ZmLmdpZiIpOwotCQkKLQkJcmVnaXN0ZXJJbWFnZShJTUdfREVGQVVMVF9TRVJWRVJfT1ZFUkxBWSwgVVJMX09WUiArICJkZWZhdWx0X3NlcnZlcl9vdnIuZ2lmIik7Ci0JCQotCQkvLyBhdWRpbyBpbWFnZXMKLQkJcmVnaXN0ZXJJbWFnZShJTUdfQVVESU9fU09VTkQsIFVSTF9PQkogKyAiYXVkaW9fc291bmQuZ2lmIik7Ci0JCXJlZ2lzdGVySW1hZ2UoSU1HX0FVRElPX0NBVEVHT1JZLCBVUkxfT0JKICsgImF1ZGlvX2NhdGVnb3J5LmdpZiIpOwotCQkKLQkJbG9hZFNlcnZlckltYWdlcygpOwotCQkKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRQcm9ncmVzc1NlcnZpY2UoKS5yZWdpc3Rlckljb25Gb3JGYW1pbHkoCi0JCQkJZ2V0SW1hZ2VEZXNjcmlwdG9yKElNR19TRVJWRVIpLCBTZXJ2ZXJQbHVnaW4uUExVR0lOX0lEKTsKLQl9Ci0KLQkvKioKLQkgKiBSZWdpc3RlciBhbiBpbWFnZSB3aXRoIHRoZSByZWdpc3RyeS4KLQkgKgotCSAqIEBwYXJhbSBrZXkgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBwYXJ0aWFsVVJMIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHJlZ2lzdGVySW1hZ2UoU3RyaW5nIGtleSwgU3RyaW5nIHBhcnRpYWxVUkwpIHsKLQkJdHJ5IHsKLQkJCUltYWdlRGVzY3JpcHRvciBpZCA9IEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKG5ldyBVUkwoSUNPTl9CQVNFX1VSTCwgcGFydGlhbFVSTCkpOwotCQkJaW1hZ2VSZWdpc3RyeS5wdXQoa2V5LCBpZCk7Ci0JCQlpbWFnZURlc2NyaXB0b3JzLnB1dChrZXksIGlkKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIHJlZ2lzdGVyaW5nIGltYWdlICIgKyBrZXkgKyAiIGZyb20gIiArIHBhcnRpYWxVUkwsIGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTG9hZCB0aGUgc2VydmVyIGltYWdlcy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGxvYWRTZXJ2ZXJJbWFnZXMoKSB7Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLkNPTkZJRywgIi0+LSBMb2FkaW5nIC5zZXJ2ZXJJbWFnZXMgZXh0ZW5zaW9uIHBvaW50IC0+LSIpOwotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlsb2FkU2VydmVySW1hZ2VzKHJlZ2lzdHJ5LmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcihTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQsIFNlcnZlclVJUGx1Z2luLkVYVEVOU0lPTl9TRVJWRVJfSU1BR0VTKSk7Ci0JCVNlcnZlclVJUGx1Z2luLmFkZFJlZ2lzdHJ5TGlzdGVuZXIoKTsKLQkJVHJhY2UudHJhY2UoVHJhY2UuQ09ORklHLCAiLTwtIERvbmUgbG9hZGluZyAuc2VydmVySW1hZ2VzIGV4dGVuc2lvbiBwb2ludCAtPC0iKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkIHRoZSBzZXJ2ZXIgaW1hZ2VzLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgbG9hZFNlcnZlckltYWdlcyhJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjZikgewotCQlpbnQgc2l6ZSA9IGNmLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJU3RyaW5nIHBsdWdpbklkID0gY2ZbaV0uZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCkuZ2V0TmFtZXNwYWNlKCk7Ci0JCQkJU3RyaW5nIGljb25QYXRoID0gY2ZbaV0uZ2V0QXR0cmlidXRlKCJpY29uIik7Ci0JCQkJSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IEFic3RyYWN0VUlQbHVnaW4uaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbihwbHVnaW5JZCwgaWNvblBhdGgpOwotCQkJCWlmIChpbWFnZURlc2NyaXB0b3IgPT0gbnVsbCAmJiBpY29uUGF0aCAhPSBudWxsICYmIGljb25QYXRoLmxlbmd0aCgpID4gMCkKLQkJCQkJaW1hZ2VEZXNjcmlwdG9yID0gSW1hZ2VEZXNjcmlwdG9yLmdldE1pc3NpbmdJbWFnZURlc2NyaXB0b3IoKTsKLQkJCQkKLQkJCQlpZiAoaW1hZ2VEZXNjcmlwdG9yICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIHR5cGVJZCA9IGNmW2ldLmdldEF0dHJpYnV0ZSgidHlwZUlkcyIpOwotCQkJCQlpZiAodHlwZUlkID09IG51bGwpCi0JCQkJCQl0eXBlSWQgPSBjZltpXS5nZXRBdHRyaWJ1dGUoIm1vZHVsZUlkIik7Ci0JCQkJCWltYWdlUmVnaXN0cnkucHV0KHR5cGVJZCwgaW1hZ2VEZXNjcmlwdG9yKTsJCQotCQkJCQlpbWFnZURlc2NyaXB0b3JzLnB1dCh0eXBlSWQsIGltYWdlRGVzY3JpcHRvcik7Ci0JCQkJfQotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkNPTkZJRywgIiAgTG9hZGVkIHNlcnZlckltYWdlOiAiICsgY2ZbaV0uZ2V0QXR0cmlidXRlKCJpZCIpKTsKLQkJCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiICBDb3VsZCBub3QgbG9hZCBzZXJ2ZXJJbWFnZTogIiArIGNmW2ldLmdldEF0dHJpYnV0ZSgiaWQiKSwgdCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgaGFuZGxlU2VydmVySW1hZ2VEZWx0YShJRXh0ZW5zaW9uRGVsdGEgZGVsdGEpIHsKLQkJaWYgKGltYWdlUmVnaXN0cnkgPT0gbnVsbCkgLy8gbm90IGxvYWRlZCB5ZXQKLQkJCXJldHVybjsKLQkJCi0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNmID0gZGVsdGEuZ2V0RXh0ZW5zaW9uKCkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCQotCQlpZiAoZGVsdGEuZ2V0S2luZCgpID09IElFeHRlbnNpb25EZWx0YS5BRERFRCkKLQkJCWxvYWRTZXJ2ZXJJbWFnZXMoY2YpOwotCQllbHNlIHsKLQkJCWludCBzaXplID0gY2YubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlTdHJpbmcgdHlwZUlkID0gY2ZbaV0uZ2V0QXR0cmlidXRlKCJ0eXBlSWRzIik7Ci0JCQkJaW1hZ2VSZWdpc3RyeS5yZW1vdmUodHlwZUlkKTsKLQkJCQlpbWFnZURlc2NyaXB0b3JzLnJlbW92ZSh0eXBlSWQpOwotCQkJfQotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL0xhdW5jaENsaWVudEpvYi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvTGF1bmNoQ2xpZW50Sm9iLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1MTNiZWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvTGF1bmNoQ2xpZW50Sm9iLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLaAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLio7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgTGF1bmNoQ2xpZW50Sm9iIGV4dGVuZHMgQ2hhaW5lZEpvYiB7Ci0JcHJvdGVjdGVkIElNb2R1bGVbXSBtb2R1bGU7Ci0JcHJvdGVjdGVkIElDbGllbnQgY2xpZW50OwotCXByb3RlY3RlZCBJTGF1bmNoYWJsZUFkYXB0ZXIgbGF1bmNoYWJsZUFkYXB0ZXI7Ci0JcHJvdGVjdGVkIFN0cmluZyBsYXVuY2hNb2RlOwotCXByb3RlY3RlZCBJTW9kdWxlQXJ0aWZhY3QgbW9kdWxlQXJ0aWZhY3Q7Ci0KLQlwdWJsaWMgTGF1bmNoQ2xpZW50Sm9iKElTZXJ2ZXIgc2VydmVyLCBJTW9kdWxlW10gbW9kdWxlLCBTdHJpbmcgbGF1bmNoTW9kZSwgSU1vZHVsZUFydGlmYWN0IG1vZHVsZUFydGlmYWN0LCBJTGF1bmNoYWJsZUFkYXB0ZXIgbGF1bmNoYWJsZUFkYXB0ZXIsIElDbGllbnQgY2xpZW50KSB7Ci0JCXN1cGVyKE1lc3NhZ2VzLmxhdW5jaGluZ0NsaWVudFRhc2ssIHNlcnZlcik7Ci0JCXRoaXMubW9kdWxlID0gbW9kdWxlOwotCQl0aGlzLmxhdW5jaE1vZGUgPSBsYXVuY2hNb2RlOwotCQl0aGlzLm1vZHVsZUFydGlmYWN0ID0gbW9kdWxlQXJ0aWZhY3Q7Ci0JCXRoaXMubGF1bmNoYWJsZUFkYXB0ZXIgPSBsYXVuY2hhYmxlQWRhcHRlcjsKLQkJdGhpcy5jbGllbnQgPSBjbGllbnQ7Ci0JCXNldFJ1bGUobmV3IFNlcnZlclNjaGVkdWxpbmdSdWxlKHNlcnZlcikpOwotCX0KLQotCS8qKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2IjcnVuKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVIsICJMYXVuY2hDbGllbnQgam9iIik7Ci0JCUlTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQotCQkvLyB3YWl0IGZvciB1cCB0byA1IG1pbnV0ZXMKLQkJZmluYWwgU2VydmVyIHNlcnZlciA9IChTZXJ2ZXIpIGdldFNlcnZlcigpOwotCQlpbnQgc3RhdGUgPSBzZXJ2ZXIuZ2V0TW9kdWxlU3RhdGUobW9kdWxlKTsKLQkJaW50IGNvdW50ID0gU2VydmVyUHJlZmVyZW5jZXMuZ2V0SW5zdGFuY2UoKS5nZXRNb2R1bGVTdGFydFRpbWVvdXQoKTsKLQkJd2hpbGUgKHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfU1RBUlRJTkcgJiYgY291bnQgPiAwKSB7Ci0JCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJcmV0dXJuIHN0YXR1czsKLQkJCXRyeSB7Ci0JCQkJVGhyZWFkLnNsZWVwKDIwMDApOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBpZ25vcmUKLQkJCX0KLQkJCWNvdW50IC09IDIwMDA7Ci0JCQlzdGF0ZSA9IHNlcnZlci5nZXRNb2R1bGVTdGF0ZShtb2R1bGUpOwotCQl9Ci0JCQotCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FUiwgIkxhdW5jaENsaWVudCBqb2IgMiAiICsgc3RhdGUpOwotCQkKLQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJcmV0dXJuIHN0YXR1czsKLQkJCi0JCWlmIChzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1NUQVJUSU5HKQotCQkJcmV0dXJuIHN0YXR1czsKLQkJCi0JCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVSLCAiTGF1bmNoQ2xpZW50IGpvYiAzIik7Ci0JCQotCQkvLyBkaXNwbGF5IGNsaWVudCBvbiBVSSB0aHJlYWQKLQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJBdHRlbXB0aW5nIHRvIGxvYWQgY2xpZW50OiAiICsgY2xpZW50KTsKLQkJCQl0cnkgewotCQkJCQlPYmplY3QgbGF1bmNoYWJsZSA9IGxhdW5jaGFibGVBZGFwdGVyLmdldExhdW5jaGFibGUoc2VydmVyLCBtb2R1bGVBcnRpZmFjdCk7Ci0JCQkJCWNsaWVudC5sYXVuY2goc2VydmVyLCBsYXVuY2hhYmxlLCBsYXVuY2hNb2RlLCBzZXJ2ZXIuZ2V0RXhpc3RpbmdMYXVuY2goKSk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiU2VydmVyIGNsaWVudCBmYWlsZWQiLCBlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FUiwgIkxhdW5jaENsaWVudCBqb2IgNCIpOwotCQlyZXR1cm4gc3RhdHVzOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9NZXNzYWdlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzMwMjcwYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotoCoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotLyoqCi0gKiBUcmFuc2xhdGVkIG1lc3NhZ2VzLgotICovCi1wdWJsaWMgY2xhc3MgTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpYWxvZ01vbml0b3JEZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaWFsb2dNb25pdG9yQWRkRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JWZXJzaW9uTGV2ZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgbG9hZGluZ1Rhc2s7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY3JlYXRlU2VydmVyUHJvamVjdERpYWxvZ01lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVmYXVsdFNlcnZlclByb2plY3ROYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRlcm1pbmF0ZVNlcnZlckRpYWxvZ01lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aW9uTW9uaXRvclBvcnQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVsZXRlU2VydmVyRGlhbG9nVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVsZXRlU2VydmVyRGlhbG9nTWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWxldGVTZXJ2ZXJEaWFsb2dNZXNzYWdlTWFueTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWxldGVTZXJ2ZXJEaWFsb2dMb29zZUNvbmZpZ3VyYXRpb25zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlbGV0ZVNlcnZlckRpYWxvZ1J1bm5pbmdTZXJ2ZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVsZXRlU2VydmVyRGlhbG9nUnVubmluZ1NlcnZlclN0b3A7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVsZXRlU2VydmVyVGFzazsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckNvdWxkTm90Q3JlYXRlU2VydmVyUHJvamVjdFN0YXR1czsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaWFsb2dTdG9wcGluZ1NlcnZlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzYXZpbmdUYXNrOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVkaXRvclNhdmVFcnJvckRpYWxvZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlZGl0b3JTYXZlRXJyb3JNZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVkaXRvclJlYWRPbmx5RmlsZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JFZGl0b3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWRpdG9yVW5kb0Rpc2FibGVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVkaXRvclVuZG9FbmFibGVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVkaXRvclJlZG9EaXNhYmxlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlZGl0b3JSZWRvRW5hYmxlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlZGl0b3JSZXNvdXJjZURlbGV0ZVRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVkaXRvclJlc291cmNlRGVsZXRlU2VydmVyTWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlZGl0b3JSZXNvdXJjZURlbGV0ZVNhdmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVzb3VyY2VEaXJ0eURpYWxvZ01lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2l6U2VsZWN0Q2xpZW50VGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2l6U2VsZWN0Q2xpZW50RGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVzb3VyY2VEaXJ0eURpYWxvZ1RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlc291cmNlRGlydHlEaWFsb2dDb250aW51ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3aXpOZXdSdW50aW1lV2l6YXJkVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VydmVyTGF1bmNoRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VydmVyTGF1bmNoU2VydmVyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlcnZlckxhdW5jaEhvc3Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VydmVyTGF1bmNoUnVudGltZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvck5vU2VydmVyU2VsZWN0ZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JTZXJ2ZXJBbHJlYWR5UnVubmluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckludmFsaWRTZXJ2ZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VydmVyTGF1bmNoQ29uZmlndXJhdGlvblRhYjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3aXpTZWxlY3RDbGllbnRNZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yQ291bGROb3RDcmVhdGVTZXJ2ZXJQcm9qZWN0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yRGlhbG9nVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWRpdG9yVmFsaWRhdGVFZGl0RmFpbHVyZU1lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJlZlByb2plY3REZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmVmUHJvamVjdE5vdE1vZHVsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmVmUHJvamVjdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmVmUHJvamVjdERlZmF1bHRTZXJ2ZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJlZlByb2plY3ROb3RDb25maWd1cmVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByZWZQcm9qZWN0Tm9TZXJ2ZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JDb3VsZE5vdFNhdmVQcmVmZXJlbmNlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByZWZlcmVuY2VSdW50aW1lc0Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFkZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlZGl0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbW92ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWFyY2g7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlhbG9nUnVudGltZVNlYXJjaE1lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlhbG9nUnVudGltZVNlYXJjaFRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpYWxvZ1J1bnRpbWVTZWFyY2hQcm9ncmVzczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbmZvTm9SdW50aW1lc0ZvdW5kOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdpekVkaXRSdW50aW1lV2l6YXJkVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJlZmVyZW5jZVJ1bnRpbWVzVGFibGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlhbG9nUnVudGltZUluVXNlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlZmF1bHREaWFsb2dUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmVmZXJlbmNlUnVudGltZXNUaXRsZUxvbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcnVudGltZVRhcmdldENvbWJvOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJ1bnRpbWVUYXJnZXROb25lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJ1bnRpbWVUYXJnZXROZXdSdW50aW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJ1bnRpbWVUYXJnZXRDaGlsZHJlbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBydW50aW1lVGFyZ2V0UnVudGltZVByZWZlcmVuY2VzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByZWZBdXRvUHVibGlzaDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmVmQXV0b1B1Ymxpc2hMb2NhbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmVmQXV0b1B1Ymxpc2hMb2NhbFRpbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJlZkF1dG9QdWJsaXNoUmVtb3RlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByZWZBdXRvUHVibGlzaFJlbW90ZVRpbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJlZkF1dG9SZXN0YXJ0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByZWZQcm9tcHRJcnJldmVyc2libGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJlZlNob3dPbkFjdGl2aXR5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByZWZTeW5jU3RhcnR1cDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmVmU2F2ZUVkaXRvcnNHcm91cDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmVmU2F2ZUVkaXRvcnNOZXZlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmVmU2F2ZUVkaXRvcnNQcm9tcHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJlZlNhdmVFZGl0b3JzQXV0b3NhdmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJlZk1hY2hpbmVTcGVlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmVmTWFjaGluZVNwZWVkVmVyeVNsb3c7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJlZk1hY2hpbmVTcGVlZFNsb3c7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJlZk1hY2hpbmVTcGVlZEF2ZXJhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJlZk1hY2hpbmVTcGVlZEZhc3Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJlZk1hY2hpbmVTcGVlZFZlcnlGYXN0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGlvbk5ldzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpb25OZXdTZXJ2ZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aW9uRGVidWdUb29sVGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGlvbkRlYnVnOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGlvblN0YXJ0VG9vbFRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpb25TdGFydDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpb25Qcm9maWxlVG9vbFRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpb25Qcm9maWxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGlvblJlc3RhcnRUb29sVGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGlvblJlc3RhcnQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aW9uUHVibGlzaFRvb2xUaXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aW9uUHVibGlzaDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpb25EZWxldGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aW9uUmVtb3ZlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpYWxvZ1JlbW92ZU1vZHVsZUNvbmZpcm07Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGVybWluYXRlU2VydmVyRGlhbG9nVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aW9uRGVidWdPblNlcnZlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpb25Qcm9maWxlT25TZXJ2ZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aW9uUnVuT25TZXJ2ZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aW9uUmVzdGFydE1vZHVsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpb25VcGRhdGVTdGF0dXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aW9uTW92ZVNlcnZlclRvTWV0YWRhdGE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aW9uTW92ZVNlcnZlclRvV29ya3NwYWNlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpYWxvZ0FkZFJlbW92ZU1vZHVsZXNOb25lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGlvblNldE5ld1NlcnZlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvck5vTW9kdWxlczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaWFsb2dNb2RlV2FybmluZ0RlYnVnOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpYWxvZ01vZGVXYXJuaW5nUHJvZmlsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvck5vU2VydmVyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yTm9DbGllbnQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlhbG9nTW9kZVdhcm5pbmdSZXN0YXJ0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpYWxvZ01vZGVXYXJuaW5nQ29udGludWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgaG9zdG5hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2l6TW9kdWxlVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2l6TW9kdWxlRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2l6TW9kdWxlTWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3aXpNb2R1bGVBdmFpbGFibGVMaXN0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdpek1vZHVsZURlcGxveWVkTGlzdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3aXpNb2R1bGVBZGQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2l6TW9kdWxlUmVtb3ZlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdpek1vZHVsZUFkZEFsbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3aXpNb2R1bGVSZW1vdmVBbGw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2l6VGFza1RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdpelRhc2tEZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3aXpUYXNrTm9uZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3aXpFcnJvckludmFsaWRGb2xkZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2l6RXJyb3JDbG9zZWRQcm9qZWN0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNyZWF0ZVNlcnZlclByb2plY3REaWFsb2dUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3aXpOZXdTZXJ2ZXJUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3aXpOZXdTZXJ2ZXJEZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3aXpOZXdTZXJ2ZXJTZWxlY3Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2l6TmV3U2VydmVyTWFudWFsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdpelNlbGVjdFNlcnZlclByZWZlcnJlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3aXpOZXdTZXJ2ZXJFeGlzdGluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3aXpOZXdTZXJ2ZXJSdW50aW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdpek5ld1NlcnZlclJ1bnRpbWVDcmVhdGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2l6RXJyb3JTZXJ2ZXJDcmVhdGlvbkVycm9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdpelJ1bk9uU2VydmVyVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2l6RGVidWdPblNlcnZlclRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdpelByb2ZpbGVPblNlcnZlclRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdpek5ld1J1bnRpbWVUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3aXpOZXdSdW50aW1lRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcGVyZm9ybWluZ1Rhc2tzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdpek1vZHVsZVdpemFyZFRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdpek5ld1NlcnZlcldpemFyZFRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdpelNlbGVjdENsaWVudFdpemFyZFRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdpelRhc2tXaXphcmRUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2aWV3Qnk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2l6RGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlhbG9nTW9uaXRvckNvbHVtblN0YXR1czsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaWFsb2dNb25pdG9yQ29sdW1uVHlwZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaWFsb2dNb25pdG9yQ29sdW1uUG9ydDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaWFsb2dNb25pdG9yQ29sdW1uTW9uaXRvclBvcnQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlhbG9nTW9uaXRvckNvbHVtbkNvbnRlbnRUeXBlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0YXJ0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0b3A7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlhbG9nTW9uaXRvclRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpYWxvZ01vbml0b3JNb25pdG9yUG9ydDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaWFsb2dNb25pdG9yQ29udGVudFR5cGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlhbG9nTW9uaXRvckNvbnRlbnRUeXBlQWxsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0YXJ0ZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3RvcHBlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaWFsb2dNb25pdG9yQ29udGVudFR5cGVXZWI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlhbG9nTW9uaXRvckNvbnRlbnRUeXBlV2ViU2VydmljZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29sdW1uTmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb2x1bW5UeXBlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJ1bnRpbWVUeXBlQ29tcFRyZWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcnVudGltZVR5cGVDb21wRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgbmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2ZW5kb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmVyc2lvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtb2R1bGVTdXBwb3J0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGluc3RhbGxlZFJ1bnRpbWVzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdpek5ld1NlcnZlclNlbGVjdEV4aXN0aW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGhvc3Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWxlbWVudFVua25vd25OYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlcnZlclR5cGVDb21wTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmlld1NlcnZlcnM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmlld05vTW9kdWxlczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpb25Nb25pdG9yUHJvcGVydGllczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpb25PcGVuOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZpZXdTZXJ2ZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmlld1N0YXR1czsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2aWV3U3luYzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpb25TdG9wVG9vbFRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpb25TdG9wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGlvbk1vZGlmeU1vZHVsZXNUb29sVGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGlvbk1vZGlmeU1vZHVsZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aW9uTW9uaXRvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2aWV3U3luY09rYXk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmlld1N5bmNSZXN0YXJ0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZpZXdTeW5jUHVibGlzaDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2aWV3U3luY1Jlc3RhcnRQdWJsaXNoOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZpZXdTeW5jUHVibGlzaGluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2aWV3U3luY09rYXkyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZpZXdTeW5jUmVzdGFydDI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmlld1N5bmNQdWJsaXNoMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2aWV3U3luY1Jlc3RhcnRQdWJsaXNoMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2aWV3U3luY1B1Ymxpc2hpbmcyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVkaXRvclNlcnZlckVkaXRvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlZGl0b3JQcm9tcHRJcnJldmVyc2libGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWRpdG9yUmVuYW1lRmlsZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JFZGl0b3JDYW50U2F2ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlZGl0b3JSZWFkT25seTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlZGl0b3JXcml0YWJsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlZGl0b3JSZXNvdXJjZU1vZGlmaWVkVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWRpdG9yUmVhZE9ubHlNZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVkaXRvclNlcnZlck1vZGlmaWVkTWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlZGl0b3JSZXNvdXJjZVdhcm5UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlZGl0b3JSZXNvdXJjZVdhcm5NZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlcnZlckVkaXRvck92ZXJ2aWV3UGFnZVRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlcnZlckVkaXRvck92ZXJ2aWV3R2VuZXJhbFNlY3Rpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VydmVyRWRpdG9yT3ZlcnZpZXdHZW5lcmFsRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VydmVyRWRpdG9yT3ZlcnZpZXdTZXJ2ZXJOYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlcnZlckVkaXRvck92ZXJ2aWV3U2VydmVySG9zdG5hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VydmVyRWRpdG9yT3ZlcnZpZXdSdW50aW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlcnZlckVkaXRvck92ZXJ2aWV3UnVudGltZUVkaXQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VydmVyRWRpdG9yT3ZlcnZpZXdTZXJ2ZXJDb25maWd1cmF0aW9uUGF0aDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZXJ2ZXJFZGl0b3JPdmVydmlld1NlcnZlckNvbmZpZ3VyYXRpb25Ccm93c2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VydmVyRWRpdG9yT3ZlcnZpZXdTZXJ2ZXJDb25maWd1cmF0aW9uQnJvd3NlTWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZXJ2ZXJFZGl0b3JPdmVydmlld0F1dG9QdWJsaXNoU2VjdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZXJ2ZXJFZGl0b3JPdmVydmlld0F1dG9QdWJsaXNoRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VydmVyRWRpdG9yT3ZlcnZpZXdBdXRvUHVibGlzaERlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VydmVyRWRpdG9yT3ZlcnZpZXdBdXRvUHVibGlzaERlZmF1bHRFZGl0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlcnZlckVkaXRvck92ZXJ2aWV3QXV0b1B1Ymxpc2hEaXNhYmxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlcnZlckVkaXRvck92ZXJ2aWV3QXV0b1B1Ymxpc2hPdmVycmlkZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZXJ2ZXJFZGl0b3JPdmVydmlld0F1dG9QdWJsaXNoT3ZlcnJpZGVJbnRlcnZhbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZXJ2ZXJFZGl0b3JPdmVydmlld0F1dG9QdWJsaXNoQ29tbWFuZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZXJ2ZXJFZGl0b3JPdmVydmlld0F1dG9QdWJsaXNoSW52YWxpZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZXJ2ZXJFZGl0b3JPdmVydmlld1NlcnZlckhvc3RuYW1lQ29tbWFuZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZXJ2ZXJFZGl0b3JPdmVydmlld1NlcnZlck5hbWVDb21tYW5kOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlcnZlckVkaXRvck92ZXJ2aWV3UnVudGltZUNvbW1hbmQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VydmVyRWRpdG9yT3ZlcnZpZXdPcGVuTGF1bmNoQ29uZmlndXJhdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvck1pc3NpbmdDb25maWd1cmF0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZpZXdTdGF0dXNTdGFydGluZzQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmlld1N0YXR1c1N0YXJ0ZWQyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZpZXdTdGF0dXNTdG9wcGluZzQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmlld1N0YXR1c1N0b3BwZWQyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZpZXdTdGF0dXNTdGFydGluZzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmlld1N0YXR1c1N0YXJ0aW5nMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2aWV3U3RhdHVzU3RhcnRpbmczOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZpZXdTdGF0dXNTdG9wcGluZzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmlld1N0YXR1c1N0b3BwaW5nMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2aWV3U3RhdHVzU3RvcHBpbmczOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZpZXdTdGF0dXNTdGFydGVkRGVidWc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmlld1N0YXR1c1N0YXJ0ZWRQcm9maWxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZpZXdTdGF0dXNTdGFydGVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZpZXdTdGF0dXNTdG9wcGVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGlvblN0b3BUb29sVGlwMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpb25TdG9wMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsYXVuY2hpbmdDbGllbnRUYXNrOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdpek5ld0luc3RhbGxhYmxlU2VydmVyVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2l6TmV3SW5zdGFsbGFibGVTZXJ2ZXJEZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3aXpOZXdJbnN0YWxsYWJsZVNlcnZlclJlc3RhcnQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW5zdGFsbGFibGVTZXJ2ZXJDb21wVHJlZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbnN0YWxsYWJsZVNlcnZlckxpbms7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvclN0YXJ0aW5nTW9uaXRvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhdWRpb1ByZWZTZWxlY3RGaWxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGF1ZGlvUHJlZkVuYWJsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhdWRpb1ByZWZWb2x1bWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYXVkaW9QcmVmU291bmRzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGF1ZGlvUHJlZlNvdW5kOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGF1ZGlvUHJlZkZpbGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYXVkaW9QcmVmUGxheTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhdWRpb1ByZWZCcm93c2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYXVkaW9QcmVmUmVzZXQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYXVkaW9Vbmtub3duOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGF1ZGlvTm9uZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhdWRpb0RlZmF1bHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmVmZXJlbmNlSW50ZXJuZXREZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbnRlcm5hbFdlYkJyb3dzZXJOYW1lOwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLmludGVybmFsLk1lc3NhZ2VzIiwgTWVzc2FnZXMuY2xhc3MpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9NZXNzYWdlcy5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvTWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc1ZGEwOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9NZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDM0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgLS0tLS0tLS0tLS0tLS0tIFdpemFyZHMgLS0tLS0tLS0tLS0tLS0tCi0jIChJZiB0aGUgZmlyc3QgdHdvIGxpbmVzIGluIGEgZ3JvdXAgZG8gbm90IHN0YXJ0IHdpdGggIndpeiIsIGl0IGlzIGJlY2F1c2UKLSMgdGhvc2UgbGluZXMgYXJlIGRpc3BsYXllZCBpbiB0aGUgd29ya2JlbmNoICJOZXciIHdpemFyZC4gVGhlIHJlc3Qgb2YgdGhlCi0jIHRleHQgaXMgZGlzcGxheWVkIGluIGVhY2ggYWN0dWFsIHdpemFyZCkKLQotIyBOZXcgU2VydmVyIChhbmQgQ29uZmlndXJhdGlvbikgV2l6YXJkCi13aXpOZXdTZXJ2ZXJXaXphcmRUaXRsZT1OZXcgU2VydmVyCi13aXpOZXdTZXJ2ZXJUaXRsZT1EZWZpbmUgYSBOZXcgU2VydmVyCi13aXpOZXdTZXJ2ZXJEZXNjcmlwdGlvbj1DaG9vc2UgdGhlIHR5cGUgb2Ygc2VydmVyIHRvIGNyZWF0ZQotd2l6TmV3U2VydmVyUnVudGltZT1TZXJ2ZXIgJnJ1bnRpbWU6Ci13aXpOZXdTZXJ2ZXJSdW50aW1lQ3JlYXRlPUNyZWF0ZSBhIG5ldyBydW50aW1lCi0KLXdpek5ld1NlcnZlclNlbGVjdD1Ib3cgZG8geW91IHdhbnQgdG8gc2VsZWN0IHRoZSBzZXJ2ZXI/Ci13aXpOZXdTZXJ2ZXJFeGlzdGluZz1DaG9vc2UgYW4gZSZ4aXN0aW5nIHNlcnZlcgotd2l6TmV3U2VydmVyTWFudWFsPSZNYW51YWxseSBkZWZpbmUgYSBuZXcgc2VydmVyCi13aXpOZXdTZXJ2ZXJTZWxlY3RFeGlzdGluZz1TZWxlY3QgdGhlIHNlcnZlciB0aGF0IHlvdSB3YW50IHRvIHVzZToKLQotIyBTZWxlY3QgU2VydmVyIHdpemFyZAotd2l6UnVuT25TZXJ2ZXJUaXRsZT1SdW4gT24gU2VydmVyCi13aXpEZWJ1Z09uU2VydmVyVGl0bGU9RGVidWcgT24gU2VydmVyCi13aXpQcm9maWxlT25TZXJ2ZXJUaXRsZT1Qcm9maWxlIE9uIFNlcnZlcgotd2l6U2VsZWN0U2VydmVyUHJlZmVycmVkPVNldCBzZXJ2ZXIgYXMgcHJvamVjdCAmZGVmYXVsdCAoZG8gbm90IGFzayBhZ2FpbikKLQotIyBTZWxlY3QgU2VydmVyIENsaWVudCBXaXphcmQKLXdpelNlbGVjdENsaWVudFdpemFyZFRpdGxlPVNlbGVjdCBhIFNlcnZlciBDbGllbnQKLXdpelNlbGVjdENsaWVudFRpdGxlPVNlbGVjdCBhIHNlcnZlciBjbGllbnQKLXdpelNlbGVjdENsaWVudERlc2NyaXB0aW9uPVNlbGVjdCBhIGNsaWVudCB0byB1c2Ugd2l0aCB0aGlzIHNlcnZlci4KLXdpelNlbGVjdENsaWVudE1lc3NhZ2U9TXVsdGlwbGUgY2xpZW50cyBjYW4gcnVuIG9uIHRoZSBjdXJyZW50IHNlbGVjdGlvbi4gU2VsZWN0IGEgY2xpZW50IGZyb20gdGhlIGxpc3QgYmVsb3c6Ci0KLSMgVGFzayBXaXphcmQKLXdpelRhc2tXaXphcmRUaXRsZT1TZWxlY3QgVGFza3MKLXdpelRhc2tUaXRsZT1TZWxlY3QgVGFza3MKLXdpelRhc2tEZXNjcmlwdGlvbj1TZWxlY3QgdGhlIHRhc2tzIHRvIHBlcmZvcm0gb24gdGhlIHNlcnZlci4KLXdpelRhc2tOb25lPVRoZXJlIGFyZSBjdXJyZW50bHkgbm8gdGFza3MgdGhhdCBuZWVkIHRvIGJlIHBlcmZvcm1lZC4KLQotIyBOZXcgUnVudGltZSBXaXphcmQKLXdpek5ld1J1bnRpbWVXaXphcmRUaXRsZT1OZXcgU2VydmVyIFJ1bnRpbWUKLXdpek5ld1J1bnRpbWVUaXRsZT1OZXcgU2VydmVyIFJ1bnRpbWUKLXdpek5ld1J1bnRpbWVEZXNjcmlwdGlvbj1EZWZpbmUgYSBuZXcgaW5zdGFsbGVkIHNlcnZlciBydW50aW1lIGVudmlyb25tZW50Ci13aXpFZGl0UnVudGltZVdpemFyZFRpdGxlPUVkaXQgU2VydmVyIFJ1bnRpbWUKLQotIyBOZXcgSW5zdGFsbGFibGUgU2VydmVyIFdpemFyZAotd2l6TmV3SW5zdGFsbGFibGVTZXJ2ZXJUaXRsZT1JbnN0YWxsIE5ldyBTZXJ2ZXIKLXdpek5ld0luc3RhbGxhYmxlU2VydmVyRGVzY3JpcHRpb249RG93bmxvYWQgYW5kIGluc3RhbGwgc3VwcG9ydCBmb3IgYSBuZXcgc2VydmVyLiBUaGUgd29ya2JlbmNoIG11c3QgYmUgcmVzdGFydGVkIGZvciB0aGUgY2hhbmdlcyB0byB0YWtlIGVmZmVjdC4KLXdpek5ld0luc3RhbGxhYmxlU2VydmVyUmVzdGFydD1JbnN0YWxsYXRpb24gY29tcGxldGUuIFRoZSBuZXcgc2VydmVyIHdpbGwgbm90IGJlIGF2YWlsYWJsZSB1bnRpbCBhZnRlciB0aGUgd29ya2JlbmNoIGlzIHJlc3RhcnRlZC4gRG8geW91IHdhbnQgdG8gcmVzdGFydCBub3c/Ci0KLSMgQWRkL1JlbW92ZSBNb2R1bGVzCi13aXpNb2R1bGVXaXphcmRUaXRsZT1BZGQgYW5kIFJlbW92ZSBQcm9qZWN0cwotd2l6TW9kdWxlVGl0bGU9QWRkIGFuZCBSZW1vdmUgUHJvamVjdHMKLXdpek1vZHVsZURlc2NyaXB0aW9uPU1vZGlmeSB0aGUgcHJvamVjdHMgdGhhdCBhcmUgY29uZmlndXJlZCBvbiB0aGUgc2VydmVyCi13aXpNb2R1bGVNZXNzYWdlPU1vdmUgcHJvamVjdHMgdG8gdGhlIHJpZ2h0IHRvIGNvbmZpZ3VyZSB0aGVtIG9uIHRoZSBzZXJ2ZXIKLXdpek1vZHVsZUF2YWlsYWJsZUxpc3Q9JkF2YWlsYWJsZSBwcm9qZWN0czoKLXdpek1vZHVsZURlcGxveWVkTGlzdD0mQ29uZmlndXJlZCBwcm9qZWN0czoKLXdpek1vZHVsZUFkZD1BJmRkID4KLXdpek1vZHVsZUFkZEFsbD1BZGQgQSZsbCA+Pgotd2l6TW9kdWxlUmVtb3ZlPTwgJlJlbW92ZQotd2l6TW9kdWxlUmVtb3ZlQWxsPTw8IFJlJm1vdmUgQWxsCi0KLSMgR2VuZXJhbCB0ZXh0IHVzZWQgaW4gbXVsdGlwbGUgd2l6YXJkcwotd2l6RGVzY3JpcHRpb249RGVzY3JpcHRpb246Ci0KLSMgV2l6YXJkIGluZm8gYW5kIGVycm9yIG1lc3NhZ2VzCi13aXpFcnJvckludmFsaWRGb2xkZXI9VGhlIGZvbGRlciBtdXN0IGJlIGEgc2VydmVyIHByb2plY3Qgb3IgYSBmb2xkZXIgd2l0aGluIGEgc2VydmVyIHByb2plY3QKLXdpekVycm9yQ2xvc2VkUHJvamVjdD1UaGUgZm9sZGVyIG11c3Qgbm90IGJlIGluIGEgY2xvc2VkIHByb2plY3QKLXdpekVycm9yU2VydmVyQ3JlYXRpb25FcnJvcj1DYW5ub3QgY3JlYXRlIGEgc2VydmVyIHVzaW5nIHRoZSBzZWxlY3RlZCB0eXBlCi0KLQotIyAtLS0tLS0tLS0tLS0tLS0gVmlld3MgLS0tLS0tLS0tLS0tLS0tCi0KLSMgLS0tIFNlcnZlciBDb25maWd1cmF0aW9uIHZpZXcgLS0tCi12aWV3U2VydmVycz1TZXJ2ZXJzCi0KLXZpZXdOb01vZHVsZXM9Tm90aGluZyBkZXBsb3llZAotCi0jIEFjdGlvbnMKLWFjdGlvbkRlbGV0ZT1EZWxldGUKLWFjdGlvblJlbW92ZT1SZW1vdmUKLWFjdGlvbk9wZW49T3BlbgotYWN0aW9uTW9uaXRvcj1Nb25pdG9yaW5nCi1hY3Rpb25Nb25pdG9yUG9ydD1Nb25pdG9yIHBvcnQgezB9ICh7MX0pCi1hY3Rpb25Nb25pdG9yUHJvcGVydGllcz1Qcm9wZXJ0aWVzCi1hY3Rpb25OZXc9TmV3Ci1hY3Rpb25OZXdTZXJ2ZXI9U2VydmVyCi0KLSMgLS0tIFNlcnZlcnMgdmlldyAtLS0KLSMgQ29sdW1uIHRpdGxlcwotdmlld1NlcnZlcj1TZXJ2ZXIKLXZpZXdTdGF0dXM9U3RhdHVzCi12aWV3U3luYz1TdGF0ZQotCi0jIEFjdGlvbnMKLWFjdGlvblN0YXJ0PVN0YXJ0Ci1hY3Rpb25TdGFydFRvb2xUaXA9U3RhcnQgdGhlIHNlcnZlcgotYWN0aW9uRGVidWc9RGVidWcKLWFjdGlvbkRlYnVnVG9vbFRpcD1TdGFydCB0aGUgc2VydmVyIGluIGRlYnVnIG1vZGUKLWFjdGlvblByb2ZpbGU9UHJvZmlsZQotYWN0aW9uUHJvZmlsZVRvb2xUaXA9U3RhcnQgdGhlIHNlcnZlciBpbiBwcm9maWxpbmcgbW9kZQotYWN0aW9uU3RvcD1TdG9wCi1hY3Rpb25TdG9wVG9vbFRpcD1TdG9wIHRoZSBzZXJ2ZXIKLWFjdGlvblJlc3RhcnQ9UmVzdGFydAotYWN0aW9uUmVzdGFydFRvb2xUaXA9UmVzdGFydCB0aGUgc2VydmVyCi1hY3Rpb25QdWJsaXNoPVB1Ymxpc2gKLWFjdGlvblB1Ymxpc2hUb29sVGlwPVB1Ymxpc2ggdG8gdGhlIHNlcnZlcgotYWN0aW9uTW9kaWZ5TW9kdWxlcz1BZGQgYW5kIFJlbW92ZSBQcm9qZWN0cy4uLgotYWN0aW9uTW9kaWZ5TW9kdWxlc1Rvb2xUaXA9QWRkIGFuZCByZW1vdmUgcHJvamVjdHMKLWFjdGlvblJlc3RhcnRNb2R1bGU9UmVzdGFydCB7MH0KLWFjdGlvblVwZGF0ZVN0YXR1cz1SZWZyZXNoIFN0YXR1cwotYWN0aW9uTW92ZVNlcnZlclRvTWV0YWRhdGE9TW92ZSB0byBNZXRhZGF0YQotYWN0aW9uTW92ZVNlcnZlclRvV29ya3NwYWNlPU1vdmUgdG8gV29ya3NwYWNlCi0KLSMgU3RhdHVzIGNvbHVtbiB0ZXh0Ci12aWV3U3RhdHVzU3RhcnRlZD1TdGFydGVkCi12aWV3U3RhdHVzU3RhcnRlZERlYnVnPURlYnVnZ2luZwotdmlld1N0YXR1c1N0YXJ0ZWRQcm9maWxlPVByb2ZpbGluZwotdmlld1N0YXR1c1N0b3BwZWQ9U3RvcHBlZAotCi12aWV3U3RhdHVzU3RhcnRpbmcxPVN0YXJ0aW5nLgotdmlld1N0YXR1c1N0YXJ0aW5nMj1TdGFydGluZy4uCi12aWV3U3RhdHVzU3RhcnRpbmczPVN0YXJ0aW5nLi4uCi0KLXZpZXdTdGF0dXNTdG9wcGluZzE9U3RvcHBpbmcuCi12aWV3U3RhdHVzU3RvcHBpbmcyPVN0b3BwaW5nLi4KLXZpZXdTdGF0dXNTdG9wcGluZzM9U3RvcHBpbmcuLi4KLQotIyBTZXJ2ZXIgU3RhdGUgdGV4dAotdmlld1N5bmNPa2F5PVN5bmNocm9uaXplZAotdmlld1N5bmNSZXN0YXJ0PVJlc3RhcnQKLXZpZXdTeW5jUHVibGlzaD1SZXB1Ymxpc2gKLXZpZXdTeW5jUmVzdGFydFB1Ymxpc2g9UmVzdGFydCAmIHJlcHVibGlzaAotdmlld1N5bmNQdWJsaXNoaW5nPVB1Ymxpc2hpbmcuLi4KLQotIyAtLS0gc2V0IDIgLS0tCi0jIEFjdGlvbnMKLWFjdGlvblN0b3AyPURpc2Nvbm5lY3QKLWFjdGlvblN0b3BUb29sVGlwMj1EaXNjb25uZWN0IGZyb20gdGhlIHNlcnZlcgotCi0jIFN0YXR1cyBjb2x1bW4gdGV4dAotdmlld1N0YXR1c1N0YXJ0aW5nND1Db25uZWN0aW5nCi12aWV3U3RhdHVzU3RhcnRlZDI9Q29ubmVjdGVkCi12aWV3U3RhdHVzU3RvcHBpbmc0PURpc2Nvbm5lY3RpbmcKLXZpZXdTdGF0dXNTdG9wcGVkMj1EaXNjb25uZWN0ZWQKLQotIyBTZXJ2ZXIgU3RhdGUgdGV4dAotdmlld1N5bmNPa2F5Mj1TeW5jaHJvbml6ZWQKLXZpZXdTeW5jUmVzdGFydDI9UmVjb25uZWN0Ci12aWV3U3luY1B1Ymxpc2gyPVJlcHVibGlzaAotdmlld1N5bmNSZXN0YXJ0UHVibGlzaDI9UmVjb25uZWN0IGFuZCByZXB1Ymxpc2gKLXZpZXdTeW5jUHVibGlzaGluZzI9UHVibGlzaGluZy4uLgotCi0KLSMgLS0tLS0tLS0tLS0tLS0tIEFjdGlvbiBTZXRzICh0b29sYmFyIGljb24gZ3JvdXBzKSAtLS0tLS0tLS0tLS0tLS0KLQotIyBTZXJ2ZXJzIGFjdGlvbiBzZXQKLWFjdGlvblNldE5ld1NlcnZlcj1DcmVhdGUgU2VydmVyCi0KLSMgUnVuIG9uIFNlcnZlciBhY3Rpb25zCi1hY3Rpb25SdW5PblNlcnZlcj1SdW4gb24gU2VydmVyLi4uCi1hY3Rpb25EZWJ1Z09uU2VydmVyPURlYnVnIG9uIFNlcnZlci4uLgotYWN0aW9uUHJvZmlsZU9uU2VydmVyPVByb2ZpbGUgb24gU2VydmVyLi4uCi0KLQotIyAtLS0tLS0tLS0tLS0tLS0gUHJlZmVyZW5jZXMgLS0tLS0tLS0tLS0tLS0tCi0KLSMgTmFtZXMgb2YgdGhlIHByZWZlcmVuY2UgcGFnZXMKLXByZWZlcmVuY2VSdW50aW1lc1RpdGxlTG9uZz1JbnN0YWxsZWQgU2VydmVyIFJ1bnRpbWUgRW52aXJvbm1lbnRzCi0KLSMgU2VydmVyIHByZWZlcmVuY2VzCi1wcmVmQXV0b1B1Ymxpc2g9QXV0b21hdGljYWxseSBwJnVibGlzaCB3aGVuIHN0YXJ0aW5nIHNlcnZlcnMKLXByZWZBdXRvUHVibGlzaExvY2FsPUF1dG9tYXRpY2FsbHkgcHVibGlzaCB0byAmbG9jYWwgc2VydmVycwotcHJlZkF1dG9QdWJsaXNoTG9jYWxUaW1lPVB1Ymxpc2hpbmcgaW50ZXImdmFsIChpbiBzZWNvbmRzKToKLXByZWZBdXRvUHVibGlzaFJlbW90ZT1BdXRvbWF0aWNhbGx5IHB1Ymxpc2ggdG8gcmVtJm90ZSBzZXJ2ZXJzCi1wcmVmQXV0b1B1Ymxpc2hSZW1vdGVUaW1lPVB1Ymxpc2hpbmcgaW50ZXJ2JmFsIChpbiBzZWNvbmRzKToKLXByZWZBdXRvUmVzdGFydD1BdXRvbWF0aWNhbGx5ICZyZXN0YXJ0IHNlcnZlcnMgd2hlbiBuZWNlc3NhcnkKLXByZWZQcm9tcHRJcnJldmVyc2libGU9UHJvbXB0IGJlZm9yZSBtYWtpbmcgJmlycmV2ZXJzaWJsZSBjaGFuZ2VzIHdpdGhpbiBhbiBlZGl0b3IKLXByZWZTaG93T25BY3Rpdml0eT1TaG93ICZTZXJ2ZXJzIHZpZXcgd2hlbiBzZXJ2ZXIgc3RhdGUgY2hhbmdlcwotcHJlZk1hY2hpbmVTcGVlZD1TZXJ2ZXIgJnRpbWVvdXQgZGVsYXk6Ci1wcmVmTWFjaGluZVNwZWVkVmVyeVNsb3c9TG9uZ2VyCi1wcmVmTWFjaGluZVNwZWVkU2xvdz1Mb25nCi1wcmVmTWFjaGluZVNwZWVkQXZlcmFnZT1Ob3JtYWwKLXByZWZNYWNoaW5lU3BlZWRGYXN0PVNob3J0Ci1wcmVmTWFjaGluZVNwZWVkVmVyeUZhc3Q9U2hvcnRlcgotcHJlZlN5bmNTdGFydHVwPVMmeW5jaHJvbml6ZSBzZXJ2ZXJzIG9uIHN0YXJ0dXAKLQotcHJlZlNhdmVFZGl0b3JzR3JvdXA9U2F2ZSBkaXJ0eSBlZGl0b3JzIGJlZm9yZSBzdGFydGluZyBzZXJ2ZXIKLXByZWZTYXZlRWRpdG9yc05ldmVyPSZOZXZlcgotcHJlZlNhdmVFZGl0b3JzUHJvbXB0PVBybyZtcHQKLXByZWZTYXZlRWRpdG9yc0F1dG9zYXZlPUF1dG8tc2F2JmUKLSAKLSMgUHJvamVjdCBwcm9wZXJ0aWVzIHByZWZlcmVuY2VzCi1wcmVmUHJvamVjdERlc2NyaXB0aW9uPVNldCB0aGUgcnVudGltZSB0YXJnZXQgYW5kIHRoZSBkZWZhdWx0IHNlcnZlciBmb3IgdGhlIHByb2plY3QuCi1wcmVmUHJvamVjdD1Qcm9qZWN0OgotcHJlZlByb2plY3REZWZhdWx0U2VydmVyPURlJmZhdWx0IHNlcnZlcjoKLXByZWZQcm9qZWN0Tm90TW9kdWxlPVRoaXMgcHJvamVjdCBjYW5ub3QgYmUgZGVwbG95ZWQgdG8gYSBzZXJ2ZXIuCi1wcmVmUHJvamVjdE5vdENvbmZpZ3VyZWQ9Tm90IGN1cnJlbnRseSBkZXBsb3llZCB0byBhbnkgc2VydmVycwotcHJlZlByb2plY3ROb1NlcnZlcj08Tm9uZT4KLQotIyBJbnN0YWxsZWQgcnVudGltZXMKLXByZWZlcmVuY2VSdW50aW1lc0Rlc2NyaXB0aW9uPUFkZCwgcmVtb3ZlLCBvciBlZGl0IGluc3RhbGxlZCBzZXJ2ZXIgcnVudGltZSBkZWZpbml0aW9ucy5cblRoZSBjaGVja2VkIHJ1bnRpbWUgd2lsbCBiZSB1c2VkIGJ5IGRlZmF1bHQgd2hlbiBjcmVhdGluZyBuZXcgcHJvamVjdHMuCi1wcmVmZXJlbmNlUnVudGltZXNUYWJsZT0mSW5zdGFsbGVkIHNlcnZlciBydW50aW1lczoKLQotCi0jIC0tLS0tLS0tLS0tLS0tLSBUYXNrcyAocHJvZ3Jlc3MgbW9uaXRvcnMpIC0tLS0tLS0tLS0tLS0tLQotCi0jIEdlbmVyYWwgdGFza3MKLXNhdmluZ1Rhc2s9U2F2aW5nIHswfS4KLWxvYWRpbmdUYXNrPUxvYWRpbmcgezB9LgotcGVyZm9ybWluZ1Rhc2tzPVBlcmZvcm1pbmcgdGFza3MuCi1sYXVuY2hpbmdDbGllbnRUYXNrPUxhdW5jaGluZyBjbGllbnQKLQotIyAtLS0tLS0tLS0tLS0tLS0gRGlhbG9ncyAtLS0tLS0tLS0tLS0tLS0KLQotIyBEZWxldGUgU2VydmVyIGRpYWxvZwotZGVsZXRlU2VydmVyRGlhbG9nVGl0bGU9RGVsZXRlIFNlcnZlcgotZGVsZXRlU2VydmVyRGlhbG9nTWVzc2FnZT1BcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHswfT8KLWRlbGV0ZVNlcnZlckRpYWxvZ01lc3NhZ2VNYW55PUFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgdGhlIHswfSBzZXJ2ZXJzPwotZGVsZXRlU2VydmVyRGlhbG9nTG9vc2VDb25maWd1cmF0aW9ucz1EZWxldGUgdW51c2VkIHNlcnZlciBjb25maWd1cmF0aW9uKHMpCi1kZWxldGVTZXJ2ZXJEaWFsb2dSdW5uaW5nU2VydmVyPURlbGV0ZSBydW5uaW5nIHNlcnZlcihzKQotZGVsZXRlU2VydmVyRGlhbG9nUnVubmluZ1NlcnZlclN0b3A9U3RvcCBzZXJ2ZXIocykgYmVmb3JlIGRlbGV0aW5nCi1kZWxldGVTZXJ2ZXJUYXNrPURlbGV0aW5nIHNlcnZlcihzKS4uLgotCi0jIENyZWF0ZSBTZXJ2ZXIgUHJvamVjdCBkaWFsb2cKLWNyZWF0ZVNlcnZlclByb2plY3REaWFsb2dUaXRsZT1DcmVhdGUgU2VydmVyIFByb2plY3QKLWNyZWF0ZVNlcnZlclByb2plY3REaWFsb2dNZXNzYWdlPURvIHlvdSB3YW50IHRvIGNyZWF0ZSBhIG5ldyBzZXJ2ZXIgcHJvamVjdCB3aXRoIHRoZSBuYW1lIHswfT8KLQotIyBUZXJtaW5hdGUgU2VydmVyIGRpYWxvZwotdGVybWluYXRlU2VydmVyRGlhbG9nVGl0bGU9VGVybWluYXRlIFNlcnZlcgotdGVybWluYXRlU2VydmVyRGlhbG9nTWVzc2FnZT1TZXJ2ZXIgezB9IGlzIG5vdCByZXNwb25kaW5nLiBEbyB5b3Ugd2FudCB0byB0ZXJtaW5hdGUgdGhpcyBzZXJ2ZXI/IENsaWNrIE9LIHRvIHRlcm1pbmF0ZSB0aGUgc2VydmVyIG9yIGNsaWNrIENhbmNlbCB0byBjb250aW51ZSB3YWl0aW5nLgotCi0jIFNlcnZlciByZXNvdXJjZSBkaXJ0eSBkaWFsb2cKLXJlc291cmNlRGlydHlEaWFsb2dUaXRsZT1TZXJ2ZXIgUmVzb3VyY2UgRGlydHkKLXJlc291cmNlRGlydHlEaWFsb2dNZXNzYWdlPVRoZSBzZXJ2ZXIgcmVzb3VyY2UgezB9IGhhcyB1bnNhdmVkIGNoYW5nZXMuIERvIHlvdSB3YW50IHRvIGNvbnRpbnVlPwotcmVzb3VyY2VEaXJ0eURpYWxvZ0NvbnRpbnVlPUNvbnRpbnVlCi0KLXJ1bnRpbWVUYXJnZXRDb21ibz0mVGFyZ2V0IHJ1bnRpbWU6Ci1ydW50aW1lVGFyZ2V0Tm9uZT08Tm9uZT4KLXJ1bnRpbWVUYXJnZXROZXdSdW50aW1lPSZOZXcuLi4KLXJ1bnRpbWVUYXJnZXRSdW50aW1lUHJlZmVyZW5jZXM9Q29uZmlndXJlICZJbnN0YWxsZWQgUnVudGltZXMuLi4KLXJ1bnRpbWVUYXJnZXRDaGlsZHJlbj1UYXJnZXQgY29udGFpbmVkIHByb2plY3RzCi0KLSMgR2VuZXJhbCBkaWFsb2dzCi1kZWZhdWx0RGlhbG9nVGl0bGU9U2VydmVyCi1kaWFsb2dTdG9wcGluZ1NlcnZlcj1TdG9wcGluZyBzZXJ2ZXIgezB9LgotCi0jIHJlc3RhcnQgd2FybmluZyBkaWFsb2cKLWRpYWxvZ01vZGVXYXJuaW5nRGVidWc9VGhlIHNlcnZlciBpcyBub3QgcnVubmluZyBpbiBkZWJ1ZyBtb2RlLiBZb3UgbWF5IHJlc3RhcnQgdGhlIHNlcnZlciBpbiBkZWJ1ZyBtb2RlLCBjb250aW51ZSB3aXRob3V0IGRlYnVnZ2luZywgb3IgY2FuY2VsIHRoZSBvcGVyYXRpb24uCi1kaWFsb2dNb2RlV2FybmluZ1Byb2ZpbGU9VGhlIHNlcnZlciBpcyBub3QgcnVubmluZyBpbiBwcm9maWxpbmcgbW9kZS4gWW91IG1heSByZXN0YXJ0IHRoZSBzZXJ2ZXIgaW4gcHJvZmlsaW5nIG1vZGUsIGNvbnRpbnVlIHdpdGhvdXQgcHJvZmlsaW5nLCBvciBjYW5jZWwgdGhlIG9wZXJhdGlvbi4KLWRpYWxvZ01vZGVXYXJuaW5nUmVzdGFydD1SZXN0YXJ0Ci1kaWFsb2dNb2RlV2FybmluZ0NvbnRpbnVlPUNvbnRpbnVlCi0KLSMgTW9uaXRvciBkaWFsb2cKLWRpYWxvZ01vbml0b3JUaXRsZT1Nb25pdG9yaW5nIFBvcnRzCi1kaWFsb2dNb25pdG9yRGVzY3JpcHRpb249VGhlIGZvbGxvd2luZyBwb3J0cyBhcmUgYmVpbmcgbW9uaXRvcmVkIG9uIHNlcnZlciB7MH06Ci1kaWFsb2dNb25pdG9yQWRkRGVzY3JpcHRpb249VGhlIHNlcnZlciB7MH0gaGFzIHRoZSBmb2xsb3dpbmcgcG9ydHMgdGhhdCBjYW4gYmUgbW9uaXRvcmVkOgotZGlhbG9nTW9uaXRvckNvbHVtblBvcnQ9U2VydmVyIFBvcnQKLWRpYWxvZ01vbml0b3JDb2x1bW5UeXBlPVR5cGUKLWRpYWxvZ01vbml0b3JDb2x1bW5Nb25pdG9yUG9ydD1Nb25pdG9yIFBvcnQKLWRpYWxvZ01vbml0b3JDb2x1bW5Db250ZW50VHlwZT1Db250ZW50IFR5cGUKLWRpYWxvZ01vbml0b3JDb2x1bW5TdGF0dXM9U3RhdHVzCi1kaWFsb2dNb25pdG9yTW9uaXRvclBvcnQ9TW9uaXRvciBwb3J0OgotZGlhbG9nTW9uaXRvckNvbnRlbnRUeXBlPUNvbnRlbnQgdHlwZToKLWRpYWxvZ01vbml0b3JDb250ZW50VHlwZUFsbD1BbGwKLWRpYWxvZ01vbml0b3JDb250ZW50VHlwZVdlYj1XZWIKLWRpYWxvZ01vbml0b3JDb250ZW50VHlwZVdlYlNlcnZpY2VzPVdlYlNlcnZpY2VzCi0KLXN0YXJ0PVN0YXJ0Ci1zdG9wPVN0b3AKLXN0YXJ0ZWQ9U3RhcnRlZAotc3RvcHBlZD1TdG9wcGVkCi0KLSMgQ29uZmlybSBydW50aW1lIHJlbW92YWwKLWRpYWxvZ1J1bnRpbWVJblVzZT1UaGUgcnVudGltZSBpcyBjdXJyZW50bHkgYmVpbmcgdXNlZCBhbmQgZGVsZXRpbmcgaXQgd2lsbCBjYXVzZSBjb21waWxhdGlvbiBvciBydW50aW1lIHByb2JsZW1zLiBEZWxldGUgdGhlIHJ1bnRpbWUgYW55d2F5PwotCi0jIHJ1bnRpbWUgbG9jYXRvciBzZWFyY2ggZGlhbG9nCi1kaWFsb2dSdW50aW1lU2VhcmNoVGl0bGU9U2VhcmNoIEZvciBSdW50aW1lcwotZGlhbG9nUnVudGltZVNlYXJjaE1lc3NhZ2U9U2VsZWN0IHRoZSBkaXJlY3RvcnkgaW4gd2hpY2ggdG8gc2VhcmNoIGZvciBzZXJ2ZXIgcnVudGltZXM6Ci1kaWFsb2dSdW50aW1lU2VhcmNoUHJvZ3Jlc3M9U2VhcmNoaW5nIGZvciBzZXJ2ZXIgcnVudGltZSBlbnZpcm9ubWVudHMuLi4KLQotIyBDYW4ndCBhZGQgcmVtb3ZlCi1kaWFsb2dBZGRSZW1vdmVNb2R1bGVzTm9uZT1UaGVyZSBhcmUgbm8gcHJvamVjdHMgdGhhdCBjYW4gYmUgYWRkZWQgb3IgcmVtb3ZlZCBmcm9tIHRoZSBzZXJ2ZXIuCi0KLWRpYWxvZ1JlbW92ZU1vZHVsZUNvbmZpcm09QXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIHJlbW92ZSB0aGUgcHJvamVjdCBmcm9tIHRoZSBzZXJ2ZXI/Ci0KLSMgLS0tLS0tLS0tLS0tLS0tIE1pc2MgVUkgLS0tLS0tLS0tLS0tLS0tCi0KLSMgcnVudGltZSBjb21wb3NpdGUKLXJ1bnRpbWVUeXBlQ29tcERlc2NyaXB0aW9uPVJ1bnRpbWVzIGFyZSB1c2VkIGF0IGJ1aWxkIHRpbWUgdG8gY29tcGlsZSBwcm9qZWN0cy4KLXJ1bnRpbWVUeXBlQ29tcFRyZWU9U2VsZWN0IHRoZSB0eXBlIG9mICZydW50aW1lIHRoYXQgeW91IHdhbnQgdG8gZGVmaW5lOgotc2VydmVyVHlwZUNvbXBMYWJlbD1TZWxlY3QgdGhlICZzZXJ2ZXIgdHlwZToKLW5hbWU9TmFtZQotdmVuZG9yPVZlbmRvcgotdmVyc2lvbj1WZXJzaW9uCi1ob3N0PUhvc3QgbmFtZQotbW9kdWxlU3VwcG9ydD1Nb2R1bGUgU3VwcG9ydAotdmlld0J5PSZWaWV3IEJ5OgotaW5zdGFsbGVkUnVudGltZXM9Jkluc3RhbGxlZCBSdW50aW1lcy4uLgotCi0jIGluc3RhbGxhYmxlIHNlcnZlciBjb21wb3NpdGUKLWluc3RhbGxhYmxlU2VydmVyQ29tcFRyZWU9U2VsZWN0IHRoZSAmc2VydmVyIHN1cHBvcnQgdG8gaW5zdGFsbDoKLWluc3RhbGxhYmxlU2VydmVyTGluaz1Eb24ndCBzZWUgeW91ciBzZXJ2ZXIgbGlzdGVkPyBDbGljayBoZXJlCi0KLSMgbWlzYyBjb21wb3NpdGVzCi1ob3N0bmFtZT1TZXJ2ZXIncyAmaG9zdCBuYW1lOgotCi0jIFNlcnZlciBsYXVuY2ggY29uZmlndXJhdGlvbiB0YWIKLXNlcnZlckxhdW5jaERlc2NyaXB0aW9uPVRoaXMgbGF1bmNoIGNvbmZpZ3VyYXRpb24gY2FuIGJlIHVzZWQgdG8gbGF1bmNoIHRoZSBzZXJ2ZXIgc3BlY2lmaWVkIGJlbG93LiBUbyBhY2Nlc3MgZnVydGhlciBvcHRpb25zIGZvciBjb25maWd1cmluZyB0aGUgc2VydmVyLCBvcGVuIHRoZSBzZXJ2ZXIncyBlZGl0b3IgZnJvbSB0aGUgU2VydmVycyB2aWV3Lgotc2VydmVyTGF1bmNoQ29uZmlndXJhdGlvblRhYj1TZXJ2ZXIKLXNlcnZlckxhdW5jaFNlcnZlcj1TZXJ2ZXI6Ci1zZXJ2ZXJMYXVuY2hSdW50aW1lPVJ1bnRpbWU6Ci1zZXJ2ZXJMYXVuY2hIb3N0PUhvc3QgbmFtZToKLQotIyBFcnJvciBNZXNzYWdlcwotZXJyb3JEaWFsb2dUaXRsZT1TZXJ2ZXIgRXJyb3IKLWVycm9yU2VydmVyQWxyZWFkeVJ1bm5pbmc9U2VydmVyIGFscmVhZHkgcnVubmluZwotZXJyb3JOb1NlcnZlclNlbGVjdGVkPU5vIHNlcnZlciBzZWxlY3RlZAotZXJyb3JJbnZhbGlkU2VydmVyPUludmFsaWQgc2VydmVyCi1lcnJvckNvdWxkTm90Q3JlYXRlU2VydmVyUHJvamVjdD1Db3VsZCBub3QgY3JlYXRlIHNlcnZlciBwcm9qZWN0Ci1lcnJvckNvdWxkTm90Q3JlYXRlU2VydmVyUHJvamVjdFN0YXR1cz1Db3VsZCBub3QgY3JlYXRlIHNlcnZlciBwcm9qZWN0OiB7MH0KLWVycm9yTm9Nb2R1bGVzPU5vIGxhdW5jaGFibGUgYXJ0aWZhY3QgY291bGQgYmUgZm91bmQgaW4gdGhlIHNlbGVjdGlvbgotZXJyb3JOb1NlcnZlcj1Db3VsZCBub3QgZmluZCBhIHNlcnZlciB0byBydW4gdGhlIHNlbGVjdGlvbgotZXJyb3JOb0NsaWVudD1Db3VsZCBub3QgZmluZCBhIGNsaWVudCB0aGF0IGlzIGFibGUgdG8gbGF1bmNoIHRoZSBzZWxlY3Rpb24KLWVycm9yQ291bGROb3RTYXZlUHJlZmVyZW5jZT1Db3VsZCBub3Qgc2F2ZSBzZXJ2ZXIgcHJlZmVyZW5jZSBpbmZvcm1hdGlvbi4KLWVycm9yRWRpdG9yQ2FudFNhdmU9Q2FuJ3Qgc2F2ZSB0aGUgc2VydmVyIHJlc291cmNlIGZvciB0aGUgZm9sbG93aW5nIHJlYXNvbihzKToKLWVycm9yRWRpdG9yPUNvdWxkIG5vdCBvcGVuIGVkaXRvciBiZWNhdXNlIHswfSBpcyBub3QgYSB2YWxpZCBzZXJ2ZXIgb3Igc2VydmVyIGNvbmZpZ3VyYXRpb24uCi1lcnJvclZlcnNpb25MZXZlbD1UaGUgc2VydmVyIGRvZXMgbm90IHN1cHBvcnQgdmVyc2lvbiB7MX0gb2YgdGhlIHswfSBzcGVjaWZpY2F0aW9uLgotZXJyb3JNaXNzaW5nQ29uZmlndXJhdGlvbj1UaGUgc2VydmVyIGNvbmZpZ3VyYXRpb24gaXMgbWlzc2luZyBvciBpbnZhbGlkCi0KLSMgSW5mbyBtZXNzYWdlcwotaW5mb05vUnVudGltZXNGb3VuZD1ObyBzZXJ2ZXIgcnVudGltZXMgd2VyZSBmb3VuZC4KLQotIyBEZWZhdWx0IHNlcnZlciBjcmVhdGlvbiBuYW1lcwotIyB7MH0gd2lsbCBiZSByZXBsYWNlZCBieSBhIG51bWJlciBpZiB0aGUgZ2l2ZW4gbmFtZSBpcyBhbHJlYWR5IGJlaW5nIHVzZWQKLWRlZmF1bHRTZXJ2ZXJQcm9qZWN0TmFtZT1TZXJ2ZXJzezB9Ci0KLSMgVXNlZCB3aGVuIGEgbmFtZSBjYW4ndCBiZSBmb3VuZAotZWxlbWVudFVua25vd25OYW1lPTx1bmtub3duPgotCi1jb2x1bW5OYW1lPU5hbWUKLWNvbHVtblR5cGU9VHlwZQotCi1hZGQ9JkFkZC4uLgotZWRpdD0mRWRpdC4uLgotcmVtb3ZlPSZSZW1vdmUKLXNlYXJjaD0mU2VhcmNoLi4uCi0KLSMgLS0tLS0tLS0tLS0tLS0tIEVkaXRvciBzdXBwb3J0IC0tLS0tLS0tLS0tLS0tLQotCi1zZXJ2ZXJFZGl0b3JPdmVydmlld1BhZ2VUaXRsZT1TZXJ2ZXIgT3ZlcnZpZXcKLXNlcnZlckVkaXRvck92ZXJ2aWV3R2VuZXJhbFNlY3Rpb249R2VuZXJhbAotc2VydmVyRWRpdG9yT3ZlcnZpZXdHZW5lcmFsRGVzY3JpcHRpb249U3BlY2lmeSB0aGUgaG9zdCBuYW1lIGFuZCBvdGhlciBjb21tb24gc2V0dGluZ3MuCi1zZXJ2ZXJFZGl0b3JPdmVydmlld1NlcnZlck5hbWU9U2VydmVyIG5hbWU6Ci1zZXJ2ZXJFZGl0b3JPdmVydmlld1NlcnZlck5hbWVDb21tYW5kPXNldCBzZXJ2ZXIgbmFtZQotc2VydmVyRWRpdG9yT3ZlcnZpZXdTZXJ2ZXJDb25maWd1cmF0aW9uUGF0aD1Db25maWd1cmF0aW9uIHBhdGg6Ci1zZXJ2ZXJFZGl0b3JPdmVydmlld1NlcnZlckNvbmZpZ3VyYXRpb25Ccm93c2U9QnJvd3NlCi1zZXJ2ZXJFZGl0b3JPdmVydmlld1NlcnZlckNvbmZpZ3VyYXRpb25Ccm93c2VNZXNzYWdlPVNwZWNpZnkgdGhlIGxvY2F0aW9uIG9mIHRoZSBzZXJ2ZXIgY29uZmlndXJhdGlvbi4KLXNlcnZlckVkaXRvck92ZXJ2aWV3U2VydmVySG9zdG5hbWU9SG9zdCBuYW1lOgotc2VydmVyRWRpdG9yT3ZlcnZpZXdTZXJ2ZXJIb3N0bmFtZUNvbW1hbmQ9c2V0IGhvc3QgbmFtZQotc2VydmVyRWRpdG9yT3ZlcnZpZXdSdW50aW1lPVJ1bnRpbWU6Ci1zZXJ2ZXJFZGl0b3JPdmVydmlld1J1bnRpbWVFZGl0PUVkaXQKLXNlcnZlckVkaXRvck92ZXJ2aWV3UnVudGltZUNvbW1hbmQ9c2V0IHJ1bnRpbWUKLQotc2VydmVyRWRpdG9yT3ZlcnZpZXdBdXRvUHVibGlzaFNlY3Rpb249QXV0b21hdGljIFB1Ymxpc2hpbmcKLXNlcnZlckVkaXRvck92ZXJ2aWV3QXV0b1B1Ymxpc2hEZXNjcmlwdGlvbj1PdmVycmlkZSB3aGVuIHRoZSBzZXJ2ZXIgaXMgYXV0b21hdGljYWxseSBwdWJsaXNoZWQgdG8uCi1zZXJ2ZXJFZGl0b3JPdmVydmlld0F1dG9QdWJsaXNoRGVmYXVsdD1Vc2UgZGVmYXVsdCBwdWJsaXNoaW5nIHNldHRpbmdzCi1zZXJ2ZXJFZGl0b3JPdmVydmlld0F1dG9QdWJsaXNoRGVmYXVsdEVkaXQ9RWRpdAotc2VydmVyRWRpdG9yT3ZlcnZpZXdBdXRvUHVibGlzaE92ZXJyaWRlPU92ZXJyaWRlIGRlZmF1bHQgc2V0dGluZ3MKLXNlcnZlckVkaXRvck92ZXJ2aWV3QXV0b1B1Ymxpc2hPdmVycmlkZUludGVydmFsPVB1Ymxpc2hpbmcgaW50ZXJ2YWwgKGluIHNlY29uZHMpOgotc2VydmVyRWRpdG9yT3ZlcnZpZXdBdXRvUHVibGlzaERpc2FibGU9TmV2ZXIgcHVibGlzaCBhdXRvbWF0aWNhbGx5Ci1zZXJ2ZXJFZGl0b3JPdmVydmlld0F1dG9QdWJsaXNoQ29tbWFuZD1tb2RpZnkgcHVibGlzaCBzZXR0aW5ncwotc2VydmVyRWRpdG9yT3ZlcnZpZXdPcGVuTGF1bmNoQ29uZmlndXJhdGlvbj1PcGVuIGxhdW5jaCBjb25maWd1cmF0aW9uCi1zZXJ2ZXJFZGl0b3JPdmVydmlld0F1dG9QdWJsaXNoSW52YWxpZD1UaGUgYXV0b21hdGljIHB1Ymxpc2ggc2V0dGluZyBpcyBpbnZhbGlkLiBJdCBtdXN0IGJlIGEgezB9IHNlY29uZHMgb3IgbW9yZS4KLQotIyBNZW51IGl0ZW1zLiB7MH0gd2lsbCBiZSByZXBsYWNlZCBieSBvbmUgb2YgdGhlIHh4eEVkaXRvckFjdGlvblh4eCBmaWVsZHMKLSMgZnJvbSBiZWxvdy4gQEN0cmwrWiBpcyB0aGUgbWVudSBtbmVtb25pYwotZWRpdG9yVW5kb0VuYWJsZWQ9VW5kbyB7MH1AQ3RybCtaCi1lZGl0b3JVbmRvRGlzYWJsZWQ9VW5kb0BDdHJsK1oKLWVkaXRvclJlZG9FbmFibGVkPVJlZG8gezB9QEN0cmwrWQotZWRpdG9yUmVkb0Rpc2FibGVkPVJlZG9AQ3RybCtZCi0KLWVkaXRvclNhdmVFcnJvckRpYWxvZz1TYXZlIFByb2JsZW1zCi1lZGl0b3JTYXZlRXJyb3JNZXNzYWdlPUVycm9yIHdoaWxlIHNhdmluZy4gezB9Ci0KLWVkaXRvclJlYWRPbmx5PVJlYWQgT25seQotZWRpdG9yV3JpdGFibGU9V3JpdGFibGUKLWVkaXRvclJlYWRPbmx5RmlsZXM9UmVhZCBPbmx5IGZpbGVzOiB7MH0KLQotZWRpdG9yU2VydmVyRWRpdG9yPVNlcnZlciBFZGl0b3IKLWVkaXRvclByb21wdElycmV2ZXJzaWJsZT1UaGlzIG9wZXJhdGlvbiBjYW5ub3QgYmUgdW5kb25lLiBEbyB5b3Ugd2FudCB0byBwcm9jZWVkPwotZWRpdG9yUmVuYW1lRmlsZXM9VGhlIHNlcnZlciBoYXMgYmVlbiByZW5hbWVkLiBEbyB5b3Ugd2FudCB0byByZW5hbWUgdGhlIGNvcnJlc3BvbmRpbmcgZmlsZXMgdG8gbWF0Y2g/Ci0KLSMgbWVzc2FnZSBpZiBhIGRpcnR5IHJlc291cmNlIGlzIGRlbGV0ZWQKLWVkaXRvclJlc291cmNlRGVsZXRlVGl0bGU9U2VydmVyIERlbGV0ZWQKLWVkaXRvclJlc291cmNlRGVsZXRlU2VydmVyTWVzc2FnZT1UaGUgc2VydmVyIHswfSBoYXMgYmVlbiBkZWxldGVkIGZyb20gdGhlIGZpbGUgc3lzdGVtLiBEbyB5b3Ugd2FudCB0byBzYXZlIHlvdXIgY2hhbmdlcyBvciBjbG9zZSB0aGUgZWRpdG9yIHdpdGhvdXQgc2F2aW5nPwotZWRpdG9yUmVzb3VyY2VEZWxldGVTYXZlPVNhdmUKLQotZWRpdG9yUmVzb3VyY2VNb2RpZmllZFRpdGxlPUZpbGUgQ2hhbmdlZAotZWRpdG9yU2VydmVyTW9kaWZpZWRNZXNzYWdlPVRoZSBzZXJ2ZXIgaGFzIGJlZW4gY2hhbmdlZCBvbiB0aGUgZmlsZSBzeXN0ZW0uIERvIHlvdSB3YW50IHRvIGxvYWQgdGhlIGNoYW5nZXM/Ci0KLWVkaXRvclZhbGlkYXRlRWRpdEZhaWx1cmVNZXNzYWdlPVRoZSBzZXJ2ZXIgY2Fubm90IGJlIGVkaXRlZC4KLWVkaXRvclJlYWRPbmx5TWVzc2FnZT1GaWxlKHMpIGJlaW5nIGVkaXRlZCBoYXZlIGJlY29tZSByZWFkLW9ubHkuIFRoZSBlZGl0b3Igd2lsbCBiZWNvbWUgcmVhZC1vbmx5IGFuZCBjaGFuZ2VzIHdpbGwgYmUgbG9zdC4KLQotZWRpdG9yUmVzb3VyY2VXYXJuVGl0bGU9U2VydmVyIE1vZGlmaWNhdGlvbiBXYXJuaW5nCi1lZGl0b3JSZXNvdXJjZVdhcm5NZXNzYWdlPVRoZSBzZXJ2ZXIgeW91IGFyZSBtb2RpZnlpbmcgaXMgcmVhZC1vbmx5LiBBbGwgY2hhbmdlcyB3aWxsIGJlIGxvc3QgYmVjYXVzZSB0aGUgc2VydmVyIGNhbm5vdCBiZSBzYXZlZC4KLQotCi1hdWRpb1ByZWZTZWxlY3RGaWxlPVNlbGVjdCBBdWRpbyBGaWxlCi1hdWRpb1ByZWZFbmFibGU9JkVuYWJsZSBzb3VuZHMKLWF1ZGlvUHJlZlZvbHVtZT0mVm9sdW1lOgotYXVkaW9QcmVmU291bmRzPSZTb3VuZHM6Ci1hdWRpb1ByZWZTb3VuZD1Tb3VuZAotYXVkaW9QcmVmRmlsZT1BdWRpbyBGaWxlCi1hdWRpb1ByZWZQbGF5PSZQbGF5Ci1hdWRpb1ByZWZCcm93c2U9JkJyb3dzZS4uLgotYXVkaW9QcmVmUmVzZXQ9JlJlc2V0Ci0KLWF1ZGlvVW5rbm93bj0odW5rbm93bikKLWF1ZGlvRGVmYXVsdD0oZGVmYXVsdCkKLWF1ZGlvTm9uZT0obm9uZSkKLQotZXJyb3JTdGFydGluZ01vbml0b3I9Q291bGQgbm90IHN0YXJ0IHRoZSBzZXJ2ZXIgbW9uaXRvcjogezB9Ci0KLWludGVybmFsV2ViQnJvd3Nlck5hbWU9SW50ZXJuYWwgV2ViIEJyb3dzZXIKLQotcHJlZmVyZW5jZUludGVybmV0RGVzY3JpcHRpb249R2VuZXJhbCBpbnRlcm5ldCBzZXR0aW5ncyBhcmUgYXZhaWxhYmxlIGluIHRoZSBjb250YWluZWQgcHJlZmVyZW5jZSBwYWdlcy4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9PdmVybGF5SW1hZ2VEZXNjcmlwdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9PdmVybGF5SW1hZ2VEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhMjY1ZTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvT3ZlcmxheUltYWdlRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLkRlYnVnVUlUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5JRGVidWdVSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5Db21wb3NpdGVJbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotLyoqCi0gKiBBIE92ZXJsYXlJbWFnZURlc2NyaXB0b3IgY29uc2lzdHMgb2YgYSBtYWluIGljb24gYW5kIG9uZSBvciBtb3JlIG92ZXJsYXlzLgotICogVGhlIG92ZXJsYXlzIGFyZSBjb21wdXRlZCBhY2NvcmRpbmcgdG8gZmxhZ3Mgc2V0IG9uIGNyZWF0aW9uIG9mIHRoZSBkZXNjcmlwdG9yLgotICovCi1wdWJsaWMgY2xhc3MgT3ZlcmxheUltYWdlRGVzY3JpcHRvciBleHRlbmRzIENvbXBvc2l0ZUltYWdlRGVzY3JpcHRvciB7Ci0JLy8gZmxhZyB0byByZW5kZXIgdGhlIGVycm9yIG92ZXJsYXkKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBFUlJPUiA9IDB4MDAxOwotCi0JcHJpdmF0ZSBJbWFnZSBmQmFzZUltYWdlOwotCXByaXZhdGUgaW50IGZGbGFnczsKLQlwcml2YXRlIFBvaW50IGZTaXplOwotCQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBPdmVybGF5SW1hZ2VEZXNjcmlwdG9yLgotCSAqIAotCSAqIEBwYXJhbSBiYXNlSW1hZ2UgYW4gaW1hZ2UgZGVzY3JpcHRvciB1c2VkIGFzIHRoZSBiYXNlIGltYWdlCi0JICogQHBhcmFtIGZsYWdzIGZsYWdzIGluZGljYXRpbmcgd2hpY2ggYWRvcm5tZW50cyBhcmUgdG8gYmUgcmVuZGVyZWQKLQkgKi8KLQlwdWJsaWMgT3ZlcmxheUltYWdlRGVzY3JpcHRvcihJbWFnZSBiYXNlSW1hZ2UsIGludCBmbGFncykgewotCQlzZXRCYXNlSW1hZ2UoYmFzZUltYWdlKTsKLQkJc2V0RmxhZ3MoZmxhZ3MpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ29tcG9zaXRlSW1hZ2VEZXNjcmlwdG9yI2dldFNpemUoKQotCSAqLwotCXByb3RlY3RlZCBQb2ludCBnZXRTaXplKCkgewotCQlpZiAoZlNpemUgPT0gbnVsbCkgewotCQkJSW1hZ2VEYXRhIGRhdGEgPSBnZXRCYXNlSW1hZ2UoKS5nZXRJbWFnZURhdGEoKTsKLQkJCXNldFNpemUobmV3IFBvaW50KGRhdGEud2lkdGgsIGRhdGEuaGVpZ2h0KSk7Ci0JCX0KLQkJcmV0dXJuIGZTaXplOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIE9iamVjdCNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoIShvYmplY3QgaW5zdGFuY2VvZiBPdmVybGF5SW1hZ2VEZXNjcmlwdG9yKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJCQotCQlPdmVybGF5SW1hZ2VEZXNjcmlwdG9yIG90aGVyID0gKE92ZXJsYXlJbWFnZURlc2NyaXB0b3IpIG9iamVjdDsKLQkJcmV0dXJuIChnZXRCYXNlSW1hZ2UoKS5lcXVhbHMob3RoZXIuZ2V0QmFzZUltYWdlKCkpICYmIGdldEZsYWdzKCkgPT0gb3RoZXIuZ2V0RmxhZ3MoKSk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgT2JqZWN0I2hhc2hDb2RlKCkKLQkgKi8KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gZ2V0QmFzZUltYWdlKCkuaGFzaENvZGUoKSB8IGdldEZsYWdzKCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgQ29tcG9zaXRlSW1hZ2VEZXNjcmlwdG9yI2RyYXdDb21wb3NpdGVJbWFnZShpbnQsIGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkcmF3Q29tcG9zaXRlSW1hZ2UoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0JCUltYWdlRGF0YSBiZyA9IGdldEJhc2VJbWFnZSgpLmdldEltYWdlRGF0YSgpOwotCQlpZiAoYmcgPT0gbnVsbCkKLQkJCWJnID0gREVGQVVMVF9JTUFHRV9EQVRBOwotCi0JCWRyYXdJbWFnZShiZywgMCwgMCk7Ci0JCWRyYXdPdmVybGF5cygpOwotCX0KLQotCS8qKgotCSAqIEFkZCBhbnkgb3ZlcmxheXMgdG8gdGhlIGltYWdlIGFzIHNwZWNpZmllZCBpbiB0aGUgZmxhZ3MuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZHJhd092ZXJsYXlzKCkgewotCQlpbnQgZmxhZ3MgPSBnZXRGbGFncygpOwotCQlJbWFnZURhdGEgZGF0YSA9IG51bGw7Ci0JCWlmICgoZmxhZ3MgJiBFUlJPUikgIT0gMCkgewotCQkJZGF0YSA9IERlYnVnVUlUb29scy5nZXRJbWFnZShJRGVidWdVSUNvbnN0YW50cy5JTUdfT1ZSX0VSUk9SKS5nZXRJbWFnZURhdGEoKTsKLQkJCWludCB4ID0gZ2V0U2l6ZSgpLnggLSBkYXRhLndpZHRoOwotCQkJZHJhd0ltYWdlKGRhdGEsIHgsIDApOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBJbWFnZSBnZXRCYXNlSW1hZ2UoKSB7Ci0JCXJldHVybiBmQmFzZUltYWdlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEJhc2VJbWFnZShJbWFnZSBiYXNlSW1hZ2UpIHsKLQkJZkJhc2VJbWFnZSA9IGJhc2VJbWFnZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgaW50IGdldEZsYWdzKCkgewotCQlyZXR1cm4gZkZsYWdzOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEZsYWdzKGludCBmbGFncykgewotCQlmRmxhZ3MgPSBmbGFnczsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTaXplKFBvaW50IHNpemUpIHsKLQkJZlNpemUgPSBzaXplOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9Qcm9ncmVzc1V0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL1Byb2dyZXNzVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWEzZThkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL1Byb2dyZXNzVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci0vKioKLSAqIFByb2dyZXNzIE1vbml0b3IgdXRpbGl0eS4KLSAqLwotcHVibGljIGNsYXNzIFByb2dyZXNzVXRpbCB7Ci0JLyoqCi0JICogUHJvZ3Jlc3NVdGlsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHJpdmF0ZSBQcm9ncmVzc1V0aWwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgdmFsaWQgcHJvZ3Jlc3MgbW9uaXRvci4KLQkgKgotCSAqIEBwYXJhbSBtb25pdG9yIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb2dyZXNzTW9uaXRvciBnZXRNb25pdG9yRm9yKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAobW9uaXRvciA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCXJldHVybiBtb25pdG9yOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHN1Yi1wcm9ncmVzcyBtb25pdG9yIHdpdGggdGhlIGdpdmVuIGFtb3VudCBvbiB0aGUKLQkgKiBjdXJyZW50IHByb2dyZXNzIG1vbml0b3IuCi0JICoKLQkgKiBAcGFyYW0gbW9uaXRvciBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcgotCSAqIEBwYXJhbSB0aWNrcyBpbnQKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvZ3Jlc3NNb25pdG9yIGdldFN1Yk1vbml0b3JGb3IoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBpbnQgdGlja3MpIHsKLQkJaWYgKG1vbml0b3IgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQlpZiAobW9uaXRvciBpbnN0YW5jZW9mIE51bGxQcm9ncmVzc01vbml0b3IpCi0JCQlyZXR1cm4gbW9uaXRvcjsKLQkJcmV0dXJuIG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgdGlja3MpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHN1Yi1wcm9ncmVzcyBtb25pdG9yIHdpdGggdGhlIGdpdmVuIGFtb3VudCBvbiB0aGUKLQkgKiBjdXJyZW50IHByb2dyZXNzIG1vbml0b3IuCi0JICoKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIG51bGwKLQkgKiBAcGFyYW0gdGlja3MgYSBudW1iZXIgb2YgdGlja3MKLQkgKiBAcGFyYW0gc3R5bGUgYSBzdHlsZQotCSAqIEByZXR1cm4gYSBwcm9ncmVzcyBtb25pdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvZ3Jlc3NNb25pdG9yIGdldFN1Yk1vbml0b3JGb3IoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBpbnQgdGlja3MsIGludCBzdHlsZSkgewotCQlpZiAobW9uaXRvciA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCWlmIChtb25pdG9yIGluc3RhbmNlb2YgTnVsbFByb2dyZXNzTW9uaXRvcikKLQkJCXJldHVybiBtb25pdG9yOwotCQlyZXR1cm4gbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCB0aWNrcywgc3R5bGUpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9Qcm9qZWN0UHJvcGVydHlQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9Qcm9qZWN0UHJvcGVydHlQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmZjZkYjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvUHJvamVjdFByb3BlcnR5UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlByb3BlcnR5UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlckNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5TZXJ2ZXJVSUNvcmU7Ci0vKioKLSAqIFByb3BlcnR5UGFnZSBmb3IgSVByb2plY3RzLiBJdCBzaG93cyB0aGUgc2VydmVyIGFuZCBydW50aW1lIHByZWZlcmVuY2UgZm9yIHRoZSBwcm9qZWN0LgotICovCi1wdWJsaWMgY2xhc3MgUHJvamVjdFByb3BlcnR5UGFnZSBleHRlbmRzIFByb3BlcnR5UGFnZSB7Ci0JcHJvdGVjdGVkIElQcm9qZWN0IHByb2plY3Q7Ci0JcHJvdGVjdGVkIElNb2R1bGUgbW9kdWxlOwotCXByb3RlY3RlZCBJU2VydmVyIHNlcnZlcjsKLQotCS8qKgotCSAqIFByb2plY3RQcm9wZXJ0eVBhZ2UgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgUHJvamVjdFByb3BlcnR5UGFnZSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgdGhlIGJvZHkgb2YgdGhlIHBhZ2UuCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZQotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbAotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdHJ5IHsKLQkJCUlBZGFwdGFibGUgZWxlbWVudCA9IGdldEVsZW1lbnQoKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVByb2plY3QpCi0JCQkJcHJvamVjdCA9IChJUHJvamVjdCkgZWxlbWVudDsKLQotCQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCQlsYXlvdXQubnVtQ29sdW1ucyA9IDQ7Ci0JCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gMTA7Ci0JCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCQkKLQkJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULldSQVApOwotCQkJbGFiZWwuc2V0VGV4dChNZXNzYWdlcy5wcmVmUHJvamVjdERlc2NyaXB0aW9uKTsKLQkJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSA0OwotCQkJZGF0YS53aWR0aEhpbnQgPSAyMDA7Ci0JCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkJCi0JCQltb2R1bGUgPSBTZXJ2ZXJVdGlsLmdldE1vZHVsZShwcm9qZWN0KTsKLQkJCWlmIChtb2R1bGUgPT0gbnVsbCkgewotCQkJCWxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkJCWxhYmVsLnNldFRleHQoTWVzc2FnZXMucHJlZlByb2plY3ROb3RNb2R1bGUpOwotCQkJCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLQkJCQlkYXRhLmhvcml6b250YWxTcGFuID0gNDsKLQkJCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkJfSBlbHNlIHsKLQkJCQlJTW9kdWxlVHlwZSBtdCA9IG1vZHVsZS5nZXRNb2R1bGVUeXBlKCk7Ci0JCQkJaWYgKG10ICE9IG51bGwpIHsKLQkJCQkJbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCQkJCWxhYmVsLnNldFRleHQoTWVzc2FnZXMucHJlZlByb2plY3QpOwotCQkJCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCQkJCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQkJCi0JCQkJCUxhYmVsIG1vZHVsZUtpbmQgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCQkJCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLQkJCQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCQkJCW1vZHVsZUtpbmQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCQkJbW9kdWxlS2luZC5zZXRUZXh0KG1vZHVsZS5nZXROYW1lKCkgKyAiICgiICsgbXQuZ2V0TmFtZSgpICsgIikiKTsKLQkJCQl9Ci0JCQkJCi0JCQkJSVNlcnZlciBwcmVmU2VydmVyID0gU2VydmVyQ29yZS5nZXREZWZhdWx0U2VydmVyKG1vZHVsZSk7Ci0JCi0JCQkJbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCQkJbGFiZWwuc2V0VGV4dChNZXNzYWdlcy5wcmVmUHJvamVjdERlZmF1bHRTZXJ2ZXIpOwotCQkJCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKTsKLQkJCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkJCQotCQkJCWZpbmFsIElTZXJ2ZXJbXSBzZXJ2ZXJzID0gZ2V0U2VydmVyc0J5U3VwcG9ydGVkTW9kdWxlKG1vZHVsZSk7Ci0JCQkJaWYgKHNlcnZlcnMgPT0gbnVsbCB8fCBzZXJ2ZXJzLmxlbmd0aCA9PSAwKSB7Ci0JCQkJCWxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULldSQVApOwotCQkJCQlsYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLnByZWZQcm9qZWN0Tm90Q29uZmlndXJlZCk7Ci0JCQkJCWRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJCQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCQkJCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZmluYWwgVGFibGUgdGFibGUgPSBuZXcgVGFibGUoY29tcG9zaXRlLCBTV1QuQk9SREVSIHwgU1dULlNJTkdMRSB8IFNXVC5WX1NDUk9MTCk7Ci0JCQkJCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCQkJCWRhdGEuaGVpZ2h0SGludCA9IDcwOwotCQkJCQl0YWJsZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkJCQkKLQkJCQkJLy8gYWRkIG5vbmUgb3B0aW9uCi0JCQkJCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpOwotCQkJCQlpdGVtLnNldFRleHQoTWVzc2FnZXMucHJlZlByb2plY3ROb1NlcnZlcik7Ci0JCQkJCS8vaXRlbS5zZXRJbWFnZSgpOwotCQkJCQkKLQkJCQkJaW50IHNpemUyID0gc2VydmVycy5sZW5ndGg7Ci0JCQkJCWludCBjb3VudCA9IDA7Ci0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgc2l6ZTI7IGorKykgewotCQkJCQkJaXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsKLQkJCQkJCWl0ZW0uc2V0VGV4dChTZXJ2ZXJVSUNvcmUuZ2V0TGFiZWxQcm92aWRlcigpLmdldFRleHQoc2VydmVyc1tqXSkpOwotCQkJCQkJaXRlbS5zZXRJbWFnZShTZXJ2ZXJVSUNvcmUuZ2V0TGFiZWxQcm92aWRlcigpLmdldEltYWdlKHNlcnZlcnNbal0pKTsKLQkJCQkJCWl0ZW0uc2V0RGF0YShzZXJ2ZXJzW2pdKTsKLQkJCQkJCWlmIChzZXJ2ZXJzW2pdLmVxdWFscyhwcmVmU2VydmVyKSkKLQkJCQkJCQljb3VudCA9IGogKyAxOwotCQkJCQl9Ci0KLQkJCQkJdGFibGUuc2V0U2VsZWN0aW9uKGNvdW50KTsKLQotCQkJCQl0YWJsZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJCQkJaW50IGluZGV4ID0gdGFibGUuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJCQkJCQlpZiAoaW5kZXggPT0gMCkgewotCQkJCQkJCQlzZXJ2ZXIgPSBudWxsOwotCQkJCQkJCX0gZWxzZSBpZiAoaW5kZXggPiAwKSB7Ci0JCQkJCQkJCXNlcnZlciA9IHNlcnZlcnNbaW5kZXgtMV07Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9KTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQoY29tcG9zaXRlKTsKLQotCQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGNyZWF0aW5nIHByb2plY3QgcHJvcGVydHkgcGFnZSIsIGUpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBhbGwgc2VydmVycyB0aGF0IHRoaXMgbW9kdWxlIGlzIGNvbmZpZ3VyZWQgb24uCi0JICoKLQkgKiBAcGFyYW0gbW9kdWxlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlCi0JICogQHJldHVybiBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgSVNlcnZlcltdIGdldFNlcnZlcnNCeVN1cHBvcnRlZE1vZHVsZShJTW9kdWxlIG1vZHVsZSkgewotCQlpZiAobW9kdWxlID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IElTZXJ2ZXJbMF07Ci0KLQkJLy8gZG8gaXQgdGhlIHNsb3cgd2F5IC0gZ28gdGhyb3VnaCBhbGwgc2VydmVycyBhbmQKLQkJLy8gc2VlIGlmIHRoaXMgbW9kdWxlIGlzIGNvbmZpZ3VyZWQgaW4gaXQKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlJU2VydmVyW10gc2VydmVycyA9IFNlcnZlckNvcmUuZ2V0U2VydmVycygpOwotCQlpZiAoc2VydmVycyAhPSBudWxsKSB7Ci0JCQlpbnQgc2l6ZSA9IHNlcnZlcnMubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlpZiAoU2VydmVyVXRpbC5pc1N1cHBvcnRlZE1vZHVsZShzZXJ2ZXJzW2ldLmdldFNlcnZlclR5cGUoKS5nZXRSdW50aW1lVHlwZSgpLmdldE1vZHVsZVR5cGVzKCksIG1vZHVsZS5nZXRNb2R1bGVUeXBlKCkpKQotCQkJCQlsaXN0LmFkZChzZXJ2ZXJzW2ldKTsKLQkJCX0KLQkJfQotCQkKLQkJSVNlcnZlcltdIGFsbFNlcnZlcnMgPSBuZXcgSVNlcnZlcltsaXN0LnNpemUoKV07Ci0JCWxpc3QudG9BcnJheShhbGxTZXJ2ZXJzKTsKLQkJcmV0dXJuIGFsbFNlcnZlcnM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlI3BlcmZvcm1PaygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotCQlpZiAobW9kdWxlICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJU2VydmVyQ29yZS5zZXREZWZhdWx0U2VydmVyKG1vZHVsZSwgc2VydmVyLCBudWxsKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIHNldHRpbmcgcHJlZmVycmVkIHNlcnZlciIsIGUpOwotCQkJCUVjbGlwc2VVdGlsLm9wZW5FcnJvcihNZXNzYWdlcy5lcnJvckNvdWxkTm90U2F2ZVByZWZlcmVuY2UsIGUuZ2V0U3RhdHVzKCkpOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIucGVyZm9ybU9rKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL1J1bnRpbWVQcmVmZXJlbmNlUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvUnVudGltZVByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyMmY1YTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvUnVudGltZVByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuUHJvZ3Jlc3NNb25pdG9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpcmVjdG9yeURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5JUnVudGltZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXdlcnMuUnVudGltZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZC5DbG9zYWJsZVdpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZC5UYXNrV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLldpemFyZFRhc2tVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLmZyYWdtZW50Lk5ld1J1bnRpbWVXaXphcmRGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLndpemFyZC5XaXphcmRGcmFnbWVudDsKLS8qKgotICogVGhlIHByZWZlcmVuY2UgcGFnZSB0aGF0IGhvbGRzIHNlcnZlciBydW50aW1lcy4KLSAqLwotcHVibGljIGNsYXNzIFJ1bnRpbWVQcmVmZXJlbmNlUGFnZSBleHRlbmRzIFByZWZlcmVuY2VQYWdlIGltcGxlbWVudHMgSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlIHsKLQlwcm90ZWN0ZWQgQnV0dG9uIGVkaXQ7Ci0JcHJvdGVjdGVkIEJ1dHRvbiByZW1vdmU7Ci0JcHJvdGVjdGVkIExhYmVsIHBhdGhMYWJlbDsKLQotCS8qKgotCSAqIFJ1bnRpbWVQcmVmZXJlbmNlc1BhZ2UgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgUnVudGltZVByZWZlcmVuY2VQYWdlKCkgewotCQlzdXBlcigpOwotCQlub0RlZmF1bHRBbmRBcHBseUJ1dHRvbigpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgdGhlIHByZWZlcmVuY2Ugb3B0aW9ucy4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlpbml0aWFsaXplRGlhbG9nVW5pdHMocGFyZW50KTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwYXJlbnQsIENvbnRleHRJZHMuUFJFRl9HRU5FUkFMKTsKLQkJCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKDQpOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKDMpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuV1JBUCk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCWxhYmVsLnNldFRleHQoTWVzc2FnZXMucHJlZmVyZW5jZVJ1bnRpbWVzRGVzY3JpcHRpb24pOwotCQkKLQkJbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuV1JBUCk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCWxhYmVsLnNldFRleHQoTWVzc2FnZXMucHJlZmVyZW5jZVJ1bnRpbWVzVGFibGUpOwotCQkKLQkJZmluYWwgUnVudGltZUNvbXBvc2l0ZSBydW50aW1lQ29tcCA9IG5ldyBSdW50aW1lQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUsIG5ldyBSdW50aW1lQ29tcG9zaXRlLlJ1bnRpbWVTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bnRpbWVTZWxlY3RlZChJUnVudGltZSBydW50aW1lKSB7Ci0JCQkJaWYgKHJ1bnRpbWUgPT0gbnVsbCkgewotCQkJCQllZGl0LnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQlyZW1vdmUuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCXBhdGhMYWJlbC5zZXRUZXh0KCIiKTsKLQkJCQl9IGVsc2UgaWYgKHJ1bnRpbWUuaXNSZWFkT25seSgpKSB7Ci0JCQkJCWVkaXQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCXJlbW92ZS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJcGF0aExhYmVsLnNldFRleHQocnVudGltZS5nZXRMb2NhdGlvbigpICsgIiIpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWVkaXQuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJcmVtb3ZlLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCXBhdGhMYWJlbC5zZXRUZXh0KHJ1bnRpbWUuZ2V0TG9jYXRpb24oKSArICIiKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQlydW50aW1lQ29tcC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5GSUxMX1ZFUlRJQ0FMKSk7Ci0JCQotCQlDb21wb3NpdGUgYnV0dG9uQ29tcCA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IDA7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSBjb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMoMyk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0JCWJ1dHRvbkNvbXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCk7Ci0JCWJ1dHRvbkNvbXAuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCi0JCUJ1dHRvbiBhZGQgPSBTV1RVdGlsLmNyZWF0ZUJ1dHRvbihidXR0b25Db21wLCBNZXNzYWdlcy5hZGQpOwotCQlhZGQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaWYgKHNob3dXaXphcmQobnVsbCkgPT0gV2luZG93LkNBTkNFTCkKLQkJCQkJcmV0dXJuOwotCQkJCXJ1bnRpbWVDb21wLnJlZnJlc2goKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQllZGl0ID0gU1dUVXRpbC5jcmVhdGVCdXR0b24oYnV0dG9uQ29tcCwgTWVzc2FnZXMuZWRpdCk7Ci0JCWVkaXQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWVkaXQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJSVJ1bnRpbWUgcnVudGltZSA9IHJ1bnRpbWVDb21wLmdldFNlbGVjdGVkUnVudGltZSgpOwotCQkJCWlmIChydW50aW1lICE9IG51bGwpIHsKLQkJCQkJSVJ1bnRpbWVXb3JraW5nQ29weSBydW50aW1lV29ya2luZ0NvcHkgPSBydW50aW1lLmNyZWF0ZVdvcmtpbmdDb3B5KCk7Ci0JCQkJCWlmIChzaG93V2l6YXJkKHJ1bnRpbWVXb3JraW5nQ29weSkgIT0gV2luZG93LkNBTkNFTCkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlydW50aW1lQ29tcC5yZWZyZXNoKHJ1bnRpbWUpOwotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCQkJLy8gaWdub3JlCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQkKLQkJcmVtb3ZlID0gU1dUVXRpbC5jcmVhdGVCdXR0b24oYnV0dG9uQ29tcCwgTWVzc2FnZXMucmVtb3ZlKTsKLQkJcmVtb3ZlLnNldEVuYWJsZWQoZmFsc2UpOwotCQlyZW1vdmUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJSVJ1bnRpbWUgcnVudGltZSA9IHJ1bnRpbWVDb21wLmdldFNlbGVjdGVkUnVudGltZSgpOwotCQkJCWlmIChzaG91bGRSZW1vdmVSdW50aW1lKHJ1bnRpbWUpKQotCQkJCQl0cnkgewotCQkJCQkJcnVudGltZS5kZWxldGUoKTsKLQkJCQkJCXJ1bnRpbWVDb21wLnJlbW92ZShydW50aW1lKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCQkvLyBpZ25vcmUKLQkJCQkJfQotCQkJfQotCQl9KTsKLQkJCi0JCUJ1dHRvbiBzZWFyY2ggPSBTV1RVdGlsLmNyZWF0ZUJ1dHRvbihidXR0b25Db21wLCBNZXNzYWdlcy5zZWFyY2gpOwotCQlkYXRhID0gKEdyaWREYXRhKSBzZWFyY2guZ2V0TGF5b3V0RGF0YSgpOwotCQlkYXRhLnZlcnRpY2FsSW5kZW50ID0gOTsKLQkJc2VhcmNoLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXRyeSB7Ci0JCQkJCS8vIHNlbGVjdCBhIHRhcmdldCBkaXJlY3RvcnkgZm9yIHRoZSBzZWFyY2gKLQkJCQkJRGlyZWN0b3J5RGlhbG9nIGRpcmVjdG9yeURpYWxvZyA9IG5ldyBEaXJlY3RvcnlEaWFsb2coZ2V0U2hlbGwoKSk7Ci0JCQkJCWRpcmVjdG9yeURpYWxvZy5zZXRNZXNzYWdlKE1lc3NhZ2VzLmRpYWxvZ1J1bnRpbWVTZWFyY2hNZXNzYWdlKTsKLQkJCQkJZGlyZWN0b3J5RGlhbG9nLnNldFRleHQoTWVzc2FnZXMuZGlhbG9nUnVudGltZVNlYXJjaFRpdGxlKTsKLQotCQkJCQlTdHJpbmcgcGF0aFN0ciA9IGRpcmVjdG9yeURpYWxvZy5vcGVuKCk7Ci0JCQkJCWlmIChwYXRoU3RyID09IG51bGwpCi0JCQkJCQlyZXR1cm47Ci0JCQkJCQotCQkJCQlmaW5hbCBJUGF0aCBwYXRoID0gbmV3IFBhdGgocGF0aFN0cik7Ci0JCQkJCQotCQkJCQlmaW5hbCBQcm9ncmVzc01vbml0b3JEaWFsb2cgZGlhbG9nID0gbmV3IFByb2dyZXNzTW9uaXRvckRpYWxvZyhnZXRTaGVsbCgpKTsKLQkJCQkJZGlhbG9nLnNldEJsb2NrT25PcGVuKGZhbHNlKTsKLQkJCQkJZGlhbG9nLnNldENhbmNlbGFibGUodHJ1ZSk7Ci0JCQkJCWRpYWxvZy5vcGVuKCk7Ci0JCQkJCWZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciA9IGRpYWxvZy5nZXRQcm9ncmVzc01vbml0b3IoKTsKLQkJCQkJZmluYWwgSVJ1bnRpbWVMb2NhdG9yW10gbG9jYXRvcnMgPSBTZXJ2ZXJQbHVnaW4uZ2V0UnVudGltZUxvY2F0b3JzKCk7Ci0JCQkJCW1vbml0b3IuYmVnaW5UYXNrKE1lc3NhZ2VzLmRpYWxvZ1J1bnRpbWVTZWFyY2hQcm9ncmVzcywgMTAwICogbG9jYXRvcnMubGVuZ3RoICsgMTApOwotCQkJCQlmaW5hbCBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQotCQkJCQlmaW5hbCBJUnVudGltZUxvY2F0b3IuSVJ1bnRpbWVTZWFyY2hMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBJUnVudGltZUxvY2F0b3IuSVJ1bnRpbWVTZWFyY2hMaXN0ZW5lcigpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bnRpbWVGb3VuZChmaW5hbCBJUnVudGltZVdvcmtpbmdDb3B5IHJ1bnRpbWUpIHsKLQkJCQkJCQlkaWFsb2cuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCQltb25pdG9yLnN1YlRhc2socnVudGltZS5nZXROYW1lKCkpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfSk7Ci0JCQkJCQkJbGlzdC5hZGQocnVudGltZSk7Ci0JCQkJCQl9Ci0JCQkJCX07Ci0JCQkJCQotCQkJCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcjIpIHsKLQkJCQkJCQlpZiAobG9jYXRvcnMgIT0gbnVsbCkgewotCQkJCQkJCQlpbnQgc2l6ZSA9IGxvY2F0b3JzLmxlbmd0aDsKLQkJCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQkJCQkJCWlmICghbW9uaXRvcjIuaXNDYW5jZWxlZCgpKQotCQkJCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQkJCWxvY2F0b3JzW2ldLnNlYXJjaEZvclJ1bnRpbWVzKHBhdGgsIGxpc3RlbmVyLCBtb25pdG9yMik7Ci0JCQkJCQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJCQkJCQkJCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiRXJyb3IgbG9jYXRpbmcgcnVudGltZXM6ICIgKyBsb2NhdG9yc1tpXS5nZXRJZCgpLCBjZSk7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLklORk8sICJEb25lIHNlYXJjaCIpOwotCQkJCQkJfQotCQkJCQl9OwotCQkJCQlkaWFsb2cucnVuKHRydWUsIHRydWUsIHJ1bm5hYmxlKTsKLQkJCQkJCi0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVSLCAiRm91bmQgcnVudGltZXM6ICIgKyBsaXN0LnNpemUoKSk7Ci0JCQkJCQotCQkJCQlpZiAoIW1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQkJCQlpZiAobGlzdC5pc0VtcHR5KCkpIHsKLQkJCQkJCQlFY2xpcHNlVXRpbC5vcGVuRXJyb3IoZ2V0U2hlbGwoKSwgTWVzc2FnZXMuaW5mb05vUnVudGltZXNGb3VuZCk7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQkJbW9uaXRvci53b3JrZWQoNSk7Ci0JCQkJCQkvLyByZW1vdmUgZHVwbGljYXRlcyBmcm9tIGxpc3QgKGJhc2VkIG9uIGxvY2F0aW9uKQotCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVIsICJSZW1vdmluZyBkdXBsaWNhdGVzIik7Ci0JCQkJCQlMaXN0IGdvb2QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQlJdGVyYXRvciBpdGVyYXRvcjIgPSBsaXN0Lml0ZXJhdG9yKCk7Ci0JCQkJCQl3aGlsZSAoaXRlcmF0b3IyLmhhc05leHQoKSkgewotCQkJCQkJCWJvb2xlYW4gZHVwID0gZmFsc2U7Ci0JCQkJCQkJSVJ1bnRpbWUgd2MgPSAoSVJ1bnRpbWUpIGl0ZXJhdG9yMi5uZXh0KCk7Ci0JCQkJCQkJCi0JCQkJCQkJSVJ1bnRpbWVbXSBydW50aW1lcyA9IFNlcnZlckNvcmUuZ2V0UnVudGltZXMoKTsKLQkJCQkJCQlpZiAocnVudGltZXMgIT0gbnVsbCkgewotCQkJCQkJCQlpbnQgc2l6ZSA9IHJ1bnRpbWVzLmxlbmd0aDsKLQkJCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQkJCQkJCWlmIChydW50aW1lc1tpXS5nZXRMb2NhdGlvbigpICE9IG51bGwgJiYgcnVudGltZXNbaV0uZ2V0TG9jYXRpb24oKS5lcXVhbHMod2MuZ2V0TG9jYXRpb24oKSkpCi0JCQkJCQkJCQkJZHVwID0gdHJ1ZTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQlpZiAoIWR1cCkKLQkJCQkJCQkJZ29vZC5hZGQod2MpOwotCQkJCQkJfQotCQkJCQkJbW9uaXRvci53b3JrZWQoNSk7Ci0JCQkJCQkKLQkJCQkJCS8vIGFkZCB0byBsaXN0Ci0JCQkJCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FUiwgIkFkZGluZyBydW50aW1lczogIiArIGdvb2Quc2l6ZSgpKTsKLQkJCQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZ29vZC5pdGVyYXRvcigpOwotCQkJCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQkJCUlSdW50aW1lV29ya2luZ0NvcHkgd2MgPSAoSVJ1bnRpbWVXb3JraW5nQ29weSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJCXdjLnNhdmUoZmFsc2UsIG1vbml0b3IpOwotCQkJCQkJfQotCQkJCQkJbW9uaXRvci5kb25lKCk7Ci0JCQkJCX0KLQkJCQkJZGlhbG9nLmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGZpbmRpbmcgcnVudGltZXMiLCBleCk7Ci0JCQkJfQotCQkJCXJ1bnRpbWVDb21wLnJlZnJlc2goKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlwYXRoTGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JCXBhdGhMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJCi0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQoY29tcG9zaXRlKTsKLQkKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkUmVtb3ZlUnVudGltZShJUnVudGltZSBydW50aW1lKSB7Ci0JCWlmIChydW50aW1lID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJLy8gY2hlY2sgZm9yIHVzZQotCQlib29sZWFuIGluVXNlID0gZmFsc2U7Ci0JCi0JCUlTZXJ2ZXJbXSBzZXJ2ZXJzID0gU2VydmVyQ29yZS5nZXRTZXJ2ZXJzKCk7Ci0JCWlmIChzZXJ2ZXJzICE9IG51bGwpIHsKLQkJCWludCBzaXplID0gc2VydmVycy5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCWlmIChydW50aW1lLmVxdWFscyhzZXJ2ZXJzW2ldLmdldFJ1bnRpbWUoKSkpCi0JCQkJCWluVXNlID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQkKLQkJLypJUHJvamVjdFtdIHByb2plY3RzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0cygpOwotCQlpZiAocHJvamVjdHMgIT0gbnVsbCkgewotCQkJaW50IHNpemUgPSBwcm9qZWN0cy5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCUlQcm9qZWN0UHJvcGVydGllcyBwcm9wcyA9IFNlcnZlckNvcmUuZ2V0UHJvamVjdFByb3BlcnRpZXMocHJvamVjdHNbaV0pOwotCQkJCWlmIChydW50aW1lLmVxdWFscyhwcm9wcy5nZXRSdW50aW1lVGFyZ2V0KCkpKQotCQkJCQlpblVzZSA9IHRydWU7Ci0JCQl9Ci0JCX0qLwotCQkKLQkJaWYgKGluVXNlKSB7Ci0JCQlpZiAoIU1lc3NhZ2VEaWFsb2cub3BlbkNvbmZpcm0oZ2V0U2hlbGwoKSwgTWVzc2FnZXMuZGVmYXVsdERpYWxvZ1RpdGxlLCBNZXNzYWdlcy5kaWFsb2dSdW50aW1lSW5Vc2UpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXByb3RlY3RlZCBpbnQgc2hvd1dpemFyZChmaW5hbCBJUnVudGltZVdvcmtpbmdDb3B5IHJ1bnRpbWVXb3JraW5nQ29weSkgewotCQlTdHJpbmcgdGl0bGUgPSBudWxsOwotCQlXaXphcmRGcmFnbWVudCBmcmFnbWVudCA9IG51bGw7Ci0JCVRhc2tNb2RlbCB0YXNrTW9kZWwgPSBuZXcgVGFza01vZGVsKCk7Ci0JCWlmIChydW50aW1lV29ya2luZ0NvcHkgPT0gbnVsbCkgewotCQkJdGl0bGUgPSBNZXNzYWdlcy53aXpOZXdSdW50aW1lV2l6YXJkVGl0bGU7Ci0JCQlmcmFnbWVudCA9IG5ldyBXaXphcmRGcmFnbWVudCgpIHsKLQkJCQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDaGlsZEZyYWdtZW50cyhMaXN0IGxpc3QpIHsKLQkJCQkJbGlzdC5hZGQobmV3IE5ld1J1bnRpbWVXaXphcmRGcmFnbWVudCgpKTsKLQkJCQkJbGlzdC5hZGQobmV3IFdpemFyZEZyYWdtZW50KCkgewotCQkJCQkJcHVibGljIHZvaWQgcGVyZm9ybUZpbmlzaChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQkJCQlXaXphcmRUYXNrVXRpbC5zYXZlUnVudGltZShnZXRUYXNrTW9kZWwoKSwgbW9uaXRvcik7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCX0KLQkJCX07Ci0JCX0gZWxzZSB7Ci0JCQl0aXRsZSA9IE1lc3NhZ2VzLndpekVkaXRSdW50aW1lV2l6YXJkVGl0bGU7Ci0JCQlmaW5hbCBXaXphcmRGcmFnbWVudCBmcmFnbWVudDIgPSBTZXJ2ZXJVSVBsdWdpbi5nZXRXaXphcmRGcmFnbWVudChydW50aW1lV29ya2luZ0NvcHkuZ2V0UnVudGltZVR5cGUoKS5nZXRJZCgpKTsKLQkJCWlmIChmcmFnbWVudDIgPT0gbnVsbCkgewotCQkJCWVkaXQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJcmV0dXJuIFdpbmRvdy5DQU5DRUw7Ci0JCQl9Ci0JCQl0YXNrTW9kZWwucHV0T2JqZWN0KFRhc2tNb2RlbC5UQVNLX1JVTlRJTUUsIHJ1bnRpbWVXb3JraW5nQ29weSk7Ci0JCQlmcmFnbWVudCA9IG5ldyBXaXphcmRGcmFnbWVudCgpIHsKLQkJCQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDaGlsZEZyYWdtZW50cyhMaXN0IGxpc3QpIHsKLQkJCQkJbGlzdC5hZGQoZnJhZ21lbnQyKTsKLQkJCQkJbGlzdC5hZGQobmV3IFdpemFyZEZyYWdtZW50KCkgewotCQkJCQkJcHVibGljIHZvaWQgcGVyZm9ybUZpbmlzaChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQkJCQlXaXphcmRUYXNrVXRpbC5zYXZlUnVudGltZShnZXRUYXNrTW9kZWwoKSwgbW9uaXRvcik7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJVGFza1dpemFyZCB3aXphcmQgPSBuZXcgVGFza1dpemFyZCh0aXRsZSwgZnJhZ21lbnQsIHRhc2tNb2RlbCk7Ci0JCXdpemFyZC5zZXRGb3JjZVByZXZpb3VzQW5kTmV4dEJ1dHRvbnModHJ1ZSk7Ci0JCUNsb3NhYmxlV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBDbG9zYWJsZVdpemFyZERpYWxvZyhnZXRTaGVsbCgpLCB3aXphcmQpOwotCQlyZXR1cm4gZGlhbG9nLm9wZW4oKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIElSdW50aW1lIGdldFNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbDIpIHsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWwyOwotCQlyZXR1cm4gKElSdW50aW1lKSBzZWwuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JfQotCQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoaXMgcHJlZmVyZW5jZSBwYWdlIHVzaW5nIHRoZSBwYXNzZWQgd29ya2JlbmNoLgotCSAqCi0JICogQHBhcmFtIHdvcmtiZW5jaCB0aGUgY3VycmVudCB3b3JrYmVuY2gKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKiogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlI3BlcmZvcm1PaygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotCQkvLyBUT0RPIC0gc2hvdWxkIG5vdCBzYXZlIHVudGlsIHVzZXIgaGl0cyBvayAKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZ1BhZ2Ujc2V0VmlzaWJsZShib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7Ci0JCXN1cGVyLnNldFZpc2libGUodmlzaWJsZSk7Ci0JCWlmICh2aXNpYmxlKQotCQkJc2V0VGl0bGUoTWVzc2FnZXMucHJlZmVyZW5jZVJ1bnRpbWVzVGl0bGVMb25nKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvU1dUVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvU1dUVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTlhNjgyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL1NXVFV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250TWV0cmljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci0vKioKLSAqIFNXVCBVdGlsaXR5IGNsYXNzLgotICovCi1wdWJsaWMgY2xhc3MgU1dUVXRpbCB7Ci0JcHJpdmF0ZSBzdGF0aWMgRm9udE1ldHJpY3MgZm9udE1ldHJpY3M7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgaW5pdGlhbGl6ZURpYWxvZ1VuaXRzKENvbnRyb2wgdGVzdENvbnRyb2wpIHsKLQkJLy8gQ29tcHV0ZSBhbmQgc3RvcmUgYSBmb250IG1ldHJpYwotCQlHQyBnYyA9IG5ldyBHQyh0ZXN0Q29udHJvbCk7Ci0JCWdjLnNldEZvbnQoSkZhY2VSZXNvdXJjZXMuZ2V0RGlhbG9nRm9udCgpKTsKLQkJZm9udE1ldHJpY3MgPSBnYy5nZXRGb250TWV0cmljcygpOwotCQlnYy5kaXNwb3NlKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIHdpZHRoIGhpbnQgZm9yIGEgYnV0dG9uIGNvbnRyb2wuCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBpbnQgZ2V0QnV0dG9uV2lkdGhIaW50KEJ1dHRvbiBidXR0b24pIHsKLQkJaW50IHdpZHRoSGludCA9IERpYWxvZy5jb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhmb250TWV0cmljcywgSURpYWxvZ0NvbnN0YW50cy5CVVRUT05fV0lEVEgpOwotCQlyZXR1cm4gTWF0aC5tYXgod2lkdGhIaW50LCBidXR0b24uY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCB0cnVlKS54KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgYnV0dG9uIHdpdGggdGhlIHN0YW5kYXJkIHNpemUuCi0JICogCi0JICogQHBhcmFtIGNvbXAgdGhlIGNvbXBvbmVudCB0byBhZGQgdGhlIGJ1dHRvbiB0bwotCSAqIEBwYXJhbSBsYWJlbCB0aGUgYnV0dG9uIGxhYmVsCi0JICogQHJldHVybiBhIGJ1dHRvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQnV0dG9uIGNyZWF0ZUJ1dHRvbihDb21wb3NpdGUgY29tcCwgU3RyaW5nIGxhYmVsKSB7Ci0JCUJ1dHRvbiBiID0gbmV3IEJ1dHRvbihjb21wLCBTV1QuUFVTSCk7Ci0JCWIuc2V0VGV4dChsYWJlbCk7Ci0JCWlmIChmb250TWV0cmljcyA9PSBudWxsKQotCQkJaW5pdGlhbGl6ZURpYWxvZ1VuaXRzKGNvbXApOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyk7Ci0JCWRhdGEud2lkdGhIaW50ID0gZ2V0QnV0dG9uV2lkdGhIaW50KGIpOwotCQliLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXJldHVybiBiOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZXJ0IERMVXMgdG8gcGl4ZWxzLgotCSAqIAotCSAqIEBwYXJhbSBjb21wIGEgY29tcG9uZW50Ci0JICogQHBhcmFtIHggcGl4ZWxzCi0JICogQHJldHVybiBkbHVzCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoQ29tcG9zaXRlIGNvbXAsIGludCB4KSB7Ci0JCWlmIChmb250TWV0cmljcyA9PSBudWxsKQotCQkJaW5pdGlhbGl6ZURpYWxvZ1VuaXRzKGNvbXApOwotCQlyZXR1cm4gRGlhbG9nLmNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKGZvbnRNZXRyaWNzLCB4KTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IERMVXMgdG8gcGl4ZWxzLgotCSAqIAotCSAqIEBwYXJhbSBjb21wIGEgY29tcG9uZW50Ci0JICogQHBhcmFtIHkgcGl4ZWxzCi0JICogQHJldHVybiBkbHVzCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKENvbXBvc2l0ZSBjb21wLCBpbnQgeSkgewotCQlpZiAoZm9udE1ldHJpY3MgPT0gbnVsbCkKLQkJCWluaXRpYWxpemVEaWFsb2dVbml0cyhjb21wKTsKLQkJcmV0dXJuIERpYWxvZy5jb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMoZm9udE1ldHJpY3MsIHkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9TZXJ2ZXJBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvU2VydmVyQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTJlZmRiYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9TZXJ2ZXJBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRmlsdGVyOwotLyoqCi0gKiBBZGFwdGVyIGZhY3RvcnkgdG8gYWRhcHQgc2VydmVycyB0byBJQWN0aW9uRmlsdGVyLgotICovCi1wdWJsaWMgY2xhc3MgU2VydmVyQWRhcHRlckZhY3RvcnkgaW1wbGVtZW50cyBJQWRhcHRlckZhY3RvcnkgewotCUlBY3Rpb25GaWx0ZXIgYWN0aW9uRmlsdGVyID0gbmV3IElBY3Rpb25GaWx0ZXIoKSB7Ci0JCXB1YmxpYyBib29sZWFuIHRlc3RBdHRyaWJ1dGUoT2JqZWN0IHRhcmdldCwgU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgewotCQkJcmV0dXJuIFNlcnZlclByb3BlcnR5VGVzdGVyLmNoZWNrUHJvcGVydHkodGFyZ2V0LCBuYW1lLCB2YWx1ZSk7Ci0JCX0KLQl9OwotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeSNnZXRBZGFwdGVyKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5DbGFzcykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoT2JqZWN0IGFkYXB0YWJsZU9iamVjdCwgQ2xhc3MgYWRhcHRlclR5cGUpIHsKLQkJaWYgKGFkYXB0ZXJUeXBlICE9IElBY3Rpb25GaWx0ZXIuY2xhc3MpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCXJldHVybiBhY3Rpb25GaWx0ZXI7IAotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlckZhY3RvcnkjZ2V0QWRhcHRlckxpc3QoKQotCSAqLwotCXB1YmxpYyBDbGFzc1tdIGdldEFkYXB0ZXJMaXN0KCkgewotCQlyZXR1cm4gbmV3IENsYXNzW10geyBJQWN0aW9uRmlsdGVyLmNsYXNzIH07Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL1NlcnZlckxhYmVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL1NlcnZlckxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJhMTQ2OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9TZXJ2ZXJMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi2gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5JV29ya2JlbmNoQWRhcHRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5JQ2xpZW50OwotLyoqCi0gKiBBIGxhYmVsIHByb3ZpZGVyIGZvciBhbGwgc2VydmVyIHJlbGF0ZWQgb2JqZWN0cy4KLSAqLwotcHVibGljIGNsYXNzIFNlcnZlckxhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJTGFiZWxQcm92aWRlciB7Ci0JcHVibGljIFNlcnZlckxhYmVsUHJvdmlkZXIoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TW9kdWxlSW1hZ2UoU3RyaW5nIHR5cGVJZCkgewotCQlpZiAodHlwZUlkID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlJbWFnZSBpbWFnZSA9IEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2UodHlwZUlkKTsKLQkJaW50IGluZCA9IHR5cGVJZC5pbmRleE9mKCIuIik7Ci0JCXdoaWxlIChpbWFnZSA9PSBudWxsICYmIGluZCA+PSAwKSB7Ci0JCQl0eXBlSWQgPSB0eXBlSWQuc3Vic3RyaW5nKDAsIGluZCk7Ci0JCQlpbWFnZSA9IEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2UodHlwZUlkKTsKLQkJfQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCQotCXByb3RlY3RlZCBJbWFnZURlc2NyaXB0b3IgZ2V0TW9kdWxlSW1hZ2VEZXNjcmlwdG9yKFN0cmluZyB0eXBlSWQpIHsKLQkJaWYgKHR5cGVJZCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlJbWFnZURlc2NyaXB0b3IgaW1hZ2UgPSBJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcih0eXBlSWQpOwotCQlpbnQgaW5kID0gdHlwZUlkLmluZGV4T2YoIi4iKTsKLQkJd2hpbGUgKGltYWdlID09IG51bGwgJiYgaW5kID49IDApIHsKLQkJCXR5cGVJZCA9IHR5cGVJZC5zdWJzdHJpbmcoMCwgaW5kKTsKLQkJCWltYWdlID0gSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IodHlwZUlkKTsKLQkJfQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElMYWJlbFByb3ZpZGVyI2dldEltYWdlKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihPYmplY3QgZWxlbWVudCkgewotCQl0cnkgewotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUnVudGltZVR5cGUpIHsKLQkJCQlJUnVudGltZVR5cGUgcnVudGltZVR5cGUgPSAoSVJ1bnRpbWVUeXBlKSBlbGVtZW50OwotCQkJCXJldHVybiBJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihydW50aW1lVHlwZS5nZXRJZCgpKTsKLQkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElSdW50aW1lKSB7Ci0JCQkJSVJ1bnRpbWUgcnVudGltZSA9IChJUnVudGltZSkgZWxlbWVudDsKLQkJCQlyZXR1cm4gSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IocnVudGltZS5nZXRSdW50aW1lVHlwZSgpLmdldElkKCkpOwotCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSVNlcnZlclR5cGUpIHsKLQkJCQlJU2VydmVyVHlwZSBzZXJ2ZXJUeXBlID0gKElTZXJ2ZXJUeXBlKSBlbGVtZW50OwotCQkJCXJldHVybiBJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihzZXJ2ZXJUeXBlLmdldElkKCkpOwotCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSVNlcnZlcikgewotCQkJCUlTZXJ2ZXIgc2VydmVyID0gKElTZXJ2ZXIpIGVsZW1lbnQ7Ci0JCQkJcmV0dXJuIEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkuZ2V0SWQoKSk7Ci0JCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJTW9kdWxlKSB7Ci0JCQkJSU1vZHVsZSBtb2R1bGUgPSAoSU1vZHVsZSkgZWxlbWVudDsKLQkJCQlJTW9kdWxlVHlwZSBtdCA9IG1vZHVsZS5nZXRNb2R1bGVUeXBlKCk7Ci0JCQkJcmV0dXJuIGdldE1vZHVsZUltYWdlRGVzY3JpcHRvcihtdC5nZXRJZCgpKTsKLQkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElNb2R1bGVbXSkgewotCQkJCUlNb2R1bGVbXSBtb2R1bGVzID0gKElNb2R1bGVbXSkgZWxlbWVudDsKLQkJCQlJTW9kdWxlIG1vZHVsZSA9IG1vZHVsZXNbbW9kdWxlcy5sZW5ndGggLSAxXTsKLQkJCQlJTW9kdWxlVHlwZSBtdCA9IG1vZHVsZS5nZXRNb2R1bGVUeXBlKCk7Ci0JCQkJcmV0dXJuIGdldE1vZHVsZUltYWdlRGVzY3JpcHRvcihtdC5nZXRJZCgpKTsKLQkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElXb3JrYmVuY2hBZGFwdGVyKSB7Ci0JCQkJcmV0dXJuICgoSVdvcmtiZW5jaEFkYXB0ZXIpIGVsZW1lbnQpLmdldEltYWdlRGVzY3JpcHRvcihudWxsKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBnZXQgaW1hZ2UgZGVzY3JpcHRvciIsIGUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogQHNlZSBJTGFiZWxQcm92aWRlciNnZXRJbWFnZShPYmplY3QpCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCXRyeSB7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElSdW50aW1lVHlwZSkgewotCQkJCUlSdW50aW1lVHlwZSBydW50aW1lVHlwZSA9IChJUnVudGltZVR5cGUpIGVsZW1lbnQ7Ci0JCQkJcmV0dXJuIEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2UocnVudGltZVR5cGUuZ2V0SWQoKSk7Ci0JCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUnVudGltZSkgewotCQkJCUlSdW50aW1lIHJ1bnRpbWUgPSAoSVJ1bnRpbWUpIGVsZW1lbnQ7Ci0JCQkJcmV0dXJuIEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2UocnVudGltZS5nZXRSdW50aW1lVHlwZSgpLmdldElkKCkpOwotCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSVNlcnZlclR5cGUpIHsKLQkJCQlJU2VydmVyVHlwZSBzZXJ2ZXJUeXBlID0gKElTZXJ2ZXJUeXBlKSBlbGVtZW50OwotCQkJCXJldHVybiBJbWFnZVJlc291cmNlLmdldEltYWdlKHNlcnZlclR5cGUuZ2V0SWQoKSk7Ci0JCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJU2VydmVyKSB7Ci0JCQkJSVNlcnZlciBzZXJ2ZXIgPSAoSVNlcnZlcikgZWxlbWVudDsKLQkJCQlpZiAoc2VydmVyLmdldFNlcnZlclR5cGUoKSA9PSBudWxsKQotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkKLQkJCQlyZXR1cm4gSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZShzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpLmdldElkKCkpOwotCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSU1vZHVsZSkgewotCQkJCUlNb2R1bGUgbW9kdWxlID0gKElNb2R1bGUpIGVsZW1lbnQ7Ci0JCQkJSU1vZHVsZVR5cGUgbXQgPSBtb2R1bGUuZ2V0TW9kdWxlVHlwZSgpOwotCQkJCWlmIChtdCA9PSBudWxsKQotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkKLQkJCQlyZXR1cm4gZ2V0TW9kdWxlSW1hZ2UobXQuZ2V0SWQoKSk7Ci0JCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJTW9kdWxlW10pIHsKLQkJCQlJTW9kdWxlW10gbW9kdWxlcyA9IChJTW9kdWxlW10pIGVsZW1lbnQ7Ci0JCQkJSU1vZHVsZSBtb2R1bGUgPSBtb2R1bGVzW21vZHVsZXMubGVuZ3RoIC0gMV07Ci0JCQkJSU1vZHVsZVR5cGUgbXQgPSBtb2R1bGUuZ2V0TW9kdWxlVHlwZSgpOwotCQkJCWlmIChtdCA9PSBudWxsKQotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkKLQkJCQlyZXR1cm4gZ2V0TW9kdWxlSW1hZ2UobXQuZ2V0SWQoKSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3QgZ2V0IGltYWdlIGRlc2NyaXB0b3IiLCBlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcgcykgewotCQlpZiAocyA9PSBudWxsKQotCQkJcmV0dXJuICIiOwotCQkKLQkJcmV0dXJuIHM7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElMYWJlbFByb3ZpZGVyI2dldFRleHQoT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuICIiOwotCi0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVJ1bnRpbWUpIHsKLQkJCXJldHVybiBnZXRTdHJpbmcoKChJUnVudGltZSkgZWxlbWVudCkuZ2V0TmFtZSgpKTsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSVNlcnZlcikgewotCQkJcmV0dXJuIGdldFN0cmluZygoKElTZXJ2ZXIpIGVsZW1lbnQpLmdldE5hbWUoKSk7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElSdW50aW1lVHlwZSkgewotCQkJcmV0dXJuICgoSVJ1bnRpbWVUeXBlKSBlbGVtZW50KS5nZXROYW1lKCk7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElTZXJ2ZXJUeXBlKSB7Ci0JCQlyZXR1cm4gKChJU2VydmVyVHlwZSkgZWxlbWVudCkuZ2V0TmFtZSgpOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJQ2xpZW50KSB7Ci0JCQlyZXR1cm4gKChJQ2xpZW50KSBlbGVtZW50KS5nZXROYW1lKCk7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElNb2R1bGUpIHsKLQkJCXJldHVybiAoKElNb2R1bGUpIGVsZW1lbnQpLmdldE5hbWUoKTsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSU1vZHVsZVtdKSB7Ci0JCQlJTW9kdWxlW10gbW9kdWxlcyA9IChJTW9kdWxlW10pIGVsZW1lbnQ7Ci0JCQlyZXR1cm4gbW9kdWxlc1ttb2R1bGVzLmxlbmd0aCAtIDFdLmdldE5hbWUoKTsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSVdvcmtiZW5jaEFkYXB0ZXIpIHsKLQkJCXJldHVybiAoKElXb3JrYmVuY2hBZGFwdGVyKSBlbGVtZW50KS5nZXRMYWJlbChudWxsKTsKLQkJfQotCi0JCXJldHVybiAiIjsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSUJhc2VMYWJlbFByb3ZpZGVyI2FkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoKLQkgKiBAc2VlIElCYXNlTGFiZWxQcm92aWRlciNpc0xhYmVsUHJvcGVydHkoT2JqZWN0LCBTdHJpbmcpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogQHNlZSBJQmFzZUxhYmVsUHJvdmlkZXIjcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIElCYXNlTGFiZWxQcm92aWRlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL1NlcnZlckxhdW5jaFNob3J0Y3V0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9TZXJ2ZXJMYXVuY2hTaG9ydGN1dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTIyMjU2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL1NlcnZlckxhdW5jaFNob3J0Y3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5JTGF1bmNoU2hvcnRjdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmFjdGlvbnMuUnVuT25TZXJ2ZXJBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUZpbGVFZGl0b3JJbnB1dDsKLS8qKgotICoKLSAqLwotcHVibGljIGNsYXNzIFNlcnZlckxhdW5jaFNob3J0Y3V0IGltcGxlbWVudHMgSUxhdW5jaFNob3J0Y3V0IHsKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5JTGF1bmNoU2hvcnRjdXQjbGF1bmNoKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbiwgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBsYXVuY2goSVNlbGVjdGlvbiBzZWxlY3Rpb24sIGZpbmFsIFN0cmluZyBtb2RlKSB7Ci0JCVJ1bk9uU2VydmVyQWN0aW9uRGVsZWdhdGUgZGVsID0gbmV3IFJ1bk9uU2VydmVyQWN0aW9uRGVsZWdhdGUoKSB7Ci0JCQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhdW5jaE1vZGUoKSB7Ci0JCQkJcmV0dXJuIG1vZGU7Ci0JCQl9Ci0JCX07Ci0JCUlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigpIHsKLQkJCS8vIGR1bW15IGFjdGlvbgotCQl9OwotCQlkZWwuc2VsZWN0aW9uQ2hhbmdlZChhY3Rpb24sIHNlbGVjdGlvbik7Ci0JCWRlbC5ydW4oYWN0aW9uKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5JTGF1bmNoU2hvcnRjdXQjbGF1bmNoKG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0LCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIGxhdW5jaChJRWRpdG9yUGFydCBlZGl0b3IsIFN0cmluZyBtb2RlKSB7Ci0JCWlmIChlZGl0b3IgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCS8vIGNoZWNrIGlmIHRoZSBlZGl0b3IgaW5wdXQgaXRzZWxmIGNhbiBiZSBydW4uIE90aGVyd2lzZSwgY2hlY2sgaWYKLQkJLy8gdGhlIGVkaXRvciBoYXMgYSBmaWxlIGlucHV0IHRoYXQgY2FuIGJlIHJ1bgotCQlJRWRpdG9ySW5wdXQgaW5wdXQgPSBlZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKTsKLQotCQlpZiAoU2VydmVyUGx1Z2luLmhhc01vZHVsZUFydGlmYWN0KGlucHV0KSkgewotCQkJbGF1bmNoKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGlucHV0KSwgbW9kZSk7Ci0JCX0gZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0KSB7Ci0JCQlJRmlsZUVkaXRvcklucHV0IGZlaSA9IChJRmlsZUVkaXRvcklucHV0KSBpbnB1dDsKLQkJCUlGaWxlIGZpbGUgPSBmZWkuZ2V0RmlsZSgpOwotCQkJaWYgKFNlcnZlclBsdWdpbi5oYXNNb2R1bGVBcnRpZmFjdChmaWxlKSkKLQkJCQlsYXVuY2gobmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZmlsZSksIG1vZGUpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL1NlcnZlclByZWZlcmVuY2VQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9TZXJ2ZXJQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTc0OGJlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL1NlcnZlclByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi2gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuU2VydmVyUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU3Bpbm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuSVdvcmtiZW5jaEhlbHBTeXN0ZW07Ci0vKioKLSAqIFRoZSBwcmVmZXJlbmNlIHBhZ2UgdGhhdCBob2xkcyBzZXJ2ZXIgcHJvcGVydGllcy4KLSAqLwotcHVibGljIGNsYXNzIFNlcnZlclByZWZlcmVuY2VQYWdlIGV4dGVuZHMgUHJlZmVyZW5jZVBhZ2UgaW1wbGVtZW50cyBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UgewotCXByb3RlY3RlZCBCdXR0b24gcHVibGlzaEJlZm9yZVN0YXJ0OwotCXByb3RlY3RlZCBCdXR0b24gYXV0b1Jlc3RhcnQ7Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIHByb21wdElycmV2ZXJzaWJsZTsKLQkKLQlwcm90ZWN0ZWQgQnV0dG9uIHNob3dPbkFjdGl2aXR5OwotCQotCXByb3RlY3RlZCBieXRlIHNhdmVFZGl0b3JzOwotCQotCXByb3RlY3RlZCBCdXR0b24gc2F2ZU5ldmVyOwotCXByb3RlY3RlZCBCdXR0b24gc2F2ZVByb21wdDsKLQlwcm90ZWN0ZWQgQnV0dG9uIHNhdmVBdXRvOwotCXByb3RlY3RlZCBCdXR0b24gc3luY09uU3RhcnR1cDsKLQotCXByb3RlY3RlZCBTZXJ2ZXJQcmVmZXJlbmNlcyBwcmVmZXJlbmNlczsKLQlwcm90ZWN0ZWQgU2VydmVyVUlQcmVmZXJlbmNlcyB1aVByZWZlcmVuY2VzOwotCQotCXByb3RlY3RlZCBCdXR0b24gYXV0b1B1Ymxpc2hPbkFjdGlvbjsKLQlwcm90ZWN0ZWQgQnV0dG9uIGF1dG9QdWJsaXNoTG9jYWw7Ci0JcHJvdGVjdGVkIFNwaW5uZXIgYXV0b1B1Ymxpc2hMb2NhbFRpbWU7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBhdXRvUHVibGlzaFJlbW90ZTsKLQlwcm90ZWN0ZWQgU3Bpbm5lciBhdXRvUHVibGlzaFJlbW90ZVRpbWU7Ci0JCi0JcHJvdGVjdGVkIENvbWJvIG1hY2hpbmVTcGVlZENvbWJvOwotCi0JLyoqCi0JICogU2VydmVyUHJlZmVyZW5jZXNQYWdlIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFNlcnZlclByZWZlcmVuY2VQYWdlKCkgewotCQlzdXBlcigpOwotCQotCQlwcmVmZXJlbmNlcyA9IFNlcnZlclByZWZlcmVuY2VzLmdldEluc3RhbmNlKCk7Ci0JCXVpUHJlZmVyZW5jZXMgPSBTZXJ2ZXJVSVBsdWdpbi5nZXRQcmVmZXJlbmNlcygpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgdGhlIHByZWZlcmVuY2Ugb3B0aW9ucy4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlpbml0aWFsaXplRGlhbG9nVW5pdHMocGFyZW50KTsKLQkJSVdvcmtiZW5jaEhlbHBTeXN0ZW0gd2hzID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCk7Ci0JCXdocy5zZXRIZWxwKHBhcmVudCwgQ29udGV4dElkcy5QUkVGX0dFTkVSQUwpOwotCQkKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoNCk7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSBjb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMoNCk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQlzaG93T25BY3Rpdml0eSA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuQ0hFQ0spOwotCQlzaG93T25BY3Rpdml0eS5zZXRUZXh0KE1lc3NhZ2VzLnByZWZTaG93T25BY3Rpdml0eSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCXNob3dPbkFjdGl2aXR5LnNldExheW91dERhdGEoZGF0YSk7Ci0JCXNob3dPbkFjdGl2aXR5LnNldFNlbGVjdGlvbih1aVByZWZlcmVuY2VzLmdldFNob3dPbkFjdGl2aXR5KCkpOwotCQl3aHMuc2V0SGVscChzaG93T25BY3Rpdml0eSwgQ29udGV4dElkcy5QUkVGX0dFTkVSQUxfU0hPV19PTl9BQ1RJVklUWSk7Ci0JCQotCQlwdWJsaXNoQmVmb3JlU3RhcnQgPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULkNIRUNLKTsKLQkJcHVibGlzaEJlZm9yZVN0YXJ0LnNldFRleHQoTWVzc2FnZXMucHJlZkF1dG9QdWJsaXNoKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMzsKLQkJcHVibGlzaEJlZm9yZVN0YXJ0LnNldExheW91dERhdGEoZGF0YSk7Ci0JCXB1Ymxpc2hCZWZvcmVTdGFydC5zZXRTZWxlY3Rpb24ocHJlZmVyZW5jZXMuaXNBdXRvUHVibGlzaGluZygpKTsKLQkJd2hzLnNldEhlbHAocHVibGlzaEJlZm9yZVN0YXJ0LCBDb250ZXh0SWRzLlBSRUZfR0VORVJBTF9QVUJMSVNIX0JFRk9SRV9TVEFSVCk7Ci0JCQotCQlzeW5jT25TdGFydHVwID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0JCXN5bmNPblN0YXJ0dXAuc2V0VGV4dChNZXNzYWdlcy5wcmVmU3luY1N0YXJ0dXApOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlzeW5jT25TdGFydHVwLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXN5bmNPblN0YXJ0dXAuc2V0U2VsZWN0aW9uKHByZWZlcmVuY2VzLmlzU3luY09uU3RhcnR1cCgpKTsKLQkJd2hzLnNldEhlbHAoc3luY09uU3RhcnR1cCwgQ29udGV4dElkcy5QUkVGX0dFTkVSQUxfU1lOQ19TVEFSVFVQKTsKLQkJCi0JCWF1dG9QdWJsaXNoTG9jYWwgPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULkNIRUNLKTsKLQkJYXV0b1B1Ymxpc2hMb2NhbC5zZXRUZXh0KE1lc3NhZ2VzLnByZWZBdXRvUHVibGlzaExvY2FsKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMzsKLQkJYXV0b1B1Ymxpc2hMb2NhbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlhdXRvUHVibGlzaExvY2FsLnNldFNlbGVjdGlvbihwcmVmZXJlbmNlcy5nZXRBdXRvUHVibGlzaExvY2FsKCkpOwotCQl3aHMuc2V0SGVscChhdXRvUHVibGlzaExvY2FsLCBDb250ZXh0SWRzLlBSRUZfR0VORVJBTF9BVVRPUFVCTElTSF9MT0NBTCk7Ci0JCQotCQlmaW5hbCBMYWJlbCBhdXRvUHVibGlzaExvY2FsVGltZUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlhdXRvUHVibGlzaExvY2FsVGltZUxhYmVsLnNldFRleHQoTWVzc2FnZXMucHJlZkF1dG9QdWJsaXNoTG9jYWxUaW1lKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMjA7Ci0JCWF1dG9QdWJsaXNoTG9jYWxUaW1lTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJYXV0b1B1Ymxpc2hMb2NhbFRpbWVMYWJlbC5zZXRFbmFibGVkKGF1dG9QdWJsaXNoTG9jYWwuZ2V0U2VsZWN0aW9uKCkpOwotCQkKLQkJYXV0b1B1Ymxpc2hMb2NhbFRpbWUgPSBuZXcgU3Bpbm5lcihjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQlhdXRvUHVibGlzaExvY2FsVGltZS5zZXRNaW5pbXVtKDApOwotCQlhdXRvUHVibGlzaExvY2FsVGltZS5zZXRNYXhpbXVtKDEyMCk7Ci0JCWF1dG9QdWJsaXNoTG9jYWxUaW1lLnNldFNlbGVjdGlvbihwcmVmZXJlbmNlcy5nZXRBdXRvUHVibGlzaExvY2FsVGltZSgpKTsKLQkJYXV0b1B1Ymxpc2hMb2NhbFRpbWUuc2V0RW5hYmxlZChhdXRvUHVibGlzaExvY2FsLmdldFNlbGVjdGlvbigpKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORyk7Ci0JCWRhdGEud2lkdGhIaW50ID0gNjA7Ci0JCWF1dG9QdWJsaXNoTG9jYWxUaW1lLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXdocy5zZXRIZWxwKGF1dG9QdWJsaXNoTG9jYWxUaW1lLCBDb250ZXh0SWRzLlBSRUZfR0VORVJBTF9BVVRPUFVCTElTSF9MT0NBTCk7Ci0JCQotCQlhdXRvUHVibGlzaExvY2FsLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWF1dG9QdWJsaXNoTG9jYWxUaW1lTGFiZWwuc2V0RW5hYmxlZChhdXRvUHVibGlzaExvY2FsLmdldFNlbGVjdGlvbigpKTsKLQkJCQlhdXRvUHVibGlzaExvY2FsVGltZS5zZXRFbmFibGVkKGF1dG9QdWJsaXNoTG9jYWwuZ2V0U2VsZWN0aW9uKCkpOwotCQkJfQotCQl9KTsKLQkJCi0JCWF1dG9QdWJsaXNoUmVtb3RlID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0JCWF1dG9QdWJsaXNoUmVtb3RlLnNldFRleHQoTWVzc2FnZXMucHJlZkF1dG9QdWJsaXNoUmVtb3RlKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMzsKLQkJYXV0b1B1Ymxpc2hSZW1vdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJYXV0b1B1Ymxpc2hSZW1vdGUuc2V0U2VsZWN0aW9uKHByZWZlcmVuY2VzLmdldEF1dG9QdWJsaXNoUmVtb3RlKCkpOwotCQl3aHMuc2V0SGVscChhdXRvUHVibGlzaFJlbW90ZSwgQ29udGV4dElkcy5QUkVGX0dFTkVSQUxfQVVUT1BVQkxJU0hfUkVNT1RFKTsKLQkJCi0JCWZpbmFsIExhYmVsIGF1dG9QdWJsaXNoUmVtb3RlVGltZUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlhdXRvUHVibGlzaFJlbW90ZVRpbWVMYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLnByZWZBdXRvUHVibGlzaFJlbW90ZVRpbWUpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlkYXRhLmhvcml6b250YWxJbmRlbnQgPSAyMDsKLQkJYXV0b1B1Ymxpc2hSZW1vdGVUaW1lTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJYXV0b1B1Ymxpc2hSZW1vdGVUaW1lTGFiZWwuc2V0RW5hYmxlZChhdXRvUHVibGlzaFJlbW90ZS5nZXRTZWxlY3Rpb24oKSk7Ci0JCQotCQlhdXRvUHVibGlzaFJlbW90ZVRpbWUgPSBuZXcgU3Bpbm5lcihjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQlhdXRvUHVibGlzaFJlbW90ZVRpbWUuc2V0TWluaW11bSgwKTsKLQkJYXV0b1B1Ymxpc2hSZW1vdGVUaW1lLnNldE1heGltdW0oMTIwKTsKLQkJYXV0b1B1Ymxpc2hSZW1vdGVUaW1lLnNldFNlbGVjdGlvbihwcmVmZXJlbmNlcy5nZXRBdXRvUHVibGlzaFJlbW90ZVRpbWUoKSk7Ci0JCWF1dG9QdWJsaXNoUmVtb3RlVGltZS5zZXRFbmFibGVkKGF1dG9QdWJsaXNoUmVtb3RlLmdldFNlbGVjdGlvbigpKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORyk7Ci0JCWRhdGEud2lkdGhIaW50ID0gNjA7Ci0JCWF1dG9QdWJsaXNoUmVtb3RlVGltZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQl3aHMuc2V0SGVscChhdXRvUHVibGlzaFJlbW90ZVRpbWUsIENvbnRleHRJZHMuUFJFRl9HRU5FUkFMX0FVVE9QVUJMSVNIX1JFTU9URSk7Ci0JCQotCQlhdXRvUHVibGlzaFJlbW90ZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlhdXRvUHVibGlzaFJlbW90ZVRpbWVMYWJlbC5zZXRFbmFibGVkKGF1dG9QdWJsaXNoUmVtb3RlLmdldFNlbGVjdGlvbigpKTsKLQkJCQlhdXRvUHVibGlzaFJlbW90ZVRpbWUuc2V0RW5hYmxlZChhdXRvUHVibGlzaFJlbW90ZS5nZXRTZWxlY3Rpb24oKSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJYXV0b1Jlc3RhcnQgPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULkNIRUNLKTsKLQkJYXV0b1Jlc3RhcnQuc2V0VGV4dChNZXNzYWdlcy5wcmVmQXV0b1Jlc3RhcnQpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlhdXRvUmVzdGFydC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlhdXRvUmVzdGFydC5zZXRTZWxlY3Rpb24ocHJlZmVyZW5jZXMuaXNBdXRvUmVzdGFydGluZygpKTsKLQkJd2hzLnNldEhlbHAoYXV0b1Jlc3RhcnQsIENvbnRleHRJZHMuUFJFRl9HRU5FUkFMX0FVVE9fUkVTVEFSVCk7Ci0JCQotCQlwcm9tcHRJcnJldmVyc2libGUgPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULkNIRUNLKTsKLQkJcHJvbXB0SXJyZXZlcnNpYmxlLnNldFRleHQoTWVzc2FnZXMucHJlZlByb21wdElycmV2ZXJzaWJsZSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCXByb21wdElycmV2ZXJzaWJsZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlwcm9tcHRJcnJldmVyc2libGUuc2V0U2VsZWN0aW9uKHVpUHJlZmVyZW5jZXMuZ2V0UHJvbXB0QmVmb3JlSXJyZXZlcnNpYmxlQ2hhbmdlKCkpOwotCQl3aHMuc2V0SGVscChwcm9tcHRJcnJldmVyc2libGUsIENvbnRleHRJZHMuUFJFRl9HRU5FUkFMX1BST01QVF9JUlJFVkVSU0lCTEUpOwotCQkKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQkvLyBzYXZlIGVkaXRvcnMgZ3JvdXAKLQkJR3JvdXAgc2F2ZUVkaXRvckdyb3VwID0gbmV3IEdyb3VwKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlzYXZlRWRpdG9yR3JvdXAuc2V0VGV4dChNZXNzYWdlcy5wcmVmU2F2ZUVkaXRvcnNHcm91cCk7Ci0JCQotCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0JCXNhdmVFZGl0b3JHcm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMzsKLQkJc2F2ZUVkaXRvckdyb3VwLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQlzYXZlTmV2ZXIgPSBuZXcgQnV0dG9uKHNhdmVFZGl0b3JHcm91cCwgU1dULlJBRElPKTsKLQkJc2F2ZU5ldmVyLnNldFRleHQoTWVzc2FnZXMucHJlZlNhdmVFZGl0b3JzTmV2ZXIpOwotCQlzYXZlTmV2ZXIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXNhdmVFZGl0b3JzID0gU2VydmVyVUlQcmVmZXJlbmNlcy5TQVZFX0VESVRPUlNfTkVWRVI7Ci0JCQl9Ci0JCX0pOwotCQl3aHMuc2V0SGVscChzYXZlTmV2ZXIsIENvbnRleHRJZHMuUFJFRl9HRU5FUkFMX1NBVkVfRURJVE9SUyk7Ci0JCQotCQlzYXZlUHJvbXB0ID0gbmV3IEJ1dHRvbihzYXZlRWRpdG9yR3JvdXAsIFNXVC5SQURJTyk7Ci0JCXNhdmVQcm9tcHQuc2V0VGV4dChNZXNzYWdlcy5wcmVmU2F2ZUVkaXRvcnNQcm9tcHQpOwotCQlzYXZlUHJvbXB0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlzYXZlRWRpdG9ycyA9IFNlcnZlclVJUHJlZmVyZW5jZXMuU0FWRV9FRElUT1JTX1BST01QVDsKLQkJCX0KLQkJfSk7Ci0JCXdocy5zZXRIZWxwKHNhdmVQcm9tcHQsIENvbnRleHRJZHMuUFJFRl9HRU5FUkFMX1NBVkVfRURJVE9SUyk7Ci0JCQotCQlzYXZlQXV0byA9IG5ldyBCdXR0b24oc2F2ZUVkaXRvckdyb3VwLCBTV1QuUkFESU8pOwotCQlzYXZlQXV0by5zZXRUZXh0KE1lc3NhZ2VzLnByZWZTYXZlRWRpdG9yc0F1dG9zYXZlKTsKLQkJc2F2ZUF1dG8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXNhdmVFZGl0b3JzID0gU2VydmVyVUlQcmVmZXJlbmNlcy5TQVZFX0VESVRPUlNfQVVUTzsKLQkJCX0KLQkJfSk7Ci0JCXdocy5zZXRIZWxwKHNhdmVBdXRvLCBDb250ZXh0SWRzLlBSRUZfR0VORVJBTF9TQVZFX0VESVRPUlMpOwotCQkKLQkJbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQlsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChNZXNzYWdlcy5wcmVmTWFjaGluZVNwZWVkKTsKLQkJCi0JCW1hY2hpbmVTcGVlZENvbWJvID0gbmV3IENvbWJvKGNvbXBvc2l0ZSwgU1dULlJFQURfT05MWSk7Ci0JCVN0cmluZ1tdIGl0ZW1zID0gbmV3IFN0cmluZ1tdIHsKLQkJCU1lc3NhZ2VzLnByZWZNYWNoaW5lU3BlZWRWZXJ5U2xvdywKLQkJCU1lc3NhZ2VzLnByZWZNYWNoaW5lU3BlZWRTbG93LAotCQkJTWVzc2FnZXMucHJlZk1hY2hpbmVTcGVlZEF2ZXJhZ2UsCi0JCQlNZXNzYWdlcy5wcmVmTWFjaGluZVNwZWVkRmFzdCwKLQkJCU1lc3NhZ2VzLnByZWZNYWNoaW5lU3BlZWRWZXJ5RmFzdAotCQl9OwotCQltYWNoaW5lU3BlZWRDb21iby5zZXRJdGVtcyhpdGVtcyk7Ci0JCW1hY2hpbmVTcGVlZENvbWJvLnNlbGVjdCgocHJlZmVyZW5jZXMuZ2V0TWFjaGluZVNwZWVkKCkgLSAxKSAvIDIpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCW1hY2hpbmVTcGVlZENvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXdocy5zZXRIZWxwKG1hY2hpbmVTcGVlZENvbWJvLCBDb250ZXh0SWRzLlBSRUZfR0VORVJBTF9USU1FT1VUX0RFTEFZKTsKLQkJCi0JCXNldFNhdmVFZGl0b3JTdGF0dXModWlQcmVmZXJlbmNlcy5nZXRTYXZlRWRpdG9ycygpKTsKLQkJCi0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQoY29tcG9zaXRlKTsKLQkKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0U2F2ZUVkaXRvclN0YXR1cyhieXRlIHN0YXR1cykgewotCQlzYXZlRWRpdG9ycyA9IHN0YXR1czsKLQkJc2F2ZU5ldmVyLnNldFNlbGVjdGlvbihzYXZlRWRpdG9ycyA9PSBTZXJ2ZXJVSVByZWZlcmVuY2VzLlNBVkVfRURJVE9SU19ORVZFUik7Ci0JCXNhdmVQcm9tcHQuc2V0U2VsZWN0aW9uKHNhdmVFZGl0b3JzID09IFNlcnZlclVJUHJlZmVyZW5jZXMuU0FWRV9FRElUT1JTX1BST01QVCk7Ci0JCXNhdmVBdXRvLnNldFNlbGVjdGlvbihzYXZlRWRpdG9ycyA9PSBTZXJ2ZXJVSVByZWZlcmVuY2VzLlNBVkVfRURJVE9SU19BVVRPKTsgCi0JfQotCQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoaXMgcHJlZmVyZW5jZSBwYWdlIHVzaW5nIHRoZSBwYXNzZWQgd29ya2JlbmNoLgotCSAqCi0JICogQHBhcmFtIHdvcmtiZW5jaCB0aGUgY3VycmVudCB3b3JrYmVuY2gKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0JCi0JLyoqCi0JICogUGVyZm9ybXMgc3BlY2lhbCBwcm9jZXNzaW5nIHdoZW4gdGhpcyBwYWdlJ3MgRGVmYXVsdHMgYnV0dG9uIGhhcyBiZWVuIHByZXNzZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQlhdXRvUmVzdGFydC5zZXRTZWxlY3Rpb24ocHJlZmVyZW5jZXMuaXNEZWZhdWx0QXV0b1Jlc3RhcnRpbmcoKSk7Ci0JCXB1Ymxpc2hCZWZvcmVTdGFydC5zZXRTZWxlY3Rpb24ocHJlZmVyZW5jZXMuaXNEZWZhdWx0QXV0b1B1Ymxpc2hpbmcoKSk7Ci0JCXByb21wdElycmV2ZXJzaWJsZS5zZXRTZWxlY3Rpb24odWlQcmVmZXJlbmNlcy5nZXREZWZhdWx0UHJvbXB0QmVmb3JlSXJyZXZlcnNpYmxlQ2hhbmdlKCkpOwotCQlzaG93T25BY3Rpdml0eS5zZXRTZWxlY3Rpb24odWlQcmVmZXJlbmNlcy5nZXREZWZhdWx0U2hvd09uQWN0aXZpdHkoKSk7Ci0JCQotCQlzeW5jT25TdGFydHVwLnNldFNlbGVjdGlvbihwcmVmZXJlbmNlcy5nZXREZWZhdWx0U3luY09uU3RhcnR1cCgpKTsKLQkJYXV0b1B1Ymxpc2hMb2NhbC5zZXRTZWxlY3Rpb24ocHJlZmVyZW5jZXMuZ2V0RGVmYXVsdEF1dG9QdWJsaXNoTG9jYWwoKSk7Ci0JCWF1dG9QdWJsaXNoTG9jYWxUaW1lLnNldFNlbGVjdGlvbihwcmVmZXJlbmNlcy5nZXREZWZhdWx0QXV0b1B1Ymxpc2hMb2NhbFRpbWUoKSk7Ci0JCWF1dG9QdWJsaXNoUmVtb3RlLnNldFNlbGVjdGlvbihwcmVmZXJlbmNlcy5nZXREZWZhdWx0QXV0b1B1Ymxpc2hSZW1vdGUoKSk7Ci0JCWF1dG9QdWJsaXNoUmVtb3RlVGltZS5zZXRTZWxlY3Rpb24ocHJlZmVyZW5jZXMuZ2V0RGVmYXVsdEF1dG9QdWJsaXNoUmVtb3RlVGltZSgpKTsKLQkJCi0JCW1hY2hpbmVTcGVlZENvbWJvLnNlbGVjdCgocHJlZmVyZW5jZXMuZ2V0RGVmYXVsdE1hY2hpbmVTcGVlZCgpIC0gMSkgLyAyKTsKLQkJCi0JCXNldFNhdmVFZGl0b3JTdGF0dXModWlQcmVmZXJlbmNlcy5nZXREZWZhdWx0U2F2ZUVkaXRvcnMoKSk7Ci0JCQotCQlzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VQYWdlI3BlcmZvcm1PaygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotCQlwcmVmZXJlbmNlcy5zZXRBdXRvUHVibGlzaGluZyhwdWJsaXNoQmVmb3JlU3RhcnQuZ2V0U2VsZWN0aW9uKCkpOwotCQlwcmVmZXJlbmNlcy5zZXRBdXRvUmVzdGFydGluZyhhdXRvUmVzdGFydC5nZXRTZWxlY3Rpb24oKSk7Ci0JCXByZWZlcmVuY2VzLnNldFN5bmNPblN0YXJ0dXAoc3luY09uU3RhcnR1cC5nZXRTZWxlY3Rpb24oKSk7Ci0JCXVpUHJlZmVyZW5jZXMuc2V0U2F2ZUVkaXRvcnMoc2F2ZUVkaXRvcnMpOwotCQl1aVByZWZlcmVuY2VzLnNldFByb21wdEJlZm9yZUlycmV2ZXJzaWJsZUNoYW5nZShwcm9tcHRJcnJldmVyc2libGUuZ2V0U2VsZWN0aW9uKCkpOwotCQl1aVByZWZlcmVuY2VzLnNldFNob3dPbkFjdGl2aXR5KHNob3dPbkFjdGl2aXR5LmdldFNlbGVjdGlvbigpKTsKLQkJCi0JCXByZWZlcmVuY2VzLnNldEF1dG9QdWJsaXNoTG9jYWwoYXV0b1B1Ymxpc2hMb2NhbC5nZXRTZWxlY3Rpb24oKSk7Ci0JCXByZWZlcmVuY2VzLnNldEF1dG9QdWJsaXNoTG9jYWxUaW1lKGF1dG9QdWJsaXNoTG9jYWxUaW1lLmdldFNlbGVjdGlvbigpKTsKLQkJcHJlZmVyZW5jZXMuc2V0QXV0b1B1Ymxpc2hSZW1vdGUoYXV0b1B1Ymxpc2hSZW1vdGUuZ2V0U2VsZWN0aW9uKCkpOwotCQlwcmVmZXJlbmNlcy5zZXRBdXRvUHVibGlzaFJlbW90ZVRpbWUoYXV0b1B1Ymxpc2hSZW1vdGVUaW1lLmdldFNlbGVjdGlvbigpKTsKLQkJCi0JCXByZWZlcmVuY2VzLnNldE1hY2hpbmVTcGVlZChtYWNoaW5lU3BlZWRDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpICogMiArIDEpOwotCQotCQkvLyBhdXRvIHJlc3RhcnQgYW55IHNlcnZlcnMgdGhhdCBhcmUgcmVhZHkgZm9yIHJlc3RhcnQKLQkJaWYgKGF1dG9SZXN0YXJ0LmdldFNlbGVjdGlvbigpKQotCQkJYXV0b1Jlc3RhcnRBbGwoKTsKLQkKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQXV0b21hdGljYWxseSByZXN0YXJ0IGFueSBzZXJ2ZXJzIHRoYXQgcmVxdWlyZSBpdC4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgYXV0b1Jlc3RhcnRBbGwoKSB7Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIkF1dG8gcmVzdGFydGluZyBhbGwgZGlydHkgc2VydmVycyIpOwotCQotCQlJU2VydmVyW10gc2VydmVycyA9IFNlcnZlckNvcmUuZ2V0U2VydmVycygpOwotCQlpZiAoc2VydmVycyAhPSBudWxsKSB7Ci0JCQlpbnQgc2l6ZSA9IHNlcnZlcnMubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlJU2VydmVyIHNlcnZlciA9IHNlcnZlcnNbaV07Ci0JCQkJaWYgKHNlcnZlci5nZXRTZXJ2ZXJSZXN0YXJ0U3RhdGUoKSkgewotCQkJCQlTdHJpbmcgbW9kZSA9IHNlcnZlci5nZXRNb2RlKCk7Ci0JCQkJCWlmIChzZXJ2ZXIuY2FuUmVzdGFydChtb2RlKS5pc09LKCkpCi0JCQkJCQl0cnkgewotCQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIkF0dGVtcHRpbmcgdG8gYXV0byByZXN0YXJ0ICIgKyBzZXJ2ZXIuZ2V0TmFtZSgpKTsKLQkJCQkJCQlzZXJ2ZXIucmVzdGFydChtb2RlLCAoSVByb2dyZXNzTW9uaXRvciludWxsKTsKLQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgcmVzdGFydGluZzogIiArIHNlcnZlciwgZSk7Ci0JCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL1NlcnZlclByb3BlcnR5VGVzdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9TZXJ2ZXJQcm9wZXJ0eVRlc3Rlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTI1ZTliLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL1NlcnZlclByb3BlcnR5VGVzdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLlByb3BlcnR5VGVzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlclBsdWdpbjsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJQcm9wZXJ0eVRlc3RlciBleHRlbmRzIFByb3BlcnR5VGVzdGVyIHsKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLklQcm9wZXJ0eVRlc3RlciN0ZXN0KGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3RbXSwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB0ZXN0KE9iamVjdCByZWNlaXZlciwgU3RyaW5nIHByb3BlcnR5LCBPYmplY3RbXSBhcmdzLCBPYmplY3QgZXhwZWN0ZWRWYWx1ZSkgewotCQlpZiAoZXhwZWN0ZWRWYWx1ZSBpbnN0YW5jZW9mIFN0cmluZykKLQkJCXJldHVybiBjaGVja1Byb3BlcnR5KHJlY2VpdmVyLCBwcm9wZXJ0eSwgKFN0cmluZykgZXhwZWN0ZWRWYWx1ZSk7Ci0JCXJldHVybiBjaGVja1Byb3BlcnR5KHJlY2VpdmVyLCBwcm9wZXJ0eSwgbnVsbCk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGNoZWNrUHJvcGVydHkoT2JqZWN0IHRhcmdldCwgU3RyaW5nIHByb3BlcnR5LCBTdHJpbmcgdmFsdWUpIHsKLQkJaWYgKCJpc1J1bm5hYmxlIi5lcXVhbHMocHJvcGVydHkpKSB7Ci0JCQkvLyBjaGVjayBpZiBwcm9qZWN0IGhhcyBhIG1vZHVsZSBhc3NvY2lhdGVkIHdpdGggaXQKLQkJCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBJUHJvamVjdCkKLQkJCQlyZXR1cm4gU2VydmVyVXRpbC5nZXRNb2R1bGUoKElQcm9qZWN0KSB0YXJnZXQpICE9IG51bGw7Ci0JCQkKLQkJCS8vIGNoZWNrIGZvciBydW5uYWJsZSBvYmplY3QKLQkJCWJvb2xlYW4gYiA9IFNlcnZlclBsdWdpbi5oYXNNb2R1bGVBcnRpZmFjdCh0YXJnZXQpOwotCQkJaWYgKGIpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQkKLQkJCS8qaWYgKCEocmVjZWl2ZXIgaW5zdGFuY2VvZiBJRWRpdG9yUGFydCkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJCi0JCQkvLwkgY2hlY2sgaWYgdGhlIGVkaXRvciBpbnB1dCBpdHNlbGYgY2FuIGJlIHJ1bi4gT3RoZXJ3aXNlLCBjaGVjayBpZgotCQkJLy8gdGhlIGVkaXRvciBoYXMgYSBmaWxlIGlucHV0IHRoYXQgY2FuIGJlIHJ1bgotCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gKElFZGl0b3JQYXJ0KSByZWNlaXZlcjsKLQkJCUlFZGl0b3JJbnB1dCBpbnB1dCA9IGVkaXRvci5nZXRFZGl0b3JJbnB1dCgpOwotCQkJCi0JCQliID0gU2VydmVyUGx1Z2luLmhhc01vZHVsZUFydGlmYWN0KGlucHV0KTsKLQkJCWlmIChiKQotCQkJCXJldHVybiB0cnVlOyovCi0JCi0JCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dCkgewotCQkJCUlGaWxlRWRpdG9ySW5wdXQgZmVpID0gKElGaWxlRWRpdG9ySW5wdXQpIHRhcmdldDsKLQkJCQlJRmlsZSBmaWxlID0gZmVpLmdldEZpbGUoKTsKLQkJCQliID0gU2VydmVyUGx1Z2luLmhhc01vZHVsZUFydGlmYWN0KGZpbGUpOwotCQkJCWlmIChiKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfSBlbHNlIGlmICgic2VydmVyVHlwZSIuZXF1YWxzKHByb3BlcnR5KSkgewotCQkJaWYgKCEodGFyZ2V0IGluc3RhbmNlb2YgSVNlcnZlcikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJCi0JCQlJU2VydmVyIHNlcnZlciA9IChJU2VydmVyKSB0YXJnZXQ7Ci0JCQkKLQkJCVN0cmluZ1tdIHR5cGVJZHMgPSBTZXJ2ZXJQbHVnaW4udG9rZW5pemUodmFsdWUsICIsIik7Ci0JCQlyZXR1cm4gc3VwcG9ydHNTZXJ2ZXJUeXBlKHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkuZ2V0SWQoKSwgdHlwZUlkcyk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIHNlcnZlciB0eXBlIChnaXZlbiBieSB0aGUgaWQpIGNhbiB1c2UgdGhpcyBhY3Rpb24uCi0JICoKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gc3VwcG9ydHNTZXJ2ZXJUeXBlKFN0cmluZyBpZCwgU3RyaW5nW10gdHlwZUlkcykgewotCQlpZiAoaWQgPT0gbnVsbCB8fCBpZC5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWlmICh0eXBlSWRzID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQlpbnQgc2l6ZSA9IHR5cGVJZHMubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJaWYgKHR5cGVJZHNbaV0uZW5kc1dpdGgoIioiKSkgewotCQkJCWlmIChpZC5sZW5ndGgoKSA+PSB0eXBlSWRzW2ldLmxlbmd0aCgpICYmIGlkLnN0YXJ0c1dpdGgodHlwZUlkc1tpXS5zdWJzdHJpbmcoMCwgdHlwZUlkc1tpXS5sZW5ndGgoKSAtIDEpKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9IGVsc2UgaWYgKGlkLmVxdWFscyh0eXBlSWRzW2ldKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL1NlcnZlclVJUGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9TZXJ2ZXJVSVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTc2MDU4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL1NlcnZlclVJUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi2gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudXRpbC5QdWJsaXNoQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLlNlcnZlclVJVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmFjdGlvbnMuUnVuT25TZXJ2ZXJBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmVkaXRvci5JU2VydmVyRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5lZGl0b3IuU2VydmVyRWRpdG9yQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmVkaXRvci5TZXJ2ZXJFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXdlcnMuSW5pdGlhbFNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLkNsb3NhYmxlV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLlRhc2tXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQuV2l6YXJkVGFza1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQuZnJhZ21lbnQuTmV3UnVudGltZVdpemFyZEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkud2l6YXJkLldpemFyZEZyYWdtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJvZ3Jlc3MuSVdvcmtiZW5jaFNpdGVQcm9ncmVzc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0vKioKLSAqIFRoZSBzZXJ2ZXIgVUkgcGx1Z2luIGNsYXNzLgotICovCi1wdWJsaWMgY2xhc3MgU2VydmVyVUlQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWSUVXX0lEID0gIm9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuU2VydmVyc1ZpZXciOwotCi0JLy8gc2VydmVyIFVJIHBsdWdpbiBpZAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpIjsKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fU0VSVkVSX0lNQUdFUyA9ICJzZXJ2ZXJJbWFnZXMiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fV0laQVJEX0ZSQUdNRU5UUyA9ICJ3aXphcmRGcmFnbWVudHMiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9FRElUT1JfUEFHRVMgPSAiZWRpdG9yUGFnZXMiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9FRElUT1JfUEFHRV9TRUNUSU9OUyA9ICJlZGl0b3JQYWdlU2VjdGlvbnMiOwotCi0JLy9wdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgU1RBUlQgPSAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBTVE9QID0gMTsKLQkvL3B1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBSRVNUQVJUID0gMjsKLQotCS8vIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzCi0JcHJpdmF0ZSBzdGF0aWMgU2VydmVyVUlQbHVnaW4gc2luZ2xldG9uOwotCi0JcHJvdGVjdGVkIE1hcCBpbWFnZURlc2NyaXB0b3JzID0gbmV3IEhhc2hNYXAoKTsKLQotCS8vIGNhY2hlZCBjb3B5IG9mIGFsbCBydW50aW1lIHdpemFyZHMKLQlwcml2YXRlIHN0YXRpYyBNYXAgd2l6YXJkRnJhZ21lbnRzOwotCi0JLy8gY2FjaGVkIGluaXRpYWwgc2VsZWN0aW9uIHByb3ZpZGVyCi0JcHJpdmF0ZSBzdGF0aWMgSW5pdGlhbFNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyOwotCi0JcHJpdmF0ZSBzdGF0aWMgSVJlZ2lzdHJ5Q2hhbmdlTGlzdGVuZXIgcmVnaXN0cnlMaXN0ZW5lcjsKLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFJlZ2lzdHJ5Q2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBJUmVnaXN0cnlDaGFuZ2VMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIHJlZ2lzdHJ5Q2hhbmdlZChJUmVnaXN0cnlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJSUV4dGVuc2lvbkRlbHRhW10gZGVsdGFzID0gZXZlbnQuZ2V0RXh0ZW5zaW9uRGVsdGFzKFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCwgRVhURU5TSU9OX1dJWkFSRF9GUkFHTUVOVFMpOwotCQkJaWYgKGRlbHRhcyAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZWx0YXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaGFuZGxlV2l6YXJkRnJhZ21lbnREZWx0YShkZWx0YXNbaV0pOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJZGVsdGFzID0gZXZlbnQuZ2V0RXh0ZW5zaW9uRGVsdGFzKFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCwgRVhURU5TSU9OX1NFUlZFUl9JTUFHRVMpOwotCQkJaWYgKGRlbHRhcyAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZWx0YXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJSW1hZ2VSZXNvdXJjZS5oYW5kbGVTZXJ2ZXJJbWFnZURlbHRhKGRlbHRhc1tpXSk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlkZWx0YXMgPSBldmVudC5nZXRFeHRlbnNpb25EZWx0YXMoU2VydmVyVUlQbHVnaW4uUExVR0lOX0lELCBFWFRFTlNJT05fRURJVE9SX1BBR0VTKTsKLQkJCWlmIChkZWx0YXMgIT0gbnVsbCkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGVsdGFzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCVNlcnZlckVkaXRvckNvcmUuaGFuZGxlRWRpdG9yUGFnZUZhY3Rvcmllc0RlbHRhKGRlbHRhc1tpXSk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlkZWx0YXMgPSBldmVudC5nZXRFeHRlbnNpb25EZWx0YXMoU2VydmVyVUlQbHVnaW4uUExVR0lOX0lELCBFWFRFTlNJT05fRURJVE9SX1BBR0VfU0VDVElPTlMpOwotCQkJaWYgKGRlbHRhcyAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZWx0YXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJU2VydmVyRWRpdG9yQ29yZS5oYW5kbGVFZGl0b3JQYWdlU2VjdGlvbkZhY3Rvcmllc0RlbHRhKGRlbHRhc1tpXSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0Jc3RhdGljIGNsYXNzIFdpemFyZEZyYWdtZW50RGF0YSB7Ci0JCVN0cmluZyBpZDsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNlOwotCQlXaXphcmRGcmFnbWVudCBmcmFnbWVudDsKLQkJCi0JCXB1YmxpYyBXaXphcmRGcmFnbWVudERhdGEoU3RyaW5nIGlkLCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgY2UpIHsKLQkJCXRoaXMuaWQgPSBpZDsKLQkJCXRoaXMuY2UgPSBjZTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgTGlzdCB0ZXJtaW5hdGlvbldhdGNoZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcm90ZWN0ZWQgSVNlcnZlckxpZmVjeWNsZUxpc3RlbmVyIHNlcnZlckxpZmVjeWNsZUxpc3RlbmVyID0gbmV3IElTZXJ2ZXJMaWZlY3ljbGVMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgc2VydmVyQWRkZWQoSVNlcnZlciBzZXJ2ZXIpIHsKLQkJCXNlcnZlci5hZGRTZXJ2ZXJMaXN0ZW5lcihzZXJ2ZXJMaXN0ZW5lcik7Ci0JCQkoKFNlcnZlcikgc2VydmVyKS5hZGRQdWJsaXNoTGlzdGVuZXIocHVibGlzaExpc3RlbmVyKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNlcnZlckNoYW5nZWQoSVNlcnZlciBzZXJ2ZXIpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2VydmVyUmVtb3ZlZChJU2VydmVyIHNlcnZlcikgewotCQkJc2VydmVyLnJlbW92ZVNlcnZlckxpc3RlbmVyKHNlcnZlckxpc3RlbmVyKTsKLQkJCSgoU2VydmVyKSBzZXJ2ZXIpLnJlbW92ZVB1Ymxpc2hMaXN0ZW5lcihwdWJsaXNoTGlzdGVuZXIpOwotCQl9Ci0JfTsKLQotCXByb3RlY3RlZCBzdGF0aWMgSVNlcnZlckxpc3RlbmVyIHNlcnZlckxpc3RlbmVyID0gbmV3IElTZXJ2ZXJMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgc2VydmVyQ2hhbmdlZChTZXJ2ZXJFdmVudCBldmVudCkgewotCQkJaW50IGV2ZW50S2luZCA9IGV2ZW50LmdldEtpbmQoKTsKLQkJCS8vIGlmIChldmVudEtpbmQgPT0gKFNlcnZlckV2ZW50LlNFUlZFUl9DSEFOR0UgfCBTZXJ2ZXJFdmVudC5TVEFURV9DSEFOR0UpKSB7Ci0JCQlpZiAoKGV2ZW50S2luZCAmIFNlcnZlckV2ZW50LlNUQVRFX0NIQU5HRSkgIT0gMCkgewotCQkJCXNob3dTZXJ2ZXJzVmlldyh0cnVlKTsKLQkJCX0gZWxzZSBpZiAoKGV2ZW50S2luZCAmIFNlcnZlckV2ZW50LlNFUlZFUl9DSEFOR0UpICE9IDApIHsKLQkJCQlzaG93U2VydmVyc1ZpZXcoZmFsc2UpOwotCQkJfQotCQl9Ci0JfTsKLQotCXByb3RlY3RlZCBzdGF0aWMgSVB1Ymxpc2hMaXN0ZW5lciBwdWJsaXNoTGlzdGVuZXIgPSBuZXcgUHVibGlzaEFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHB1Ymxpc2hTdGFydGVkKElTZXJ2ZXIgc2VydmVyKSB7Ci0JCQlzaG93U2VydmVyc1ZpZXcoZmFsc2UpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcHVibGlzaEZpbmlzaGVkKElTZXJ2ZXIgc2VydmVyLCBJU3RhdHVzIHN0YXR1cykgewotCQkJc2hvd1NlcnZlcnNWaWV3KGZhbHNlKTsKLQkJfQotCX07Ci0KLQkvKioKLQkgKiBDcmVhdGUgdGhlIFNlcnZlclVJUGx1Z2luLgotCSAqLwotCXB1YmxpYyBTZXJ2ZXJVSVBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJc2luZ2xldG9uID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhpcyBwbHVnaW4uCi0JICoKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwucGx1Z2luLlNlcnZlclVJUGx1Z2luCi0JICovCi0JcHVibGljIHN0YXRpYyBTZXJ2ZXJVSVBsdWdpbiBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIHNpbmdsZXRvbjsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGxvZ2dpbmcuCi0JICoKLQkgKiBAcGFyYW0gc3RhdHVzIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhJU3RhdHVzIHN0YXR1cykgewotCQlnZXRJbnN0YW5jZSgpLmdldExvZygpLmxvZyhzdGF0dXMpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIFVJIHByZWZlcmVuY2VzLgotCSAqIAotCSAqIEByZXR1cm4gU2VydmVyVUlQcmVmZXJlbmNlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU2VydmVyVUlQcmVmZXJlbmNlcyBnZXRQcmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIG5ldyBTZXJ2ZXJVSVByZWZlcmVuY2VzKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBQbHVnaW4jc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVHJhY2UudHJhY2UoVHJhY2UuQ09ORklHLCAiLS0tLS0+LS0tLS0gU2VydmVyIFVJIHBsdWdpbiBzdGFydCAtLS0tLT4tLS0tLSIpOwotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQkJCi0JCVNlcnZlclVJUHJlZmVyZW5jZXMgcHJlZnMgPSBnZXRQcmVmZXJlbmNlcygpOwotCQlwcmVmcy5zZXREZWZhdWx0cygpOwotCQkKLQkJU2VydmVyQ29yZS5hZGRTZXJ2ZXJMaWZlY3ljbGVMaXN0ZW5lcihzZXJ2ZXJMaWZlY3ljbGVMaXN0ZW5lcik7Ci0JCQotCQlJU2VydmVyW10gc2VydmVycyA9IFNlcnZlckNvcmUuZ2V0U2VydmVycygpOwotCQlpZiAoc2VydmVycyAhPSBudWxsKSB7Ci0JCQlpbnQgc2l6ZSA9IHNlcnZlcnMubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlzZXJ2ZXJzW2ldLmFkZFNlcnZlckxpc3RlbmVyKHNlcnZlckxpc3RlbmVyKTsKLQkJCQkoKFNlcnZlcikgc2VydmVyc1tpXSkuYWRkUHVibGlzaExpc3RlbmVyKHB1Ymxpc2hMaXN0ZW5lcik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVHJhY2UudHJhY2UoVHJhY2UuQ09ORklHLCAiLS0tLS08LS0tLS0gU2VydmVyIFVJIHBsdWdpbiBzdG9wIC0tLS0tPC0tLS0tIik7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCQotCQlpZiAocmVnaXN0cnlMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQlJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQkJcmVnaXN0cnkucmVtb3ZlUmVnaXN0cnlDaGFuZ2VMaXN0ZW5lcihyZWdpc3RyeUxpc3RlbmVyKTsKLQkJfQotCQkKLQkJSW1hZ2VSZXNvdXJjZS5kaXNwb3NlKCk7Ci0JCQotCQlJU2VydmVyW10gc2VydmVycyA9IFNlcnZlckNvcmUuZ2V0U2VydmVycygpOwotCQlpZiAoc2VydmVycyAhPSBudWxsKSB7Ci0JCQlpbnQgc2l6ZSA9IHNlcnZlcnMubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlzZXJ2ZXJzW2ldLnJlbW92ZVNlcnZlckxpc3RlbmVyKHNlcnZlckxpc3RlbmVyKTsKLQkJCQkoKFNlcnZlcikgc2VydmVyc1tpXSkucmVtb3ZlUHVibGlzaExpc3RlbmVyKHB1Ymxpc2hMaXN0ZW5lcik7Ci0JCQl9Ci0JCX0KLQkJCi0JCVNlcnZlckNvcmUucmVtb3ZlU2VydmVyTGlmZWN5Y2xlTGlzdGVuZXIoc2VydmVyTGlmZWN5Y2xlTGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgYSB3YXRjaCB0byB0aGlzIHNlcnZlci4gSWYgaXQgaGFzbid0IHN0b3BwZWQgaW4gYQotCSAqIHJlYXNvbmFibGUgYW1vdW50IG9mIHRpbWUsIHRoZSB1c2VyIHdpbGwgYmUgcHJvbXB0ZWQgdG8KLQkgKiB0ZXJtaW5hdGUgdGhlIHNlcnZlci4KLQkgKgotCSAqIEBwYXJhbSBzaGVsbCBhIHNoZWxsCi0JICogQHBhcmFtIHNlcnZlciBhIHNlcnZlcgotCSAqIEBwYXJhbSBtb2RlIGEgZGVidWcgbW9kZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRUZXJtaW5hdGlvbldhdGNoKGZpbmFsIFNoZWxsIHNoZWxsLCBmaW5hbCBJU2VydmVyIHNlcnZlciwgZmluYWwgaW50IG1vZGUpIHsKLQkJaWYgKHRlcm1pbmF0aW9uV2F0Y2hlcy5jb250YWlucyhzZXJ2ZXIpKQotCQkJcmV0dXJuOwotCQkKLQkJdGVybWluYXRpb25XYXRjaGVzLmFkZChzZXJ2ZXIpOwotCQkKLQkJY2xhc3MgVGVybWluYXRlVGhyZWFkIGV4dGVuZHMgVGhyZWFkIHsKLQkJCXB1YmxpYyBib29sZWFuIGFsaXZlID0gdHJ1ZTsKLQkJCXB1YmxpYyBJU2VydmVyTGlzdGVuZXIgbGlzdGVuZXI7Ci0KLQkJCXB1YmxpYyBUZXJtaW5hdGVUaHJlYWQoKSB7Ci0JCQkJc3VwZXIoIlNlcnZlciBUZXJtaW5hdGlvbiBUaHJlYWQiKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXdoaWxlIChhbGl2ZSkgewotCQkJCQlTZXJ2ZXJUeXBlIHNlcnZlclR5cGUgPSAoU2VydmVyVHlwZSkgc2VydmVyLmdldFNlcnZlclR5cGUoKTsKLQkJCQkJaW50IGRlbGF5ID0gc2VydmVyVHlwZS5nZXRTdGFydFRpbWVvdXQoKTsKLQkJCQkJaWYgKG1vZGUgPT0gMSkKLQkJCQkJCWRlbGF5ID0gc2VydmVyVHlwZS5nZXRTdG9wVGltZW91dCgpOwotCQkJCQllbHNlIGlmIChtb2RlID09IDIpCi0JCQkJCQlkZWxheSArPSBzZXJ2ZXJUeXBlLmdldFN0b3BUaW1lb3V0KCk7Ci0JCQkJCQotCQkJCQlpZiAoZGVsYXkgPCAwKQotCQkJCQkJcmV0dXJuOwotCQkJCQkKLQkJCQkJdHJ5IHsKLQkJCQkJCVRocmVhZC5zbGVlcChkZWxheSk7Ci0JCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIGlnbm9yZQotCQkJCQl9Ci0JCQkJCQotCQkJCQlpZiAoc2VydmVyLmdldFNlcnZlclN0YXRlKCkgPT0gSVNlcnZlci5TVEFURV9TVE9QUEVEKQotCQkJCQkJYWxpdmUgPSBmYWxzZTsKLQkKLQkJCQkJaWYgKGFsaXZlKSB7Ci0JCQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQlUZXJtaW5hdGlvbkRpYWxvZyBkaWFsb2cgPSBuZXcgVGVybWluYXRpb25EaWFsb2coc2hlbGwsIHNlcnZlci5nZXROYW1lKCkpOwotCQkJCQkJCQlkaWFsb2cub3BlbigpOwotCQkJCQkJCQlpZiAoZGlhbG9nLmdldFJldHVybkNvZGUoKSA9PSBJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKSB7Ci0JCQkJCQkJCQkvLyBvbmx5IHRyeSBjYWxsaW5nIHRlcm1pbmF0ZSBvbmNlLiBBbHNvLCBtYWtlIHN1cmUgdGhhdCBpdCBkaWRuJ3Qgc3RvcCB3aGlsZQotCQkJCQkJCQkJLy8gdGhlIGRpYWxvZyB3YXMgb3BlbgotCQkJCQkJCQkJaWYgKHNlcnZlci5nZXRTZXJ2ZXJTdGF0ZSgpICE9IElTZXJ2ZXIuU1RBVEVfU1RPUFBFRCkKLQkJCQkJCQkJCQlzZXJ2ZXIuc3RvcCh0cnVlKTsKLQkJCQkJCQkJCWFsaXZlID0gZmFsc2U7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9KTsKLQkJCQkJfQotCQkJCQlpZiAoIWFsaXZlKSB7Ci0JCQkJCQlpZiAobGlzdGVuZXIgIT0gbnVsbCkKLQkJCQkJCQlzZXJ2ZXIucmVtb3ZlU2VydmVyTGlzdGVuZXIobGlzdGVuZXIpOwotCQkJCQkJdGVybWluYXRpb25XYXRjaGVzLnJlbW92ZShzZXJ2ZXIpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCi0JCWZpbmFsIFRlcm1pbmF0ZVRocmVhZCB0ID0gbmV3IFRlcm1pbmF0ZVRocmVhZCgpOwotCQl0LnNldERhZW1vbih0cnVlKTsKLQkJdC5zZXRQcmlvcml0eShUaHJlYWQuTk9STV9QUklPUklUWSAtIDIpOwotCQotCQkvLyBhZGQgbGlzdGVuZXIgdG8gc3RvcCB0aGUgdGhyZWFkIGlmL3doZW4gdGhlIHNlcnZlciBzdG9wcwotCQlJU2VydmVyTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgSVNlcnZlckxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VydmVyQ2hhbmdlZChTZXJ2ZXJFdmVudCBldmVudCkgewotCQkJCWludCBldmVudEtpbmQgPSBldmVudC5nZXRLaW5kKCk7Ci0JCQkJSVNlcnZlciBzZXJ2ZXIyID0gZXZlbnQuZ2V0U2VydmVyKCk7Ci0JCQkJaWYgKGV2ZW50S2luZCA9PSAoU2VydmVyRXZlbnQuU0VSVkVSX0NIQU5HRSB8IFNlcnZlckV2ZW50LlNUQVRFX0NIQU5HRSkpIHsKLQkJCQkJaWYgKHNlcnZlcjIuZ2V0U2VydmVyU3RhdGUoKSA9PSBJU2VydmVyLlNUQVRFX1NUT1BQRUQgJiYgdCAhPSBudWxsKQotCQkJCQkJdC5hbGl2ZSA9IGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfTsKLQkJdC5saXN0ZW5lciA9IGxpc3RlbmVyOwotCQlzZXJ2ZXIuYWRkU2VydmVyTGlzdGVuZXIobGlzdGVuZXIpOwotCQotCQl0LnN0YXJ0KCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNlcnZlciB0aGF0IGNhbWUgZnJvbSB0aGUgZ2l2ZW4gZmlsZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBpZiBub25lLiBUaGlzIGNvbnZlbmllbmNlIG1ldGhvZCBzZWFyY2hlcyB0aGUgbGlzdCBvZiBrbm93bgotCSAqIHNlcnZlcnMgKHtAbGluayBTZXJ2ZXJDb3JlI2dldFNlcnZlcnMoKX0pIGZvciB0aGUgb25lIHdpdGggYSBtYXRjaGluZwotCSAqIGxvY2F0aW9uICh7QGxpbmsgU2VydmVyI2dldEZpbGUoKX0pLiBUaGUgZmlsZSBtYXkgbm90IGJlIG51bGwuCi0JICoKLQkgKiBAcGFyYW0gZmlsZSBhIHNlcnZlciBmaWxlCi0JICogQHJldHVybiB0aGUgc2VydmVyIGluc3RhbmNlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiAKLQkgKiB0aGVyZSBpcyBubyBzZXJ2ZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBmaWxlCi0JICovCi0JcHVibGljIHN0YXRpYyBJU2VydmVyIGZpbmRTZXJ2ZXIoSUZpbGUgZmlsZSkgewotCQlpZiAoZmlsZSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQkKLQkJSVNlcnZlcltdIHNlcnZlcnMgPSBTZXJ2ZXJDb3JlLmdldFNlcnZlcnMoKTsKLQkJaWYgKHNlcnZlcnMgIT0gbnVsbCkgewotCQkJaW50IHNpemUgPSBzZXJ2ZXJzLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJaWYgKGZpbGUuZXF1YWxzKCgoU2VydmVyKXNlcnZlcnNbaV0pLmdldEZpbGUoKSkpCi0JCQkJCXJldHVybiBzZXJ2ZXJzW2ldOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGFsbCBrbm93biBydW50aW1lIGluc3RhbmNlcyBvZgotCSAqIHRoZSBnaXZlbiBydW50aW1lIHR5cGUuIFRoaXMgY29udmVuaWVuY2UgbWV0aG9kIGZpbHRlcnMgdGhlIGxpc3Qgb2Yga25vd24KLQkgKiBydW50aW1lICh7QGxpbmsgU2VydmVyQ29yZSNnZXRSdW50aW1lcygpfSkgZm9yIG9uZXMgd2l0aCBhIG1hdGNoaW5nCi0JICogcnVudGltZSB0eXBlICh7QGxpbmsgSVJ1bnRpbWUjZ2V0UnVudGltZVR5cGUoKX0pLiBUaGUgYXJyYXkgd2lsbCBub3QKLQkgKiBjb250YWluIGFueSB3b3JraW5nIGNvcGllcy4KLQkgKiA8cD4KLQkgKiBBIG5ldyBhcnJheSBpcyByZXR1cm5lZCBvbiBlYWNoIGNhbGwsIHNvIGNsaWVudHMgbWF5IHN0b3JlIG9yIG1vZGlmeSB0aGUgcmVzdWx0LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gcnVudGltZVR5cGUgdGhlIHJ1bnRpbWUgdHlwZQotCSAqIEByZXR1cm4gYSBwb3NzaWJseS1lbXB0eSBsaXN0IG9mIHJ1bnRpbWUgaW5zdGFuY2VzIHtAbGluayBJUnVudGltZX0KLQkgKiBvZiB0aGUgZ2l2ZW4gcnVudGltZSB0eXBlCi0JICovCi0JcHVibGljIHN0YXRpYyBJUnVudGltZVtdIGdldFJ1bnRpbWVzKElSdW50aW1lVHlwZSBydW50aW1lVHlwZSkgewotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlSdW50aW1lW10gcnVudGltZXMgPSBTZXJ2ZXJDb3JlLmdldFJ1bnRpbWVzKCk7Ci0JCWlmIChydW50aW1lcyAhPSBudWxsKSB7Ci0JCQlpbnQgc2l6ZSA9IHJ1bnRpbWVzLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJaWYgKHJ1bnRpbWVzW2ldLmdldFJ1bnRpbWVUeXBlKCkgIT0gbnVsbCAmJiBydW50aW1lc1tpXS5nZXRSdW50aW1lVHlwZSgpLmVxdWFscyhydW50aW1lVHlwZSkpCi0JCQkJCWxpc3QuYWRkKHJ1bnRpbWVzW2ldKTsKLQkJCX0KLQkJfQotCQkKLQkJSVJ1bnRpbWVbXSByID0gbmV3IElSdW50aW1lW2xpc3Quc2l6ZSgpXTsKLQkJbGlzdC50b0FycmF5KHIpOwotCQlyZXR1cm4gcjsKLQl9Ci0JCi0JLyoqCi0JICogT3BlbiB0aGUgZ2l2ZW4gc2VydmVyIHdpdGggdGhlIHNlcnZlciBlZGl0b3IuCi0JICoKLQkgKiBAcGFyYW0gc2VydmVyCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGVkaXRTZXJ2ZXIoSVNlcnZlciBzZXJ2ZXIpIHsKLQkJaWYgKHNlcnZlciA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWVkaXRTZXJ2ZXIoc2VydmVyLmdldElkKCkpOwotCX0KLQotCS8qKgotCSAqIE9wZW4gdGhlIGdpdmVuIHNlcnZlciBpZCB3aXRoIHRoZSBzZXJ2ZXIgZWRpdG9yLgotCSAqCi0JICogQHBhcmFtIHNlcnZlcklkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGVkaXRTZXJ2ZXIoU3RyaW5nIHNlcnZlcklkKSB7Ci0JCWlmIChzZXJ2ZXJJZCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCUlXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93ID0gU2VydmVyVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IHdvcmtiZW5jaFdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0KLQkJdHJ5IHsKLQkJCUlTZXJ2ZXJFZGl0b3JJbnB1dCBpbnB1dCA9IG5ldyBTZXJ2ZXJFZGl0b3JJbnB1dChzZXJ2ZXJJZCk7Ci0JCQlwYWdlLm9wZW5FZGl0b3IoaW5wdXQsIElTZXJ2ZXJFZGl0b3JJbnB1dC5FRElUT1JfSUQpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3Igb3BlbmluZyBzZXJ2ZXIgZWRpdG9yIiwgZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogVXNlIHRoZSBwcmVmZXJlbmNlIHRvIHByb21wdCB0aGUgdXNlciB0byBzYXZlIGRpcnR5IGVkaXRvcnMsIGlmIGFwcGxpY2FibGUuCi0JICogCi0JICogQHJldHVybiBib29sZWFuICAtIFJldHVybnMgZmFsc2UgaWYgdGhlIHVzZXIgY2FuY2VsbGVkIHRoZSBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2F2ZUVkaXRvcnMoKSB7Ci0JCWJ5dGUgYiA9IFNlcnZlclVJUGx1Z2luLmdldFByZWZlcmVuY2VzKCkuZ2V0U2F2ZUVkaXRvcnMoKTsKLQkJaWYgKGIgPT0gU2VydmVyVUlQcmVmZXJlbmNlcy5TQVZFX0VESVRPUlNfTkVWRVIpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIFNlcnZlclVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V29ya2JlbmNoKCkuc2F2ZUFsbEVkaXRvcnMoYiA9PSBTZXJ2ZXJVSVByZWZlcmVuY2VzLlNBVkVfRURJVE9SU19QUk9NUFQpOwkJCQotCX0KLQkKLQkvKioKLQkgKiBQcm9tcHRzIHRoZSB1c2VyIGlmIHRoZSBzZXJ2ZXIgaXMgZGlydHkuIFJldHVybnMgdHJ1ZSBpZiB0aGUgc2VydmVyIHdhcwotCSAqIG5vdCBkaXJ0eSBvciBpZiB0aGUgdXNlciBkZWNpZGVkIHRvIGNvbnRpbnVlIGFueXdheS4gUmV0dXJucyBmYWxzZSBpZgotCSAqIHRoZSBzZXJ2ZXIgaXMgZGlydHkgYW5kIHRoZSB1c2VyIGNob3NlIHRvIGNhbmNlbCB0aGUgb3BlcmF0aW9uLgotCSAqCi0JICogQHBhcmFtIHNoZWxsIGEgc2hlbGwKLQkgKiBAcGFyYW0gc2VydmVyIGEgc2VydmVyCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHByb21wdElmRGlydHkoU2hlbGwgc2hlbGwsIElTZXJ2ZXIgc2VydmVyKSB7Ci0JCWlmIChzZXJ2ZXIgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCWlmICghKHNlcnZlciBpbnN0YW5jZW9mIElTZXJ2ZXJXb3JraW5nQ29weSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQotCQlTdHJpbmcgdGl0bGUgPSBNZXNzYWdlcy5yZXNvdXJjZURpcnR5RGlhbG9nVGl0bGU7Ci0JCQotCQlJU2VydmVyV29ya2luZ0NvcHkgd2MgPSAoSVNlcnZlcldvcmtpbmdDb3B5KSBzZXJ2ZXI7Ci0JCWlmICh3Yy5pc0RpcnR5KCkpIHsKLQkJCVN0cmluZyBtZXNzYWdlID0gTkxTLmJpbmQoTWVzc2FnZXMucmVzb3VyY2VEaXJ0eURpYWxvZ01lc3NhZ2UsIHNlcnZlci5nZXROYW1lKCkpOwotCQkJU3RyaW5nW10gbGFiZWxzID0gbmV3IFN0cmluZ1tdIHtNZXNzYWdlcy5yZXNvdXJjZURpcnR5RGlhbG9nQ29udGludWUsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMfTsKLQkJCU1lc3NhZ2VEaWFsb2cgZGlhbG9nID0gbmV3IE1lc3NhZ2VEaWFsb2coc2hlbGwsIHRpdGxlLCBudWxsLCBtZXNzYWdlLCBNZXNzYWdlRGlhbG9nLklORk9STUFUSU9OLCBsYWJlbHMsIDApOwotCQotCQkJaWYgKGRpYWxvZy5vcGVuKCkgIT0gMCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogU2hvdyB0aGUgU2VydmVycyB2aWV3LiBUaGUgU2VydmVycyBpcyBuZXZlciBnaXZlbiBmb2N1cy4KLQkgKiAKLQkgKiBAcGFyYW0gYnJpbmdUb0Zyb250IDxjb2RlPnRydWU8L2NvZGU+IHRvIG1ha2UgdGhlIFNlcnZlcnMgdmlldyBwdXNoIHRvIHRoZSB0b3AKLQkgKiAgICBvZiB0aGUgei1vcmRlciwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiB0byBqdXN0IGhpZ2hsaWdodCBpdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBzaG93U2VydmVyc1ZpZXcoZmluYWwgYm9vbGVhbiBicmluZ1RvRnJvbnQpIHsKLQkJaWYgKCFnZXRQcmVmZXJlbmNlcygpLmdldFNob3dPbkFjdGl2aXR5KCkpCi0JCQlyZXR1cm47Ci0JCQotCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXRyeSB7Ci0JCQkJCUlXb3JrYmVuY2ggd29ya2JlbmNoID0gU2VydmVyVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRXb3JrYmVuY2goKTsKLQkJCQkJSVdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2hXaW5kb3cgPSB3b3JrYmVuY2guZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCi0JCQkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSB3b3JrYmVuY2hXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotCQotCQkJCQlJVmlld1BhcnQgdmlldzIgPSBwYWdlLmZpbmRWaWV3KFZJRVdfSUQpOwotCQkJCQkKLQkJCQkJaWYgKHZpZXcyICE9IG51bGwpIHsKLQkJCQkJCWlmIChicmluZ1RvRnJvbnQpCi0JCQkJCQkJcGFnZS5icmluZ1RvVG9wKHZpZXcyKTsKLQkJCQkJCWVsc2UgewotCQkJCQkJCUlXb3JrYmVuY2hTaXRlUHJvZ3Jlc3NTZXJ2aWNlIHdzcHMgPSAoSVdvcmtiZW5jaFNpdGVQcm9ncmVzc1NlcnZpY2UpCi0JCQkJCQkJCXZpZXcyLmdldFNpdGUoKS5nZXRBZGFwdGVyKElXb3JrYmVuY2hTaXRlUHJvZ3Jlc3NTZXJ2aWNlLmNsYXNzKTsKLQkJCQkJCQl3c3BzLndhcm5PZkNvbnRlbnRDaGFuZ2UoKTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlCi0JCQkJCQlwYWdlLnNob3dWaWV3KFZJRVdfSUQpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIG9wZW5pbmcgVENQL0lQIHZpZXciLCBlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIHNlcnZlciBpcyBhbHJlYWR5IHN0YXJ0ZWQgaW4gdGhlIGdpdmVuCi0JICogbW9kZSwgb3IgY291bGQgYmUgKHJlKXN0YXJ0ZWQgaW4gdGhlIHN0YXJ0IG1vZGUuCi0JICogCi0JICogQHBhcmFtIHNlcnZlcgotCSAqIEBwYXJhbSBsYXVuY2hNb2RlCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzQ29tcGF0aWJsZVdpdGhMYXVuY2hNb2RlKElTZXJ2ZXIgc2VydmVyLCBTdHJpbmcgbGF1bmNoTW9kZSkgewotCQlpZiAoc2VydmVyID09IG51bGwgfHwgbGF1bmNoTW9kZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWludCBzdGF0ZSA9IHNlcnZlci5nZXRTZXJ2ZXJTdGF0ZSgpOwotCQlpZiAoc3RhdGUgPT0gSVNlcnZlci5TVEFURV9TVEFSVEVEICYmIGxhdW5jaE1vZGUuZXF1YWxzKHNlcnZlci5nZXRNb2RlKCkpKQotCQkJcmV0dXJuIHRydWU7Ci0KLQkJaWYgKHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkuc3VwcG9ydHNMYXVuY2hNb2RlKGxhdW5jaE1vZGUpKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogT3BlbiB0aGUgbmV3IHJ1bnRpbWUgd2l6YXJkLgotCSAqIAotCSAqIEBwYXJhbSBzaGVsbAotCSAqIEBwYXJhbSB0eXBlCi0JICogQHBhcmFtIHZlcnNpb24KLQkgKiBAcGFyYW0gcnVudGltZVR5cGVJZAotCSAqIEByZXR1cm4gdHJ1ZSBpZiBhIG5ldyBydW50aW1lIHdhcyBjcmVhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHNob3dOZXdSdW50aW1lV2l6YXJkKFNoZWxsIHNoZWxsLCBmaW5hbCBTdHJpbmcgdHlwZSwgZmluYWwgU3RyaW5nIHZlcnNpb24sIGZpbmFsIFN0cmluZyBydW50aW1lVHlwZUlkKSB7Ci0JCVdpemFyZEZyYWdtZW50IGZyYWdtZW50ID0gbmV3IFdpemFyZEZyYWdtZW50KCkgewotCQkJcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ2hpbGRGcmFnbWVudHMoTGlzdCBsaXN0KSB7Ci0JCQkJbGlzdC5hZGQobmV3IE5ld1J1bnRpbWVXaXphcmRGcmFnbWVudCh0eXBlLCB2ZXJzaW9uLCBydW50aW1lVHlwZUlkKSk7Ci0JCQkJbGlzdC5hZGQobmV3IFdpemFyZEZyYWdtZW50KCkgewotCQkJCQlwdWJsaWMgdm9pZCBwZXJmb3JtRmluaXNoKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCQkJV2l6YXJkVGFza1V0aWwuc2F2ZVJ1bnRpbWUoZ2V0VGFza01vZGVsKCksIG1vbml0b3IpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX07Ci0JCVRhc2tXaXphcmQgd2l6YXJkID0gbmV3IFRhc2tXaXphcmQoTWVzc2FnZXMud2l6TmV3UnVudGltZVdpemFyZFRpdGxlLCBmcmFnbWVudCk7Ci0JCXdpemFyZC5zZXRGb3JjZVByZXZpb3VzQW5kTmV4dEJ1dHRvbnModHJ1ZSk7Ci0JCUNsb3NhYmxlV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBDbG9zYWJsZVdpemFyZERpYWxvZyhzaGVsbCwgd2l6YXJkKTsKLQkJcmV0dXJuIChkaWFsb2cub3BlbigpID09IElEaWFsb2dDb25zdGFudHMuT0tfSUQpOwotCX0KLQkKLQkvKioKLQkgKiBPcGVuIHRoZSBuZXcgcnVudGltZSB3aXphcmQuCi0JICogCi0JICogQHBhcmFtIHNoZWxsCi0JICogQHBhcmFtIHJ1bnRpbWVUeXBlSWQKLQkgKiBAcmV0dXJuIHRydWUgaWYgYSBuZXcgcnVudGltZSB3YXMgY3JlYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzaG93TmV3UnVudGltZVdpemFyZChTaGVsbCBzaGVsbCwgZmluYWwgU3RyaW5nIHJ1bnRpbWVUeXBlSWQpIHsKLQkJSVJ1bnRpbWVUeXBlIHJ1bnRpbWVUeXBlID0gbnVsbDsKLQkJaWYgKHJ1bnRpbWVUeXBlSWQgIT0gbnVsbCkKLQkJCXJ1bnRpbWVUeXBlID0gU2VydmVyQ29yZS5maW5kUnVudGltZVR5cGUocnVudGltZVR5cGVJZCk7Ci0JCWlmIChydW50aW1lVHlwZSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWZpbmFsIElSdW50aW1lV29ya2luZ0NvcHkgcnVudGltZSA9IHJ1bnRpbWVUeXBlLmNyZWF0ZVJ1bnRpbWUobnVsbCwgbnVsbCk7Ci0JCQkJVGFza01vZGVsIHRhc2tNb2RlbCA9IG5ldyBUYXNrTW9kZWwoKTsKLQkJCQl0YXNrTW9kZWwucHV0T2JqZWN0KFRhc2tNb2RlbC5UQVNLX1JVTlRJTUUsIHJ1bnRpbWUpOwotCQkJCQotCQkJCVdpemFyZEZyYWdtZW50IGZyYWdtZW50ID0gbmV3IFdpemFyZEZyYWdtZW50KCkgewotCQkJCQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDaGlsZEZyYWdtZW50cyhMaXN0IGxpc3QpIHsKLQkJCQkJCWxpc3QuYWRkKGdldFdpemFyZEZyYWdtZW50KHJ1bnRpbWVUeXBlSWQpKTsKLQkJCQkJCWxpc3QuYWRkKG5ldyBXaXphcmRGcmFnbWVudCgpIHsKLQkJCQkJCQlwdWJsaWMgdm9pZCBwZXJmb3JtRmluaXNoKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCQkJCQlXaXphcmRUYXNrVXRpbC5zYXZlUnVudGltZShnZXRUYXNrTW9kZWwoKSwgbW9uaXRvcik7Ci0JCQkJCQkJfQotCQkJCQkJfSk7Ci0JCQkJCX0KLQkJCQl9OwotCQkJCVRhc2tXaXphcmQgd2l6YXJkID0gbmV3IFRhc2tXaXphcmQoTWVzc2FnZXMud2l6TmV3UnVudGltZVdpemFyZFRpdGxlLCBmcmFnbWVudCwgdGFza01vZGVsKTsKLQkJCQl3aXphcmQuc2V0Rm9yY2VQcmV2aW91c0FuZE5leHRCdXR0b25zKHRydWUpOwotCQkJCUNsb3NhYmxlV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBDbG9zYWJsZVdpemFyZERpYWxvZyhzaGVsbCwgd2l6YXJkKTsKLQkJCQlyZXR1cm4gKGRpYWxvZy5vcGVuKCkgPT0gSURpYWxvZ0NvbnN0YW50cy5PS19JRCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc2hvd05ld1J1bnRpbWVXaXphcmQoc2hlbGwsIG51bGwsIG51bGwsIHJ1bnRpbWVUeXBlSWQpOwotCX0KLQkKLQkvKioKLQkgKiBPcGVuIHRoZSBuZXcgcnVudGltZSB3aXphcmQuCi0JICogQHBhcmFtIHNoZWxsCi0JICogQHJldHVybiB0cnVlIGlmIGEgbmV3IHJ1bnRpbWUgd2FzIGNyZWF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2hvd05ld1J1bnRpbWVXaXphcmQoU2hlbGwgc2hlbGwpIHsKLQkJcmV0dXJuIFNlcnZlclVJVXRpbC5zaG93TmV3UnVudGltZVdpemFyZChzaGVsbCwgbnVsbCwgbnVsbCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHdpemFyZCBmcmFnbWVudCB3aXRoIHRoZSBnaXZlbiBpZC4KLQkgKgotCSAqIEBwYXJhbSB0eXBlSWQgdGhlIHNlcnZlciBvciBydW50aW1lIHR5cGUgaWQKLQkgKiBAcmV0dXJuIGEgd2l6YXJkIGZyYWdtZW50LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lIGNvdWxkIGJlIGZvdW5kCi0JICovCi0JcHVibGljIHN0YXRpYyBXaXphcmRGcmFnbWVudCBnZXRXaXphcmRGcmFnbWVudChTdHJpbmcgdHlwZUlkKSB7Ci0JCWlmICh0eXBlSWQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCWlmICh3aXphcmRGcmFnbWVudHMgPT0gbnVsbCkKLQkJCWxvYWRXaXphcmRGcmFnbWVudHMoKTsKLQkJCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gd2l6YXJkRnJhZ21lbnRzLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAodHlwZUlkLmVxdWFscyhrZXkpKSB7Ci0JCQkJV2l6YXJkRnJhZ21lbnREYXRhIGRhdGEgPSAoV2l6YXJkRnJhZ21lbnREYXRhKSB3aXphcmRGcmFnbWVudHMuZ2V0KGtleSk7Ci0JCQkJcmV0dXJuIGdldFdpemFyZEZyYWdtZW50KGRhdGEpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIExvYWQgdGhlIHdpemFyZCBmcmFnbWVudHMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgbG9hZFdpemFyZEZyYWdtZW50cygpIHsKLQkJaWYgKHdpemFyZEZyYWdtZW50cyAhPSBudWxsKQotCQkJcmV0dXJuOwotCQlUcmFjZS50cmFjZShUcmFjZS5DT05GSUcsICItPi0gTG9hZGluZyAud2l6YXJkRnJhZ21lbnRzIGV4dGVuc2lvbiBwb2ludCAtPi0iKTsKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2YgPSByZWdpc3RyeS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoU2VydmVyVUlQbHVnaW4uUExVR0lOX0lELCBFWFRFTlNJT05fV0laQVJEX0ZSQUdNRU5UUyk7Ci0KLQkJd2l6YXJkRnJhZ21lbnRzID0gbmV3IEhhc2hNYXAoY2YubGVuZ3RoKTsKLQkJbG9hZFdpemFyZEZyYWdtZW50cyhjZik7Ci0JCWFkZFJlZ2lzdHJ5TGlzdGVuZXIoKTsKLQkJCi0JCVRyYWNlLnRyYWNlKFRyYWNlLkNPTkZJRywgIi08LSBEb25lIGxvYWRpbmcgLndpemFyZEZyYWdtZW50cyBleHRlbnNpb24gcG9pbnQgLTwtIik7Ci0JfQotCi0JLyoqCi0JICogTG9hZCB3aXphcmQgZnJhZ21lbnRzLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIGxvYWRXaXphcmRGcmFnbWVudHMoSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2YpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjZi5sZW5ndGg7IGkrKykgewotCQkJdHJ5IHsKLQkJCQlTdHJpbmcgaWQgPSBjZltpXS5nZXRBdHRyaWJ1dGUoInR5cGVJZHMiKTsKLQkJCQl3aXphcmRGcmFnbWVudHMucHV0KGlkLCBuZXcgV2l6YXJkRnJhZ21lbnREYXRhKGlkLCBjZltpXSkpOwotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkNPTkZJRywgIiAgTG9hZGVkIHdpemFyZEZyYWdtZW50OiAiICsgaWQpOwotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICIgIENvdWxkIG5vdCBsb2FkIHdpemFyZEZyYWdtZW50OiAiICsgY2ZbaV0uZ2V0QXR0cmlidXRlKCJpZCIpLCB0KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGluaXRpYWwgc2VsZWN0aW9uIHByb3ZpZGVyLgotCSAqCi0JICogQHJldHVybiBhbiBpbml0aWFsIHNlbGVjdGlvbiBwcm92aWRlciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZSBjb3VsZCBiZSBmb3VuZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW5pdGlhbFNlbGVjdGlvblByb3ZpZGVyIGdldEluaXRpYWxTZWxlY3Rpb25Qcm92aWRlcigpIHsKLQkJaWYgKHNlbGVjdGlvblByb3ZpZGVyID09IG51bGwpCi0JCQlsb2FkSW5pdGlhbFNlbGVjdGlvblByb3ZpZGVyKCk7Ci0JCQotCQlyZXR1cm4gc2VsZWN0aW9uUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogTG9hZCB0aGUgaW5pdGlhbCBzZWxlY3Rpb24gcHJvdmlkZXIuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgbG9hZEluaXRpYWxTZWxlY3Rpb25Qcm92aWRlcigpIHsKLQkJaWYgKHNlbGVjdGlvblByb3ZpZGVyICE9IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQlUcmFjZS50cmFjZShUcmFjZS5DT05GSUcsICItPi0gTG9hZGluZyAuaW5pdGlhbFNlbGVjdGlvblByb3ZpZGVyIGV4dGVuc2lvbiBwb2ludCAtPi0iKTsKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2YgPSByZWdpc3RyeS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoU2VydmVyVUlQbHVnaW4uUExVR0lOX0lELCAiaW5pdGlhbFNlbGVjdGlvblByb3ZpZGVyIik7Ci0JCQotCQlpZiAoY2YubGVuZ3RoID09IDEpIHsKLQkJCXRyeSB7Ci0JCQkJc2VsZWN0aW9uUHJvdmlkZXIgPSAoSW5pdGlhbFNlbGVjdGlvblByb3ZpZGVyKSBjZlswXS5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJjbGFzcyIpOwotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkNPTkZJRywgIiAgTG9hZGVkIGluaXRpYWxTZWxlY3Rpb25Qcm92aWRlcjogIiArIGNmWzBdLmdldEF0dHJpYnV0ZSgiaWQiKSk7Ci0JCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIiAgQ291bGQgbm90IGxvYWQgaW5pdGlhbFNlbGVjdGlvblByb3ZpZGVyOiAiICsgY2ZbMF0uZ2V0QXR0cmlidXRlKCJpZCIpLCB0KTsKLQkJCX0KLQkJfSBlbHNlIGlmIChjZi5sZW5ndGggPiAxKQotCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIk1vcmUgdGhhdCBvbmUgaW5pdGlhbCBzZWxlY3Rpb24gcHJvdmlkZXIgZm91bmQgLSBpZ25vcmluZyIpOwotCQllbHNlCi0JCQlUcmFjZS50cmFjZShUcmFjZS5DT05GSUcsICJObyBpbml0aWFsIHNlbGVjdGlvbiBwcm92aWRlciBmb3VuZCIpOwotCQkKLQkJaWYgKHNlbGVjdGlvblByb3ZpZGVyID09IG51bGwpCi0JCQlzZWxlY3Rpb25Qcm92aWRlciA9IG5ldyBJbml0aWFsU2VsZWN0aW9uUHJvdmlkZXIoKTsKLQkJCi0JCVRyYWNlLnRyYWNlKFRyYWNlLkNPTkZJRywgIi08LSBEb25lIGxvYWRpbmcgLmluaXRpYWxTZWxlY3Rpb25Qcm92aWRlciBleHRlbnNpb24gcG9pbnQgLTwtIik7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBXaXphcmRGcmFnbWVudCBnZXRXaXphcmRGcmFnbWVudChXaXphcmRGcmFnbWVudERhdGEgZnJhZ21lbnQpIHsKLQkJaWYgKGZyYWdtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkKLQkJaWYgKGZyYWdtZW50LmZyYWdtZW50ID09IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJZnJhZ21lbnQuZnJhZ21lbnQgPSAoV2l6YXJkRnJhZ21lbnQpIGZyYWdtZW50LmNlLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7Ci0JCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBjcmVhdGUgd2l6YXJkRnJhZ21lbnQ6ICIgKyBmcmFnbWVudC5jZS5nZXRBdHRyaWJ1dGUoImlkIiksIHQpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmcmFnbWVudC5mcmFnbWVudDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHJ1bk9uU2VydmVyKE9iamVjdCBvYmplY3QsIFN0cmluZyBsYXVuY2hNb2RlKSB7Ci0JCVJ1bk9uU2VydmVyQWN0aW9uRGVsZWdhdGUgZGVsZWdhdGUgPSBuZXcgUnVuT25TZXJ2ZXJBY3Rpb25EZWxlZ2F0ZSgpOwotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigpIHsKLQkJCS8vIGR1bW15IGFjdGlvbgotCQl9OwotCQlpZiAob2JqZWN0ICE9IG51bGwpIHsKLQkJCVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24ob2JqZWN0KTsKLQkJCWRlbGVnYXRlLnNlbGVjdGlvbkNoYW5nZWQoYWN0aW9uLCBzZWwpOwotCQl9IGVsc2UKLQkJCWRlbGVnYXRlLnNlbGVjdGlvbkNoYW5nZWQoYWN0aW9uLCBudWxsKTsKLQotCQlkZWxlZ2F0ZS5ydW4oYWN0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIGFkZFJlZ2lzdHJ5TGlzdGVuZXIoKSB7Ci0JCWlmIChyZWdpc3RyeUxpc3RlbmVyICE9IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQlyZWdpc3RyeUxpc3RlbmVyID0gbmV3IFJlZ2lzdHJ5Q2hhbmdlTGlzdGVuZXIoKTsKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJcmVnaXN0cnkuYWRkUmVnaXN0cnlDaGFuZ2VMaXN0ZW5lcihyZWdpc3RyeUxpc3RlbmVyLCBTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBoYW5kbGVXaXphcmRGcmFnbWVudERlbHRhKElFeHRlbnNpb25EZWx0YSBkZWx0YSkgewotCQlpZiAod2l6YXJkRnJhZ21lbnRzID09IG51bGwpIC8vIG5vdCBsb2FkZWQgeWV0Ci0JCQlyZXR1cm47Ci0JCQotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjZiA9IGRlbHRhLmdldEV4dGVuc2lvbigpLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQkKLQkJaWYgKGRlbHRhLmdldEtpbmQoKSA9PSBJRXh0ZW5zaW9uRGVsdGEuQURERUQpIHsKLQkJCWxvYWRXaXphcmRGcmFnbWVudHMoY2YpOwotCQl9IGVsc2UgewotCQkJLyppbnQgc2l6ZSA9IHdpemFyZEZyYWdtZW50cy5zaXplKCk7Ci0JCQlXaXphcmRGcmFnbWVudFtdIHdmID0gbmV3IFdpemFyZEZyYWdtZW50W3NpemVdOwotCQkJd2l6YXJkRnJhZ21lbnRzLnRvQXJyYXkod2YpOwotCQkJaW50IHNpemUyID0gY2YubGVuZ3RoOwotCQkJCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgc2l6ZTI7IGorKykgewotCQkJCQlpZiAod2ZbaV0uZ2V0SWQoKS5lcXVhbHMoY2Zbal0uZ2V0QXR0cmlidXRlKCJpZCIpKSkgewotCQkJCQkJd2ZbaV0uZGlzcG9zZSgpOwotCQkJCQkJd2l6YXJkRnJhZ21lbnRzLnJlbW92ZSh3ZltpXSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ki8KLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9TZXJ2ZXJVSVByZWZlcmVuY2VzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9TZXJ2ZXJVSVByZWZlcmVuY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3MGNhN2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvU2VydmVyVUlQcmVmZXJlbmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotoCogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci0vKioKLSAqIEhlbHBlciBjbGFzcyB0aGF0IHN0b3JlcyBwcmVmZXJlbmNlIGluZm9ybWF0aW9uIGZvcgotICogdGhlIHNlcnZlciB0b29scy4KLSAqLwotcHVibGljIGNsYXNzIFNlcnZlclVJUHJlZmVyZW5jZXMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX1BST01QVF9JUlJFVkVSU0lCTEUgPSAicHJvbXB0LWlycmV2ZXJzaWJsZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfSU1QT1JUX0xPQ0FUSU9OID0gImltcG9ydC1sb2NhdGlvbiI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfU0FWRV9FRElUT1JTID0gInNhdmUtZWRpdG9ycyI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfSE9TVF9OQU1FUyA9ICJob3N0LW5hbWVzIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9TSE9XX09OX0FDVElWSVRZID0gInNob3ctb24tYWN0aXZpdHkiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIFNBVkVfRURJVE9SU19ORVZFUiA9IDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIFNBVkVfRURJVE9SU19QUk9NUFQgPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBTQVZFX0VESVRPUlNfQVVUTyA9IDI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0hPU1ROQU1FUyA9IDEwOwotCi0JcHJpdmF0ZSBQcmVmZXJlbmNlcyBwcmVmZXJlbmNlczsKLQotCS8qKgotCSAqIFNlcnZlclVJUHJlZmVyZW5jZSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBTZXJ2ZXJVSVByZWZlcmVuY2VzKCkgewotCQlzdXBlcigpOwotCQlwcmVmZXJlbmNlcyA9IFNlcnZlclVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0cygpIHsKLQkJcHJlZmVyZW5jZXMuc2V0RGVmYXVsdChQUkVGX1BST01QVF9JUlJFVkVSU0lCTEUsIGdldERlZmF1bHRQcm9tcHRCZWZvcmVJcnJldmVyc2libGVDaGFuZ2UoKSk7Ci0JCXByZWZlcmVuY2VzLnNldERlZmF1bHQoUFJFRl9TQVZFX0VESVRPUlMsIGdldERlZmF1bHRTYXZlRWRpdG9ycygpKTsKLQkJcHJlZmVyZW5jZXMuc2V0RGVmYXVsdChQUkVGX0hPU1RfTkFNRVMsICJsb2NhbGhvc3QiKTsKLQkJcHJlZmVyZW5jZXMuc2V0RGVmYXVsdChQUkVGX1NIT1dfT05fQUNUSVZJVFksIHRydWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdXNlciBzaG91bGQgYmUgcHJvbXB0ZWQgYmVmb3JlIG1ha2luZyBhbgotCSAqIGlycmV2ZXJzaWJsZSBjaGFuZ2UgaW4gdGhlIGVkaXRvci4KLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRQcm9tcHRCZWZvcmVJcnJldmVyc2libGVDaGFuZ2UoKSB7Ci0JCXJldHVybiBwcmVmZXJlbmNlcy5nZXRCb29sZWFuKFBSRUZfUFJPTVBUX0lSUkVWRVJTSUJMRSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB3aGV0aGVyIHRoZSB1c2VyIHNob3VsZCBiZSBwcm9tcHRlZAotCSAqIGJlZm9yZSBtYWtpbmcgYW4gaXJyZXZlcnNpYmxlIGNoYW5nZSBpbiB0aGUgZWRpdG9yLgotCSAqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0RGVmYXVsdFByb21wdEJlZm9yZUlycmV2ZXJzaWJsZUNoYW5nZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB3aGV0aGVyIHRoZSB1c2VyIHNob3VsZCBiZSBwcm9tcHRlZCBiZWZvcmUgbWFraW5nIGFuCi0JICogaXJyZXZlcnNpYmxlIGNoYW5nZSBpbiB0aGUgZWRpdG9yLgotCSAqCi0JICogQHBhcmFtIGIgdHJ1ZSB0byBwcm9tcHQgYmVmb3JlIGlycmV2ZXJzaWJsZSBjaGFuZ2VzCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvbXB0QmVmb3JlSXJyZXZlcnNpYmxlQ2hhbmdlKGJvb2xlYW4gYikgewotCQlwcmVmZXJlbmNlcy5zZXRWYWx1ZShQUkVGX1BST01QVF9JUlJFVkVSU0lCTEUsIGIpOwotCQlTZXJ2ZXJVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbXBvcnQgbG9jYXRpb24uCi0JICoKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEltcG9ydExvY2F0aW9uKCkgewotCQlyZXR1cm4gcHJlZmVyZW5jZXMuZ2V0U3RyaW5nKFBSRUZfSU1QT1JUX0xPQ0FUSU9OKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgaW1wb3J0IGxvY2F0aW9uLgotCSAqCi0JICogQHBhcmFtIHMgdGhlIGltcG9ydCBsb2NhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEltcG9ydExvY2F0aW9uKFN0cmluZyBzKSB7Ci0JCXByZWZlcmVuY2VzLnNldFZhbHVlKFBSRUZfSU1QT1JUX0xPQ0FUSU9OLCBzKTsKLQkJU2VydmVyVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGVmYXVsdCBzZXR0aW5nIGZvciBzYXZpbmcgZWRpdG9ycyBiZWZvcmUgbGF1bmNoaW5nLgotCSAqIAotCSAqIEByZXR1cm4gYnl0ZQotCSAqLwotCXB1YmxpYyBieXRlIGdldERlZmF1bHRTYXZlRWRpdG9ycygpIHsKLQkJcmV0dXJuIFNBVkVfRURJVE9SU19QUk9NUFQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2V0dGluZyBmb3Igc2F2aW5nIGVkaXRvcnMgYmVmb3JlIGxhdW5jaGluZy4KLQkgKiAKLQkgKiBAcmV0dXJuIGJ5dGUKLQkgKi8KLQlwdWJsaWMgYnl0ZSBnZXRTYXZlRWRpdG9ycygpIHsKLQkJcmV0dXJuIChieXRlKSBwcmVmZXJlbmNlcy5nZXRJbnQoUFJFRl9TQVZFX0VESVRPUlMpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIGZvciBzYXZpbmcgZWRpdG9ycyBiZWZvcmUgbGF1bmNoaW5nLgotCSAqIAotCSAqIEBwYXJhbSBiCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2F2ZUVkaXRvcnMoYnl0ZSBiKSB7Ci0JCXByZWZlcmVuY2VzLnNldFZhbHVlKFBSRUZfU0FWRV9FRElUT1JTLCBiKTsKLQkJU2VydmVyVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGVmYXVsdCBzZXR0aW5nIGZvciBvcGVuaW5nIHRoZSBzZXJ2ZXJzIHZpZXcgb24gYWN0aXZpdHkuCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0RGVmYXVsdFNob3dPbkFjdGl2aXR5KCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZXR0aW5nIGZvciBvcGVuaW5nIHRoZSBzZXJ2ZXJzIHZpZXcgb24gYWN0aXZpdHkuCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0U2hvd09uQWN0aXZpdHkoKSB7Ci0JCXJldHVybiBwcmVmZXJlbmNlcy5nZXRCb29sZWFuKFBSRUZfU0hPV19PTl9BQ1RJVklUWSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgZm9yIG9wZW5pbmcgdGhlIHNlcnZlcnMgdmlldyBvbiBhY3Rpdml0eS4KLQkgKiAKLQkgKiBAcGFyYW0gYgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNob3dPbkFjdGl2aXR5KGJvb2xlYW4gYikgewotCQlwcmVmZXJlbmNlcy5zZXRWYWx1ZShQUkVGX1NIT1dfT05fQUNUSVZJVFksIGIpOwotCQlTZXJ2ZXJVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbGlzdCBvZiBtb3N0IHJlY2VudGx5IHVzZWQgaG9zdG5hbWVzLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGhvc3RuYW1lcwotCSAqLwotCXB1YmxpYyBMaXN0IGdldEhvc3RuYW1lcygpIHsKLQkJU3RyaW5nIHMgPSBwcmVmZXJlbmNlcy5nZXRTdHJpbmcoUFJFRl9IT1NUX05BTUVTKTsKLQkJU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihzLCAifCp8Iik7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgewotCQkJbGlzdC5hZGQoc3QubmV4dFRva2VuKCkpOwotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCS8qKgotCSAqIEFkZCBhIG5ldyBob3N0bmFtZSB0byB0aGUgbW9zdCByZWNlbnRseSB1c2VkIGxpc3QuCi0JICogIAotCSAqIEBwYXJhbSBob3N0bmFtZQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEhvc3RuYW1lKFN0cmluZyBob3N0bmFtZSkgewotCQlpZiAoImxvY2FsaG9zdCIuZXF1YWxzKGhvc3RuYW1lKSkKLQkJCXJldHVybjsKLQkJCi0JCUxpc3QgbGlzdCA9IGdldEhvc3RuYW1lcygpOwotCQkKLQkJLy8gcmVtb3ZlIGR1cGxpY2F0ZXMKLQkJaWYgKGxpc3QuY29udGFpbnMoaG9zdG5hbWUpKQotCQkJbGlzdC5yZW1vdmUoaG9zdG5hbWUpOwotCQkKLQkJLy8gYWx3YXlzIGFkZCBzZWNvbmQgKGxlYXZlIGxvY2FsaG9zdCBmaXJzdCkKLQkJbGlzdC5hZGQoMSwgaG9zdG5hbWUpOwotCQkKLQkJLy8gcmVtb3ZlIGxlYXN0IHVzZWQgaG9zdG5hbWUKLQkJaWYgKGxpc3Quc2l6ZSgpID4gTUFYX0hPU1ROQU1FUykKLQkJCWxpc3QucmVtb3ZlKGxpc3Quc2l6ZSgpIC0gMSk7Ci0JCQotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlTdHJpbmcgcyA9IChTdHJpbmcpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCXNiLmFwcGVuZChzKTsKLQkJCXNiLmFwcGVuZCgifCp8Iik7Ci0JCX0KLQkJcHJlZmVyZW5jZXMuc2V0VmFsdWUoUFJFRl9IT1NUX05BTUVTLCBzYi50b1N0cmluZygpKTsKLQkJU2VydmVyVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvU3RhcnR1cC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvU3RhcnR1cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjZhZGE2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL1N0YXJ0dXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLklTdGFydHVwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5TZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnV0aWwuUHVibGlzaEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5hdWRpby5BdWRpbzsKLS8qKgotICoKLSAqLwotcHVibGljIGNsYXNzIFN0YXJ0dXAgaW1wbGVtZW50cyBJU3RhcnR1cCB7Ci0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuSVN0YXJ0dXAjc3RhcnR1cCgpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnR1cCgpIHsKLQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiQXVkaW8gc3RhcnR1cCIpOwotCi0JCWZpbmFsIElQdWJsaXNoTGlzdGVuZXIgcHVibGlzaExpc3RlbmVyID0gbmV3IFB1Ymxpc2hBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgcHVibGlzaEZpbmlzaGVkKElTZXJ2ZXIgc2VydmVyLCBJU3RhdHVzIHN0YXR1cykgewotCQkJCUF1ZGlvLnBsYXlTb3VuZCgib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5zb3VuZC5wdWJsaXNoRmluaXNoZWQiKTsKLQkJCX0KLQkJfTsKLQkJCi0JCWZpbmFsIElTZXJ2ZXJMaXN0ZW5lciBzZXJ2ZXJMaXN0ZW5lciA9IG5ldyBJU2VydmVyTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZXJ2ZXJDaGFuZ2VkKFNlcnZlckV2ZW50IGV2ZW50KSB7Ci0JCQkJaW50IGV2ZW50S2luZCA9IGV2ZW50LmdldEtpbmQoKTsKLQkJCQlJU2VydmVyIHNlcnZlciA9IGV2ZW50LmdldFNlcnZlcigpOwotCQkJCWlmIChldmVudEtpbmQgPT0gKFNlcnZlckV2ZW50LlNFUlZFUl9DSEFOR0UgfCBTZXJ2ZXJFdmVudC5TVEFURV9DSEFOR0UpKSB7Ci0JCQkJCWludCBzdGF0ZSA9IHNlcnZlci5nZXRTZXJ2ZXJTdGF0ZSgpOwotCQkJCQlpZiAoc3RhdGUgPT0gSVNlcnZlci5TVEFURV9TVEFSVEVEKQotCQkJCQkJQXVkaW8ucGxheVNvdW5kKCJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnNvdW5kLnNlcnZlclN0YXJ0Iik7Ci0JCQkJCWVsc2UgaWYgKHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfU1RPUFBFRCkKLQkJCQkJCUF1ZGlvLnBsYXlTb3VuZCgib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5zb3VuZC5zZXJ2ZXJTdG9wIik7Ci0JCQkJfQotCQkJfQotCQl9OwotCi0JCUlTZXJ2ZXJMaWZlY3ljbGVMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBJU2VydmVyTGlmZWN5Y2xlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZXJ2ZXJBZGRlZChJU2VydmVyIHNlcnZlcikgewotCQkJCXNlcnZlci5hZGRTZXJ2ZXJMaXN0ZW5lcihzZXJ2ZXJMaXN0ZW5lcik7Ci0JCQkJKChTZXJ2ZXIpIHNlcnZlcikuYWRkUHVibGlzaExpc3RlbmVyKHB1Ymxpc2hMaXN0ZW5lcik7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyB2b2lkIHNlcnZlckNoYW5nZWQoSVNlcnZlciBzZXJ2ZXIpIHsKLQkJCQkvLyBkbyBub3RoaW5nCi0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHNlcnZlclJlbW92ZWQoSVNlcnZlciBzZXJ2ZXIpIHsKLQkJCQlzZXJ2ZXIucmVtb3ZlU2VydmVyTGlzdGVuZXIoc2VydmVyTGlzdGVuZXIpOwotCQkJCSgoU2VydmVyKSBzZXJ2ZXIpLnJlbW92ZVB1Ymxpc2hMaXN0ZW5lcihwdWJsaXNoTGlzdGVuZXIpOwotCQkJfQotCQl9OwotCQlTZXJ2ZXJDb3JlLmFkZFNlcnZlckxpZmVjeWNsZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvVGVybWluYXRpb25EaWFsb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL1Rlcm1pbmF0aW9uRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExNGViNzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvVGVybWluYXRpb25EaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLS8qKgotICogRGlhbG9nIHRoYXQgcHJvbXB0cyBhIHVzZXIgdG8gc2VlIGlmIGEgc2VydmVyIHNob3VsZAotICogYmUgdGVybWluYXRlZC4KLSAqLwotcHVibGljIGNsYXNzIFRlcm1pbmF0aW9uRGlhbG9nIGV4dGVuZHMgRGlhbG9nIHsKLQlwcm90ZWN0ZWQgU3RyaW5nIHNlcnZlck5hbWU7Ci0KLQkvKioKLQkgKiBUZXJtaW5hdGlvbkRpYWxvZyBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnRTaGVsbCBhIHNoZWxsCi0JICogQHBhcmFtIHNlcnZlck5hbWUgYSBzZXJ2ZXIgbmFtZQotCSAqLwotCXB1YmxpYyBUZXJtaW5hdGlvbkRpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgU3RyaW5nIHNlcnZlck5hbWUpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwpOwotCQl0aGlzLnNlcnZlck5hbWUgPSBzZXJ2ZXJOYW1lOwotCQlzZXRCbG9ja09uT3Blbih0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIG5ld1NoZWxsKSB7Ci0JCXN1cGVyLmNvbmZpZ3VyZVNoZWxsKG5ld1NoZWxsKTsKLQkJbmV3U2hlbGwuc2V0VGV4dChNZXNzYWdlcy50ZXJtaW5hdGVTZXJ2ZXJEaWFsb2dUaXRsZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbmQgcmV0dXJucyB0aGUgY29udGVudHMgb2YgdGhlIHVwcGVyIHBhcnQgCi0JICogb2YgdGhpcyBkaWFsb2cgKGFib3ZlIHRoZSBidXR0b24gYmFyKS4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjb21wb3NpdGUgdG8gY29udGFpbiB0aGUgZGlhbG9nIGFyZWEKLQkgKiBAcmV0dXJuIHRoZSBkaWFsb2cgYXJlYSBjb250cm9sCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vIGNyZWF0ZSBhIGNvbXBvc2l0ZSB3aXRoIHN0YW5kYXJkIG1hcmdpbnMgYW5kIHNwYWNpbmcKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IGNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLlZFUlRJQ0FMX01BUkdJTik7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuSE9SSVpPTlRBTF9NQVJHSU4pOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuVkVSVElDQUxfU1BBQ0lORyk7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuSE9SSVpPTlRBTF9TUEFDSU5HKTsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCWNvbXBvc2l0ZS5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNvbXBvc2l0ZSwgQ29udGV4dElkcy5URVJNSU5BVEVfU0VSVkVSX0RJQUxPRyk7Ci0JCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULldSQVApOwotCQlsYWJlbC5zZXRUZXh0KE5MUy5iaW5kKE1lc3NhZ2VzLnRlcm1pbmF0ZVNlcnZlckRpYWxvZ01lc3NhZ2UsIG5ldyBTdHJpbmdbXSB7c2VydmVyTmFtZX0pKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLndpZHRoSGludCA9IDQwMDsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCi0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQoY29tcG9zaXRlKTsKLQkKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvVHJhY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL1RyYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiODg2YzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvVHJhY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotoCogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotLyoqCi0gKiBIZWxwZXIgY2xhc3MgdG8gcm91dGUgdHJhY2Ugb3V0cHV0LgotICovCi1wdWJsaWMgY2xhc3MgVHJhY2UgewotCXB1YmxpYyBzdGF0aWMgYnl0ZSBDT05GSUcgPSAwOwotCXB1YmxpYyBzdGF0aWMgYnl0ZSBJTkZPID0gMTsKLQlwdWJsaWMgc3RhdGljIGJ5dGUgV0FSTklORyA9IDI7Ci0JcHVibGljIHN0YXRpYyBieXRlIFNFVkVSRSA9IDM7Ci0JcHVibGljIHN0YXRpYyBieXRlIEZJTkVTVCA9IDQ7Ci0JcHVibGljIHN0YXRpYyBieXRlIEZJTkVSID0gNTsKLQlwdWJsaWMgc3RhdGljIGJ5dGUgUEVSRk9STUFOQ0UgPSA2OwotCXB1YmxpYyBzdGF0aWMgYnl0ZSBFWFRFTlNJT05fUE9JTlQgPSA3OwotCQotCXByb3RlY3RlZCBzdGF0aWMgaW50IHBsdWdpbkxlbmd0aCA9IC0xOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGxldmVsTmFtZXMgPSBuZXcgU3RyaW5nW10gewotCQkiQ09ORklHICIsICJJTkZPICAgIiwgIldBUk5JTkciLCAiU0VWRVJFICIsICJGSU5FUiAgIiwgIkZJTkVTVCAiLCAiUEVSRiAgICIsICJFWFRFTlNJT04ifTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgc3BhY2VyID0gIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFNpbXBsZURhdGVGb3JtYXQgc2RmID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoImRkL01NL3l5IEhIOm1tLnNzLlNTUyIpOwotCi0JLyoqCi0JICogVHJhY2UgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwcml2YXRlIFRyYWNlKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFRyYWNlIHRoZSBnaXZlbiB0ZXh0LgotCSAqCi0JICogQHBhcmFtIGxldmVsIGEgdHJhY2UgbGV2ZWwKLQkgKiBAcGFyYW0gcyBhIG1lc3NhZ2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2UoYnl0ZSBsZXZlbCwgU3RyaW5nIHMpIHsKLQkJdHJhY2UobGV2ZWwsIHMsIG51bGwpOwotCX0KLQkKLQkvKioKLQkgKiBUcmFjZSB0aGUgZ2l2ZW4gbWVzc2FnZSBhbmQgZXhjZXB0aW9uLgotCSAqCi0JICogQHBhcmFtIGxldmVsIGEgdHJhY2UgbGV2ZWwKLQkgKiBAcGFyYW0gcyBhIG1lc3NhZ2UKLQkgKiBAcGFyYW0gdCBhIHRocm93YWJsZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZShieXRlIGxldmVsLCBTdHJpbmcgcywgVGhyb3dhYmxlIHQpIHsKLQkJaWYgKCFTZXJ2ZXJVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmlzRGVidWdnaW5nKCkpCi0JCQlyZXR1cm47Ci0KLQkJU3RyaW5nIHBsdWdpbklkID0gU2VydmVyVUlQbHVnaW4uUExVR0lOX0lEOwotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKHBsdWdpbklkKTsKLQkJaWYgKHBsdWdpbklkLmxlbmd0aCgpID4gcGx1Z2luTGVuZ3RoKQotCQkJcGx1Z2luTGVuZ3RoID0gcGx1Z2luSWQubGVuZ3RoKCk7Ci0JCWVsc2UgaWYgKHBsdWdpbklkLmxlbmd0aCgpIDwgcGx1Z2luTGVuZ3RoKQotCQkJc2IuYXBwZW5kKHNwYWNlci5zdWJzdHJpbmcoMCwgcGx1Z2luTGVuZ3RoIC0gcGx1Z2luSWQubGVuZ3RoKCkpKTsKLQkJc2IuYXBwZW5kKCIgIik7Ci0JCXNiLmFwcGVuZChsZXZlbE5hbWVzW2xldmVsXSk7Ci0JCXNiLmFwcGVuZCgiICIpOwotCQlzYi5hcHBlbmQoc2RmLmZvcm1hdChuZXcgRGF0ZSgpKSk7Ci0JCXNiLmFwcGVuZCgiICIpOwotCQlzYi5hcHBlbmQocyk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbihzYi50b1N0cmluZygpKTsKLQkJaWYgKHQgIT0gbnVsbCkKLQkJCXQucHJpbnRTdGFja1RyYWNlKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL1dlYkxhdW5jaGFibGVDbGllbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL1dlYkxhdW5jaGFibGVDbGllbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI2OTRkMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9XZWJMYXVuY2hhYmxlQ2xpZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYnJvd3Nlci5JV2ViQnJvd3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5icm93c2VyLklXb3JrYmVuY2hCcm93c2VyU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuQ2xpZW50RGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnV0aWwuSHR0cExhdW5jaGFibGU7Ci0vKioKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJMYXVuY2hhYmxlQ2xpZW50IGV4dGVuZHMgQ2xpZW50RGVsZWdhdGUgewotCS8qCi0JICogQHNlZSBDbGllbnREZWxlZ2F0ZSNzdXBwb3J0cyhJTGF1bmNoYWJsZSkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhJU2VydmVyIHNlcnZlciwgT2JqZWN0IGxhdW5jaGFibGUsIFN0cmluZyBsYXVuY2hNb2RlKSB7Ci0JCXJldHVybiAobGF1bmNoYWJsZSBpbnN0YW5jZW9mIEh0dHBMYXVuY2hhYmxlKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ2xpZW50RGVsZWdhdGUjbGF1bmNoKElMYXVuY2hhYmxlKQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGxhdW5jaChJU2VydmVyIHNlcnZlciwgT2JqZWN0IGxhdW5jaGFibGUsIFN0cmluZyBsYXVuY2hNb2RlLCBJTGF1bmNoIGxhdW5jaCkgewotCQlIdHRwTGF1bmNoYWJsZSBodHRwID0gKEh0dHBMYXVuY2hhYmxlKSBsYXVuY2hhYmxlOwotCQl0cnkgewotCQkJSVdvcmtiZW5jaEJyb3dzZXJTdXBwb3J0IGJyb3dzZXJTdXBwb3J0ID0gU2VydmVyVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRXb3JrYmVuY2goKS5nZXRCcm93c2VyU3VwcG9ydCgpOwotCQkJSVdlYkJyb3dzZXIgYnJvd3NlciA9IGJyb3dzZXJTdXBwb3J0LmNyZWF0ZUJyb3dzZXIoSVdvcmtiZW5jaEJyb3dzZXJTdXBwb3J0LkxPQ0FUSU9OX0JBUiB8IElXb3JrYmVuY2hCcm93c2VyU3VwcG9ydC5OQVZJR0FUSU9OX0JBUiwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0JCQlicm93c2VyLm9wZW5VUkwoaHR0cC5nZXRVUkwoKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBvcGVuaW5nIGJyb3dzZXIiLCBlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvYWN0aW9ucy9BYnN0cmFjdFNlcnZlckFjdGlvbkRlbGVnYXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9hY3Rpb25zL0Fic3RyYWN0U2VydmVyQWN0aW9uRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE4ODIzZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9hY3Rpb25zL0Fic3RyYWN0U2VydmVyQWN0aW9uRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuRWNsaXBzZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlOwotLyoqCi0gKiAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U2VydmVyQWN0aW9uRGVsZWdhdGUgaW1wbGVtZW50cyBJQWN0aW9uRGVsZWdhdGUgewotCXByb3RlY3RlZCBMaXN0IHNlcnZlcnM7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHNlcnZlciBjYW4gY3VycmVudGx5IGJlIGFjdGVkIG9uLgotCSAqCi0JICogQHJldHVybiBib29sZWFuCi0JICogQHBhcmFtIHNlcnZlciBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGFjY2VwdChJU2VydmVyIHNlcnZlcik7Ci0KLQkvKioKLQkgKiBQZXJmb3JtIGFjdGlvbiBvbiB0aGlzIHNlcnZlci4KLQkgKiAKLQkgKiBAcGFyYW0gc2hlbGwgYSBzaGVsbAotCSAqIEBwYXJhbSBzZXJ2ZXIgYSBzZXJ2ZXIKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBwZXJmb3JtKFNoZWxsIHNoZWxsLCBJU2VydmVyIHNlcnZlcik7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjcnVuKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQlTaGVsbCBzaGVsbCA9IEVjbGlwc2VVdGlsLmdldFNoZWxsKCk7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gc2VydmVycy5pdGVyYXRvcigpOwotCQlPYmplY3Qgb2JqID0gaXRlcmF0b3IubmV4dCgpOwotCQlpZiAob2JqIGluc3RhbmNlb2YgSVNlcnZlcikgewotCQkJSVNlcnZlciBzZXJ2ZXIgPSAoSVNlcnZlcikgb2JqOwotCQkJaWYgKGFjY2VwdChzZXJ2ZXIpKQotCQkJCXBlcmZvcm0oc2hlbGwsIHNlcnZlcik7Ci0JCQlzZWxlY3Rpb25DaGFuZ2VkKGFjdGlvbiwgbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oc2VydmVycykpOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24sIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlzZXJ2ZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoc2VsZWN0aW9uLmlzRW1wdHkoKSB8fCAhKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFN0cnVjdHVyZWRTZWxlY3Rpb24pKSB7Ci0JCQlhY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWJvb2xlYW4gZW5hYmxlZCA9IGZhbHNlOwotCQlJdGVyYXRvciBpdGVyYXRvciA9ICgoU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3Qgb2JqID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElTZXJ2ZXIpIHsKLQkJCQlJU2VydmVyIHNlcnZlciA9IChJU2VydmVyKSBvYmo7Ci0JCQkJaWYgKGFjY2VwdChzZXJ2ZXIpKSB7Ci0JCQkJCXNlcnZlcnMuYWRkKHNlcnZlcik7Ci0JCQkJCWVuYWJsZWQgPSB0cnVlOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJYWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlhY3Rpb24uc2V0RW5hYmxlZChlbmFibGVkKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvYWN0aW9ucy9EZWJ1Z09uU2VydmVyQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9hY3Rpb25zL0RlYnVnT25TZXJ2ZXJBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTVhZGMzMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9hY3Rpb25zL0RlYnVnT25TZXJ2ZXJBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5JbWFnZVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci0vKioKLSAqICJEZWJ1ZyBvbiBTZXJ2ZXIiIG1lbnUgYWN0aW9uLiBBbGxvd3MgdGhlIHVzZXIgdG8gc2VsZWN0IGFuCi0gKiBvYmplY3QsIGFuZCBoYXZlIGF1dG9tYXRpYyBzZXJ2ZXIgY3JlYXRpb24sIGxhdW5jaGluZywgYW5kCi0gKiB0aGUgYXBwcm9wcmlhdGUgY2xpZW50IHRvIGFwcGVhci4gQSBuZXcgaW5zdGFuY2Ugb2YgdGhpcwotICogYWN0aW9uIG11c3QgYmUgY3JlYXRlZCBmb3IgZWFjaCBvYmplY3QgdGhhdCB0aGUgdXNlciBzZWxlY3RzLgotICovCi1wdWJsaWMgY2xhc3MgRGVidWdPblNlcnZlckFjdGlvbiBleHRlbmRzIEFjdGlvbiB7Ci0JcHJvdGVjdGVkIERlYnVnT25TZXJ2ZXJBY3Rpb25EZWxlZ2F0ZSBkZWxlZ2F0ZTsKLQotCS8qKgotCSAqIERlYnVnT25TZXJ2ZXJBY3Rpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSBvYmplY3QgdG8gYXR0ZW1wdCB0byBkZWJ1ZwotCSAqLwotCXB1YmxpYyBEZWJ1Z09uU2VydmVyQWN0aW9uKE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIoTWVzc2FnZXMuYWN0aW9uRGVidWdPblNlcnZlcik7Ci0JCi0JCXNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX0RUT09MX0RFQlVHX09OX1NFUlZFUikpOwotCQlzZXRIb3ZlckltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19DVE9PTF9ERUJVR19PTl9TRVJWRVIpKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX0VUT09MX0RFQlVHX09OX1NFUlZFUikpOwotCQotCQlkZWxlZ2F0ZSA9IG5ldyBEZWJ1Z09uU2VydmVyQWN0aW9uRGVsZWdhdGUoKTsKLQkJaWYgKG9iamVjdCAhPSBudWxsKSB7Ci0JCQlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG9iamVjdCk7Ci0JCQlkZWxlZ2F0ZS5zZWxlY3Rpb25DaGFuZ2VkKHRoaXMsIHNlbCk7Ci0JCX0gZWxzZQotCQkJZGVsZWdhdGUuc2VsZWN0aW9uQ2hhbmdlZCh0aGlzLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBJbXBsZW1lbnRhdGlvbiBvZiBtZXRob2QgZGVmaW5lZCBvbiA8Y29kZT5JQWN0aW9uPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCWRlbGVnYXRlLnJ1bih0aGlzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvYWN0aW9ucy9EZWJ1Z09uU2VydmVyQWN0aW9uRGVsZWdhdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2FjdGlvbnMvRGVidWdPblNlcnZlckFjdGlvbkRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4MTFlODcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvYWN0aW9ucy9EZWJ1Z09uU2VydmVyQWN0aW9uRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoTWFuYWdlcjsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWJ1Z09uU2VydmVyQWN0aW9uRGVsZWdhdGUgZXh0ZW5kcyBSdW5PblNlcnZlckFjdGlvbkRlbGVnYXRlIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdGFydCBtb2RlIHRoYXQgdGhlIHNlcnZlciBzaG91bGQgdXNlLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGF1bmNoTW9kZSgpIHsKLQkJcmV0dXJuIElMYXVuY2hNYW5hZ2VyLkRFQlVHX01PREU7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2FjdGlvbnMvRGVsZXRlQWN0aW9uRGVsZWdhdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2FjdGlvbnMvRGVsZXRlQWN0aW9uRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDgzNTk2Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9hY3Rpb25zL0RlbGV0ZUFjdGlvbkRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3LnNlcnZlcnMuRGVsZXRlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlOwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIERlbGV0ZUFjdGlvbkRlbGVnYXRlIGltcGxlbWVudHMgSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlIHsKLQlwcm90ZWN0ZWQgSVNlcnZlcltdIHNlcnZlcnM7Ci0JcHJvdGVjdGVkIFNoZWxsIHNoZWxsOwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlI2luaXQoSVdvcmtiZW5jaFdpbmRvdykKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7Ci0JCWlmICh3aW5kb3cgIT0gbnVsbCkKLQkJCXNoZWxsID0gd2luZG93LmdldFNoZWxsKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjcnVuKElBY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCWlmIChhY3Rpb24gIT0gbnVsbCAmJiBhY3Rpb24uaXNFbmFibGVkKCkgJiYgc2VydmVycyAhPSBudWxsKQotCQkJcmV0dXJuOwotCQlEZWxldGVBY3Rpb24gZGVsZXRlID0gbmV3IERlbGV0ZUFjdGlvbihzaGVsbCwgc2VydmVycyk7Ci0JCWRlbGV0ZS5ydW4oKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24sIElTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJc2VydmVycyA9IG51bGw7Ci0JCWlmIChzZWxlY3Rpb24gPT0gbnVsbCB8fCBzZWxlY3Rpb24uaXNFbXB0eSgpIHx8ICEoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pKSB7Ci0JCQlhY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3QgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBzZWxlY3QuaXRlcmF0b3IoKTsKLQkJCi0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCi0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBvYmogPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgSVNlcnZlcikKLQkJCQlsaXN0LmFkZChvYmopOwotCQkJZWxzZSB7Ci0JCQkJYWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQkKLQkJc2VydmVycyA9IG5ldyBJU2VydmVyW2xpc3Quc2l6ZSgpXTsKLQkJbGlzdC50b0FycmF5KHNlcnZlcnMpOwotCQlhY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvYWN0aW9ucy9MYXVuY2hXaXphcmRBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2FjdGlvbnMvTGF1bmNoV2l6YXJkQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExZWU3NjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvYWN0aW9ucy9MYXVuY2hXaXphcmRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotLyoqCi0gKiBBbiBhYnN0cmFjdCBhY3Rpb24gdGhhdCBvcGVucyB1cCBhIHdvcmtiZW5jaCB3aXphcmQgd2hlbiBydW4uCi0gKi8KLWFic3RyYWN0IGNsYXNzIExhdW5jaFdpemFyZEFjdGlvbiBleHRlbmRzIEFjdGlvbiB7Ci0JLyoqCi0JICogTGF1bmNoV2l6YXJkQWN0aW9uCi0JICovCi0JcHVibGljIExhdW5jaFdpemFyZEFjdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHdvcmtiZW5jaCB3aXphcmQgdGhhdCBzaG91bGQgYmUgb3BlbmVkLgotCSAqCi0JICogQHJldHVybiB0aGUgd2l6YXJkIHRvIG9wZW4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgSVdvcmtiZW5jaFdpemFyZCBnZXRXaXphcmQoKTsKLQotCS8qCi0JICogQHNlZSBJQWN0aW9uLnJ1bigpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlJV29ya2JlbmNoIHdvcmtiZW5jaCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCk7Ci0JCUlXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93ID0gd29ya2JlbmNoLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHdvcmtiZW5jaFdpbmRvdy5nZXRTZWxlY3Rpb25TZXJ2aWNlKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCi0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvblRvUGFzcyA9IG51bGw7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikKLQkJCXNlbGVjdGlvblRvUGFzcyA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQllbHNlCi0JCQlzZWxlY3Rpb25Ub1Bhc3MgPSBTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZOwotCQotCQlJV29ya2JlbmNoV2l6YXJkIHdpemFyZCA9IGdldFdpemFyZCgpOwotCQl3aXphcmQuaW5pdCh3b3JrYmVuY2gsIHNlbGVjdGlvblRvUGFzcyk7Ci0JCVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKHdvcmtiZW5jaC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpLCB3aXphcmQpOwotCQlkaWFsb2cub3BlbigpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9hY3Rpb25zL05ld1NlcnZlckFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvYWN0aW9ucy9OZXdTZXJ2ZXJBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRhOThlMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9hY3Rpb25zL05ld1NlcnZlckFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLkNsb3NhYmxlV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLk5ld1NlcnZlcldpemFyZDsKLS8qKgotICogQWN0aW9uIHRvIGNyZWF0ZSBhIG5ldyBzZXJ2ZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdTZXJ2ZXJBY3Rpb24gZXh0ZW5kcyBOZXdXaXphcmRBY3Rpb24gewotCXByb3RlY3RlZCBTdHJpbmdbXSBpZHM7Ci0JcHJvdGVjdGVkIFN0cmluZ1tdIHZhbHVlczsKLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBOZXdTZXJ2ZXJBY3Rpb24uCi0JICovCi0JcHVibGljIE5ld1NlcnZlckFjdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgTmV3U2VydmVyQWN0aW9uIHdpdGggc29tZSBpbml0aWFsIHRhc2sgbW9kZWwKLQkgKiBwcm9wZXJ0aWVzLgotCSAqIAotCSAqIEBwYXJhbSBpZHMKLQkgKiBAcGFyYW0gdmFsdWVzCi0JICovCi0JcHVibGljIE5ld1NlcnZlckFjdGlvbihTdHJpbmdbXSBpZHMsIFN0cmluZ1tdIHZhbHVlcykgewotCQlzdXBlcigpOwotCQl0aGlzLmlkcyA9IGlkczsKLQkJdGhpcy52YWx1ZXMgPSB2YWx1ZXM7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhpcyBhY3Rpb24uCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIGRlbGVnYXRpbmcgYWN0aW9uIGhhcyBiZWVuIHRyaWdnZXJlZC4KLQkgKiBJbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gZG8gdGhlIGFjdHVhbCB3b3JrLgotCSAqIDwvcD4KLQkgKgotCSAqIEBwYXJhbSBhY3Rpb24gdGhlIGFjdGlvbiBwcm94eSB0aGF0IGhhbmRsZXMgdGhlIHByZXNlbnRhdGlvbiBwb3J0aW9uIG9mIHRoZQotCSAqICAgYWN0aW9uCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCU5ld1NlcnZlcldpemFyZCB3aXphcmQgPSBudWxsOwotCQlpZiAoaWRzID09IG51bGwpCi0JCQl3aXphcmQgPSBuZXcgTmV3U2VydmVyV2l6YXJkKCk7Ci0JCWVsc2UKLQkJCXdpemFyZCA9IG5ldyBOZXdTZXJ2ZXJXaXphcmQoaWRzLCB2YWx1ZXMpOwotCQl3aXphcmQuaW5pdCh3b3JrYmVuY2gsIHNlbGVjdGlvbik7Ci0JCUNsb3NhYmxlV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBDbG9zYWJsZVdpemFyZERpYWxvZyh3b3JrYmVuY2guZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKSwgd2l6YXJkKTsKLQkJZGlhbG9nLm9wZW4oKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvYWN0aW9ucy9OZXdTZXJ2ZXJXaXphcmRBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2FjdGlvbnMvTmV3U2VydmVyV2l6YXJkQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjMWEyZjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvYWN0aW9ucy9OZXdTZXJ2ZXJXaXphcmRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLkltYWdlUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZC5OZXdTZXJ2ZXJXaXphcmQ7Ci0vKioKLSAqIEFuIGFjdGlvbiB0byBpbnZva2UgdGhlIG5ldyBzZXJ2ZXIgYW5kIHNlcnZlciBjb25maWd1cmF0aW9uIHdpemFyZC4KLSAqLwotcHVibGljIGNsYXNzIE5ld1NlcnZlcldpemFyZEFjdGlvbiBleHRlbmRzIExhdW5jaFdpemFyZEFjdGlvbiB7Ci0JcHJvdGVjdGVkIFN0cmluZ1tdIGlkczsKLQlwcm90ZWN0ZWQgU3RyaW5nW10gdmFsdWVzOwotCi0JLyoqCi0JICogTmV3IHNlcnZlciBhY3Rpb24uCi0JICovCi0JcHVibGljIE5ld1NlcnZlcldpemFyZEFjdGlvbigpIHsKLQkJc3VwZXIoKTsKLQkKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX0NUT09MX05FV19TRVJWRVIpKTsKLQkJc2V0VGV4dChNZXNzYWdlcy5hY3Rpb25TZXROZXdTZXJ2ZXIpOwotCX0KLQkKLQkvKioKLQkgKiBOZXcgc2VydmVyIGFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gaWRzIGlkcyB0byBwYXNzIGludG8gdGhlIGFjdGlvbgotCSAqIEBwYXJhbSB2YWx1ZXMgdmFsdWVzIHRvIHBhc3MgaW50byB0aGUgYWN0aW9uCi0JICovCi0JcHVibGljIE5ld1NlcnZlcldpemFyZEFjdGlvbihTdHJpbmdbXSBpZHMsIFN0cmluZ1tdIHZhbHVlcykgewotCQl0aGlzKCk7Ci0JCXRoaXMuaWRzID0gaWRzOwotCQl0aGlzLnZhbHVlcyA9IHZhbHVlczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHdpemFyZCB0aGF0IHNob3VsZCBiZSBvcGVuZWQuCi0JICoKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaXphcmQKLQkgKi8KLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaFdpemFyZCBnZXRXaXphcmQoKSB7Ci0JCXJldHVybiBuZXcgTmV3U2VydmVyV2l6YXJkKGlkcywgdmFsdWVzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvYWN0aW9ucy9OZXdXaXphcmRBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2FjdGlvbnMvTmV3V2l6YXJkQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmY2YzNmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvYWN0aW9ucy9OZXdXaXphcmRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZTsKLS8qKgotICogQWN0aW9uIHRvIGNyZWF0ZSBhIG5ldyBzZXJ2ZXIgZWxlbWVudCB0aHJvdWdoIGEgd2l6YXJkLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTmV3V2l6YXJkQWN0aW9uIGltcGxlbWVudHMgSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlIHsKLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaCB3b3JrYmVuY2g7Ci0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbjsKLQotCS8qKgotCSAqIE5ld1dpemFyZEFjdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBOZXdXaXphcmRBY3Rpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogRGlzcG9zZXMgdGhpcyBhY3Rpb24gZGVsZWdhdGUuICBUaGUgaW1wbGVtZW50b3Igc2hvdWxkIHVuaG9vayBhbnkgcmVmZXJlbmNlcwotCSAqIHRvIGl0c2VsZiBzbyB0aGF0IGdhcmJhZ2UgY29sbGVjdGlvbiBjYW4gb2NjdXIuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoaXMgYWN0aW9uIGRlbGVnYXRlIHdpdGggdGhlIHdvcmtiZW5jaCB3aW5kb3cgaXQgd2lsbCB3b3JrIGluLgotCSAqCi0JICogQHBhcmFtIHdpbmRvdyB0aGUgd2luZG93IHRoYXQgcHJvdmlkZXMgdGhlIGNvbnRleHQgZm9yIHRoaXMgZGVsZWdhdGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7Ci0JCXdvcmtiZW5jaCA9IHdpbmRvdy5nZXRXb3JrYmVuY2goKTsKLQl9Ci0KLQkvKioKLQkgKiBOb3RpZmllcyB0aGlzIGFjdGlvbiBkZWxlZ2F0ZSB0aGF0IHRoZSBzZWxlY3Rpb24gaW4gdGhlIHdvcmtiZW5jaCBoYXMgY2hhbmdlZC4KLQkgKiA8cD4KLQkgKiBJbXBsZW1lbnRlcnMgY2FuIHVzZSB0aGlzIG9wcG9ydHVuaXR5IHRvIGNoYW5nZSB0aGUgYXZhaWxhYmlsaXR5IG9mIHRoZQotCSAqIGFjdGlvbiBvciB0byBtb2RpZnkgb3RoZXIgcHJlc2VudGF0aW9uIHByb3BlcnRpZXMuCi0JICogPC9wPgotCSAqCi0JICogQHBhcmFtIGFjdGlvbiB0aGUgYWN0aW9uIHByb3h5IHRoYXQgaGFuZGxlcyBwcmVzZW50YXRpb24gcG9ydGlvbiBvZiB0aGUgYWN0aW9uCi0JICogQHBhcmFtIHNlbCB0aGUgY3VycmVudCBzZWxlY3Rpb24gaW4gdGhlIHdvcmtiZW5jaAotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsKSB7Ci0JCWlmIChzZWwgaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikKLQkJCXNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsOwotCQllbHNlCi0JCQlzZWxlY3Rpb24gPSBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9hY3Rpb25zL1Byb2ZpbGVPblNlcnZlckFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvYWN0aW9ucy9Qcm9maWxlT25TZXJ2ZXJBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY0ZDIwMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9hY3Rpb25zL1Byb2ZpbGVPblNlcnZlckFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLkltYWdlUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKLS8qKgotICogIlByb2ZpbGUgb24gU2VydmVyIiBtZW51IGFjdGlvbi4gQWxsb3dzIHRoZSB1c2VyIHRvIHNlbGVjdCBhbgotICogb2JqZWN0LCBhbmQgaGF2ZSBhdXRvbWF0aWMgc2VydmVyIGNyZWF0aW9uLCBsYXVuY2hpbmcsIGFuZAotICogdGhlIGFwcHJvcHJpYXRlIGNsaWVudCB0byBhcHBlYXIuIEEgbmV3IGluc3RhbmNlIG9mIHRoaXMKLSAqIGFjdGlvbiBtdXN0IGJlIGNyZWF0ZWQgZm9yIGVhY2ggb2JqZWN0IHRoYXQgdGhlIHVzZXIgc2VsZWN0cy4KLSAqLwotcHVibGljIGNsYXNzIFByb2ZpbGVPblNlcnZlckFjdGlvbiBleHRlbmRzIEFjdGlvbiB7Ci0JcHJvdGVjdGVkIFByb2ZpbGVPblNlcnZlckFjdGlvbkRlbGVnYXRlIGRlbGVnYXRlOwotCi0JLyoqCi0JICogUHJvZmlsZSBhbiBvYmplY3Qgb24gc2VydmVyLgotCSAqIAotCSAqIEBwYXJhbSBvYmplY3QgdGhlIG9iamVjdCB0byBhdHRlbXB0IHRvIGRlYnVnCi0JICovCi0JcHVibGljIFByb2ZpbGVPblNlcnZlckFjdGlvbihPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyKE1lc3NhZ2VzLmFjdGlvblByb2ZpbGVPblNlcnZlcik7Ci0JCi0JCXNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX0RUT09MX1BST0ZJTEVfT05fU0VSVkVSKSk7Ci0JCXNldEhvdmVySW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX0NUT09MX1BST0ZJTEVfT05fU0VSVkVSKSk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19FVE9PTF9QUk9GSUxFX09OX1NFUlZFUikpOwotCQotCQlkZWxlZ2F0ZSA9IG5ldyBQcm9maWxlT25TZXJ2ZXJBY3Rpb25EZWxlZ2F0ZSgpOwotCQlpZiAob2JqZWN0ICE9IG51bGwpIHsKLQkJCVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24ob2JqZWN0KTsKLQkJCWRlbGVnYXRlLnNlbGVjdGlvbkNoYW5nZWQodGhpcywgc2VsKTsKLQkJfSBlbHNlCi0JCQlkZWxlZ2F0ZS5zZWxlY3Rpb25DaGFuZ2VkKHRoaXMsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIEltcGxlbWVudGF0aW9uIG9mIG1ldGhvZCBkZWZpbmVkIG9uIDxjb2RlPklBY3Rpb248L2NvZGU+LgotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJZGVsZWdhdGUucnVuKHRoaXMpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9hY3Rpb25zL1Byb2ZpbGVPblNlcnZlckFjdGlvbkRlbGVnYXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9hY3Rpb25zL1Byb2ZpbGVPblNlcnZlckFjdGlvbkRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyOWEwYWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvYWN0aW9ucy9Qcm9maWxlT25TZXJ2ZXJBY3Rpb25EZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hNYW5hZ2VyOwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFByb2ZpbGVPblNlcnZlckFjdGlvbkRlbGVnYXRlIGV4dGVuZHMgUnVuT25TZXJ2ZXJBY3Rpb25EZWxlZ2F0ZSB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RhcnQgbW9kZSB0aGF0IHRoZSBzZXJ2ZXIgc2hvdWxkIHVzZS4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhdW5jaE1vZGUoKSB7Ci0JCXJldHVybiBJTGF1bmNoTWFuYWdlci5QUk9GSUxFX01PREU7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2FjdGlvbnMvUnVuT25TZXJ2ZXJBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2FjdGlvbnMvUnVuT25TZXJ2ZXJBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc2NDJkMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9hY3Rpb25zL1J1bk9uU2VydmVyQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuSW1hZ2VSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLk1lc3NhZ2VzOwotLyoqCi0gKiAiUnVuIG9uIFNlcnZlciIgbWVudSBhY3Rpb24uIEFsbG93cyB0aGUgdXNlciB0byBzZWxlY3QgYW4KLSAqIG9iamVjdCwgYW5kIGhhdmUgYXV0b21hdGljIHNlcnZlciBjcmVhdGlvbiwgbGF1bmNoaW5nLCBhbmQKLSAqIHRoZSBhcHByb3ByaWF0ZSBjbGllbnQgdG8gYXBwZWFyLiBBIG5ldyBpbnN0YW5jZSBvZiB0aGlzCi0gKiBhY3Rpb24gbXVzdCBiZSBjcmVhdGVkIGZvciBlYWNoIG9iamVjdCB0aGF0IHRoZSB1c2VyIHNlbGVjdHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBSdW5PblNlcnZlckFjdGlvbiBleHRlbmRzIEFjdGlvbiB7Ci0JcHJvdGVjdGVkIFJ1bk9uU2VydmVyQWN0aW9uRGVsZWdhdGUgZGVsZWdhdGU7Ci0KLQkvKioKLQkgKiBSdW4gb24gc2VydmVyIGFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSBvYmplY3QgdG8gYXR0ZW1wdCB0byBkZWJ1ZwotCSAqLwotCXB1YmxpYyBSdW5PblNlcnZlckFjdGlvbihPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyKE1lc3NhZ2VzLmFjdGlvblJ1bk9uU2VydmVyKTsKLQkKLQkJc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfRFRPT0xfUlVOX09OX1NFUlZFUikpOwotCQlzZXRIb3ZlckltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19DVE9PTF9SVU5fT05fU0VSVkVSKSk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19FVE9PTF9SVU5fT05fU0VSVkVSKSk7Ci0JCi0JCWRlbGVnYXRlID0gbmV3IFJ1bk9uU2VydmVyQWN0aW9uRGVsZWdhdGUoKTsKLQkJaWYgKG9iamVjdCAhPSBudWxsKSB7Ci0JCQlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG9iamVjdCk7Ci0JCQlkZWxlZ2F0ZS5zZWxlY3Rpb25DaGFuZ2VkKHRoaXMsIHNlbCk7Ci0JCX0gZWxzZQotCQkJZGVsZWdhdGUuc2VsZWN0aW9uQ2hhbmdlZCh0aGlzLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBJbXBsZW1lbnRhdGlvbiBvZiBtZXRob2QgZGVmaW5lZCBvbiA8Y29kZT5JQWN0aW9uPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCWRlbGVnYXRlLnJ1bih0aGlzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvYWN0aW9ucy9SdW5PblNlcnZlckFjdGlvbkRlbGVnYXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9hY3Rpb25zL1J1bk9uU2VydmVyQWN0aW9uRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEyM2U3YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9hY3Rpb25zL1J1bk9uU2VydmVyQWN0aW9uRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLaAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRXJyb3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLklDbGllbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLklMYXVuY2hhYmxlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuUHVibGlzaFNlcnZlckpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuUmVzdGFydFNlcnZlckpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuU2VydmVyUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5TZXJ2ZXJUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5TdGFydFNlcnZlckpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZTsKLS8qKgotICogU3VwcG9ydCBmb3Igc3RhcnRpbmcvc3RvcHBpbmcgc2VydmVyIGFuZCBjbGllbnRzIGZvciByZXNvdXJjZXMgcnVubmluZyBvbiBhIHNlcnZlci4KLSAqLwotcHVibGljIGNsYXNzIFJ1bk9uU2VydmVyQWN0aW9uRGVsZWdhdGUgaW1wbGVtZW50cyBJV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUgewotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nW10gbGF1bmNoTW9kZXMgPSB7Ci0JCUlMYXVuY2hNYW5hZ2VyLlJVTl9NT0RFLCBJTGF1bmNoTWFuYWdlci5ERUJVR19NT0RFLCBJTGF1bmNoTWFuYWdlci5QUk9GSUxFX01PREUgfTsKLQotCXByb3RlY3RlZCBPYmplY3Qgc2VsZWN0aW9uOwotCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hXaW5kb3cgd2luZG93OwotCi0JcHJvdGVjdGVkIHN0YXRpYyBPYmplY3QgZ2xvYmFsU2VsZWN0aW9uOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBNYXAgZ2xvYmFsTGF1bmNoTW9kZTsKLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiB0YXNrc1J1bjsKLQotCS8qKgotCSAqIFJ1bk9uU2VydmVyQWN0aW9uRGVsZWdhdGUgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgUnVuT25TZXJ2ZXJBY3Rpb25EZWxlZ2F0ZSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwb3NlcyB0aGlzIGFjdGlvbiBkZWxlZ2F0ZS4gIFRoZSBpbXBsZW1lbnRvciBzaG91bGQgdW5ob29rIGFueSByZWZlcmVuY2VzCi0JICogdG8gaXRzZWxmIHNvIHRoYXQgZ2FyYmFnZSBjb2xsZWN0aW9uIGNhbiBvY2N1ci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQl3aW5kb3cgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoaXMgYWN0aW9uIGRlbGVnYXRlIHdpdGggdGhlIHdvcmtiZW5jaCB3aW5kb3cgaXQgd2lsbCB3b3JrIGluLgotCSAqCi0JICogQHBhcmFtIG5ld1dpbmRvdyB0aGUgd2luZG93IHRoYXQgcHJvdmlkZXMgdGhlIGNvbnRleHQgZm9yIHRoaXMgZGVsZWdhdGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2hXaW5kb3cgbmV3V2luZG93KSB7Ci0JCXdpbmRvdyA9IG5ld1dpbmRvdzsKLQl9Ci0JCi0JcHVibGljIElTZXJ2ZXIgZ2V0U2VydmVyKElNb2R1bGUgbW9kdWxlLCBTdHJpbmcgbGF1bmNoTW9kZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCUlTZXJ2ZXIgc2VydmVyID0gU2VydmVyQ29yZS5nZXREZWZhdWx0U2VydmVyKG1vZHVsZSk7Ci0JCQotCQkvLyBpZ25vcmUgcHJlZmVyZW5jZSBpZiB0aGUgc2VydmVyIGRvZXNuJ3Qgc3VwcG9ydCB0aGlzIG1vZGUuCi0JCWlmIChzZXJ2ZXIgIT0gbnVsbCAmJiAhU2VydmVyVUlQbHVnaW4uaXNDb21wYXRpYmxlV2l0aExhdW5jaE1vZGUoc2VydmVyLCBsYXVuY2hNb2RlKSkKLQkJCXNlcnZlciA9IG51bGw7Ci0JCQotCQlpZiAoc2VydmVyICE9IG51bGwgJiYgIVNlcnZlclV0aWwuY29udGFpbnNNb2R1bGUoc2VydmVyLCBtb2R1bGUsIG1vbml0b3IpKSB7Ci0JCQlJU2VydmVyV29ya2luZ0NvcHkgd2MgPSBzZXJ2ZXIuY3JlYXRlV29ya2luZ0NvcHkoKTsKLQkJCXRyeSB7Ci0JCQkJU2VydmVyVXRpbC5tb2RpZnlNb2R1bGVzKHdjLCBuZXcgSU1vZHVsZVtdIHsgbW9kdWxlIH0sIG5ldyBJTW9kdWxlWzBdLCBtb25pdG9yKTsKLQkJCQl3Yy5zYXZlKGZhbHNlLCBtb25pdG9yKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3QgYWRkIG1vZHVsZSB0byBzZXJ2ZXIiLCBjZSk7Ci0JCQkJc2VydmVyID0gbnVsbDsKLQkJCX0KLQkJfQotCQkKLQkJU2hlbGwgc2hlbGw7Ci0JCWlmICh3aW5kb3cgIT0gbnVsbCkKLQkJCXNoZWxsID0gd2luZG93LmdldFNoZWxsKCk7Ci0JCWVsc2UKLQkJCXNoZWxsID0gU2VydmVyVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpOwotCi0JCWlmIChzZXJ2ZXIgPT0gbnVsbCkgewotCQkJLy8gdHJ5IHRoZSBmdWxsIHdpemFyZAotCQkJUnVuT25TZXJ2ZXJXaXphcmQgd2l6YXJkID0gbmV3IFJ1bk9uU2VydmVyV2l6YXJkKG1vZHVsZSwgbGF1bmNoTW9kZSk7Ci0JCQlDbG9zYWJsZVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgQ2xvc2FibGVXaXphcmREaWFsb2coc2hlbGwsIHdpemFyZCk7Ci0JCQlpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuQ0FOQ0VMKSB7Ci0JCQkJbW9uaXRvci5zZXRDYW5jZWxlZCh0cnVlKTsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJdHJ5IHsKLQkJCQlQbGF0Zm9ybS5nZXRKb2JNYW5hZ2VyKCkuam9pbigib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5mYW1pbHkiLCBudWxsKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIkVycm9yIHdhaXRpbmcgZm9yIGpvYiIsIGUpOwotCQkJfQotCQkJc2VydmVyID0gd2l6YXJkLmdldFNlcnZlcigpOwotCQkJYm9vbGVhbiBwcmVmZXJyZWQgPSB3aXphcmQuaXNQcmVmZXJyZWRTZXJ2ZXIoKTsKLQkJCXRhc2tzUnVuID0gdHJ1ZTsKLQotCQkJLy8gc2V0IHByZWZlcnJlZCBzZXJ2ZXIgaWYgcmVxdWVzdGVkCi0JCQlpZiAoc2VydmVyICE9IG51bGwgJiYgcHJlZmVycmVkKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJU2VydmVyQ29yZS5zZXREZWZhdWx0U2VydmVyKG1vZHVsZSwgc2VydmVyLCBtb25pdG9yKTsKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkJCVN0cmluZyBtZXNzYWdlID0gTWVzc2FnZXMuZXJyb3JDb3VsZE5vdFNhdmVQcmVmZXJlbmNlOwotCQkJCQlFcnJvckRpYWxvZy5vcGVuRXJyb3Ioc2hlbGwsIE1lc3NhZ2VzLmVycm9yRGlhbG9nVGl0bGUsIG1lc3NhZ2UsIGNlLmdldFN0YXR1cygpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXRyeSB7Ci0JCQlQbGF0Zm9ybS5nZXRKb2JNYW5hZ2VyKCkuam9pbigib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5mYW1pbHkiLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJFcnJvciB3YWl0aW5nIGZvciBqb2IiLCBlKTsKLQkJfQotCQkKLQkJcmV0dXJuIHNlcnZlcjsKLQl9Ci0KLQkvKioKLQkgKiBSdW4gdGhlIHJlc291cmNlIG9uIGEgc2VydmVyLgotCSAqCi0JICogQHBhcmFtIG1vbml0b3Igb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCVN0cmluZyBsYXVuY2hNb2RlID0gZ2V0TGF1bmNoTW9kZSgpOwotCQlJTW9kdWxlQXJ0aWZhY3QgbW9kdWxlQXJ0aWZhY3QgPSBTZXJ2ZXJQbHVnaW4ubG9hZE1vZHVsZUFydGlmYWN0KHNlbGVjdGlvbik7Ci0JCQotCQlTaGVsbCBzaGVsbDsKLQkJaWYgKHdpbmRvdyAhPSBudWxsKQotCQkJc2hlbGwgPSB3aW5kb3cuZ2V0U2hlbGwoKTsKLQkJZWxzZQotCQkJc2hlbGwgPSBTZXJ2ZXJVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCk7Ci0KLQkJaWYgKG1vZHVsZUFydGlmYWN0ID09IG51bGwgfHwgbW9kdWxlQXJ0aWZhY3QuZ2V0TW9kdWxlKCkgPT0gbnVsbCkgewotCQkJRWNsaXBzZVV0aWwub3BlbkVycm9yKE1lc3NhZ2VzLmVycm9yTm9Nb2R1bGVzKTsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIk5vIG1vZHVsZXMiKTsKLQkJCXJldHVybjsKLQkJfQotCQlJTW9kdWxlIG1vZHVsZSA9IG1vZHVsZUFydGlmYWN0LmdldE1vZHVsZSgpOwotCi0JCS8vIGNoZWNrIGZvciBzZXJ2ZXJzIHdpdGggdGhlIGdpdmVuIHN0YXJ0IG1vZGUKLQkJSVNlcnZlcltdIHNlcnZlcnMgPSBTZXJ2ZXJDb3JlLmdldFNlcnZlcnMoKTsKLQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQlpZiAoc2VydmVycyAhPSBudWxsKSB7Ci0JCQlpbnQgc2l6ZSA9IHNlcnZlcnMubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplICYmICFmb3VuZDsgaSsrKSB7Ci0JCQkJaWYgKFNlcnZlclVJUGx1Z2luLmlzQ29tcGF0aWJsZVdpdGhMYXVuY2hNb2RlKHNlcnZlcnNbaV0sIGxhdW5jaE1vZGUpKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJTW9kdWxlW10gcGFyZW50cyA9IHNlcnZlcnNbaV0uZ2V0Um9vdE1vZHVsZXMobW9kdWxlLCBtb25pdG9yKTsKLQkJCQkJCWlmIChwYXJlbnRzICE9IG51bGwgJiYgcGFyZW50cy5sZW5ndGggPiAwKQotCQkJCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIGlnbm9yZQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKCFmb3VuZCkgewotCQkJLy8gbm8gZXhpc3Rpbmcgc2VydmVyIHN1cHBvcnRzIHRoZSBwcm9qZWN0IGFuZCBzdGFydCBtb2RlIQotCQkJLy8gY2hlY2sgaWYgdGhlcmUgbWlnaHQgYmUgYW5vdGhlciBvbmUgdGhhdCBjYW4gYmUgY3JlYXRlZAotCQkJSVNlcnZlclR5cGVbXSBzZXJ2ZXJUeXBlcyA9IFNlcnZlckNvcmUuZ2V0U2VydmVyVHlwZXMoKTsKLQkJCWJvb2xlYW4gZm91bmQyID0gZmFsc2U7Ci0JCQlpZiAoc2VydmVyVHlwZXMgIT0gbnVsbCkgewotCQkJCWludCBzaXplID0gc2VydmVyVHlwZXMubGVuZ3RoOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZSAmJiAhZm91bmQyOyBpKyspIHsKLQkJCQkJSVNlcnZlclR5cGUgdHlwZSA9IHNlcnZlclR5cGVzW2ldOwotCQkJCQlJTW9kdWxlVHlwZVtdIG1vZHVsZVR5cGVzID0gdHlwZS5nZXRSdW50aW1lVHlwZSgpLmdldE1vZHVsZVR5cGVzKCk7Ci0JCQkJCWlmICh0eXBlLnN1cHBvcnRzTGF1bmNoTW9kZShsYXVuY2hNb2RlKSAmJiBTZXJ2ZXJVdGlsLmlzU3VwcG9ydGVkTW9kdWxlKG1vZHVsZVR5cGVzLCBtb2R1bGUuZ2V0TW9kdWxlVHlwZSgpKSkgewotCQkJCQkJZm91bmQyID0gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmICghZm91bmQyKSB7Ci0JCQkJRWNsaXBzZVV0aWwub3BlbkVycm9yKE1lc3NhZ2VzLmVycm9yTm9TZXJ2ZXIpOwotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIk5vIHNlcnZlciBmb3Igc3RhcnQgbW9kZSIpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKCFTZXJ2ZXJVSVBsdWdpbi5zYXZlRWRpdG9ycygpKQotCQkJcmV0dXJuOwotCi0JCXRhc2tzUnVuID0gZmFsc2U7Ci0JCUlTZXJ2ZXIgc2VydmVyID0gZ2V0U2VydmVyKG1vZHVsZSwgbGF1bmNoTW9kZSwgbW9uaXRvcik7Ci0JCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCXJldHVybjsKLQkJCi0JCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIlNlcnZlcjogIiArIHNlcnZlcik7Ci0JCQotCQlpZiAoc2VydmVyID09IG51bGwpIHsKLQkJCUVjbGlwc2VVdGlsLm9wZW5FcnJvcihNZXNzYWdlcy5lcnJvck5vU2VydmVyKTsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIk5vIHNlcnZlciBmb3VuZCIpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKCFTZXJ2ZXJVSVBsdWdpbi5wcm9tcHRJZkRpcnR5KHNoZWxsLCBzZXJ2ZXIpKQotCQkJcmV0dXJuOwotCQkKLQkJaWYgKCF0YXNrc1J1bikgewotCQkJU2VsZWN0VGFza3NXaXphcmQgd2l6YXJkID0gbmV3IFNlbGVjdFRhc2tzV2l6YXJkKHNlcnZlcik7Ci0JCQl3aXphcmQuYWRkUGFnZXMoKTsKLQkJCWlmICh3aXphcmQuaGFzVGFza3MoKSAmJiB3aXphcmQuaGFzT3B0aW9uYWxUYXNrcygpKSB7Ci0JCQkJV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2coc2hlbGwsIHdpemFyZCk7Ci0JCQkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93LkNBTkNFTCkKLQkJCQkJcmV0dXJuOwotCQkJfSBlbHNlCi0JCQkJd2l6YXJkLnBlcmZvcm1GaW5pc2goKTsKLQkJfQotCQkKLQkJLy8gZ2V0IHRoZSBsYXVuY2hhYmxlIGFkYXB0ZXIgYW5kIG1vZHVsZSBvYmplY3QKLQkJSUxhdW5jaGFibGVBZGFwdGVyIGxhdW5jaGFibGVBZGFwdGVyID0gbnVsbDsKLQkJT2JqZWN0IGxhdW5jaGFibGUgPSBudWxsOwotCQlJTGF1bmNoYWJsZUFkYXB0ZXJbXSBhZGFwdGVycyA9IFNlcnZlclBsdWdpbi5nZXRMYXVuY2hhYmxlQWRhcHRlcnMoKTsKLQkJaWYgKGFkYXB0ZXJzICE9IG51bGwpIHsKLQkJCWludCBzaXplMiA9IGFkYXB0ZXJzLmxlbmd0aDsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgc2l6ZTI7IGorKykgewotCQkJCUlMYXVuY2hhYmxlQWRhcHRlciBhZGFwdGVyID0gYWRhcHRlcnNbal07Ci0JCQkJdHJ5IHsKLQkJCQkJT2JqZWN0IGxhdW5jaGFibGUyID0gYWRhcHRlci5nZXRMYXVuY2hhYmxlKHNlcnZlciwgbW9kdWxlQXJ0aWZhY3QpOwotCQkJCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJhZGFwdGVyPSAiICsgYWRhcHRlciArICIsIGxhdW5jaGFibGU9ICIgKyBsYXVuY2hhYmxlMik7Ci0JCQkJCWlmIChsYXVuY2hhYmxlMiAhPSBudWxsKSB7Ci0JCQkJCQlsYXVuY2hhYmxlQWRhcHRlciA9IGFkYXB0ZXI7Ci0JCQkJCQlsYXVuY2hhYmxlID0gbGF1bmNoYWJsZTI7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBpbiBsYXVuY2hhYmxlIGFkYXB0ZXIiLCBlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCUlDbGllbnRbXSBjbGllbnRzID0gbmV3IElDbGllbnRbMF07Ci0JCWlmIChsYXVuY2hhYmxlICE9IG51bGwpCi0JCQljbGllbnRzID0gZ2V0Q2xpZW50cyhzZXJ2ZXIsIGxhdW5jaGFibGUsIGxhdW5jaE1vZGUpOwotCQkKLQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiTGF1bmNoYWJsZSBjbGllbnRzOiAiICsgY2xpZW50cyk7Ci0JCQotCQlJQ2xpZW50IGNsaWVudCA9IG51bGw7Ci0JCWlmIChjbGllbnRzID09IG51bGwgfHwgY2xpZW50cy5sZW5ndGggPT0gMCkgewotCQkJRWNsaXBzZVV0aWwub3BlbkVycm9yKE1lc3NhZ2VzLmVycm9yTm9DbGllbnQpOwotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiTm8gbGF1bmNoYWJsZSBjbGllbnRzISIpOwotCQkJcmV0dXJuOwotCQl9IGVsc2UgaWYgKGNsaWVudHMubGVuZ3RoID09IDEpIHsKLQkJCWNsaWVudCA9IGNsaWVudHNbMF07Ci0JCX0gZWxzZSB7Ci0JCQlTZWxlY3RDbGllbnRXaXphcmQgd2l6YXJkID0gbmV3IFNlbGVjdENsaWVudFdpemFyZChjbGllbnRzKTsKLQkJCUNsb3NhYmxlV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBDbG9zYWJsZVdpemFyZERpYWxvZyhzaGVsbCwgd2l6YXJkKTsKLQkJCWRpYWxvZy5vcGVuKCk7Ci0JCQljbGllbnQgPSB3aXphcmQuZ2V0U2VsZWN0ZWRDbGllbnQoKTsKLQkJCWlmIChjbGllbnQgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCX0KLQkJCi0JCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIlJlYWR5IHRvIGxhdW5jaCIpOwotCQkKLQkJLy8gc3RhcnQgc2VydmVyIGlmIGl0J3Mgbm90IGFscmVhZHkgc3RhcnRlZAotCQkvLyBhbmQgY3VlIHRoZSBjbGllbnQgdG8gc3RhcnQKLQkJSU1vZHVsZVtdIG1vZHVsZXMgPSBuZXcgSU1vZHVsZVtdIHsgbW9kdWxlIH07IC8vIFRPRE86IGdldCBwYXJlbnQgaGVpcmFyY2h5IGNvcnJlY3QKLQkJaW50IHN0YXRlID0gc2VydmVyLmdldFNlcnZlclN0YXRlKCk7Ci0JCWlmIChzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1NUQVJUSU5HKSB7Ci0JCQlMYXVuY2hDbGllbnRKb2IgY2xpZW50Sm9iID0gbmV3IExhdW5jaENsaWVudEpvYihzZXJ2ZXIsIG1vZHVsZXMsIGxhdW5jaE1vZGUsIG1vZHVsZUFydGlmYWN0LCBsYXVuY2hhYmxlQWRhcHRlciwgY2xpZW50KTsKLQkJCWNsaWVudEpvYi5zY2hlZHVsZSgpOwotCQl9IGVsc2UgaWYgKHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfU1RBUlRFRCkgewotCQkJYm9vbGVhbiByZXN0YXJ0ID0gZmFsc2U7Ci0JCQlTdHJpbmcgbW9kZSA9IHNlcnZlci5nZXRNb2RlKCk7Ci0JCQlpZiAoIUlMYXVuY2hNYW5hZ2VyLkRFQlVHX01PREUuZXF1YWxzKG1vZGUpICYmIElMYXVuY2hNYW5hZ2VyLkRFQlVHX01PREUuZXF1YWxzKGxhdW5jaE1vZGUpKSB7Ci0JCQkJaW50IHJlc3VsdCA9IG9wZW5XYXJuaW5nRGlhbG9nKHNoZWxsLCBNZXNzYWdlcy5kaWFsb2dNb2RlV2FybmluZ0RlYnVnKTsKLQkJCQlpZiAocmVzdWx0ID09IDEpCi0JCQkJCWxhdW5jaE1vZGUgPSBtb2RlOwotCQkJCWVsc2UgaWYgKHJlc3VsdCA9PSAwKQotCQkJCQlyZXN0YXJ0ID0gdHJ1ZTsKLQkJCQllbHNlCi0JCQkJCXJldHVybjsKLQkJCX0gZWxzZSBpZiAoIUlMYXVuY2hNYW5hZ2VyLlBST0ZJTEVfTU9ERS5lcXVhbHMobW9kZSkgJiYgSUxhdW5jaE1hbmFnZXIuUFJPRklMRV9NT0RFLmVxdWFscyhsYXVuY2hNb2RlKSkgewotCQkJCWludCByZXN1bHQgPSBvcGVuV2FybmluZ0RpYWxvZyhzaGVsbCwgTWVzc2FnZXMuZGlhbG9nTW9kZVdhcm5pbmdQcm9maWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IDEpCi0JCQkJCWxhdW5jaE1vZGUgPSBtb2RlOwotCQkJCWVsc2UgaWYgKHJlc3VsdCA9PSAwKQotCQkJCQlyZXN0YXJ0ID0gdHJ1ZTsKLQkJCQllbHNlCi0JCQkJCXJldHVybjsKLQkJCX0KLQkJCQotCQkJUHVibGlzaFNlcnZlckpvYiBwdWJsaXNoSm9iID0gbmV3IFB1Ymxpc2hTZXJ2ZXJKb2Ioc2VydmVyLCBJU2VydmVyLlBVQkxJU0hfSU5DUkVNRU5UQUwsIGZhbHNlKTsKLQkJCUxhdW5jaENsaWVudEpvYiBjbGllbnRKb2IgPSBuZXcgTGF1bmNoQ2xpZW50Sm9iKHNlcnZlciwgbW9kdWxlcywgbGF1bmNoTW9kZSwgbW9kdWxlQXJ0aWZhY3QsIGxhdW5jaGFibGVBZGFwdGVyLCBjbGllbnQpOwotCQkJcHVibGlzaEpvYi5zZXROZXh0Sm9iKGNsaWVudEpvYik7Ci0JCQkKLQkJCWlmIChyZXN0YXJ0KSB7Ci0JCQkJUmVzdGFydFNlcnZlckpvYiByZXN0YXJ0Sm9iID0gbmV3IFJlc3RhcnRTZXJ2ZXJKb2Ioc2VydmVyLCBsYXVuY2hNb2RlKTsKLQkJCQlyZXN0YXJ0Sm9iLnNldE5leHRKb2IocHVibGlzaEpvYik7Ci0JCQkJcmVzdGFydEpvYi5zY2hlZHVsZSgpOwotCQkJfSBlbHNlCi0JCQkJcHVibGlzaEpvYi5zY2hlZHVsZSgpOwotCQl9IGVsc2UgaWYgKHN0YXRlICE9IElTZXJ2ZXIuU1RBVEVfU1RPUFBJTkcpIHsKLQkJCVB1Ymxpc2hTZXJ2ZXJKb2IgcHVibGlzaEpvYiA9IG5ldyBQdWJsaXNoU2VydmVySm9iKHNlcnZlcik7Ci0JCQlTdGFydFNlcnZlckpvYiBzdGFydFNlcnZlckpvYiA9IG5ldyBTdGFydFNlcnZlckpvYihzZXJ2ZXIsIGxhdW5jaE1vZGUpOwotCQkJTGF1bmNoQ2xpZW50Sm9iIGNsaWVudEpvYiA9IG5ldyBMYXVuY2hDbGllbnRKb2Ioc2VydmVyLCBtb2R1bGVzLCBsYXVuY2hNb2RlLCBtb2R1bGVBcnRpZmFjdCwgbGF1bmNoYWJsZUFkYXB0ZXIsIGNsaWVudCk7Ci0JCQkKLQkJCWlmICgoKFNlcnZlclR5cGUpc2VydmVyLmdldFNlcnZlclR5cGUoKSkuc3RhcnRCZWZvcmVQdWJsaXNoKCkpIHsKLQkJCQlzdGFydFNlcnZlckpvYi5zZXROZXh0Sm9iKHB1Ymxpc2hKb2IpOwotCQkJCXB1Ymxpc2hKb2Iuc2V0TmV4dEpvYihjbGllbnRKb2IpOwotCQkJCXN0YXJ0U2VydmVySm9iLnNjaGVkdWxlKCk7Ci0JCQl9IGVsc2UgewotCQkJCXB1Ymxpc2hKb2Iuc2V0TmV4dEpvYihzdGFydFNlcnZlckpvYik7Ci0JCQkJc3RhcnRTZXJ2ZXJKb2Iuc2V0TmV4dEpvYihjbGllbnRKb2IpOwotCQkJCXB1Ymxpc2hKb2Iuc2NoZWR1bGUoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxhdW5jaGFibGUgY2xpZW50cyBmb3IgdGhlIGdpdmVuIHNlcnZlciBhbmQgbGF1bmNoYWJsZQotCSAqIG9iamVjdC4KLQkgKgotCSAqIEBwYXJhbSBzZXJ2ZXIgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXIKLQkgKiBAcGFyYW0gbGF1bmNoYWJsZQotCSAqIEBwYXJhbSBsYXVuY2hNb2RlIFN0cmluZwotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgY2xpZW50cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUNsaWVudFtdIGdldENsaWVudHMoSVNlcnZlciBzZXJ2ZXIsIE9iamVjdCBsYXVuY2hhYmxlLCBTdHJpbmcgbGF1bmNoTW9kZSkgewotCQlBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSUNsaWVudFtdIGNsaWVudHMgPSBTZXJ2ZXJQbHVnaW4uZ2V0Q2xpZW50cygpOwotCQlpZiAoY2xpZW50cyAhPSBudWxsKSB7Ci0JCQlpbnQgc2l6ZSA9IGNsaWVudHMubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJjbGllbnQ9ICIgKyBjbGllbnRzW2ldKTsKLQkJCQlpZiAoY2xpZW50c1tpXS5zdXBwb3J0cyhzZXJ2ZXIsIGxhdW5jaGFibGUsIGxhdW5jaE1vZGUpKQotCQkJCQlsaXN0LmFkZChjbGllbnRzW2ldKTsKLQkJCX0KLQkJfQotCQkKLQkJSUNsaWVudFtdIGNsaWVudHMyID0gbmV3IElDbGllbnRbbGlzdC5zaXplKCldOwotCQlsaXN0LnRvQXJyYXkoY2xpZW50czIpOwotCQlyZXR1cm4gY2xpZW50czI7Ci0JfQotCi0JLyoqCi0JICogT3BlbiBhIG1lc3NhZ2UgZGlhbG9nLgotCSAqIAotCSAqIEBwYXJhbSBzaGVsbAotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogQHJldHVybiBhIGRpYWxvZyByZXR1cm4gY29uc3RhbnQKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IG9wZW5XYXJuaW5nRGlhbG9nKFNoZWxsIHNoZWxsLCBTdHJpbmcgbWVzc2FnZSkgewotCQlNZXNzYWdlRGlhbG9nIGRpYWxvZyA9IG5ldyBNZXNzYWdlRGlhbG9nKHNoZWxsLCBNZXNzYWdlcy5lcnJvckRpYWxvZ1RpdGxlLCBudWxsLAotCQkJbWVzc2FnZSwJTWVzc2FnZURpYWxvZy5XQVJOSU5HLCBuZXcgU3RyaW5nW10ge01lc3NhZ2VzLmRpYWxvZ01vZGVXYXJuaW5nUmVzdGFydCwKLQkJCU1lc3NhZ2VzLmRpYWxvZ01vZGVXYXJuaW5nQ29udGludWUsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMfSwgMCk7Ci0JCXJldHVybiBkaWFsb2cub3BlbigpOwotCX0KLQotCS8qKgotCSAqIFRoZSBkZWxlZ2F0aW5nIGFjdGlvbiBoYXMgYmVlbiBwZXJmb3JtZWQuIEltcGxlbWVudAotCSAqIHRoaXMgbWV0aG9kIHRvIGRvIHRoZSBhY3R1YWwgd29yay4KLQkgKgotCSAqIEBwYXJhbSBhY3Rpb24gYWN0aW9uIHByb3h5IHRoYXQgaGFuZGxlcyB0aGUgcHJlc2VudGF0aW9uCi0JICogcG9ydGlvbiBvZiB0aGUgcGx1Z2luIGFjdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJSdW5uaW5nIG9uIFNlcnZlci4uLiIpOwotCQl0cnkgewotCQkJcnVuKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiUnVuIG9uIFNlcnZlciBFcnJvciIsIGUpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGlzRW5hYmxlZCgpIHsKLQkJdHJ5IHsKLQkJCUJvb2xlYW4gYiA9IChCb29sZWFuKSBnbG9iYWxMYXVuY2hNb2RlLmdldChnZXRMYXVuY2hNb2RlKCkpOwotCQkJcmV0dXJuIGIuYm9vbGVhblZhbHVlKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RhcnQgbW9kZSB0aGF0IHRoZSBzZXJ2ZXIgc2hvdWxkIHVzZS4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhdW5jaE1vZGUoKSB7Ci0JCXJldHVybiBJTGF1bmNoTWFuYWdlci5SVU5fTU9ERTsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmUgd2hpY2ggY2xpZW50cyBjYW4gYWN0IG9uIHRoZSBjdXJyZW50IHNlbGVjdGlvbi4KLQkgKgotCSAqIEBwYXJhbSBhY3Rpb24gYWN0aW9uIHByb3h5IHRoYXQgaGFuZGxlcyBwcmVzZW50YXRpb24KLQkgKiAgICBwb3J0aW9uIG9mIHRoZSBwbHVnaW4gYWN0aW9uCi0JICogQHBhcmFtIHNlbCBjdXJyZW50IHNlbGVjdGlvbiBpbiB0aGUgZGVza3RvcAotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsKSB7Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIj4gc2VsZWN0aW9uQ2hhbmdlZCIpOwotCQlzZWxlY3Rpb24gPSBudWxsOwotCQlsb25nIHRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJaWYgKHNlbCA9PSBudWxsIHx8IHNlbC5pc0VtcHR5KCkgfHwgIShzZWwgaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikpIHsKLQkJCWFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWdsb2JhbFNlbGVjdGlvbiA9IG51bGw7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3QgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbDsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBzZWxlY3QuaXRlcmF0b3IoKTsKLQkJaWYgKGl0ZXJhdG9yLmhhc05leHQoKSkKLQkJCXNlbGVjdGlvbiA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJaWYgKGl0ZXJhdG9yLmhhc05leHQoKSkgeyAvLyBtb3JlIHRoYW4gb25lIHNlbGVjdGlvbiAoc2hvdWxkIG5ldmVyIGhhcHBlbikKLQkJCWFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCXNlbGVjdGlvbiA9IG51bGw7Ci0JCQlnbG9iYWxTZWxlY3Rpb24gPSBudWxsOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKHNlbGVjdGlvbiAhPSBnbG9iYWxTZWxlY3Rpb24pIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIlNlbGVjdGlvbjogIiArIHNlbGVjdGlvbik7Ci0JCQlpZiAoc2VsZWN0aW9uICE9IG51bGwpCQotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIlNlbGVjdGlvbiB0eXBlOiAiICsgc2VsZWN0aW9uLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLQkJCWdsb2JhbFNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQkJCWdsb2JhbExhdW5jaE1vZGUgPSBuZXcgSGFzaE1hcCgpOwotCQkJaWYgKCFTZXJ2ZXJQbHVnaW4uaGFzTW9kdWxlQXJ0aWZhY3QoZ2xvYmFsU2VsZWN0aW9uKSkgewotCQkJCWFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQkKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgImNoZWNraW5nIGZvciBtb2R1bGUgYXJ0aWZhY3QiKTsKLQkJCUlNb2R1bGVBcnRpZmFjdCBtb2R1bGVBcnRpZmFjdCA9IFNlcnZlclBsdWdpbi5nZXRNb2R1bGVBcnRpZmFjdChnbG9iYWxTZWxlY3Rpb24pOwotCQkJSU1vZHVsZSBtb2R1bGUgPSBudWxsOwotCQkJaWYgKG1vZHVsZUFydGlmYWN0ICE9IG51bGwpCi0JCQkJbW9kdWxlID0gbW9kdWxlQXJ0aWZhY3QuZ2V0TW9kdWxlKCk7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJtb2R1bGVBcnRpZmFjdD0gIiArIG1vZHVsZUFydGlmYWN0ICsgIiwgbW9kdWxlPSAiICsgbW9kdWxlKTsKLQkJCWlmIChtb2R1bGUgIT0gbnVsbCkKLQkJCQlmaW5kR2xvYmFsTGF1bmNoTW9kZXMobW9kdWxlKTsKLQkJCWVsc2UgewotCQkJCWdsb2JhbExhdW5jaE1vZGUucHV0KElMYXVuY2hNYW5hZ2VyLlJVTl9NT0RFLCBuZXcgQm9vbGVhbih0cnVlKSk7Ci0JCQkJZ2xvYmFsTGF1bmNoTW9kZS5wdXQoSUxhdW5jaE1hbmFnZXIuREVCVUdfTU9ERSwgbmV3IEJvb2xlYW4odHJ1ZSkpOwotCQkJCWdsb2JhbExhdW5jaE1vZGUucHV0KElMYXVuY2hNYW5hZ2VyLlBST0ZJTEVfTU9ERSwgbmV3IEJvb2xlYW4odHJ1ZSkpOwotCQkJfQotCQl9Ci0KLQkJYWN0aW9uLnNldEVuYWJsZWQoaXNFbmFibGVkKCkpOwotCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICI8IHNlbGVjdGlvbkNoYW5nZWQgIiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHRpbWUpKTsKLQl9Ci0JCi0JLyoqCi0JICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZXJlIGlzIGEgc2VydmVyIGZhY3RvcnkgYXZhaWxhYmxlIGZvciB0aGUgZ2l2ZW4gbW9kdWxlCi0JICogYW5kIHRoZSB2YXJpb3VzIHN0YXJ0IG1vZGVzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpbmRHbG9iYWxMYXVuY2hNb2RlcyhJTW9kdWxlIG1vZHVsZSkgewotCQlJU2VydmVyVHlwZVtdIHNlcnZlclR5cGVzID0gU2VydmVyQ29yZS5nZXRTZXJ2ZXJUeXBlcygpOwotCQlpZiAoc2VydmVyVHlwZXMgIT0gbnVsbCkgewotCQkJaW50IHNpemUgPSBzZXJ2ZXJUeXBlcy5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCUlTZXJ2ZXJUeXBlIHR5cGUgPSBzZXJ2ZXJUeXBlc1tpXTsKLQkJCQlpZiAoaXNWYWxpZFNlcnZlclR5cGUodHlwZSwgbW9kdWxlKSkgewotCQkJCQlmb3IgKGJ5dGUgYiA9IDA7IGIgPCBsYXVuY2hNb2Rlcy5sZW5ndGg7IGIrKykgewotCQkJCQkJaWYgKHR5cGUuc3VwcG9ydHNMYXVuY2hNb2RlKGxhdW5jaE1vZGVzW2JdKSkgewotCQkJCQkJCWdsb2JhbExhdW5jaE1vZGUucHV0KGxhdW5jaE1vZGVzW2JdLCBuZXcgQm9vbGVhbih0cnVlKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIHNlcnZlciB0eXBlIGNhbiBsYXVuY2ggdGhlIG1vZHVsZS4gCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNWYWxpZFNlcnZlclR5cGUoSVNlcnZlclR5cGUgdHlwZSwgSU1vZHVsZSBtb2R1bGUpIHsKLQkJdHJ5IHsKLQkJCUlSdW50aW1lVHlwZSBydW50aW1lVHlwZSA9IHR5cGUuZ2V0UnVudGltZVR5cGUoKTsKLQkJCVNlcnZlclV0aWwuaXNTdXBwb3J0ZWRNb2R1bGUocnVudGltZVR5cGUuZ2V0TW9kdWxlVHlwZXMoKSwgbW9kdWxlLmdldE1vZHVsZVR5cGUoKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gc3VwcG9ydHNMYXVuY2hNb2RlKElTZXJ2ZXIgc2VydmVyLCBTdHJpbmcgbGF1bmNoTW9kZSkgewotCQlyZXR1cm4gc2VydmVyLmdldFNlcnZlclR5cGUoKS5zdXBwb3J0c0xhdW5jaE1vZGUobGF1bmNoTW9kZSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2F1ZGlvL0F1ZGlvLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9hdWRpby9BdWRpby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGY3NzE3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2F1ZGlvL0F1ZGlvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuYXVkaW87Ci0KLS8qKgotICogQXVkaW8gaXMgdGhlIG1haW4gaW50ZXJmYWNlIHRvIHRoZSBhdWRpbyBwbHVnaW4uPHA+Ci0gKgotICogQWRkaW5nIGEgbmV3IHNvdW5kIHRvIHlvdXIgcGx1Z2luIGlzIGFzIGVhc3kgYXMgQUJDOgotICogPHVsPgotICogPGxpPkE6IEFkZCB0aGUgZm9sbG93aW5nIHJlcXVpcmVzIHRvIHlvdXIgcGx1Z2luLnhtbDo8YnI+Ci0gKiAgIDxwcmU+Jmx0O2ltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudXRpbCImZ3Q7PC9wcmU+PC9saT4KLSAqCi0gKiA8bGk+QjogRGVmaW5lIGEgbmV3IHNvdW5kIGV4dGVuc2lvbiBwb2ludCBpbiB5b3VyIHBsdWdpbi54bWw6PGJyPgotICogICA8cHJlPiZsdDtleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudXRpbC5zb3VuZCImZ3Q7Ci0gKiAgICAgJmx0O2NhdGVnb3J5IGlkPSJvcmcuZWNsaXBzZS5teVBsdWdpbiIKLSAqICAgICAgIG5hbWU9Ik15IFBsdWdpbiBOYW1lIi8mZ3Q7Ci0gKiAgICAgJmx0O3NvdW5kIGlkPSJvcmcuZWNsaXBzZS5teVBsdWdpbi5teVNvdW5kIgotICogICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLm15UGx1Z2luIgotICogICAgICAgbmFtZT0iU29tZXRoaW5nIEhhcHBlbmVkIgotICogICAgICAgbG9jYXRpb249InNvdW5kcy9teVNvdW5kLndhdiIvJmd0OwotICogICAgICZsdDtzb3VuZCBpZD0ib3JnLmVjbGlwc2UubXlQbHVnaW4ubXlPdGhlclNvdW5kcyIKLSAqICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5teVBsdWdpbiIKLSAqICAgICAgIG5hbWU9IkFub3RoZXIgRXZlbnQgSGFwcGVuZWQiLyZndDsKLSAqICAgJmx0Oy9leHRlbnNpb24mZ3Q7PC9wcmU+PGJyPgotICogICAodGhlIGxvY2F0aW9uIGlzIG9wdGlvbmFsLiBJZiBpdCBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgc291bmQKLSAqICAgIHdpbGwgbm90IHBsYXkgdW50aWwgdGhlIHVzZXIgc3BlY2lmaWVzIGFuIGF1ZGlvIGZpbGUpPC9saT4KLSAqCi0gKiA8bGk+QzogQ2FsbCB0aGUgc291bmRzIHdoZW4gdGhlIGFwcHJvcHJpYXRlIGV2ZW50cyBvY2N1ciB3aXRoaW4KLSAqICAgeW91ciBwbHVnaW46PGJyPgotICogICA8cHJlPm9yZy5lY2xpcHNlLndzdC5hdWRpby5BdWRpby5wbGF5U291bmQoIm9yZy5lY2xpcHNlLm15UGx1Z2luLm15U291bmQiKTs8L3ByZT48L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIGNsYXNzIEF1ZGlvIHsKLQkvKioKLQkgKiBBdWRpb0NvcmUgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwcml2YXRlIEF1ZGlvKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFBsYXlzIHRoZSBzb3VuZCB3aXRoIHRoZSBnaXZlbiBpZC4KLQkgKgotCSAqIEBwYXJhbSBpZCBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHBsYXlTb3VuZChTdHJpbmcgaWQpIHsKLQkJQXVkaW9Db3JlLmdldEluc3RhbmNlKCkucGxheVNvdW5kKGlkKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvYXVkaW8vQXVkaW9Db3JlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9hdWRpby9BdWRpb0NvcmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODA0OTljYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9hdWRpby9BdWRpb0NvcmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuYXVkaW87Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmF4LnNvdW5kLnNhbXBsZWQuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlNlcnZlclVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuVHJhY2U7Ci0vKioKLSAqIE1haW4gYXVkaW8gcGx1Z2luIGNsYXNzLgotICovCi1wdWJsaWMgY2xhc3MgQXVkaW9Db3JlIHsKLQlwcm90ZWN0ZWQgc3RhdGljIEF1ZGlvQ29yZSBpbnN0YW5jZTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfU09VTkRfRU5BQkxFRCA9ICJzb3VuZEVuYWJsZWQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfVk9MVU1FID0gInZvbHVtZSI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTT1VORFNfRklMRSA9ICJzb3VuZHMueG1sIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNBQkxFRF9GSUxFID0gImRpc2FibGVkLXNvdW5kcy54bWwiOwotCi0JLy8gQ2F0ZWdvcmllcyAtIG1hcCBvZiBTdHJpbmcgaWQgdG8gU3RyaW5nIG5hbWVzCi0JcHJpdmF0ZSBNYXAgY2F0ZWdvcmllczsKLQotCS8vIFNvdW5kcyAtIG1hcCBvZiBTdHJpbmcgaWQgdG8gU291bmQKLQlwcml2YXRlIE1hcCBzb3VuZHM7Ci0KLQkvLyBzcGVjaWZpYyBzb3VuZHMgb3IgY2F0ZWdvcmllcyB0aGF0IGhhdmUgYmVlbiBkaXNhYmxlZCwgYnkgaWQKLQlwcml2YXRlIExpc3QgZGlzYWJsZWRTb3VuZHM7Ci0JcHJpdmF0ZSBMaXN0IGRpc2FibGVkQ2F0ZWdvcmllczsKLQotCS8vIFNvdW5kTWFwIC0gbWFwIG9mIFN0cmluZyBpZCB0byBhbiBJUGF0aAotCXByaXZhdGUgTWFwIHVzZXJTb3VuZE1hcDsKLQotCS8qKgotCSAqIEF1ZGlvQ29yZSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXByaXZhdGUgQXVkaW9Db3JlKCkgewotCQlzdXBlcigpOwotCQotCQlsb2FkRXh0ZW5zaW9uUG9pbnRzKCk7Ci0JCi0JCWxvYWRTb3VuZE1hcCgpOwotCQlsb2FkRGlzYWJsZWRMaXN0cygpOwotCQkKLQkJCi0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjYXRlZ29yaWVzCi0JICoKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5NYXAKLQkgKi8KLQlwcm90ZWN0ZWQgTWFwIGdldENhdGVnb3JpZXMoKSB7Ci0JCXJldHVybiBjYXRlZ29yaWVzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGF1ZGlvIGNsaXAuCi0JICoKLQkgKiBAcGFyYW0gdXJsIGphdmEubmV0LlVSTAotCSAqIEByZXR1cm4gamF2YXguc291bmQuc2FtcGxlZC5DbGlwCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBDbGlwIGdldENsaXAoVVJMIHVybCkgewotCQl0cnkgewotCQkJQXVkaW9JbnB1dFN0cmVhbSBhdWRpb0lucHV0U3RyZWFtID0gQXVkaW9TeXN0ZW0uZ2V0QXVkaW9JbnB1dFN0cmVhbSh1cmwpOwotCQotCQkJQXVkaW9Gb3JtYXQgZm9ybWF0ID0gYXVkaW9JbnB1dFN0cmVhbS5nZXRGb3JtYXQoKTsKLQkKLQkJCS8qKgotCQkJICogd2UgY2FuJ3QgeWV0IG9wZW4gdGhlIGRldmljZSBmb3IgQUxBVy9VTEFXIHBsYXliYWNrLAotCQkJICogY29udmVydCBBTEFXL1VMQVcgdG8gUENNCi0JCQkgKi8KLQkJCWlmICgoZm9ybWF0LmdldEVuY29kaW5nKCkgPT0gQXVkaW9Gb3JtYXQuRW5jb2RpbmcuVUxBVykgfHwKLQkJCQkoZm9ybWF0LmdldEVuY29kaW5nKCkgPT0gQXVkaW9Gb3JtYXQuRW5jb2RpbmcuQUxBVykpIHsKLQkJCQlBdWRpb0Zvcm1hdCB0bXAgPSBuZXcgQXVkaW9Gb3JtYXQoCi0JCQkJCUF1ZGlvRm9ybWF0LkVuY29kaW5nLlBDTV9TSUdORUQsIAotCQkJCQlmb3JtYXQuZ2V0U2FtcGxlUmF0ZSgpLAotCQkJCQlmb3JtYXQuZ2V0U2FtcGxlU2l6ZUluQml0cygpICogMiwKLQkJCQkJZm9ybWF0LmdldENoYW5uZWxzKCksCi0JCQkJCWZvcm1hdC5nZXRGcmFtZVNpemUoKSAqIDIsCi0JCQkJCWZvcm1hdC5nZXRGcmFtZVJhdGUoKSwgdHJ1ZSk7Ci0JCQkJYXVkaW9JbnB1dFN0cmVhbSA9IEF1ZGlvU3lzdGVtLmdldEF1ZGlvSW5wdXRTdHJlYW0odG1wLCBhdWRpb0lucHV0U3RyZWFtKTsKLQkJCQlmb3JtYXQgPSB0bXA7Ci0JCQl9Ci0JCQlEYXRhTGluZS5JbmZvIGluZm8gPSBuZXcgRGF0YUxpbmUuSW5mbygKLQkJCQlDbGlwLmNsYXNzLCBhdWRpb0lucHV0U3RyZWFtLmdldEZvcm1hdCgpLCAKLQkJCQkoKGludCkgYXVkaW9JbnB1dFN0cmVhbS5nZXRGcmFtZUxlbmd0aCgpICoKLQkJCQlmb3JtYXQuZ2V0RnJhbWVTaXplKCkpKTsKLQkJCi0JCQlDbGlwIGNsaXAgPSAoQ2xpcCkgQXVkaW9TeXN0ZW0uZ2V0TGluZShpbmZvKTsKLQkJCWNsaXAub3BlbihhdWRpb0lucHV0U3RyZWFtKTsKLQkJCXJldHVybiBjbGlwOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IGdldCBjbGlwOiAiICsgdXJsLCBlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIGF1ZGlvIGlzIGN1cnJlbnRseSBhdmFpbGFibGUgb24gdGhpcyBzeXN0ZW0uCi0JICoKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaXNBdWRpb1N1cHBvcnRlZCgpIHsKLQkJdHJ5IHsKLQkJCWJvb2xlYW4gc291bmQgPSBmYWxzZTsKLQkJCU1peGVyLkluZm9bXSBpbmZvMiA9IEF1ZGlvU3lzdGVtLmdldE1peGVySW5mbygpOwotCQkJaWYgKGluZm8yICE9IG51bGwpIHsKLQkJCQlpbnQgc2l6ZSA9IGluZm8yLmxlbmd0aDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCQkvL1RyYWNlLnRyYWNlKCIgIiArIGluZm8yW2ldKTsKLQkJCQkJTWl4ZXIgbWl4ZXIgPSBBdWRpb1N5c3RlbS5nZXRNaXhlcihpbmZvMltpXSk7Ci0JCQkJCWlmIChtaXhlciAhPSBudWxsKSB7Ci0JCQkJCQkvL1RyYWNlLnRyYWNlKCIgICBNaXhlcjoiICsgbWl4ZXIpOwotCQkJCQkJLy9UcmFjZS50cmFjZSgiICAgIiArIG1peGVyLmdldExpbmVJbmZvKCkpOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQlMaW5lLkluZm8gaW5mbyA9IG1peGVyLmdldExpbmVJbmZvKCk7Ci0JCQkJCQkJTGluZSBsaW5lID0gbWl4ZXIuZ2V0TGluZShpbmZvKTsKLQkJCQkJCQkvL1RyYWNlLnRyYWNlKCIgICBMaW5lOiIgKyBsaW5lKTsKLQkJCQkJCQlpZiAobGluZSAhPSBudWxsICYmIGxpbmUudG9TdHJpbmcoKS5pbmRleE9mKCJPdXRwdXQiKSA+PSAwKQotCQkJCQkJCQlzb3VuZCA9IHRydWU7Ci0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCS8vIGlnbm9yZQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHNvdW5kOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IHZlcmlmeSBhdWRpbyBzdGF0dXMiLCBlKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHNvdW5kIGlzIGVuYWJsZWQuCi0JICoKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXREZWZhdWx0U291bmRzRW5hYmxlZCgpIHsKLQkJcmV0dXJuIGdldFByZWZlcmVuY2VTdG9yZSgpLmdldERlZmF1bHRCb29sZWFuKFBSRUZfU09VTkRfRU5BQkxFRCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGVmYXVsdCB2b2x1bWUuCi0JICoKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RGVmYXVsdFZvbHVtZSgpIHsKLQkJcmV0dXJuIGdldFByZWZlcmVuY2VTdG9yZSgpLmdldERlZmF1bHRJbnQoUFJFRl9WT0xVTUUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZS4KLQkgKgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuYXVkaW8uaW50ZXJuYWwuQXVkaW9Db3JlCi0JICovCi0JcHVibGljIHN0YXRpYyBBdWRpb0NvcmUgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKQotCQkJaW5zdGFuY2UgPSBuZXcgQXVkaW9Db3JlKCk7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZQotCSAqLwotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGdldFByZWZlcmVuY2VTdG9yZSgpIHsKLQkJcmV0dXJuIFNlcnZlclVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc291bmQgd2l0aCB0aGUgZ2l2ZW4gaWQuCi0JICoKLQkgKiBAcGFyYW0gaWQgamF2YS5sYW5nLlN0cmluZwotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuYXVkaW8uU291bmQKLQkgKi8KLQlwcm90ZWN0ZWQgU291bmQgZ2V0U291bmQoU3RyaW5nIGlkKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gKFNvdW5kKSBzb3VuZHMuZ2V0KGlkKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzb3VuZHMuCi0JICoKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5NYXAKLQkgKi8KLQlwcm90ZWN0ZWQgTWFwIGdldFNvdW5kcygpIHsKLQkJcmV0dXJuIHNvdW5kczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmdWxsIHVzZXIgc291bmQgbWFwLgotCSAqCi0JICogQHJldHVybiBqYXZhLnV0aWwuTWFwCi0JICovCi0JcHJvdGVjdGVkIE1hcCBnZXRVc2VyU291bmRNYXAoKSB7Ci0JCWlmICh1c2VyU291bmRNYXAgPT0gbnVsbCkKLQkJCWxvYWRTb3VuZE1hcCgpOwotCQlyZXR1cm4gdXNlclNvdW5kTWFwOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgY3VycmVudCBVUkwgZm9yIHRoaXMgc291bmQuCi0JICoKLQkgKiBAcGFyYW0gaWQgamF2YS5sYW5nLlN0cmluZwotCSAqIEByZXR1cm4gamF2YS5uZXQuVVJMCi0JICovCi0JcHJvdGVjdGVkIElQYXRoIGdldFVzZXJTb3VuZFBhdGgoU3RyaW5nIGlkKSB7Ci0JCXRyeSB7Ci0JCQlpZiAodXNlclNvdW5kTWFwID09IG51bGwpCi0JCQkJbG9hZFNvdW5kTWFwKCk7Ci0JCi0JCQlJUGF0aCBwYXRoID0gKElQYXRoKSB1c2VyU291bmRNYXAuZ2V0KGlkKTsKLQkJCWlmIChwYXRoICE9IG51bGwpCi0JCQkJcmV0dXJuIHBhdGg7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3QgZ2V0IHNvdW5kIFVSTDogIiArIGlkLCBlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwcmVmZXJyZWQgdm9sdW1lLgotCSAqCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFZvbHVtZSgpIHsKLQkJcmV0dXJuIGdldFByZWZlcmVuY2VTdG9yZSgpLmdldEludChQUkVGX1ZPTFVNRSk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZSB0aGUgZGVmYXVsdCBwcmVmZXJlbmNlcy4KLQkgKgotCSAqIEBwYXJhbSBzdG9yZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcyhJUHJlZmVyZW5jZVN0b3JlIHN0b3JlKSB7Ci0JCXN0b3JlLnNldERlZmF1bHQoUFJFRl9WT0xVTUUsIDE4KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIGNhdGVnb3J5IGlzIGVuYWJsZWQuCi0JICoKLQkgKiBAcGFyYW0gaWQgamF2YS5sYW5nLlN0cmluZwotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ2F0ZWdvcnlFbmFibGVkKFN0cmluZyBpZCkgewotCQlpZiAoaWQgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkKLQkJaWYgKGRpc2FibGVkQ2F0ZWdvcmllcyA9PSBudWxsKQotCQkJbG9hZERpc2FibGVkTGlzdHMoKTsKLQkKLQkJcmV0dXJuICghZGlzYWJsZWRDYXRlZ29yaWVzLmNvbnRhaW5zKGlkKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHNvdW5kIGlzIGVuYWJsZWQuCi0JICoKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NvdW5kRW5hYmxlZCgpIHsKLQkJcmV0dXJuIGdldFByZWZlcmVuY2VTdG9yZSgpLmdldEJvb2xlYW4oUFJFRl9TT1VORF9FTkFCTEVEKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIHNvdW5kIGlzIGVuYWJsZWQuCi0JICoKLQkgKiBAcGFyYW0gaWQgamF2YS5sYW5nLlN0cmluZwotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU291bmRFbmFibGVkKFN0cmluZyBpZCkgewotCQlpZiAoaWQgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkKLQkJaWYgKGRpc2FibGVkU291bmRzID09IG51bGwpCi0JCQlsb2FkRGlzYWJsZWRMaXN0cygpOwotCQotCQlyZXR1cm4gKCFkaXNhYmxlZFNvdW5kcy5jb250YWlucyhpZCkpOwotCX0KLQotCS8qKgotCSAqIFNhdmVzIHRoZSBkaXNhYmxlZCBzb3VuZCBsaXN0LgotCSAqLwotCXByaXZhdGUgdm9pZCBsb2FkRGlzYWJsZWRMaXN0cygpIHsKLQkJU3RyaW5nIGZpbGVuYW1lID0gU2VydmVyVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRTdGF0ZUxvY2F0aW9uKCkuYXBwZW5kKERJU0FCTEVEX0ZJTEUpLnRvT1NTdHJpbmcoKTsKLQkKLQkJRmlsZUlucHV0U3RyZWFtIGluID0gbnVsbDsKLQkJZGlzYWJsZWRDYXRlZ29yaWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlkaXNhYmxlZFNvdW5kcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJdHJ5IHsKLQkJCWluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlbmFtZSk7Ci0JCQlJTWVtZW50byBtZW1lbnRvID0gWE1MTWVtZW50by5sb2FkTWVtZW50byhpbik7Ci0JCi0JCQlJTWVtZW50byBjYXQgPSBtZW1lbnRvLmdldENoaWxkKCJjYXRlZ29yaWVzIik7Ci0JCQlJTWVtZW50b1tdIGNoaWxkcmVuID0gY2F0LmdldENoaWxkcmVuKCJjYXRlZ29yeSIpOwotCQotCQkJaW50IHNpemUgPSBjaGlsZHJlbi5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCXRyeSB7Ci0JCQkJCUlNZW1lbnRvIGNoaWxkID0gY2hpbGRyZW5baV07Ci0JCQkJCVN0cmluZyBpZCA9IGNoaWxkLmdldFN0cmluZygiaWQiKTsKLQkKLQkJCQkJZGlzYWJsZWRDYXRlZ29yaWVzLmFkZChpZCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIHJlYWRpbmcgVVJMIG1hcCAiLCBleCk7Ci0JCQkJfQotCQkJfQotCQotCQkJSU1lbWVudG8gc291bmQgPSBtZW1lbnRvLmdldENoaWxkKCJzb3VuZHMiKTsKLQkJCWNoaWxkcmVuID0gc291bmQuZ2V0Q2hpbGRyZW4oInNvdW5kIik7Ci0JCi0JCQlzaXplID0gY2hpbGRyZW4ubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQl0cnkgewotCQkJCQlJTWVtZW50byBjaGlsZCA9IGNoaWxkcmVuW2ldOwotCQkJCQlTdHJpbmcgaWQgPSBjaGlsZC5nZXRTdHJpbmcoImlkIik7Ci0JCi0JCQkJCWRpc2FibGVkU291bmRzLmFkZChpZCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIHJlYWRpbmcgVVJMIG1hcCAiLCBleCk7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy9BdWRpb1BsdWdpbi5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIEF1ZGlvUGx1Z2luLlBMVUdJTl9JRCwgMCwgIkNvdWxkIG5vdCBsb2FkIGRpc2FibGVkIHNvdW5kIGluZm9ybWF0aW9uIiwgZSkpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKGluICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlpbi5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIGlnbm9yZQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIExvYWQgZXh0ZW5zaW9uIHBvaW50LgotCSAqLwotCXByaXZhdGUgdm9pZCBsb2FkRXh0ZW5zaW9uUG9pbnRzKCkgewotCQkvLyBsb2FkIGV4dGVuc2lvbiBwb2ludHMKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2YgPSByZWdpc3RyeS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoU2VydmVyVUlQbHVnaW4uUExVR0lOX0lELCAiYXVkaW8iKTsKLQkKLQkJaW50IHNpemUgPSBjZi5sZW5ndGg7Ci0JCWNhdGVnb3JpZXMgPSBuZXcgSGFzaE1hcCgpOwotCQlzb3VuZHMgPSBuZXcgSGFzaE1hcCgpOwotCQotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJdHJ5IHsKLQkJCQlTdHJpbmcgZWxlbWVudE5hbWUgPSBjZltpXS5nZXROYW1lKCk7Ci0JCQkJU3RyaW5nIGlkID0gY2ZbaV0uZ2V0QXR0cmlidXRlKCJpZCIpOwotCQkJCVN0cmluZyBuYW1lID0gY2ZbaV0uZ2V0QXR0cmlidXRlKCJuYW1lIik7Ci0JCQkJaWYgKCJjYXRlZ29yeSIuZXF1YWxzKGVsZW1lbnROYW1lKSkgewotCQkJCQljYXRlZ29yaWVzLnB1dChpZCwgbmFtZSk7Ci0JCQkJfSBlbHNlIGlmICgic291bmQiLmVxdWFscyhlbGVtZW50TmFtZSkpIHsKLQkJCQkJU3RyaW5nIGNhdGVnb3J5ID0gY2ZbaV0uZ2V0QXR0cmlidXRlKCJjYXRlZ29yeSIpOwotCQkJCQlTdHJpbmcgbG9jYXRpb24gPSBjZltpXS5nZXRBdHRyaWJ1dGUoImxvY2F0aW9uIik7Ci0JCi0JCQkJCVVSTCByZWFsVVJMID0gbnVsbDsKLQkJCQkJaWYgKGxvY2F0aW9uICE9IG51bGwgJiYgbG9jYXRpb24ubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQlTdHJpbmcgcGx1Z2luSWQgPSBjZltpXS5nZXREZWNsYXJpbmdFeHRlbnNpb24oKS5nZXROYW1lc3BhY2UoKTsKLQkJCQkJCVVSTCB1cmwgPSBQbGF0Zm9ybS5maW5kKFBsYXRmb3JtLmdldEJ1bmRsZShwbHVnaW5JZCksIG5ldyBQYXRoKGxvY2F0aW9uKSk7Ci0JCQkJCQlyZWFsVVJMID0gUGxhdGZvcm0ucmVzb2x2ZSh1cmwpOwotCQkJCQl9Ci0JCi0JCQkJCVNvdW5kIHNvdW5kID0gbmV3IFNvdW5kKGlkLCBjYXRlZ29yeSwgbmFtZSwgcmVhbFVSTCk7Ci0JCQkJCXNvdW5kcy5wdXQoaWQsIHNvdW5kKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBsb2FkIGF1ZGlvOiAiICsgY2ZbaV0uZ2V0QXR0cmlidXRlKCJpZCIpLCB0KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFNhdmVzIHRoZSBkaXNhYmxlZCBzb3VuZCBsaXN0LgotCSAqLwotCXByaXZhdGUgdm9pZCBsb2FkU291bmRNYXAoKSB7Ci0JCVN0cmluZyBmaWxlbmFtZSA9IFNlcnZlclVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U3RhdGVMb2NhdGlvbigpLmFwcGVuZChTT1VORFNfRklMRSkudG9PU1N0cmluZygpOwotCQotCQlJbnB1dFN0cmVhbSBpbiA9IG51bGw7Ci0JCXVzZXJTb3VuZE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCXRyeSB7Ci0JCQlpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZW5hbWUpOwotCQkJSU1lbWVudG8gbWVtZW50byA9IFhNTE1lbWVudG8ubG9hZE1lbWVudG8oaW4pOwotCQotCQkJSU1lbWVudG9bXSBjaGlsZHJlbiA9IG1lbWVudG8uZ2V0Q2hpbGRyZW4oIm1hcCIpOwotCQotCQkJaW50IHNpemUgPSBjaGlsZHJlbi5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCXRyeSB7Ci0JCQkJCUlNZW1lbnRvIGNoaWxkID0gY2hpbGRyZW5baV07Ci0JCQkJCVN0cmluZyBpZCA9IGNoaWxkLmdldFN0cmluZygiaWQiKTsKLQkJCQkJU3RyaW5nIHBhdGhTdHIgPSBjaGlsZC5nZXRTdHJpbmcoInBhdGgiKTsKLQkJCQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKHBhdGhTdHIpOwotCQotCQkJCQl1c2VyU291bmRNYXAucHV0KGlkLCBwYXRoKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgcmVhZGluZyBVUkwgbWFwICIsIGV4KTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChpbiAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaW4uY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkvLyBpZ25vcmUKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQbGF5IHRoZSBzb3VuZCB3aXRoIHRoZSBnaXZlbiBpZC4gKHByb3ZpZGVkIHRoYXQKLQkgKiB0aGUgdXNlciBoYXMgZW5hYmxlZCB0aGUgc291bmQpCi0JICoKLQkgKiBAcGFyYW0gaWQgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHBsYXlTb3VuZChTdHJpbmcgaWQpIHsKLQkJaWYgKCFpc1NvdW5kRW5hYmxlZCgpKQotCQkJcmV0dXJuOwotCQotCQlpZiAoIWlzU291bmRFbmFibGVkKGlkKSkKLQkJCXJldHVybjsKLQkKLQkJdHJ5IHsKLQkJCVNvdW5kIHNvdW5kID0gKFNvdW5kKSBzb3VuZHMuZ2V0KGlkKTsKLQkJCVN0cmluZyBjYXRlZ29yeSA9IHNvdW5kLmdldENhdGVnb3J5KCk7Ci0JCQlpZiAoY2F0ZWdvcnkgIT0gbnVsbCAmJiBjYXRlZ29yaWVzLmNvbnRhaW5zS2V5KGNhdGVnb3J5KSkgewotCQkJCWlmICghaXNDYXRlZ29yeUVuYWJsZWQoY2F0ZWdvcnkpKQotCQkJCQlyZXR1cm47Ci0JCQl9Ci0JCi0JCQlVUkwgdXJsID0gc291bmQuZ2V0TG9jYXRpb24oKTsKLQkJCUlQYXRoIHBhdGggPSBnZXRVc2VyU291bmRQYXRoKGlkKTsKLQkJCWlmIChwYXRoICE9IG51bGwpCi0JCQkJdXJsID0gcGF0aC50b0ZpbGUoKS50b1VSTCgpOwotCQotCQkJcGxheVNvdW5kKHVybCwgZ2V0Vm9sdW1lKCkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgcGxheWluZyBhdWRpbzogIiArIGlkLCBlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFBsYXlzIHRoZSBzb3VuZCBhdCB0aGUgZ2l2ZW4gdXJsLgotCSAqCi0JICogQHBhcmFtIHVybCBqYXZhLm5ldC5VUkwKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgcGxheVNvdW5kKFVSTCB1cmwsIGZpbmFsIGludCB2b2x1bWUpIHsKLQkJdHJ5IHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgInBsYXlTb3VuZCIpOwotCQkJaWYgKHVybCA9PSBudWxsIHx8IHZvbHVtZSA8PSAwKQotCQkJCXJldHVybjsKLQkKLQkJCWZpbmFsIENsaXAgY2xpcCA9IGdldENsaXAodXJsKTsKLQkJCWlmIChjbGlwID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJCQotCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAicGxheWluZyIpOwotCQotCQkJVGhyZWFkIHQgPSBuZXcgVGhyZWFkKCJTb3VuZCBUaHJlYWQiKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkvLyBzZXQgZ2FpbgotCQkJCQlGbG9hdENvbnRyb2wgZ2FpbkNvbnRyb2wgPSAoRmxvYXRDb250cm9sKSBjbGlwLmdldENvbnRyb2woRmxvYXRDb250cm9sLlR5cGUuTUFTVEVSX0dBSU4pOwotCQkJCQlkb3VibGUgdmFsdWUgPSB2b2x1bWUgLyAyMC4wOwotCQkJCQlmbG9hdCBkQiA9IChmbG9hdCkgKE1hdGgubG9nKHZhbHVlPT0wLjA/MC4wMDAxOnZhbHVlKS9NYXRoLmxvZygxMC4wKSoyMC4wKTsKLQkJCQkJZ2FpbkNvbnRyb2wuc2V0VmFsdWUoZEIpOwotCQotCQkJCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJzdGFydCIpOwotCQkJCQljbGlwLnN0YXJ0KCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlzbGVlcCg5OSk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBpZ25vcmUKLQkJCQkJfQotCQotCQkJCQl3aGlsZSAoY2xpcC5pc0FjdGl2ZSgpKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCXNsZWVwKDk5KTsKLQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJY2xpcC5zdG9wKCk7Ci0JCQkJCWNsaXAuY2xvc2UoKTsKLQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAic3RvcCIpOwotCQkJCX0KLQkJCX07Ci0JCQl0LnNldERhZW1vbih0cnVlKTsKLQkJCXQuc3RhcnQoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIHBsYXlpbmcgYXVkaW86ICIgKyB1cmwsIGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2F2ZXMgdGhlIGRpc2FibGVkIHNvdW5kcyBhbmQgY2F0ZWdvcmllcyBsaXN0LgotCSAqLwotCXByaXZhdGUgdm9pZCBzYXZlRGlzYWJsZWRMaXN0cygpIHsKLQkJU3RyaW5nIGZpbGVuYW1lID0gU2VydmVyVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRTdGF0ZUxvY2F0aW9uKCkuYXBwZW5kKERJU0FCTEVEX0ZJTEUpLnRvT1NTdHJpbmcoKTsKLQkKLQkJRmlsZU91dHB1dFN0cmVhbSBmb3V0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCVhNTE1lbWVudG8gbWVtZW50byA9IFhNTE1lbWVudG8uY3JlYXRlV3JpdGVSb290KCJkaXNhYmxlZCIpOwotCQotCQkJSU1lbWVudG8gY2F0ID0gbWVtZW50by5jcmVhdGVDaGlsZCgiY2F0ZWdvcmllcyIpOwotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBkaXNhYmxlZENhdGVnb3JpZXMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlJTWVtZW50byBjaGlsZCA9IGNhdC5jcmVhdGVDaGlsZCgiY2F0ZWdvcnkiKTsKLQkJCQlTdHJpbmcgaWQgPSAoU3RyaW5nKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJY2hpbGQucHV0U3RyaW5nKCJpZCIsIGlkKTsKLQkJCX0KLQkKLQkJCUlNZW1lbnRvIHNvdW5kID0gbWVtZW50by5jcmVhdGVDaGlsZCgic291bmRzIik7Ci0JCQlpdGVyYXRvciA9IGRpc2FibGVkU291bmRzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJSU1lbWVudG8gY2hpbGQgPSBzb3VuZC5jcmVhdGVDaGlsZCgic291bmQiKTsKLQkJCQlTdHJpbmcgaWQgPSAoU3RyaW5nKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJY2hpbGQucHV0U3RyaW5nKCJpZCIsIGlkKTsKLQkJCX0KLQkKLQkJCWZvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlbmFtZSk7Ci0JCQltZW1lbnRvLnNhdmUoZm91dCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3Qgc2F2ZSBkaXNhYmxlZCBpbmZvcm1hdGlvbiIsIGUpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKGZvdXQgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCWZvdXQuY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkvLyBpZ25vcmUKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB0aGUgZGlzYWJsZWQgc291bmQgbGlzdC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgc2F2ZVNvdW5kTWFwKCkgewotCQlTdHJpbmcgZmlsZW5hbWUgPSBTZXJ2ZXJVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFN0YXRlTG9jYXRpb24oKS5hcHBlbmQoU09VTkRTX0ZJTEUpLnRvT1NTdHJpbmcoKTsKLQkKLQkJRmlsZU91dHB1dFN0cmVhbSBmb3V0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCVhNTE1lbWVudG8gbWVtZW50byA9IFhNTE1lbWVudG8uY3JlYXRlV3JpdGVSb290KCJzb3VuZC1tYXAiKTsKLQkKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gdXNlclNvdW5kTWFwLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJSU1lbWVudG8gY2hpbGQgPSBtZW1lbnRvLmNyZWF0ZUNoaWxkKCJtYXAiKTsKLQkJCQlTdHJpbmcgaWQgPSAoU3RyaW5nKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJY2hpbGQucHV0U3RyaW5nKCJpZCIsIGlkKTsKLQkJCQlJUGF0aCBwYXRoID0gKElQYXRoKSB1c2VyU291bmRNYXAuZ2V0KGlkKTsKLQkJCQljaGlsZC5wdXRTdHJpbmcoInBhdGgiLCBwYXRoLnRvU3RyaW5nKCkpOwotCQkJfQotCQotCQkJZm91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGVuYW1lKTsKLQkJCW1lbWVudG8uc2F2ZShmb3V0KTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBzYXZlIFVSTCBtYXAgaW5mb3JtYXRpb24iLCBlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChmb3V0ICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlmb3V0LmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gaWdub3JlCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogRW5hYmxlIG9yIGRpc2FibGUgYSBzcGVjaWZpYyBjYXRlZ29yeS4KLQkgKgotCSAqIEBwYXJhbSBpZCBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGIgYm9vbGVhbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldENhdGVnb3J5RW5hYmxlZChTdHJpbmcgaWQsIGJvb2xlYW4gYikgewotCQlpZiAoaWQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkKLQkJaWYgKGRpc2FibGVkQ2F0ZWdvcmllcyA9PSBudWxsKQotCQkJbG9hZERpc2FibGVkTGlzdHMoKTsKLQkKLQkJaWYgKGIpIHsKLQkJCWlmIChkaXNhYmxlZENhdGVnb3JpZXMuY29udGFpbnMoaWQpKSB7Ci0JCQkJZGlzYWJsZWRDYXRlZ29yaWVzLnJlbW92ZShpZCk7Ci0JCQkJc2F2ZURpc2FibGVkTGlzdHMoKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmICghZGlzYWJsZWRDYXRlZ29yaWVzLmNvbnRhaW5zKGlkKSkgewotCQkJCWRpc2FibGVkQ2F0ZWdvcmllcy5hZGQoaWQpOwotCQkJCXNhdmVEaXNhYmxlZExpc3RzKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBFbmFibGUgb3IgZGlzYWJsZSBhIHNwZWNpZmljIHNvdW5kLgotCSAqCi0JICogQHBhcmFtIGlkIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gYiBib29sZWFuCi0JICovCi0JcHVibGljIHZvaWQgc2V0U291bmRFbmFibGVkKFN0cmluZyBpZCwgYm9vbGVhbiBiKSB7Ci0JCWlmIChpZCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQotCQlpZiAoZGlzYWJsZWRTb3VuZHMgPT0gbnVsbCkKLQkJCWxvYWREaXNhYmxlZExpc3RzKCk7Ci0JCi0JCWlmIChiKSB7Ci0JCQlpZiAoZGlzYWJsZWRTb3VuZHMuY29udGFpbnMoaWQpKSB7Ci0JCQkJZGlzYWJsZWRTb3VuZHMucmVtb3ZlKGlkKTsKLQkJCQlzYXZlRGlzYWJsZWRMaXN0cygpOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKCFkaXNhYmxlZFNvdW5kcy5jb250YWlucyhpZCkpIHsKLQkJCQlkaXNhYmxlZFNvdW5kcy5hZGQoaWQpOwotCQkJCXNhdmVEaXNhYmxlZExpc3RzKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHdoZXRoZXIgc291bmQgaXMgZW5hYmxlZC4KLQkgKgotCSAqIEBwYXJhbSBlbmFibGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U291bmRzRW5hYmxlZChib29sZWFuIGVuYWJsZWQpIHsKLQkJZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUoUFJFRl9TT1VORF9FTkFCTEVELCBlbmFibGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBjdXJyZW50IFVSTCBmb3IgdGhpcyBzb3VuZC4KLQkgKgotCSAqIEBwYXJhbSBpZCBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIHBhdGggSVBhdGgKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTb3VuZFVSTChTdHJpbmcgaWQsIElQYXRoIHBhdGgpIHsKLQkJaWYgKGlkID09IG51bGwgfHwgcGF0aCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQotCQl0cnkgewotCQkJaWYgKHVzZXJTb3VuZE1hcCA9PSBudWxsKQotCQkJCWxvYWRTb3VuZE1hcCgpOwotCQotCQkJdXNlclNvdW5kTWFwLnB1dChpZCwgcGF0aCk7Ci0JCQlzYXZlU291bmRNYXAoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBnZXQgc291bmQgVVJMOiAiICsgaWQsIGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZnVsbCB1c2VyIHNvdW5kIG1hcC4KLQkgKgotCSAqIEBwYXJhbSBtYXAgdGhlIHNvdW5kIG1hcAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFVzZXJTb3VuZE1hcChNYXAgbWFwKSB7Ci0JCWlmIChtYXAgIT0gbnVsbCkgewotCQkJdXNlclNvdW5kTWFwID0gbWFwOwotCQkJc2F2ZVNvdW5kTWFwKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2b2x1bWUuCi0JICoKLQkgKiBAcGFyYW0gdm9sdW1lIHRoZSB2b2x1bWUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWb2x1bWUoaW50IHZvbHVtZSkgewotCQlnZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZShQUkVGX1ZPTFVNRSwgdm9sdW1lKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvYXVkaW8vQXVkaW9QcmVmZXJlbmNlUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvYXVkaW8vQXVkaW9QcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTBhNmIzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2F1ZGlvL0F1ZGlvUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuYXVkaW87Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGVscC5JV29ya2JlbmNoSGVscFN5c3RlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLkNvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlNXVFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5UcmFjZTsKLS8qKgotICogQXVkaW8gcHJlZmVyZW5jZSBwYWdlLgotICovCi1wdWJsaWMgY2xhc3MgQXVkaW9QcmVmZXJlbmNlUGFnZSBleHRlbmRzIFByZWZlcmVuY2VQYWdlIGltcGxlbWVudHMgSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlIHsKLQlwcm90ZWN0ZWQgQnV0dG9uIGVuYWJsZUJ1dHRvbjsKLQlwcm90ZWN0ZWQgU3Bpbm5lciB2b2x1bWU7Ci0KLQlwcm90ZWN0ZWQgTWFwIHVzZXJTb3VuZE1hcDsKLQotCXByb3RlY3RlZCBDYXRlZ29yeVRhYmxlVmlld2VyIHZpZXdlcjsKLQkKLQlib29sZWFuIHNvdW5kQXZhaWxhYmxlID0gdHJ1ZTsKLQotCS8qKgotCSAqIEF1ZGlvUHJlZmVyZW5jZVBhZ2UgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgQXVkaW9QcmVmZXJlbmNlUGFnZSgpIHsKLQkJc3VwZXIoKTsKLQkKLQkJbG9hZFVzZXJNYXBJbmZvKCk7Ci0JfQotCQotCXByb3RlY3RlZCBJUGF0aCBjaG9vc2VBdWRpb0ZpbGUoKSB7Ci0JCUZpbGVEaWFsb2cgZGlhbG9nID0gbmV3IEZpbGVEaWFsb2coZ2V0U2hlbGwoKSwgU1dULlNJTkdMRSk7Ci0JCWRpYWxvZy5zZXRUZXh0KE1lc3NhZ2VzLmF1ZGlvUHJlZlNlbGVjdEZpbGUpOwotCQlkaWFsb2cuc2V0RmlsdGVyRXh0ZW5zaW9ucyhuZXcgU3RyaW5nW10geyIqLmF1Oyoud2F2In0pOwotCQlkaWFsb2cuc2V0RmlsdGVyUGF0aChudWxsKTsKLQkJZGlhbG9nLm9wZW4oKTsKLQkKLQkJU3RyaW5nW10gZmlsZW5hbWVzID0gZGlhbG9nLmdldEZpbGVOYW1lcygpOwotCQlpZiAoZmlsZW5hbWVzICE9IG51bGwgJiYgZmlsZW5hbWVzLmxlbmd0aCA+IDApIHsKLQkJCVN0cmluZyBmaWx0ZXJQYXRoID0gZGlhbG9nLmdldEZpbHRlclBhdGgoKTsKLQkJCXJldHVybiBuZXcgUGF0aChmaWx0ZXJQYXRoICsgamF2YS5pby5GaWxlLnNlcGFyYXRvciArIGZpbGVuYW1lc1swXSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbmQgcmV0dXJucyB0aGUgU1dUIGNvbnRyb2wgZm9yIHRoZSBjdXN0b21pemVkIGJvZHkgCi0JICogb2YgdGhpcyBwcmVmZXJlbmNlIHBhZ2UgdW5kZXIgdGhlIGdpdmVuIHBhcmVudCBjb21wb3NpdGUuCi0JICogPHA+Ci0JICogVGhpcyBmcmFtZXdvcmsgbWV0aG9kIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgY29uY3JldGUKLQkgKiBzdWJjbGFzc2VzLgotCSAqIDwvcD4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcmV0dXJuIHRoZSBuZXcgY29udHJvbAotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJaW5pdGlhbGl6ZURpYWxvZ1VuaXRzKHBhcmVudCk7Ci0JCUlXb3JrYmVuY2hIZWxwU3lzdGVtIHdocyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpOwotCQl3aHMuc2V0SGVscChwYXJlbnQsIENvbnRleHRJZHMuQVVESU9fUFJFRkVSRU5DRVMpOwotCQotCQlmaW5hbCBBdWRpb0NvcmUgY29yZSA9IEF1ZGlvQ29yZS5nZXRJbnN0YW5jZSgpOwotCQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKDQpOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKDMpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkKLQkJZW5hYmxlQnV0dG9uID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0JCWVuYWJsZUJ1dHRvbi5zZXRUZXh0KE1lc3NhZ2VzLmF1ZGlvUHJlZkVuYWJsZSk7Ci0JCWVuYWJsZUJ1dHRvbi5zZXRTZWxlY3Rpb24oQXVkaW9Db3JlLmdldEluc3RhbmNlKCkuaXNTb3VuZEVuYWJsZWQoKSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCWVuYWJsZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQl3aHMuc2V0SGVscChlbmFibGVCdXR0b24sIENvbnRleHRJZHMuQVVESU9fUFJFRkVSRU5DRVNfRU5BQkxFKTsKLQkJCi0JCWZpbmFsIExhYmVsIHZvbHVtZUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQl2b2x1bWVMYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLmF1ZGlvUHJlZlZvbHVtZSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMjA7Ci0JCXZvbHVtZUxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXZvbHVtZUxhYmVsLnNldEVuYWJsZWQoZW5hYmxlQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQkJCi0JCXZvbHVtZSA9IG5ldyBTcGlubmVyKGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCXZvbHVtZS5zZXRNaW5pbXVtKDApOwotCQl2b2x1bWUuc2V0TWF4aW11bSgyMCk7Ci0JCXZvbHVtZS5zZXRTZWxlY3Rpb24oQXVkaW9Db3JlLmdldEluc3RhbmNlKCkuZ2V0Vm9sdW1lKCkpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWRhdGEud2lkdGhIaW50ID0gNjA7Ci0JCXZvbHVtZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQl2b2x1bWUuc2V0RW5hYmxlZChlbmFibGVCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCQl3aHMuc2V0SGVscCh2b2x1bWUsIENvbnRleHRJZHMuQVVESU9fUFJFRkVSRU5DRVNfVk9MVU1FKTsKLQkJCi0JCWVuYWJsZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQl2b2x1bWVMYWJlbC5zZXRFbmFibGVkKGVuYWJsZUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJdm9sdW1lLnNldEVuYWJsZWQoZW5hYmxlQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMzsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCi0JCWxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLmF1ZGlvUHJlZlNvdW5kcyk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQlmaW5hbCBUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShjb21wb3NpdGUsIFNXVC5CT1JERVIgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuU0lOR0xFIHwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULkNIRUNLKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJdGFibGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJd2hzLnNldEhlbHAodGFibGUsIENvbnRleHRJZHMuQVVESU9fUFJFRkVSRU5DRVNfU09VTkRTX1RBQkxFKTsKLQkJCi0JCXZpZXdlciA9IG5ldyBDYXRlZ29yeVRhYmxlVmlld2VyKHRhYmxlKTsKLQkJCi0JCVRhYmxlTGF5b3V0IHRhYmxlTGF5b3V0ID0gbmV3IFRhYmxlTGF5b3V0KCk7Ci0JCXRhYmxlLnNldExheW91dCh0YWJsZUxheW91dCk7Ci0JCXRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JCQotCQl0YWJsZUxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5QaXhlbERhdGEoMTksIGZhbHNlKSk7Ci0JCVRhYmxlQ29sdW1uIGNvbCA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUsIDApOwotCQljb2wuc2V0VGV4dCgiIik7Ci0JCWNvbC5zZXRSZXNpemFibGUoZmFsc2UpOwotCQkKLQkJdGFibGVMYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uV2VpZ2h0RGF0YSgxMSwgMTEwLCB0cnVlKSk7Ci0JCWNvbCA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUsIDEpOwotCQljb2wuc2V0VGV4dChNZXNzYWdlcy5hdWRpb1ByZWZTb3VuZCk7Ci0JCWNvbC5zZXRSZXNpemFibGUodHJ1ZSk7Ci0JCQotCQl0YWJsZUxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKDE1LCAxNTAsIHRydWUpKTsKLQkJY29sID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSwgMik7Ci0JCWNvbC5zZXRUZXh0KE1lc3NhZ2VzLmF1ZGlvUHJlZkZpbGUpOwotCQljb2wuc2V0UmVzaXphYmxlKHRydWUpOwotCQkKLQkJdmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQXVkaW9UYWJsZUNvbnRlbnRQcm92aWRlcigpKTsKLQkJdmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IEF1ZGlvVGFibGVMYWJlbFByb3ZpZGVyKHRoaXMpKTsKLQkJdmlld2VyLnNldElucHV0KCJyb290Iik7Ci0JCQotCQlzZXRDaGVja1N0YXRlKHZpZXdlcik7Ci0JCQotCQl2aWV3ZXIuYWRkQ2hlY2tTdGF0ZUxpc3RlbmVyKG5ldyBJQ2hlY2tTdGF0ZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY2hlY2tTdGF0ZUNoYW5nZWQoQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCWJvb2xlYW4gY2hlY2tlZCA9IGV2ZW50LmdldENoZWNrZWQoKTsKLQkJCQlPYmplY3Qgb2JqID0gZXZlbnQuZ2V0RWxlbWVudCgpOwotCQkJCQotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJU3RyaW5nIGlkID0gKFN0cmluZykgb2JqOwotCQkJCQljb3JlLnNldENhdGVnb3J5RW5hYmxlZChpZCwgY2hlY2tlZCk7Ci0JCQkJCS8vdmlld2VyLnJlZnJlc2goKTsKLQkJCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBBdWRpb1RhYmxlQ29udGVudFByb3ZpZGVyLmdldFNvdW5kc0J5Q2F0ZWdvcnkoaWQpLml0ZXJhdG9yKCk7Ci0JCQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJCVNvdW5kIHMgPSAoU291bmQpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCXZpZXdlci5zZXRDaGVja2VkKHMsIGNoZWNrZWQpOwotCQkJCQkJY29yZS5zZXRTb3VuZEVuYWJsZWQocy5nZXRJZCgpLCBjaGVja2VkKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCVNvdW5kIHNvdW5kID0gKFNvdW5kKSBvYmo7Ci0JCQkJCWNvcmUuc2V0U291bmRFbmFibGVkKHNvdW5kLmdldElkKCksIGNoZWNrZWQpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCQotCQlDb21wb3NpdGUgcmlnaHQgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKDQpOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKDQpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJcmlnaHQuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKTsKLQkJcmlnaHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkKLQkJLy8gcGxheSBidXR0b24gYW5kIHRhYmxlIHNlbGVjdGlvbiBsaXN0ZW5lcgotCQlmaW5hbCBCdXR0b24gcGxheUJ1dHRvbiA9IFNXVFV0aWwuY3JlYXRlQnV0dG9uKHJpZ2h0LCBNZXNzYWdlcy5hdWRpb1ByZWZQbGF5KTsKLQkJcGxheUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJd2hzLnNldEhlbHAocGxheUJ1dHRvbiwgQ29udGV4dElkcy5BVURJT19QUkVGRVJFTkNFU19QTEFZKTsKLQkKLQkJZmluYWwgQnV0dG9uIGJyb3dzZUJ1dHRvbiA9IFNXVFV0aWwuY3JlYXRlQnV0dG9uKHJpZ2h0LCBNZXNzYWdlcy5hdWRpb1ByZWZCcm93c2UpOwotCQlicm93c2VCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCXdocy5zZXRIZWxwKGJyb3dzZUJ1dHRvbiwgQ29udGV4dElkcy5BVURJT19QUkVGRVJFTkNFU19CUk9XU0UpOwotCQotCQlmaW5hbCBCdXR0b24gcmVzZXRCdXR0b24gPSBTV1RVdGlsLmNyZWF0ZUJ1dHRvbihyaWdodCwgTWVzc2FnZXMuYXVkaW9QcmVmUmVzZXQpOwotCQlyZXNldEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJd2hzLnNldEhlbHAocmVzZXRCdXR0b24sIENvbnRleHRJZHMuQVVESU9fUFJFRkVSRU5DRVNfUkVTRVQpOwotCQkKLQkJdmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJdHJ5IHsKLQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudC5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJT2JqZWN0IG9iaiA9IHNlbC5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFNvdW5kKSB7Ci0JCQkJCQlTb3VuZCBzb3VuZCA9IChTb3VuZCkgb2JqOwotCQkJCQkJVVJMIHVybCA9IGdldFNvdW5kVVJMKHNvdW5kLmdldElkKCkpOwotCQkJCQkJaWYgKHVybCAhPSBudWxsICYmIHNvdW5kQXZhaWxhYmxlKQotCQkJCQkJCXBsYXlCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJCWVsc2UKLQkJCQkJCQlwbGF5QnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQkJYnJvd3NlQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCQkKLQkJCQkJCWlmIChnZXRVc2VyU291bmRQYXRoKHNvdW5kLmdldElkKCkpICE9IG51bGwpCi0JCQkJCQkJcmVzZXRCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJCWVsc2UKLQkJCQkJCQlyZXNldEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXBsYXlCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCQlicm93c2VCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCQlyZXNldEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBpbiB0YWJsZSBzZWxlY3Rpb24iLCBleCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkKLQkJc291bmRBdmFpbGFibGUgPSBBdWRpb0NvcmUuaXNBdWRpb1N1cHBvcnRlZCgpOwotCQlpZiAoc291bmRBdmFpbGFibGUpIHsKLQkJCXBsYXlCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQl0cnkgewotCQkJCQkJaW50IHNlbCA9IHRhYmxlLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCQkJCQlTb3VuZCBzb3VuZCA9IChTb3VuZCkgdGFibGUuZ2V0SXRlbShzZWwpLmdldERhdGEoKTsKLQkJCQkJCUF1ZGlvQ29yZS5wbGF5U291bmQoZ2V0U291bmRVUkwoc291bmQuZ2V0SWQoKSksIHZvbHVtZS5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgaW4gdGFibGUgc2VsZWN0aW9uIiwgZXgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0gZWxzZQotCQkJcGxheUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCi0JCWJyb3dzZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQl0cnkgewotCQkJCQlJUGF0aCBwYXRoID0gY2hvb3NlQXVkaW9GaWxlKCk7Ci0JCQkJCWlmIChwYXRoICE9IG51bGwpIHsKLQkJCQkJCWludCBzZWwgPSB0YWJsZS5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQkJCQkJU291bmQgc291bmQgPSAoU291bmQpIHRhYmxlLmdldEl0ZW0oc2VsKS5nZXREYXRhKCk7Ci0JCQkJCQlzZXRVc2VyU291bmRQYXRoKHNvdW5kLmdldElkKCksIHBhdGgpOwotCQkJCQkJdmlld2VyLnJlZnJlc2goc291bmQpOwotCQkJCQkJcGxheUJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGJyb3dzaW5nIiwgZXgpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCQotCQlyZXNldEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQl0cnkgewotCQkJCQlpbnQgc2VsID0gdGFibGUuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJCQkJU291bmQgc291bmQgPSAoU291bmQpIHRhYmxlLmdldEl0ZW0oc2VsKS5nZXREYXRhKCk7Ci0JCQkJCXJlbW92ZVVzZXJTb3VuZFBhdGgoc291bmQuZ2V0SWQoKSk7Ci0JCQkJCXZpZXdlci5yZWZyZXNoKHNvdW5kKTsKLQkJCQkJLy9wbGF5QnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIHJlc2V0aW5nIHNvdW5kIiwgZXgpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCQotCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KGNvbXBvc2l0ZSk7Ci0JCQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldENoZWNrU3RhdGUoQ2hlY2tib3hUYWJsZVZpZXdlciB2aWV3ZXIpIHsKLQkJQXVkaW9Db3JlIGNvcmUgPSBBdWRpb0NvcmUuZ2V0SW5zdGFuY2UoKTsKLQkJCi0JCU1hcCBjYXRlZ29yaWVzID0gY29yZS5nZXRDYXRlZ29yaWVzKCk7Ci0JCQotCQkvLyBmaXJzdCwgZmluZCBhbGwgdGhlIGNhdGVnb3JpZXMgYW5kIHNvcnQKLQkJTGlzdCBjYXRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IGNhdGVnb3JpZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLQkJCWNhdHMuYWRkKGl0ZXJhdG9yLm5leHQoKSk7Ci0JCQotCQkvLyBsaXN0IHRoZW0sIGlnbm9yaW5nIGVtcHR5IG9uZXMKLQkJaXRlcmF0b3IgPSBjYXRlZ29yaWVzLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVN0cmluZyBpZCA9IChTdHJpbmcpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCUxpc3QgbCA9IEF1ZGlvVGFibGVDb250ZW50UHJvdmlkZXIuZ2V0U291bmRzQnlDYXRlZ29yeShpZCk7Ci0JCQlpZiAoIWwuaXNFbXB0eSgpKSB7Ci0JCQkJaWYgKGNvcmUuaXNDYXRlZ29yeUVuYWJsZWQoaWQpKQotCQkJCQl2aWV3ZXIuc2V0Q2hlY2tlZChpZCwgdHJ1ZSk7Ci0JCQkJCi0JCQkJaW50IHNpemUgPSBsLnNpemUoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCQlTb3VuZCBzID0gKFNvdW5kKSBsLmdldChpKTsKLQkJCQkJaWYgKGNvcmUuaXNTb3VuZEVuYWJsZWQocy5nZXRJZCgpKSkKLQkJCQkJCXZpZXdlci5zZXRDaGVja2VkKHMsIHRydWUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJLy8gZmluYWxseSwgbGlzdCB0aGUgIm1pc2MiIHNvdW5kcwotCQlMaXN0IGwgPSBBdWRpb1RhYmxlQ29udGVudFByb3ZpZGVyLmdldFNvdW5kc0J5Q2F0ZWdvcnkobnVsbCk7Ci0JCWlmICghbC5pc0VtcHR5KCkpIHsKLQkJCWludCBzaXplID0gbC5zaXplKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCVNvdW5kIHMgPSAoU291bmQpIGwuZ2V0KGkpOwotCQkJCWlmIChjb3JlLmlzU291bmRFbmFibGVkKHMuZ2V0SWQoKSkpCi0JCQkJCXZpZXdlci5zZXRDaGVja2VkKHMsIHRydWUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGgKLQkgKiBAcGFyYW0gaWQgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXByb3RlY3RlZCBVUkwgZ2V0U291bmRVUkwoU3RyaW5nIGlkKSB7Ci0JCXRyeSB7Ci0JCQlJUGF0aCBwYXRoID0gKElQYXRoKSB1c2VyU291bmRNYXAuZ2V0KGlkKTsKLQkJCWlmIChwYXRoICE9IG51bGwpCi0JCQkJcmV0dXJuIHBhdGgudG9GaWxlKCkudG9VUkwoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCi0JCXJldHVybiBBdWRpb0NvcmUuZ2V0SW5zdGFuY2UoKS5nZXRTb3VuZChpZCkuZ2V0TG9jYXRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aAotCSAqIEBwYXJhbSBpZCBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHJvdGVjdGVkIElQYXRoIGdldFVzZXJTb3VuZFBhdGgoU3RyaW5nIGlkKSB7Ci0JCXRyeSB7Ci0JCQlJUGF0aCBwYXRoID0gKElQYXRoKSB1c2VyU291bmRNYXAuZ2V0KGlkKTsKLQkJCWlmIChwYXRoICE9IG51bGwpCi0JCQkJcmV0dXJuIHBhdGg7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGlzIHByZWZlcmVuY2UgcGFnZSBmb3IgdGhlIGdpdmVuIHdvcmtiZW5jaC4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYXV0b21hdGljYWxseSBhcyB0aGUgcHJlZmVyZW5jZSBwYWdlIGlzIGJlaW5nIGNyZWF0ZWQKLQkgKiBhbmQgaW5pdGlhbGl6ZWQuIENsaWVudHMgbXVzdCBub3QgY2FsbCB0aGlzIG1ldGhvZC4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcGFyYW0gd29ya2JlbmNoIHRoZSB3b3JrYmVuY2gKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsb2FkVXNlck1hcEluZm8oKSB7Ci0JCS8vIGNyZWF0ZSBhIGNvcHkgb2YgdGhlIHVzZXIgc291bmQgbWFwCi0JCU1hcCBtYXAgPSBBdWRpb0NvcmUuZ2V0SW5zdGFuY2UoKS5nZXRVc2VyU291bmRNYXAoKTsKLQkJdXNlclNvdW5kTWFwID0gbmV3IEhhc2hNYXAobWFwLnNpemUoKSk7Ci0JCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbWFwLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVN0cmluZyBpZCA9IChTdHJpbmcpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCUlQYXRoIHBhdGggPSAoSVBhdGgpIG1hcC5nZXQoaWQpOwotCQkJdXNlclNvdW5kTWFwLnB1dChpZCwgcGF0aCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFByZWZlcmVuY2VQYWdlI3BlcmZvcm1EZWZhdWx0cygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQlBdWRpb0NvcmUgY29yZSA9IEF1ZGlvQ29yZS5nZXRJbnN0YW5jZSgpOwotCQkKLQkJZW5hYmxlQnV0dG9uLnNldFNlbGVjdGlvbihjb3JlLmdldERlZmF1bHRTb3VuZHNFbmFibGVkKCkpOwotCQl2b2x1bWUuc2V0U2VsZWN0aW9uKGNvcmUuZ2V0RGVmYXVsdFZvbHVtZSgpKTsKLQkKLQkJdXNlclNvdW5kTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJdmlld2VyLnJlZnJlc2goKTsKLQkKLQkJc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0JfQotCi0JLyoqIAotCSAqIEBzZWUgUHJlZmVyZW5jZVBhZ2UjcGVyZm9ybU9rKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCUF1ZGlvQ29yZSBjb3JlID0gQXVkaW9Db3JlLmdldEluc3RhbmNlKCk7Ci0JCWNvcmUuc2V0U291bmRzRW5hYmxlZChlbmFibGVCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCQljb3JlLnNldFZvbHVtZSh2b2x1bWUuZ2V0U2VsZWN0aW9uKCkpOwotCQotCQljb3JlLnNldFVzZXJTb3VuZE1hcCh1c2VyU291bmRNYXApOwotCQl2aWV3ZXIucmVmcmVzaCgpOwotCQotCQlyZXR1cm4gc3VwZXIucGVyZm9ybU9rKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlVXNlclNvdW5kUGF0aChTdHJpbmcgaWQpIHsKLQkJaWYgKHVzZXJTb3VuZE1hcC5jb250YWluc0tleShpZCkpCi0JCQl1c2VyU291bmRNYXAucmVtb3ZlKGlkKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzYXZlVXNlck1hcEluZm8oKSB7Ci0JCS8vIGNyZWF0ZSBhIGNvcHkgb2YgdGhlIHVzZXIgc291bmQgbWFwCi0JCU1hcCBtYXAgPSBBdWRpb0NvcmUuZ2V0SW5zdGFuY2UoKS5nZXRVc2VyU291bmRNYXAoKTsKLQkJdXNlclNvdW5kTWFwID0gbmV3IEhhc2hNYXAobWFwLnNpemUoKSk7Ci0JCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbWFwLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVN0cmluZyBpZCA9IChTdHJpbmcpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCUlQYXRoIHBhdGggPSAoSVBhdGgpIG1hcC5nZXQoaWQpOwotCQkJdXNlclNvdW5kTWFwLnB1dChpZCwgcGF0aCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gcGF0aCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGgKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVc2VyU291bmRQYXRoKFN0cmluZyBpZCwgSVBhdGggcGF0aCkgewotCQl1c2VyU291bmRNYXAucHV0KGlkLCBwYXRoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvYXVkaW8vQXVkaW9UYWJsZUNvbnRlbnRQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvYXVkaW8vQXVkaW9UYWJsZUNvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODAzM2MyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2F1ZGlvL0F1ZGlvVGFibGVDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuYXVkaW87Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotLyoqCi0gKiBBdWRpbyB0YWJsZSBjb250ZW50IHByb3ZpZGVyLgotICovCi1jbGFzcyBBdWRpb1RhYmxlQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgewotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE1JU0NfQ0FURUdPUlkgPSAibWlzY0NhdGVnb3J5IjsKLQotCS8qKgotCSAqIEF1ZGlvVGFibGVDb250ZW50UHJvdmlkZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgQXVkaW9UYWJsZUNvbnRlbnRQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwb3NlcyBvZiB0aGlzIGNvbnRlbnQgcHJvdmlkZXIuICAKLQkgKiBUaGlzIGlzIGNhbGxlZCBieSB0aGUgdmlld2VyIHdoZW4gaXQgaXMgZGlzcG9zZWQuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGVsZW1lbnRzIHRvIGRpc3BsYXkgaW4gdGhlIHZpZXdlciAKLQkgKiB3aGVuIGl0cyBpbnB1dCBpcyBzZXQgdG8gdGhlIGdpdmVuIGVsZW1lbnQuIAotCSAqIFRoZXNlIGVsZW1lbnRzIGNhbiBiZSBwcmVzZW50ZWQgYXMgcm93cyBpbiBhIHRhYmxlLCBpdGVtcyBpbiBhIGxpc3QsIGV0Yy4KLQkgKiBUaGUgcmVzdWx0IGlzIG5vdCBtb2RpZmllZCBieSB0aGUgdmlld2VyLgotCSAqCi0JICogQHBhcmFtIGlucHV0RWxlbWVudCB0aGUgaW5wdXQgZWxlbWVudAotCSAqIEByZXR1cm4gdGhlIGFycmF5IG9mIGVsZW1lbnRzIHRvIGRpc3BsYXkgaW4gdGhlIHZpZXdlcgotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCUF1ZGlvQ29yZSBjb3JlID0gQXVkaW9Db3JlLmdldEluc3RhbmNlKCk7Ci0JCi0JCU1hcCBjYXRlZ29yaWVzID0gY29yZS5nZXRDYXRlZ29yaWVzKCk7Ci0JCU1hcCBzb3VuZHMgPSBjb3JlLmdldFNvdW5kcygpOwotCQotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KHNvdW5kcy5zaXplKCkpOwotCQotCQkvLyBmaXJzdCwgZmluZCBhbGwgdGhlIGNhdGVnb3JpZXMgYW5kIHNvcnQKLQkJTGlzdCBjYXRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IGNhdGVnb3JpZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLQkJCWNhdHMuYWRkKGl0ZXJhdG9yLm5leHQoKSk7Ci0JCXNvcnRDYXRlZ29yaWVzKGNhdHMpOwotCQotCQkvLyBsaXN0IHRoZW0sIGlnbm9yaW5nIGVtcHR5IG9uZXMKLQkJaXRlcmF0b3IgPSBjYXRlZ29yaWVzLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVN0cmluZyBpZCA9IChTdHJpbmcpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCUxpc3QgbCA9IGdldFNvdW5kc0J5Q2F0ZWdvcnkoaWQpOwotCQkJaWYgKCFsLmlzRW1wdHkoKSkgewotCQkJCWxpc3QuYWRkKGlkKTsKLQkJCQlzb3J0U291bmRzKGwpOwotCQotCQkJCWludCBzaXplID0gbC5zaXplKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCi0JCQkJCWxpc3QuYWRkKGwuZ2V0KGkpKTsKLQkJCX0KLQkJfQotCQotCQkvLyBmaW5hbGx5LCBsaXN0IHRoZSAibWlzYyIgc291bmRzCi0JCUxpc3QgbCA9IGdldFNvdW5kc0J5Q2F0ZWdvcnkobnVsbCk7Ci0JCWlmICghbC5pc0VtcHR5KCkpIHsKLQkJCWxpc3QuYWRkKE1JU0NfQ0FURUdPUlkpOwotCQkJc29ydFNvdW5kcyhsKTsKLQkKLQkJCWludCBzaXplID0gbC5zaXplKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLQkJCQlsaXN0LmFkZChsLmdldChpKSk7Ci0JCX0KLQkKLQkJcmV0dXJuIGxpc3QudG9BcnJheSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNvdW5kcyBmcm9tIHRoZSBnaXZlbiBjYXRlZ29yeS4gVXNlIG51bGwKLQkgKiB0byByZXR1cm4gYWxsIG1pc2NlbGxlbmVvdXMgc291bmRzIHdpdGggbm8gY2F0ZWdvcnkgb3IKLQkgKiBhbiBpbnZhbGlkIGNhdGVnb3J5LgotCSAqCi0JICogQHJldHVybiBqYXZhLnV0aWwuTGlzdAotCSAqIEBwYXJhbSBjYXRlZ29yeSBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBMaXN0IGdldFNvdW5kc0J5Q2F0ZWdvcnkoU3RyaW5nIGNhdGVnb3J5KSB7Ci0JCUF1ZGlvQ29yZSBjb3JlID0gQXVkaW9Db3JlLmdldEluc3RhbmNlKCk7Ci0JCi0JCU1hcCBzb3VuZHMgPSBjb3JlLmdldFNvdW5kcygpOwotCQlNYXAgY2F0ZWdvcmllcyA9IGNvcmUuZ2V0Q2F0ZWdvcmllcygpOwotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gc291bmRzLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVN0cmluZyBpZCA9IChTdHJpbmcpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCVNvdW5kIHNvdW5kID0gKFNvdW5kKSBzb3VuZHMuZ2V0KGlkKTsKLQkJCWlmIChjYXRlZ29yeSAhPSBudWxsICYmIGNhdGVnb3J5LmVxdWFscyhzb3VuZC5nZXRDYXRlZ29yeSgpKSkKLQkJCQlsaXN0LmFkZChzb3VuZCk7Ci0JCQllbHNlIGlmIChjYXRlZ29yeSA9PSBudWxsICYmIChzb3VuZC5nZXRDYXRlZ29yeSgpID09IG51bGwgfHwgIWNhdGVnb3JpZXMuY29udGFpbnNLZXkoc291bmQuZ2V0Q2F0ZWdvcnkoKSkpKQotCQkJCWxpc3QuYWRkKHNvdW5kKTsKLQkJfQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBOb3RpZmllcyB0aGlzIGNvbnRlbnQgcHJvdmlkZXIgdGhhdCB0aGUgZ2l2ZW4gdmlld2VyJ3MgaW5wdXQKLQkgKiBoYXMgYmVlbiBzd2l0Y2hlZCB0byBhIGRpZmZlcmVudCBlbGVtZW50LgotCSAqIDxwPgotCSAqIEEgdHlwaWNhbCB1c2UgZm9yIHRoaXMgbWV0aG9kIGlzIHJlZ2lzdGVyaW5nIHRoZSBjb250ZW50IHByb3ZpZGVyIGFzIGEgbGlzdGVuZXIKLQkgKiB0byBjaGFuZ2VzIG9uIHRoZSBuZXcgaW5wdXQgKHVzaW5nIG1vZGVsLXNwZWNpZmljIG1lYW5zKSwgYW5kIGRlcmVnaXN0ZXJpbmcgdGhlIHZpZXdlciAKLQkgKiBmcm9tIHRoZSBvbGQgaW5wdXQuIEluIHJlc3BvbnNlIHRvIHRoZXNlIGNoYW5nZSBub3RpZmljYXRpb25zLCB0aGUgY29udGVudCBwcm92aWRlcgotCSAqIHByb3BhZ2F0ZXMgdGhlIGNoYW5nZXMgdG8gdGhlIHZpZXdlci4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcGFyYW0gdmlld2VyIHRoZSB2aWV3ZXIKLQkgKiBAcGFyYW0gb2xkSW5wdXQgdGhlIG9sZCBpbnB1dCBlbGVtZW50LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgdmlld2VyCi0JICogICBkaWQgbm90IHByZXZpb3VzbHkgaGF2ZSBhbiBpbnB1dAotCSAqIEBwYXJhbSBuZXdJbnB1dCB0aGUgbmV3IGlucHV0IGVsZW1lbnQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSB2aWV3ZXIKLQkgKiAgIGRvZXMgbm90IGhhdmUgYW4gaW5wdXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIFNvcnRzIGEgbGlzdCBvZiBjYXRlZ29yaWVzLCBpbiBwbGFjZS4KLQkgKgotCSAqIEBwYXJhbSBsaXN0IGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgc29ydENhdGVnb3JpZXMoTGlzdCBsaXN0KSB7Ci0JCWludCBzaXplID0gbGlzdC5zaXplKCk7Ci0JCWlmIChzaXplIDwgMikKLQkJCXJldHVybjsKLQkKLQkJTWFwIGNhdGVnb3JpZXMgPSBBdWRpb0NvcmUuZ2V0SW5zdGFuY2UoKS5nZXRDYXRlZ29yaWVzKCk7Ci0JCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZSAtIDE7IGkrKykgewotCQkJZm9yIChpbnQgaiA9IGkrMTsgaiA8IHNpemU7IGorKykgewotCQkJCVN0cmluZyBhID0gKFN0cmluZykgbGlzdC5nZXQoaSk7Ci0JCQkJU3RyaW5nIGFhID0gKFN0cmluZykgY2F0ZWdvcmllcy5nZXQoYSk7Ci0JCQkJU3RyaW5nIGIgPSAoU3RyaW5nKSBsaXN0LmdldChqKTsKLQkJCQlTdHJpbmcgYmIgPSAoU3RyaW5nKSBjYXRlZ29yaWVzLmdldChiKTsKLQkJCQlpZiAoYWEuY29tcGFyZVRvKGJiKSA+IDApIHsKLQkJCQkJbGlzdC5zZXQoaSwgYik7Ci0JCQkJCWxpc3Quc2V0KGosIGEpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFNvcnRzIGEgbGlzdCBvZiBzb3VuZHMsIGluIHBsYWNlLgotCSAqCi0JICogQHBhcmFtIHNvdW5kcyBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNvcnRTb3VuZHMoTGlzdCBzb3VuZHMpIHsKLQkJaW50IHNpemUgPSBzb3VuZHMuc2l6ZSgpOwotCQlpZiAoc2l6ZSA8IDIpCi0JCQlyZXR1cm47Ci0JCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZSAtIDE7IGkrKykgewotCQkJZm9yIChpbnQgaiA9IGkrMTsgaiA8IHNpemU7IGorKykgewotCQkJCVNvdW5kIGEgPSAoU291bmQpIHNvdW5kcy5nZXQoaSk7Ci0JCQkJU291bmQgYiA9IChTb3VuZCkgc291bmRzLmdldChqKTsKLQkJCQlpZiAoYS5nZXROYW1lKCkuY29tcGFyZVRvKGIuZ2V0TmFtZSgpKSA+IDApIHsKLQkJCQkJc291bmRzLnNldChpLCBiKTsKLQkJCQkJc291bmRzLnNldChqLCBhKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvYXVkaW8vQXVkaW9UYWJsZUxhYmVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2F1ZGlvL0F1ZGlvVGFibGVMYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2NWZjZWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvYXVkaW8vQXVkaW9UYWJsZUxhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuYXVkaW87Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5JbWFnZVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotLyoqCi0gKiBBdWRpbyB0YWJsZSBsYWJlbCBwcm92aWRlci4KLSAqLwotY2xhc3MgQXVkaW9UYWJsZUxhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJVGFibGVMYWJlbFByb3ZpZGVyIHsKLQlwcm90ZWN0ZWQgQXVkaW9QcmVmZXJlbmNlUGFnZSBwYWdlOwotCi0JLyoqCi0JICogQXVkaW9UYWJsZUxhYmVsUHJvdmlkZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFnZSB0aGUgcHJlZmVyZW5jZSBwYWdlCi0JICovCi0JcHVibGljIEF1ZGlvVGFibGVMYWJlbFByb3ZpZGVyKEF1ZGlvUHJlZmVyZW5jZVBhZ2UgcGFnZSkgewotCQlzdXBlcigpOwotCQl0aGlzLnBhZ2UgPSBwYWdlOwotCX0KLQotCS8qKgotCSAqIEFkZHMgYSBsaXN0ZW5lciB0byB0aGlzIGxhYmVsIHByb3ZpZGVyLiAKLQkgKiBIYXMgbm8gZWZmZWN0IGlmIGFuIGlkZW50aWNhbCBsaXN0ZW5lciBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQuCi0JICogPHA+Ci0JICogTGFiZWwgcHJvdmlkZXIgbGlzdGVuZXJzIGFyZSBpbmZvcm1lZCBhYm91dCBzdGF0ZSBjaGFuZ2VzIAotCSAqIHRoYXQgYWZmZWN0IHRoZSByZW5kZXJpbmcgb2YgdGhlIHZpZXdlciB0aGF0IHVzZXMgdGhpcyBsYWJlbCBwcm92aWRlci4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcGFyYW0gbGlzdGVuZXIgYSBsYWJlbCBwcm92aWRlciBsaXN0ZW5lcgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIERpc3Bvc2VzIG9mIHRoaXMgbGFiZWwgcHJvdmlkZXIuICBXaGVuIGEgbGFiZWwgcHJvdmlkZXIgaXMKLQkgKiBhdHRhY2hlZCB0byBhIHZpZXdlciwgdGhlIHZpZXdlciB3aWxsIGF1dG9tYXRpY2FsbHkgY2FsbAotCSAqIHRoaXMgbWV0aG9kIHdoZW4gdGhlIHZpZXdlciBpcyBiZWluZyBjbG9zZWQuICBXaGVuIGxhYmVsIHByb3ZpZGVycwotCSAqIGFyZSB1c2VkIG91dHNpZGUgb2YgdGhlIGNvbnRleHQgb2YgYSB2aWV3ZXIsIGl0IGlzIHRoZSBjbGllbnQncwotCSAqIHJlc3BvbnNpYmlsaXR5IHRvIGVuc3VyZSB0aGF0IHRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZQotCSAqIHByb3ZpZGVyIGlzIG5vIGxvbmdlciBuZWVkZWQuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVRhYmxlTGFiZWxQcm92aWRlciNnZXRDb2x1bW5JbWFnZShqYXZhLmxhbmcuT2JqZWN0LCBpbnQpCi0JICovCi0JcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJLypBdWRpb0NvcmUgY29yZSA9IEF1ZGlvQ29yZS5nZXRJbnN0YW5jZSgpOwotCQotCQlpZiAoY29sdW1uSW5kZXggPT0gMCkgewotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQlpZiAoZWxlbWVudCAhPSBBdWRpb1RhYmxlQ29udGVudFByb3ZpZGVyLk1JU0NfQ0FURUdPUlkpIHsKLQkJCQkJaWYgKGNvcmUuaXNDYXRlZ29yeUVuYWJsZWQoKFN0cmluZykgZWxlbWVudCkpCi0JCQkJCQlyZXR1cm4gSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZShJbWFnZVJlc291cmNlLklNR19BVURJT19FTkFCTEVEKTsKLQkJCQkJcmV0dXJuIEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2UoSW1hZ2VSZXNvdXJjZS5JTUdfQVVESU9fRElTQUJMRUQpOwotCQkJCX0KLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCVNvdW5kIHNvdW5kID0gKFNvdW5kKSBlbGVtZW50OwotCQkJaWYgKCFjb3JlLmlzQ2F0ZWdvcnlFbmFibGVkKHNvdW5kLmdldENhdGVnb3J5KCkpKQotCQkJCXJldHVybiBJbWFnZVJlc291cmNlLmdldEltYWdlKEltYWdlUmVzb3VyY2UuSU1HX0FVRElPX1VOQVZBSUxBQkxFKTsKLQkJCWlmIChjb3JlLmlzU291bmRFbmFibGVkKHNvdW5kLmdldElkKCkpKQotCQkJCXJldHVybiBJbWFnZVJlc291cmNlLmdldEltYWdlKEltYWdlUmVzb3VyY2UuSU1HX0FVRElPX0VOQUJMRUQpOwotCQkJcmV0dXJuIEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2UoSW1hZ2VSZXNvdXJjZS5JTUdfQVVESU9fRElTQUJMRUQpOwotCQl9IGVsc2UqLwotCQlpZiAoY29sdW1uSW5kZXggPT0gMSkgewotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBTdHJpbmcpCi0JCQkJcmV0dXJuIEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2UoSW1hZ2VSZXNvdXJjZS5JTUdfQVVESU9fQ0FURUdPUlkpOwotCQkJcmV0dXJuIEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2UoSW1hZ2VSZXNvdXJjZS5JTUdfQVVESU9fU09VTkQpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVRhYmxlTGFiZWxQcm92aWRlciNnZXRDb2x1bW5UZXh0KGphdmEubGFuZy5PYmplY3QsIGludCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQlpZiAoY29sdW1uSW5kZXggPT0gMCkKLQkJCXJldHVybiAiIjsKLQkJCi0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQlTdHJpbmcgY2F0ZWdvcnlJZCA9IChTdHJpbmcpIGVsZW1lbnQ7Ci0JCQlpZiAoY29sdW1uSW5kZXggPT0gMSkgewotCQkJCWlmIChjYXRlZ29yeUlkLmVxdWFscyhBdWRpb1RhYmxlQ29udGVudFByb3ZpZGVyLk1JU0NfQ0FURUdPUlkpKQotCQkJCQlyZXR1cm4gIiI7IC8vKE1pc2NlbGxhbmVvdXMpIjsKLQkJCQlNYXAgY2F0ZWdvcmllcyA9IEF1ZGlvQ29yZS5nZXRJbnN0YW5jZSgpLmdldENhdGVnb3JpZXMoKTsKLQkJCQlyZXR1cm4gKFN0cmluZykgY2F0ZWdvcmllcy5nZXQoY2F0ZWdvcnlJZCk7Ci0JCQl9Ci0JCQlyZXR1cm4gIiI7Ci0JCX0KLQkJU291bmQgc291bmQgPSAoU291bmQpIGVsZW1lbnQ7Ci0JCQotCQlpZiAoY29sdW1uSW5kZXggPT0gMSkgewotCQkJU3RyaW5nIHMgPSBzb3VuZC5nZXROYW1lKCk7Ci0JCQlpZiAocyAhPSBudWxsKQotCQkJCXJldHVybiBzOwotCQkJcmV0dXJuIE1lc3NhZ2VzLmF1ZGlvVW5rbm93bjsKLQkJfSBlbHNlIGlmIChjb2x1bW5JbmRleCA9PSAyKSB7Ci0JCQlJUGF0aCBwYXRoID0gcGFnZS5nZXRVc2VyU291bmRQYXRoKHNvdW5kLmdldElkKCkpOwotCQkJaWYgKHBhdGggIT0gbnVsbCkKLQkJCQlyZXR1cm4gcGF0aC5sYXN0U2VnbWVudCgpOwotCQkJCi0JCQlVUkwgdXJsID0gcGFnZS5nZXRTb3VuZFVSTChzb3VuZC5nZXRJZCgpKTsKLQkJCWlmICh1cmwgPT0gbnVsbCkKLQkJCQlyZXR1cm4gTWVzc2FnZXMuYXVkaW9Ob25lOwotCQkJcmV0dXJuIE1lc3NhZ2VzLmF1ZGlvRGVmYXVsdDsKLQkJfQotCQlyZXR1cm4gIiI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBsYWJlbCB3b3VsZCBiZSBhZmZlY3RlZCAKLQkgKiBieSBhIGNoYW5nZSB0byB0aGUgZ2l2ZW4gcHJvcGVydHkgb2YgdGhlIGdpdmVuIGVsZW1lbnQuCi0JICogVGhpcyBjYW4gYmUgdXNlZCB0byBvcHRpbWl6ZSBhIG5vbi1zdHJ1Y3R1cmFsIHZpZXdlciB1cGRhdGUuCi0JICogSWYgdGhlIHByb3BlcnR5IG1lbnRpb25lZCBpbiB0aGUgdXBkYXRlIGRvZXMgbm90IGFmZmVjdCB0aGUgbGFiZWwsCi0JICogdGhlbiB0aGUgdmlld2VyIG5lZWQgbm90IHVwZGF0ZSB0aGUgbGFiZWwuCi0JICoKLQkgKiBAcGFyYW0gZWxlbWVudCB0aGUgZWxlbWVudAotCSAqIEBwYXJhbSBwcm9wZXJ0eSB0aGUgcHJvcGVydHkKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBsYWJlbCB3b3VsZCBiZSBhZmZlY3RlZCwKLQkgKiAgICBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGl0IHdvdWxkIGJlIHVuYWZmZWN0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBhIGxpc3RlbmVyIHRvIHRoaXMgbGFiZWwgcHJvdmlkZXIuCi0JICogSGFzIG5vIGFmZmVjdCBpZiBhbiBpZGVudGljYWwgbGlzdGVuZXIgaXMgbm90IHJlZ2lzdGVyZWQuCi0JICoKLQkgKiBAcGFyYW0gbGlzdGVuZXIgYSBsYWJlbCBwcm92aWRlciBsaXN0ZW5lcgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9hdWRpby9DYXRlZ29yeVRhYmxlVmlld2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9hdWRpby9DYXRlZ29yeVRhYmxlVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1YzdkZDcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvYXVkaW8vQ2F0ZWdvcnlUYWJsZVZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmF1ZGlvOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQ7Ci0vKioKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBDYXRlZ29yeVRhYmxlVmlld2VyIGV4dGVuZHMgQ2hlY2tib3hUYWJsZVZpZXdlciB7Ci0JcHJvdGVjdGVkIENvbG9yIGNvbG9yOwotCi0JcHVibGljIENhdGVnb3J5VGFibGVWaWV3ZXIoVGFibGUgdGFibGUpIHsKLQkJc3VwZXIodGFibGUpOwotCQljcmVhdGVDb2xvcih0YWJsZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29sb3IoQ29udHJvbCBjKSB7Ci0JCWNvbG9yID0gbmV3IENvbG9yKGMuZ2V0RGlzcGxheSgpLCAyNTUsIDI1NSwgMjI1KTsKLQkJYy5hZGREaXNwb3NlTGlzdGVuZXIobmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBlKSB7Ci0JCQkJY29sb3IuZGlzcG9zZSgpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkb1VwZGF0ZUl0ZW0oV2lkZ2V0IHdpZGdldCwgT2JqZWN0IGVsZW1lbnQsIGJvb2xlYW4gZnVsbE1hcCkgewotCQlpZiAoY29sb3IgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKHdpZGdldCBpbnN0YW5jZW9mIFRhYmxlSXRlbSkgewotCQkJVGFibGVJdGVtIGl0ZW0gPSAoVGFibGVJdGVtKSB3aWRnZXQ7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCWl0ZW0uc2V0QmFja2dyb3VuZChjb2xvcik7Ci0JCQl9IGVsc2UKLQkJCQlpdGVtLnNldEJhY2tncm91bmQobnVsbCk7Ci0JCX0KLQkJc3VwZXIuZG9VcGRhdGVJdGVtKHdpZGdldCwgZWxlbWVudCwgZnVsbE1hcCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2F1ZGlvL1NvdW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9hdWRpby9Tb3VuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTI5NDM4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2F1ZGlvL1NvdW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmF1ZGlvOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotLyoqCi0gKiBBIHNpbmdsZSBzb3VuZC4KLSAqLwotY2xhc3MgU291bmQgewotCXByb3RlY3RlZCBTdHJpbmcgaWQ7Ci0JcHJvdGVjdGVkIFN0cmluZyBuYW1lOwotCXB1YmxpYyBVUkwgbG9jYXRpb247Ci0JcHJvdGVjdGVkIFN0cmluZyBjYXRlZ29yeTsKLQotCS8qKgotCSAqIFNvdW5kIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFNvdW5kKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFNvdW5kIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIGlkIGFuIGlkCi0JICogQHBhcmFtIGNhdGVnb3J5IGEgY2F0ZWdvcnkKLQkgKiBAcGFyYW0gbmFtZSBhIG5hbWUKLQkgKiBAcGFyYW0gbG9jIGxvY2F0aW9uCi0JICovCi0JcHVibGljIFNvdW5kKFN0cmluZyBpZCwgU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbmFtZSwgVVJMIGxvYykgewotCQlzdXBlcigpOwotCQotCQl0aGlzLmlkID0gaWQ7Ci0JCXRoaXMuY2F0ZWdvcnkgPSBjYXRlZ29yeTsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5sb2NhdGlvbiA9IGxvYzsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLmF1ZGlvLkNhdGVnb3J5Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRDYXRlZ29yeSgpIHsKLQkJcmV0dXJuIGNhdGVnb3J5OwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubmV0LlVSTAotCSAqLwotCXB1YmxpYyBVUkwgZ2V0TG9jYXRpb24oKSB7Ci0JCXJldHVybiBsb2NhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBuZXdDYXRlZ29yeSBvcmcuZWNsaXBzZS5hdWRpby5DYXRlZ29yeQotCSAqLwotCXB1YmxpYyB2b2lkIHNldENhdGVnb3J5KFN0cmluZyBuZXdDYXRlZ29yeSkgewotCQljYXRlZ29yeSA9IG5ld0NhdGVnb3J5OwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBuZXdJZCBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKSB7Ci0JCWlkID0gbmV3SWQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIG5ld0xvY2F0aW9uIGphdmEubmV0LlVSTAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExvY2F0aW9uKFVSTCBuZXdMb2NhdGlvbikgewotCQlsb2NhdGlvbiA9IG5ld0xvY2F0aW9uOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBuZXdOYW1lIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCW5hbWUgPSBuZXdOYW1lOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9hdWRpby9YTUxNZW1lbnRvLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9hdWRpby9YTUxNZW1lbnRvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlM2MxZGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvYXVkaW8vWE1MTWVtZW50by5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5hdWRpbzsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcudzNjLmRvbS4qOwotaW1wb3J0IG9yZy54bWwuc2F4Lio7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuKjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLio7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5kb20uRE9NU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklNZW1lbnRvOwotLyoqCi0gKiBBIE1lbWVudG8gaXMgYSBjbGFzcyBpbmRlcGVuZGVudCBjb250YWluZXIgZm9yIHBlcnNpc3RlbmNlCi0gKiBpbmZvLiAgSXQgaXMgYSByZWZsZWN0aW9uIG9mIDMgc3RvcmFnZSByZXF1aXJlbWVudHMuCi0gKgotICogMSkgICBXZSBuZWVkIHRoZSBhYmlsaXR5IHRvIHBlcnNpc3QgYW4gb2JqZWN0IGFuZCByZXN0b3JlIGl0LiAgCi0gKiAyKSAgIFRoZSBjbGFzcyBmb3IgYW4gb2JqZWN0IG1heSBiZSBhYnNlbnQuICBJZiBzbyB3ZSB3b3VsZCAKLSAqICAgICAgbGlrZSB0byBza2lwIHRoZSBvYmplY3QgYW5kIGtlZXAgcmVhZGluZy4gCi0gKiAzKSAgIFRoZSBjbGFzcyBmb3IgYW4gb2JqZWN0IG1heSBjaGFuZ2UuICBJZiBzbyB0aGUgbmV3IGNsYXNzIAotICogICAgICBzaG91bGQgYmUgYWJsZSB0byByZWFkIHRoZSBvbGQgcGVyc2lzdGVuY2UgaW5mby4KLSAqCi0gKiBXZSBjb3VsZCBhc2sgdGhlIG9iamVjdHMgdG8gc2VyaWFsaXplIHRoZW1zZWx2ZXMgaW50byBhbiAKLSAqIE9iamVjdE91dHB1dFN0cmVhbSwgRGF0YU91dHB1dFN0cmVhbSwgb3IgSGFzaHRhYmxlLiAgSG93ZXZlciAKLSAqIGFsbCBvZiB0aGVzZSBhcHByb2FjaGVzIGZhaWwgdG8gbWVldCB0aGUgc2Vjb25kIHJlcXVpcmVtZW50LgotICoKLSAqIE1lbWVudG8gc3VwcG9ydHMgYmluYXJ5IHBlcnNpc3RhbmNlIHdpdGggYSB2ZXJzaW9uIElELgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgWE1MTWVtZW50byBpbXBsZW1lbnRzIElNZW1lbnRvIHsKLQlwcml2YXRlIERvY3VtZW50IGZhY3Rvcnk7Ci0JcHJpdmF0ZSBFbGVtZW50IGVsZW1lbnQ7Ci0KLQkvKioKLQkgKiBBbnN3ZXIgYSBtZW1lbnRvIGZvciB0aGUgZG9jdW1lbnQgYW5kIGVsZW1lbnQuICBGb3Igc2ltcGxpY2l0eQotCSAqIHlvdSBzaG91bGQgdXNlIGNyZWF0ZVJlYWRSb290IGFuZCBjcmVhdGVXcml0ZVJvb3QgdG8gY3JlYXRlIHRoZSBpbml0aWFsCi0JICogbWVtZW50b3Mgb24gYSBkb2N1bWVudC4KLQkgKi8KLQlwcml2YXRlIFhNTE1lbWVudG8oRG9jdW1lbnQgZG9jLCBFbGVtZW50IGVsKSB7Ci0JCWZhY3RvcnkgPSBkb2M7Ci0JCWVsZW1lbnQgPSBlbDsKLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIElNZW1lbnRvCi0JICovCi0JcHVibGljIElNZW1lbnRvIGNyZWF0ZUNoaWxkKFN0cmluZyB0eXBlKSB7Ci0JCUVsZW1lbnQgY2hpbGQgPSBmYWN0b3J5LmNyZWF0ZUVsZW1lbnQodHlwZSk7Ci0JCWVsZW1lbnQuYXBwZW5kQ2hpbGQoY2hpbGQpOwotCQlyZXR1cm4gbmV3IFhNTE1lbWVudG8oZmFjdG9yeSwgY2hpbGQpOwotCX0KLQkKLQkvKgotCSAqIEBzZWUgSU1lbWVudG8KLQkgKi8KLQlwdWJsaWMgSU1lbWVudG8gY3JlYXRlQ2hpbGQoU3RyaW5nIHR5cGUsIFN0cmluZyBpZCkgewotCQlFbGVtZW50IGNoaWxkID0gZmFjdG9yeS5jcmVhdGVFbGVtZW50KHR5cGUpOwotCQljaGlsZC5zZXRBdHRyaWJ1dGUoVEFHX0lELCBpZCk7Ci0JCWVsZW1lbnQuYXBwZW5kQ2hpbGQoY2hpbGQpOwotCQlyZXR1cm4gbmV3IFhNTE1lbWVudG8oZmFjdG9yeSwgY2hpbGQpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBEb2N1bWVudCBmcm9tIGEgUmVhZGVyIGFuZCBhbnN3ZXIgYSByb290IG1lbWVudG8gZm9yIHJlYWRpbmcgCi0JICogYSBkb2N1bWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFhNTE1lbWVudG8gY3JlYXRlUmVhZFJvb3QoUmVhZGVyIHJlYWRlcikgewotCQlEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGZhY3RvcnkgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0JCQlEb2N1bWVudEJ1aWxkZXIgcGFyc2VyID0gZmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKLQkJCWRvY3VtZW50ID0gcGFyc2VyLnBhcnNlKG5ldyBJbnB1dFNvdXJjZShyZWFkZXIpKTsKLQkJCU5vZGUgbm9kZSA9IGRvY3VtZW50LmdldEZpcnN0Q2hpbGQoKTsKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgRWxlbWVudCkKLQkJCQlyZXR1cm4gbmV3IFhNTE1lbWVudG8oZG9jdW1lbnQsIChFbGVtZW50KSBub2RlKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBBbnN3ZXIgYSByb290IG1lbWVudG8gZm9yIHdyaXRpbmcgYSBkb2N1bWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gdHlwZSBhIHR5cGUKLQkgKiBAcmV0dXJuIGEgbWVtZW50bwotCSAqLwotCXB1YmxpYyBzdGF0aWMgWE1MTWVtZW50byBjcmVhdGVXcml0ZVJvb3QoU3RyaW5nIHR5cGUpIHsKLQkJRG9jdW1lbnQgZG9jdW1lbnQ7Ci0JCXRyeSB7Ci0JCQlkb2N1bWVudCA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdEb2N1bWVudEJ1aWxkZXIoKS5uZXdEb2N1bWVudCgpOwotCQkJRWxlbWVudCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0eXBlKTsKLQkJCWRvY3VtZW50LmFwcGVuZENoaWxkKGVsZW1lbnQpOwotCQkJcmV0dXJuIG5ldyBYTUxNZW1lbnRvKGRvY3VtZW50LCBlbGVtZW50KTsgICAgICAgICAgICAKLQkJfSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgRXJyb3IoZSk7Ci0JCX0KLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIElNZW1lbnRvCi0JICovCi0JcHVibGljIElNZW1lbnRvIGdldENoaWxkKFN0cmluZyB0eXBlKSB7Ci0JCQotCQkvLyBHZXQgdGhlIG5vZGVzLgotCQlOb2RlTGlzdCBub2RlcyA9IGVsZW1lbnQuZ2V0Q2hpbGROb2RlcygpOwotCQlpbnQgc2l6ZSA9IG5vZGVzLmdldExlbmd0aCgpOwotCQlpZiAoc2l6ZSA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCi0JCS8vIEZpbmQgdGhlIGZpcnN0IG5vZGUgd2hpY2ggaXMgYSBjaGlsZCBvZiB0aGlzIG5vZGUuCi0JCWZvciAoaW50IG5YID0gMDsgblggPCBzaXplOyBuWCArKykgewotCQkJTm9kZSBub2RlID0gbm9kZXMuaXRlbShuWCk7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCQlFbGVtZW50IGVsZW1lbnQyID0gKEVsZW1lbnQpbm9kZTsKLQkJCQlpZiAoZWxlbWVudDIuZ2V0Tm9kZU5hbWUoKS5lcXVhbHModHlwZSkpCi0JCQkJCXJldHVybiBuZXcgWE1MTWVtZW50byhmYWN0b3J5LCBlbGVtZW50Mik7Ci0JCQl9Ci0JCX0KLQkKLQkJLy8gQSBjaGlsZCB3YXMgbm90IGZvdW5kLgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIElNZW1lbnRvCi0JICovCi0JcHVibGljIElNZW1lbnRvIFtdIGdldENoaWxkcmVuKFN0cmluZyB0eXBlKSB7Ci0JCi0JCS8vIEdldCB0aGUgbm9kZXMuCi0JCU5vZGVMaXN0IG5vZGVzID0gZWxlbWVudC5nZXRDaGlsZE5vZGVzKCk7Ci0JCWludCBzaXplID0gbm9kZXMuZ2V0TGVuZ3RoKCk7Ci0JCWlmIChzaXplID09IDApCi0JCQlyZXR1cm4gbmV3IElNZW1lbnRvWzBdOwotCQotCQkvLyBFeHRyYWN0IGVhY2ggbm9kZSB3aXRoIGdpdmVuIHR5cGUuCi0JCUFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdChzaXplKTsKLQkJZm9yIChpbnQgblggPSAwOyBuWCA8IHNpemU7IG5YICsrKSB7Ci0JCQlOb2RlIG5vZGUgPSBub2Rlcy5pdGVtKG5YKTsKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJCUVsZW1lbnQgZWxlbWVudDIgPSAoRWxlbWVudClub2RlOwotCQkJCWlmIChlbGVtZW50Mi5nZXROb2RlTmFtZSgpLmVxdWFscyh0eXBlKSkKLQkJCQkJbGlzdC5hZGQoZWxlbWVudDIpOwotCQkJfQotCQl9Ci0JCi0JCS8vIENyZWF0ZSBhIG1lbWVudG8gZm9yIGVhY2ggbm9kZS4KLQkJc2l6ZSA9IGxpc3Quc2l6ZSgpOwotCQlJTWVtZW50byBbXSByZXN1bHRzID0gbmV3IElNZW1lbnRvW3NpemVdOwotCQlmb3IgKGludCB4ID0gMDsgeCA8IHNpemU7IHggKyspIHsKLQkJCXJlc3VsdHNbeF0gPSBuZXcgWE1MTWVtZW50byhmYWN0b3J5LCAoRWxlbWVudClsaXN0LmdldCh4KSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdHM7Ci0JfQotCQotCS8qCi0JICogQHNlZSBJTWVtZW50bwotCSAqLwotCXB1YmxpYyBGbG9hdCBnZXRGbG9hdChTdHJpbmcga2V5KSB7Ci0JCUF0dHIgYXR0ciA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlTm9kZShrZXkpOwotCQlpZiAoYXR0ciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7IAotCQlTdHJpbmcgc3RyVmFsdWUgPSBhdHRyLmdldFZhbHVlKCk7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gbmV3IEZsb2F0KHN0clZhbHVlKTsKLQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCQotCS8qCi0JICogQHNlZSBJTWVtZW50bwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SUQoKSB7Ci0JCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZShUQUdfSUQpOwotCX0KLQkKLQkvKgotCSAqIEBzZWUgSU1lbWVudG8KLQkgKi8KLQlwdWJsaWMgSW50ZWdlciBnZXRJbnRlZ2VyKFN0cmluZyBrZXkpIHsKLQkJQXR0ciBhdHRyID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVOb2RlKGtleSk7Ci0JCWlmIChhdHRyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgCi0JCVN0cmluZyBzdHJWYWx1ZSA9IGF0dHIuZ2V0VmFsdWUoKTsKLQkJdHJ5IHsKLQkJCXJldHVybiBuZXcgSW50ZWdlcihzdHJWYWx1ZSk7Ci0JCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQkKLQkvKgotCSAqIEBzZWUgSU1lbWVudG8KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCUF0dHIgYXR0ciA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlTm9kZShrZXkpOwotCQlpZiAoYXR0ciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7IAotCQlyZXR1cm4gYXR0ci5nZXRWYWx1ZSgpOwotCX0KLQkKLQkvKioKLQkgKiBMb2FkcyBhIG1lbWVudG8gZnJvbSB0aGUgZ2l2ZW4gZmlsZW5hbWUuCi0JICoKLQkgKiBAcGFyYW0gaW4gamF2YS5pby5JbnB1dFN0cmVhbQotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UudWkuSU1lbWVudG8KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElNZW1lbnRvIGxvYWRNZW1lbnRvKElucHV0U3RyZWFtIGluKSB7Ci0JCURvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCURvY3VtZW50QnVpbGRlckZhY3RvcnkgZmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLQkJCURvY3VtZW50QnVpbGRlciBwYXJzZXIgPSBmYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOwotCQkJZG9jdW1lbnQgPSBwYXJzZXIucGFyc2UoaW4pOwotCQkJTm9kZSBub2RlID0gZG9jdW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KQotCQkJCXJldHVybiBuZXcgWE1MTWVtZW50byhkb2N1bWVudCwgKEVsZW1lbnQpIG5vZGUpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCWluLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCS8vIGlnbm9yZQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKgotCSAqIEBzZWUgSU1lbWVudG8KLQkgKi8KLQlwcml2YXRlIHZvaWQgcHV0RWxlbWVudChFbGVtZW50IGVsZW1lbnQyKSB7Ci0JCU5hbWVkTm9kZU1hcCBub2RlTWFwID0gZWxlbWVudDIuZ2V0QXR0cmlidXRlcygpOwotCQlpbnQgc2l6ZSA9IG5vZGVNYXAuZ2V0TGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKXsKLQkJCUF0dHIgYXR0ciA9IChBdHRyKW5vZGVNYXAuaXRlbShpKTsKLQkJCXB1dFN0cmluZyhhdHRyLmdldE5hbWUoKSxhdHRyLmdldFZhbHVlKCkpOwotCQl9Ci0JCQkJCQotCQlOb2RlTGlzdCBub2RlcyA9IGVsZW1lbnQyLmdldENoaWxkTm9kZXMoKTsKLQkJc2l6ZSA9IG5vZGVzLmdldExlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkgKyspIHsKLQkJCU5vZGUgbm9kZSA9IG5vZGVzLml0ZW0oaSk7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCQlYTUxNZW1lbnRvIGNoaWxkID0gKFhNTE1lbWVudG8pY3JlYXRlQ2hpbGQobm9kZS5nZXROb2RlTmFtZSgpKTsKLQkJCQljaGlsZC5wdXRFbGVtZW50KChFbGVtZW50KW5vZGUpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qCi0JICogQHNlZSBJTWVtZW50bwotCSAqLwotCXB1YmxpYyB2b2lkIHB1dEZsb2F0KFN0cmluZyBrZXksIGZsb2F0IGYpIHsKLQkJZWxlbWVudC5zZXRBdHRyaWJ1dGUoa2V5LCBTdHJpbmcudmFsdWVPZihmKSk7Ci0JfQotCQotCS8qCi0JICogQHNlZSBJTWVtZW50bwotCSAqLwotCXB1YmxpYyB2b2lkIHB1dEludGVnZXIoU3RyaW5nIGtleSwgaW50IG4pIHsKLQkJZWxlbWVudC5zZXRBdHRyaWJ1dGUoa2V5LCBTdHJpbmcudmFsdWVPZihuKSk7Ci0JfQotCQotCS8qCi0JICogQHNlZSBJTWVtZW50bwotCSAqLwotCXB1YmxpYyB2b2lkIHB1dE1lbWVudG8oSU1lbWVudG8gbWVtZW50bykgewotCQlYTUxNZW1lbnRvIHhtbE1lbWVudG8gPSAoWE1MTWVtZW50bykgbWVtZW50bzsKLQkJcHV0RWxlbWVudCh4bWxNZW1lbnRvLmVsZW1lbnQpOwotCX0KLQkKLQkvKgotCSAqIEBzZWUgSU1lbWVudG8KLQkgKi8KLQlwdWJsaWMgdm9pZCBwdXRTdHJpbmcoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQllbGVtZW50LnNldEF0dHJpYnV0ZShrZXksIHZhbHVlKTsKLQl9Ci0JCi0JLyoqCi0JICogU2F2ZSB0aGlzIE1lbWVudG8gdG8gYSBXcml0ZXIuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZShPdXRwdXRTdHJlYW0gb3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVJlc3VsdCByZXN1bHQgPSBuZXcgU3RyZWFtUmVzdWx0KG9zKTsKLQkJU291cmNlIHNvdXJjZSA9IG5ldyBET01Tb3VyY2UoZmFjdG9yeSk7Ci0JCXRyeSB7Ci0JCQlUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1RyYW5zZm9ybWVyKCk7Ci0JCQl0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLklOREVOVCwgInllcyIpOyAvLyROT04tTkxTLTEkCi0JCQl0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLk1FVEhPRCwgInhtbCIpOyAvLyROT04tTkxTLTEkCi0JCQl0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLkVOQ09ESU5HLCAiVVRGLTgiKTsgLy8kTk9OLU5MUy0xJAotCQkJdHJhbnNmb3JtZXIudHJhbnNmb3JtKHNvdXJjZSwgcmVzdWx0KTsgICAgICAgICAgICAKLQkJfQotCQljYXRjaCAoVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IChJT0V4Y2VwdGlvbikgKG5ldyBJT0V4Y2VwdGlvbigpLmluaXRDYXVzZShlKSk7Ci0JCX0KLQkJY2F0Y2ggKFRyYW5zZm9ybWVyRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IChJT0V4Y2VwdGlvbikgKG5ldyBJT0V4Y2VwdGlvbigpLmluaXRDYXVzZShlKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkYXRhIG9mIHRoZSBUZXh0IG5vZGUgb2YgdGhlIG1lbWVudG8uIEVhY2ggbWVtZW50byBpcyBhbGxvd2VkCi0JICogb25seSBvbmUgVGV4dCBub2RlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGRhdGEgb2YgdGhlIFRleHQgbm9kZSBvZiB0aGUgbWVtZW50bywgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBpZiB0aGUgbWVtZW50byBoYXMgbm8gVGV4dCBub2RlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dERhdGEoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBtZW1lbnRvJ3MgVGV4dCBub2RlIHRvIGNvbnRhaW4gdGhlIGdpdmVuIGRhdGEuIENyZWF0ZXMgdGhlIFRleHQgbm9kZSBpZgotCSAqIG5vbmUgZXhpc3RzLiBJZiBhIFRleHQgbm9kZSBkb2VzIGV4aXN0LCBpdCdzIGN1cnJlbnQgY29udGVudHMgYXJlIHJlcGxhY2VkLiAKLQkgKiBFYWNoIG1lbWVudG8gaXMgYWxsb3dlZCBvbmx5IG9uZSB0ZXh0IG5vZGUuCi0JICoKLQkgKiBAcGFyYW0gZGF0YSB0aGUgZGF0YSB0byBiZSBwbGFjZWQgb24gdGhlIFRleHQgbm9kZQotCSAqLwotCXB1YmxpYyB2b2lkIHB1dFRleHREYXRhKFN0cmluZyBkYXRhKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvY29tbWFuZC9TZXJ2ZXJDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9jb21tYW5kL1NlcnZlckNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY1MzkxNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9jb21tYW5kL1NlcnZlckNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5jb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLkFic3RyYWN0T3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyV29ya2luZ0NvcHk7Ci0vKioKLSAqIEEgY29tbWFuZCBvbiBhIHNlcnZlci4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFNlcnZlckNvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdE9wZXJhdGlvbiB7Ci0JcHJvdGVjdGVkIElTZXJ2ZXJXb3JraW5nQ29weSBzZXJ2ZXI7Ci0KLQkvKioKLQkgKiBTZXJ2ZXJDb21tYW5kIGNvbnN0cnVjdG9yLgotCSAqIAotCSAqIEBwYXJhbSBzZXJ2ZXIgYSBzZXJ2ZXIKLQkgKiBAcGFyYW0gbmFtZSBhIGxhYmVsCi0JICovCi0JcHVibGljIFNlcnZlckNvbW1hbmQoSVNlcnZlcldvcmtpbmdDb3B5IHNlcnZlciwgU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JCXRoaXMuc2VydmVyID0gc2VydmVyOwotCX0KLQotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIGV4ZWN1dGUoKTsKLQotCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGFkYXB0KSB7Ci0JCWV4ZWN1dGUoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGFic3RyYWN0IHZvaWQgdW5kbygpOwotCi0JcHVibGljIElTdGF0dXMgdW5kbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgYWRhcHQpIHsKLQkJdW5kbygpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIElTdGF0dXMgcmVkbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgYWRhcHQpIHsKLQkJcmV0dXJuIGV4ZWN1dGUobW9uaXRvciwgYWRhcHQpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9jb21tYW5kL1NldFNlcnZlckF1dG9QdWJsaXNoRGVmYXVsdENvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2NvbW1hbmQvU2V0U2VydmVyQXV0b1B1Ymxpc2hEZWZhdWx0Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmVjODBmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2NvbW1hbmQvU2V0U2VydmVyQXV0b1B1Ymxpc2hEZWZhdWx0Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi2gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5TZXJ2ZXJXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLk1lc3NhZ2VzOwotLyoqCi0gKiBDb21tYW5kIHRvIGNoYW5nZSB0aGUgc2VydmVyJ3MgYXV0by1wdWJsaXNoIHNldHRpbmcuCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXRTZXJ2ZXJBdXRvUHVibGlzaERlZmF1bHRDb21tYW5kIGV4dGVuZHMgU2VydmVyQ29tbWFuZCB7Ci0JcHJvdGVjdGVkIGludCBzZXR0aW5nOwotCXByb3RlY3RlZCBpbnQgb2xkU2V0dGluZzsKLQotCS8qKgotCSAqIFNldFNlcnZlckF1dG9QdWJsaXNoRGVmYXVsdENvbW1hbmQgY29uc3RydWN0b3IuCi0JICogCi0JICogQHBhcmFtIHNlcnZlciBhIHNlcnZlcgotCSAqIEBwYXJhbSBzZXR0aW5nIHRoZSBhdXRvLXB1Ymxpc2ggc2V0dGluZwotCSAqLwotCXB1YmxpYyBTZXRTZXJ2ZXJBdXRvUHVibGlzaERlZmF1bHRDb21tYW5kKElTZXJ2ZXJXb3JraW5nQ29weSBzZXJ2ZXIsIGludCBzZXR0aW5nKSB7Ci0JCXN1cGVyKHNlcnZlciwgTWVzc2FnZXMuc2VydmVyRWRpdG9yT3ZlcnZpZXdBdXRvUHVibGlzaENvbW1hbmQpOwotCQl0aGlzLnNldHRpbmcgPSBzZXR0aW5nOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGUgdGhlIGNvbW1hbmQuCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJU2VydmVyV29ya2luZ0NvcHkgc3djID0gKFNlcnZlcldvcmtpbmdDb3B5KSBzZXJ2ZXI7Ci0JCW9sZFNldHRpbmcgPSBzd2MuZ2V0QXV0b1B1Ymxpc2hTZXR0aW5nKCk7Ci0JCXN3Yy5zZXRBdXRvUHVibGlzaFNldHRpbmcoc2V0dGluZyk7Ci0JfQotCi0JLyoqCi0JICogVW5kbyB0aGUgY29tbWFuZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlTZXJ2ZXJXb3JraW5nQ29weSBzd2MgPSAoU2VydmVyV29ya2luZ0NvcHkpIHNlcnZlcjsKLQkJc3djLnNldEF1dG9QdWJsaXNoU2V0dGluZyhvbGRTZXR0aW5nKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvY29tbWFuZC9TZXRTZXJ2ZXJBdXRvUHVibGlzaFRpbWVDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9jb21tYW5kL1NldFNlcnZlckF1dG9QdWJsaXNoVGltZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFiM2M5YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9jb21tYW5kL1NldFNlcnZlckF1dG9QdWJsaXNoVGltZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotoCogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5jb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuU2VydmVyV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKLS8qKgotICogQ29tbWFuZCB0byBjaGFuZ2UgdGhlIHNlcnZlcidzIGF1dG8tcHVibGlzaCBzZXR0aW5nLgotICovCi1wdWJsaWMgY2xhc3MgU2V0U2VydmVyQXV0b1B1Ymxpc2hUaW1lQ29tbWFuZCBleHRlbmRzIFNlcnZlckNvbW1hbmQgewotCXByb3RlY3RlZCBpbnQgdGltZTsKLQlwcm90ZWN0ZWQgaW50IG9sZFRpbWU7Ci0KLQkvKioKLQkgKiBTZXRTZXJ2ZXJBdXRvUHVibGlzaERlZmF1bHRDb21tYW5kIGNvbnN0cnVjdG9yLgotCSAqIAotCSAqIEBwYXJhbSBzZXJ2ZXIgYSBzZXJ2ZXIKLQkgKiBAcGFyYW0gdGltZSBhIHB1Ymxpc2ggdGltZQotCSAqLwotCXB1YmxpYyBTZXRTZXJ2ZXJBdXRvUHVibGlzaFRpbWVDb21tYW5kKElTZXJ2ZXJXb3JraW5nQ29weSBzZXJ2ZXIsIGludCB0aW1lKSB7Ci0JCXN1cGVyKHNlcnZlciwgTWVzc2FnZXMuc2VydmVyRWRpdG9yT3ZlcnZpZXdBdXRvUHVibGlzaENvbW1hbmQpOwotCQl0aGlzLnRpbWUgPSB0aW1lOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGUgdGhlIGNvbW1hbmQuCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJU2VydmVyV29ya2luZ0NvcHkgc3djID0gKFNlcnZlcldvcmtpbmdDb3B5KSBzZXJ2ZXI7Ci0JCW9sZFRpbWUgPSBzd2MuZ2V0QXV0b1B1Ymxpc2hUaW1lKCk7Ci0JCXN3Yy5zZXRBdXRvUHVibGlzaFRpbWUodGltZSk7Ci0JfQotCi0JLyoqCi0JICogVW5kbyB0aGUgY29tbWFuZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlTZXJ2ZXJXb3JraW5nQ29weSBzd2MgPSAoU2VydmVyV29ya2luZ0NvcHkpIHNlcnZlcjsKLQkJc3djLnNldEF1dG9QdWJsaXNoVGltZShvbGRUaW1lKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvY29tbWFuZC9TZXRTZXJ2ZXJDb25maWd1cmF0aW9uRm9sZGVyQ29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvY29tbWFuZC9TZXRTZXJ2ZXJDb25maWd1cmF0aW9uRm9sZGVyQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzFiYjYxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2NvbW1hbmQvU2V0U2VydmVyQ29uZmlndXJhdGlvbkZvbGRlckNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5jb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci0vKioKLSAqIENvbW1hbmQgdG8gY2hhbmdlIHRoZSBzZXJ2ZXIgY29uZmlndXJhdGlvbiBmb2xkZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXRTZXJ2ZXJDb25maWd1cmF0aW9uRm9sZGVyQ29tbWFuZCBleHRlbmRzIFNlcnZlckNvbW1hbmQgewotCXByb3RlY3RlZCBJRm9sZGVyIGZvbGRlcjsKLQlwcm90ZWN0ZWQgSUZvbGRlciBvbGRGb2xkZXI7Ci0KLQkvKioKLQkgKiBTZXRTZXJ2ZXJDb25maWd1cmF0aW9uRm9sZGVyQ29tbWFuZCBjb25zdHJ1Y3Rvci4KLQkgKiAKLQkgKiBAcGFyYW0gc2VydmVyIGEgc2VydmVyCi0JICogQHBhcmFtIGZvbGRlciBhIG5ldyBzZXJ2ZXIgY29uZmlndXJhdGlvbiBsb2NhdGlvbgotCSAqLwotCXB1YmxpYyBTZXRTZXJ2ZXJDb25maWd1cmF0aW9uRm9sZGVyQ29tbWFuZChJU2VydmVyV29ya2luZ0NvcHkgc2VydmVyLCBJRm9sZGVyIGZvbGRlcikgewotCQlzdXBlcihzZXJ2ZXIsIE1lc3NhZ2VzLnNlcnZlckVkaXRvck92ZXJ2aWV3U2VydmVySG9zdG5hbWVDb21tYW5kKTsKLQkJdGhpcy5mb2xkZXIgPSBmb2xkZXI7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZSB0aGUgY29tbWFuZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlvbGRGb2xkZXIgPSBzZXJ2ZXIuZ2V0U2VydmVyQ29uZmlndXJhdGlvbigpOwotCQlzZXJ2ZXIuc2V0U2VydmVyQ29uZmlndXJhdGlvbihmb2xkZXIpOwotCX0KLQotCS8qKgotCSAqIFVuZG8gdGhlIGNvbW1hbmQuCi0JICovCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJc2VydmVyLnNldFNlcnZlckNvbmZpZ3VyYXRpb24ob2xkRm9sZGVyKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvY29tbWFuZC9TZXRTZXJ2ZXJIb3N0bmFtZUNvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2NvbW1hbmQvU2V0U2VydmVySG9zdG5hbWVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1OGJkODQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvY29tbWFuZC9TZXRTZXJ2ZXJIb3N0bmFtZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5jb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLk1lc3NhZ2VzOwotLyoqCi0gKiBDb21tYW5kIHRvIGNoYW5nZSB0aGUgc2VydmVyIGhvc3RuYW1lLgotICovCi1wdWJsaWMgY2xhc3MgU2V0U2VydmVySG9zdG5hbWVDb21tYW5kIGV4dGVuZHMgU2VydmVyQ29tbWFuZCB7Ci0JcHJvdGVjdGVkIFN0cmluZyBuYW1lOwotCXByb3RlY3RlZCBTdHJpbmcgb2xkTmFtZTsKLQotCS8qKgotCSAqIFNldFNlcnZlckhvc3RuYW1lQ29tbWFuZCBjb25zdHJ1Y3Rvci4KLQkgKiAKLQkgKiBAcGFyYW0gc2VydmVyIGEgc2VydmVyCi0JICogQHBhcmFtIG5hbWUgYSBob3N0bmFtZSBvciBJUCBhZGRyZXNzCi0JICovCi0JcHVibGljIFNldFNlcnZlckhvc3RuYW1lQ29tbWFuZChJU2VydmVyV29ya2luZ0NvcHkgc2VydmVyLCBTdHJpbmcgbmFtZSkgewotCQlzdXBlcihzZXJ2ZXIsIE1lc3NhZ2VzLnNlcnZlckVkaXRvck92ZXJ2aWV3U2VydmVySG9zdG5hbWVDb21tYW5kKTsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlIHRoZSBjb21tYW5kLgotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCW9sZE5hbWUgPSBzZXJ2ZXIuZ2V0SG9zdCgpOwotCQlzZXJ2ZXIuc2V0SG9zdChuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBVbmRvIHRoZSBjb21tYW5kLgotCSAqLwotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCXNlcnZlci5zZXRIb3N0KG9sZE5hbWUpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9jb21tYW5kL1NldFNlcnZlck5hbWVDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9jb21tYW5kL1NldFNlcnZlck5hbWVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiYTQxNmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvY29tbWFuZC9TZXRTZXJ2ZXJOYW1lQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci0vKioKLSAqIENvbW1hbmQgdG8gY2hhbmdlIHRoZSBzZXJ2ZXIgbmFtZS4KLSAqLwotcHVibGljIGNsYXNzIFNldFNlcnZlck5hbWVDb21tYW5kIGV4dGVuZHMgU2VydmVyQ29tbWFuZCB7Ci0JcHJvdGVjdGVkIFN0cmluZyBuYW1lOwotCXByb3RlY3RlZCBTdHJpbmcgb2xkTmFtZTsKLQotCS8qKgotCSAqIFNldFNlcnZlck5hbWVDb21tYW5kIGNvbnN0cnVjdG9yLgotCSAqIAotCSAqIEBwYXJhbSBzZXJ2ZXIgYSBzZXJ2ZXIKLQkgKiBAcGFyYW0gbmFtZSBhIG5hbWUgZm9yIHRoZSBzZXJ2ZXIKLQkgKi8KLQlwdWJsaWMgU2V0U2VydmVyTmFtZUNvbW1hbmQoSVNlcnZlcldvcmtpbmdDb3B5IHNlcnZlciwgU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIoc2VydmVyLCBNZXNzYWdlcy5zZXJ2ZXJFZGl0b3JPdmVydmlld1NlcnZlck5hbWVDb21tYW5kKTsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlIHRoZSBjb21tYW5kLgotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCW9sZE5hbWUgPSBzZXJ2ZXIuZ2V0TmFtZSgpOwotCQlzZXJ2ZXIuc2V0TmFtZShuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBVbmRvIHRoZSBjb21tYW5kLgotCSAqLwotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCXNlcnZlci5zZXROYW1lKG9sZE5hbWUpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9jb21tYW5kL1NldFNlcnZlclJ1bnRpbWVDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9jb21tYW5kL1NldFNlcnZlclJ1bnRpbWVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwYzlhMDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvY29tbWFuZC9TZXRTZXJ2ZXJSdW50aW1lQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLk1lc3NhZ2VzOwotLyoqCi0gKiBDb21tYW5kIHRvIGNoYW5nZSB0aGUgc2VydmVyIHJ1bnRpbWUuCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXRTZXJ2ZXJSdW50aW1lQ29tbWFuZCBleHRlbmRzIFNlcnZlckNvbW1hbmQgewotCXByb3RlY3RlZCBJUnVudGltZSBydW50aW1lOwotCXByb3RlY3RlZCBJUnVudGltZSBvbGRSdW50aW1lOwotCi0JLyoqCi0JICogU2V0U2VydmVyUnVudGltZUNvbW1hbmQgY29uc3RydWN0b3IuCi0JICogCi0JICogQHBhcmFtIHNlcnZlciBhIHNlcnZlcgotCSAqIEBwYXJhbSBydW50aW1lIGEgc2VydmVyIHJ1bnRpbWUKLQkgKi8KLQlwdWJsaWMgU2V0U2VydmVyUnVudGltZUNvbW1hbmQoSVNlcnZlcldvcmtpbmdDb3B5IHNlcnZlciwgSVJ1bnRpbWUgcnVudGltZSkgewotCQlzdXBlcihzZXJ2ZXIsIE1lc3NhZ2VzLnNlcnZlckVkaXRvck92ZXJ2aWV3UnVudGltZUNvbW1hbmQpOwotCQl0aGlzLnJ1bnRpbWUgPSBydW50aW1lOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGUgdGhlIGNvbW1hbmQuCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJb2xkUnVudGltZSA9IHNlcnZlci5nZXRSdW50aW1lKCk7Ci0JCXNlcnZlci5zZXRSdW50aW1lKHJ1bnRpbWUpOwotCX0KLQotCS8qKgotCSAqIFVuZG8gdGhlIGNvbW1hbmQuCi0JICovCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJc2VydmVyLnNldFJ1bnRpbWUob2xkUnVudGltZSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2VkaXRvci9HbG9iYWxDb21tYW5kTWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvZWRpdG9yL0dsb2JhbENvbW1hbmRNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmYTJlMGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvZWRpdG9yL0dsb2JhbENvbW1hbmRNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuSVVuZG9hYmxlT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuZWRpdG9yLklTZXJ2ZXJFZGl0b3JQYXJ0SW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlNlcnZlclVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuVHJhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBHbG9iYWxDb21tYW5kTWFuYWdlciB7Ci0JLy8gbWF4aW11bSBudW1iZXIgb2YgY29tbWFuZHMgaW4gdGhlIGhpc3RvcnkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0hJU1RPUlkgPSAyMDA7Ci0KLQljbGFzcyBTZXJ2ZXJSZXNvdXJjZUNvbW1hbmQgewotCQlJVW5kb2FibGVPcGVyYXRpb24gY29tbWFuZDsKLQkJU3RyaW5nIGlkOwotCX0KLQkKLQkvLyBjb21tYW5kcyBpbiB0aGUgdW5kbyBoaXN0b3J5Ci0JcHJvdGVjdGVkIExpc3QgdW5kb0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkvLyBjb21tYW5kcyBpbiB0aGUgcmVkbyBoaXN0b3J5Ci0JcHJvdGVjdGVkIExpc3QgcmVkb0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQljbGFzcyBDb21tYW5kTWFuYWdlckluZm8gewotCQkvLyBudW1iZXIgb2Ygb3BlbiBlZGl0b3JzIG9uIHRoaXMgcmVzb3VyY2UKLQkJaW50IGNvdW50OwotCQkKLQkJLy8gdHJ1ZSBpZiB0aGUgcmVzb3VyY2UgaGFzIG5vdCBiZWVuIHNhdmVkIHNpbmNlCi0JCS8vIHRoZSBsYXN0IGNoYW5nZQotCQlib29sZWFuIGlzRGlydHk7Ci0JCQotCQkvLyB0cnVlIGlmIHRoZSByZXNvdXJjZSBpcyByZWFkLW9ubHkKLQkJYm9vbGVhbiBpc1JlYWRPbmx5OwotCQkKLQkJLy8gdHJ1ZSBpZiBhbGwgY2hhbmdlcyBjYW4gYmUgdW5kb25lLCBmYWxzZSBpZgotCQkvLyBhIG5vbi1yZXZlcnNhYmxlIGNoYW5nZSBoYXMgYmVlbiBtYWRlCi0JCWJvb2xlYW4gY2FuQ29tcGxldGVseVVuZG8gPSB0cnVlOwotCQkKLQkJLy8gdGhlIGVsZW1lbnQgaWQKLQkJU3RyaW5nIGlkOwotCQkKLQkJLy8gdGhlIHdvcmtpbmcgY29weQotCQlJU2VydmVyV29ya2luZ0NvcHkgd2M7Ci0JCQotCQkvLyBmaWxlcyBhbmQgdGltZXN0YW1wcwotCQlNYXAgZmlsZU1hcDsKLQkJCi0JCWludCB0aW1lc3RhbXA7Ci0JfQotCi0JcHJvdGVjdGVkIE1hcCBjb21tYW5kTWFuYWdlcnMgPSBuZXcgSGFzaE1hcCgpOwotCi0JLy8gcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVycwotCXByb3RlY3RlZCBMaXN0IHByb3BlcnR5TGlzdGVuZXJzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfRElSVFkgPSAiZGlydHlTdGF0ZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9VTkRPID0gInVuZG9BY3Rpb24iOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfUkVETyA9ICJyZWRvQWN0aW9uIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX1JFTE9BRCA9ICJyZWxvYWQiOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBHbG9iYWxDb21tYW5kTWFuYWdlciBpbnN0YW5jZTsKLQotCXB1YmxpYyBzdGF0aWMgR2xvYmFsQ29tbWFuZE1hbmFnZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKQotCQkJaW5zdGFuY2UgPSBuZXcgR2xvYmFsQ29tbWFuZE1hbmFnZXIoKTsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qKgotCSAqIEFkZCBhIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lciB0byB0aGlzIGluc3RhbmNlLgotCSAqCi0JICogQHBhcmFtIGxpc3RlbmVyIGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAocHJvcGVydHlMaXN0ZW5lcnMgPT0gbnVsbCkKLQkJCXByb3BlcnR5TGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQlwcm9wZXJ0eUxpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lciBmcm9tIHRoaXMgaW5zdGFuY2UuCi0JICoKLQkgKiBAcGFyYW0gbGlzdGVuZXIgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChwcm9wZXJ0eUxpc3RlbmVycyAhPSBudWxsKQotCQkJcHJvcGVydHlMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBGaXJlIGEgcHJvcGVydHkgY2hhbmdlIGV2ZW50LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCWlmIChwcm9wZXJ0eUxpc3RlbmVycyA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCVByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQgPSBuZXcgUHJvcGVydHlDaGFuZ2VFdmVudCh0aGlzLCBwcm9wZXJ0eU5hbWUsIG9sZFZhbHVlLCBuZXdWYWx1ZSk7Ci0JCS8vVHJhY2UudHJhY2UoIkZpcmluZzogIiArIGV2ZW50ICsgIiAiICsgb2xkVmFsdWUpOwotCQl0cnkgewotCQkJaW50IHNpemUgPSBwcm9wZXJ0eUxpc3RlbmVycy5zaXplKCk7Ci0JCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyW10gcGNsID0gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJbc2l6ZV07Ci0JCQlwcm9wZXJ0eUxpc3RlbmVycy50b0FycmF5KHBjbCk7Ci0JCQkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotCQkJCXRyeSB7Ci0JCQkJCXBjbFtpXS5wcm9wZXJ0eUNoYW5nZShldmVudCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gaWdub3JlCi0JCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGNvbW1hbmQgbWFuYWdlciBmb3IgYSBnaXZlbiBpZC4KLQkgKiAKLQkgKiBAcGFyYW0gaWQgYW4gaWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBnZXRDb21tYW5kTWFuYWdlcihTdHJpbmcgaWQpIHsKLQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiR2V0dGluZyBjb21tYW5kIG1hbmFnZXIgZm9yICIgKyBpZCk7Ci0JCXRyeSB7Ci0JCQlDb21tYW5kTWFuYWdlckluZm8gaW5mbyA9IChDb21tYW5kTWFuYWdlckluZm8pIGNvbW1hbmRNYW5hZ2Vycy5nZXQoaWQpOwotCQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJCWluZm8uY291bnQgKys7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIkNvdWxkIG5vdCBmaW5kIGV4aXN0aW5nIGNvbW1hbmQgbWFuYWdlciIsIGUpOwotCQl9Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIkNyZWF0aW5nIG5ldyBjb21tYW5kIG1hbmFnZXIgZm9yICIgKyBpZCk7Ci0JCXRyeSB7Ci0JCQlDb21tYW5kTWFuYWdlckluZm8gaW5mbyA9IG5ldyBDb21tYW5kTWFuYWdlckluZm8oKTsKLQkJCWluZm8uY291bnQgPSAxOwotCQkJaW5mby5pZCA9IGlkOwotCQkJSVNlcnZlciBzZXJ2ZXIgPSBudWxsOwotCQkJaWYgKGlkICE9IG51bGwpCi0JCQkJc2VydmVyID0gU2VydmVyQ29yZS5maW5kU2VydmVyKGlkKTsKLQkJCWlmIChzZXJ2ZXIgIT0gbnVsbCkKLQkJCQlpbmZvLndjID0gc2VydmVyLmNyZWF0ZVdvcmtpbmdDb3B5KCk7Ci0JCQlpbmZvLmlzRGlydHkgPSBmYWxzZTsKLQkJCWluZm8uaXNSZWFkT25seSA9IGZhbHNlOwotCQkJY29tbWFuZE1hbmFnZXJzLnB1dChpZCwgaW5mbyk7Ci0JCQl1cGRhdGVUaW1lc3RhbXBzKGlkKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBvYnRhaW4gY29tbWFuZCBtYW5hZ2VyIiwgZSk7Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQotCS8qKgotCSAqIFJlbGVhc2UgdGhlIGNvbW1hbmQgbWFuYWdlciBmb3IgYSBnaXZlbiBpZC4KLQkgKiAKLQkgKiBAcGFyYW0gaWQgYW4gaWQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlQ29tbWFuZE1hbmFnZXIoU3RyaW5nIGlkKSB7Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIlJlbGVhc2luZyBjb21tYW5kIG1hbmFnZXIgZm9yICIgKyBpZCk7Ci0JCXRyeSB7Ci0JCQlDb21tYW5kTWFuYWdlckluZm8gaW5mbyA9IChDb21tYW5kTWFuYWdlckluZm8pIGNvbW1hbmRNYW5hZ2Vycy5nZXQoaWQpOwotCQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJCWluZm8uY291bnQgLS07Ci0JCQkJaWYgKGluZm8uY291bnQgPT0gMCkgewotCQkJCQljb21tYW5kTWFuYWdlcnMucmVtb3ZlKGlkKTsKLQkJCQkJY2xlYXJVbmRvTGlzdChpZCk7Ci0JCQkJCWNsZWFyUmVkb0xpc3QoaWQpOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCByZWxlYXNlIGNvbW1hbmQgbWFuYWdlciIsIGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVsb2FkIHRoZSBjb21tYW5kIG1hbmFnZXIgZm9yIGEgZ2l2ZW4gaWQuCi0JICogCi0JICogQHBhcmFtIGlkIGFuIGlkCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yCi0JICovCi0JcHVibGljIHZvaWQgcmVsb2FkKFN0cmluZyBpZCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXRyeSB7Ci0JCQlDb21tYW5kTWFuYWdlckluZm8gaW5mbyA9IGdldEV4aXN0aW5nQ29tbWFuZE1hbmFnZXJJbmZvKGlkKTsKLQkJCWlmIChpbmZvICE9IG51bGwpIHsKLQkJCQlJU2VydmVyIHNlcnZlciA9IG51bGw7Ci0JCQkJaWYgKGlkICE9IG51bGwpCi0JCQkJCXNlcnZlciA9IFNlcnZlckNvcmUuZmluZFNlcnZlcihpZCk7Ci0JCQkJaWYgKHNlcnZlciAhPSBudWxsKQotCQkJCQlpbmZvLndjID0gc2VydmVyLmNyZWF0ZVdvcmtpbmdDb3B5KCk7Ci0JCQkJLy9pbmZvLnNlcnZlckVsZW1lbnQgPSBTZXJ2ZXJDb3JlLmdldFJlc291cmNlTWFuYWdlcigpLmdldFNlcnZlcigpCi0JCQkJLy9pbmZvLnNlcnZlckVsZW1lbnQgPSBTZXJ2ZXJDb3JlLmdldEVkaXRNYW5hZ2VyKCkucmVsb2FkRWRpdE1vZGVsKGluZm8uZmlsZSwgbW9uaXRvcik7Ci0JCQkJZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQoUFJPUF9SRUxPQUQsIGlkLCBudWxsKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCByZWxlYXNlIGNvbW1hbmQgbWFuYWdlciIsIGUpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kTWFuYWdlckluZm8gZ2V0RXhpc3RpbmdDb21tYW5kTWFuYWdlckluZm8oU3RyaW5nIGlkKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gKENvbW1hbmRNYW5hZ2VySW5mbykgY29tbWFuZE1hbmFnZXJzLmdldChpZCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3QgZmluZCBleGlzdGluZyBjb21tYW5kIG1hbmFnZXIgaW5mbyIpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSBpcyBvbmx5IG9uZSBjb21tYW5kIG1hbmFnZXIuCi0JICogCi0JICogQHBhcmFtIGlkIGFuIGlkCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgb25seSBjb21tYW5kIG1hbmFnZXIKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc09ubHlDb21tYW5kTWFuYWdlcihTdHJpbmcgaWQpIHsKLQkJQ29tbWFuZE1hbmFnZXJJbmZvIGluZm8gPSBnZXRFeGlzdGluZ0NvbW1hbmRNYW5hZ2VySW5mbyhpZCk7Ci0JCXJldHVybiAoaW5mbyAhPSBudWxsICYmIGluZm8uY291bnQgPT0gMSk7Ci0JfQotCQotCXByb3RlY3RlZCBJU2VydmVyRWRpdG9yUGFydElucHV0IGdldFBhcnRJbnB1dChTdHJpbmcgc2VydmVySWQsIFNlcnZlclJlc291cmNlQ29tbWFuZE1hbmFnZXIgc2VydmVyQ29tbWFuZE1hbmFnZXIpIHsKLQkJQ29tbWFuZE1hbmFnZXJJbmZvIHNlcnZlckluZm8gPSBudWxsOwotCQlJU2VydmVyV29ya2luZ0NvcHkgc2VydmVyID0gbnVsbDsKLQkJYm9vbGVhbiBzZXJ2ZXJSZWFkT25seSA9IGZhbHNlOwotCQlpZiAoc2VydmVySWQgIT0gbnVsbCkgewotCQkJc2VydmVySW5mbyA9IGdldEV4aXN0aW5nQ29tbWFuZE1hbmFnZXJJbmZvKHNlcnZlcklkKTsKLQkJCWlmIChzZXJ2ZXJJbmZvID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQkKLQkJCXNlcnZlciA9IHNlcnZlckluZm8ud2M7Ci0JCQlzZXJ2ZXJSZWFkT25seSA9IHNlcnZlckluZm8uaXNSZWFkT25seTsKLQkJfQotCi0JCXJldHVybiBuZXcgU2VydmVyRWRpdG9yUGFydElucHV0KHNlcnZlckNvbW1hbmRNYW5hZ2VyLCBzZXJ2ZXIsIHNlcnZlclJlYWRPbmx5KTsKLQl9Ci0JCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIElTZXJ2ZXJXb3JraW5nQ29weSBnZXRTZXJ2ZXJSZXNvdXJjZShTdHJpbmcgaWQpIHsKLQkJQ29tbWFuZE1hbmFnZXJJbmZvIGluZm8gPSBnZXRFeGlzdGluZ0NvbW1hbmRNYW5hZ2VySW5mbyhpZCk7Ci0JCWlmIChpbmZvID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCQotCQlyZXR1cm4gaW5mby53YzsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlIHRoZSBnaXZlbiBjb21tYW5kIGFuZCBwbGFjZSBpdCBpbiB0aGUgdW5kbyBzdGFjay4KLQkgKiBJZiB0aGUgY29tbWFuZCBjYW5ub3QgYmUgdW5kb25lLCB0aGUgdXNlciB3aWxsIGJlIG5vdGlmZWQKLQkgKiBiZWZvcmUgaXQgaXMgZXhlY3V0ZWQuCi0JICoKLQkgKiBAcGFyYW0gaWQgYW4gaWQKLQkgKiBAcGFyYW0gY29tbWFuZCBhIHRhc2sKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlQ29tbWFuZChTdHJpbmcgaWQsIElVbmRvYWJsZU9wZXJhdGlvbiBjb21tYW5kKSB7Ci0JCWlmICghY29tbWFuZC5jYW5VbmRvKCkgJiYgIXVuZG9MaXN0LmlzRW1wdHkoKSAmJiBTZXJ2ZXJVSVBsdWdpbi5nZXRQcmVmZXJlbmNlcygpLmdldFByb21wdEJlZm9yZUlycmV2ZXJzaWJsZUNoYW5nZSgpKSB7Ci0JCQl0cnkgewotCQkJCURpc3BsYXkgZCA9IERpc3BsYXkuZ2V0Q3VycmVudCgpOwotCQkJCWlmIChkID09IG51bGwpCi0JCQkJCWQgPSBEaXNwbGF5LmdldERlZmF1bHQoKTsKLQkJCi0JCQkJU2hlbGwgc2hlbGwgPSBkLmdldEFjdGl2ZVNoZWxsKCk7Ci0JCQkJaWYgKCFNZXNzYWdlRGlhbG9nLm9wZW5Db25maXJtKHNoZWxsLCBNZXNzYWdlcy5lZGl0b3JTZXJ2ZXJFZGl0b3IsIE1lc3NhZ2VzLmVkaXRvclByb21wdElycmV2ZXJzaWJsZSkpCi0JCQkJCXJldHVybjsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCX0KLQkJCi0JCVNlcnZlclJlc291cmNlQ29tbWFuZCBzcmMgPSBuZXcgU2VydmVyUmVzb3VyY2VDb21tYW5kKCk7Ci0JCXNyYy5pZCA9IGlkOwotCQlzcmMuY29tbWFuZCA9IGNvbW1hbmQ7Ci0KLQkJdHJ5IHsKLQkJCWNvbW1hbmQuZXhlY3V0ZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCBudWxsKTsKLQkJfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGNlKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlDb21tYW5kTWFuYWdlckluZm8gaW5mbyA9IGdldEV4aXN0aW5nQ29tbWFuZE1hbmFnZXJJbmZvKGlkKTsKLQkJaWYgKGluZm8gPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlpZiAoY29tbWFuZC5jYW5VbmRvKCkpCi0JCQlhZGRUb1VuZG9MaXN0KHNyYyk7Ci0JCWVsc2UgewotCQkJaW5mby5jYW5Db21wbGV0ZWx5VW5kbyA9IGZhbHNlOwotCQkJY2xlYXJVbmRvTGlzdChpZCk7Ci0JCX0KLQotCQkvLyBjbGVhciByZWRvIGxpc3Qgc2luY2UgYSBuZXcgY29tbWFuZCBoYXMgYmVlbiBleGVjdXRlZC4KLQkJY2xlYXJSZWRvTGlzdChpZCk7Ci0KLQkJc2V0RGlydHlTdGF0ZShpZCwgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQWRkIGEgY29tbWFuZCB0byB0aGUgaGlzdG9yeS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkVG9VbmRvTGlzdChTZXJ2ZXJSZXNvdXJjZUNvbW1hbmQgc3JjKSB7Ci0JCXVuZG9MaXN0LmFkZChzcmMpOwotCi0JCS8vIGxpbWl0IGhpc3RvcnkgZ3Jvd3RoCi0JCWlmICh1bmRvTGlzdC5zaXplKCkgPiBNQVhfSElTVE9SWSkKLQkJCXVuZG9MaXN0LnJlbW92ZSgwKTsKLQotCQlmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChQUk9QX1VORE8sIHNyYy5pZCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ2xlYXJzIHRoZSB1bmRvIG9mIGEgcGFydGljdWxhciByZXNvdXJjZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgY2xlYXJVbmRvTGlzdChTdHJpbmcgaWQpIHsKLQkJaW50IGkgPSAwOwotCQlib29sZWFuIG1vZGlmaWVkID0gZmFsc2U7Ci0JCXdoaWxlIChpIDwgdW5kb0xpc3Quc2l6ZSgpKSB7Ci0JCQlTZXJ2ZXJSZXNvdXJjZUNvbW1hbmQgc3JjID0gKFNlcnZlclJlc291cmNlQ29tbWFuZCkgdW5kb0xpc3QuZ2V0KGkpOwotCQkJaWYgKHNyYy5pZC5lcXVhbHMoaWQpKSB7Ci0JCQkJbW9kaWZpZWQgPSB0cnVlOwotCQkJCXVuZG9MaXN0LnJlbW92ZShpKTsKLQkJCX0gZWxzZQotCQkJCWkrKzsKLQkJfQotCQlpZiAobW9kaWZpZWQpCi0JCQlmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChQUk9QX1VORE8sIGlkLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBDbGVhcnMgdGhlIHJlZG8gb2YgYSBwYXJ0aWN1bGFyIHJlc291cmNlLgotCSAqLwotCXByaXZhdGUgdm9pZCBjbGVhclJlZG9MaXN0KFN0cmluZyBpZCkgewotCQlpbnQgaSA9IDA7Ci0JCWJvb2xlYW4gbW9kaWZpZWQgPSBmYWxzZTsKLQkJd2hpbGUgKGkgPCByZWRvTGlzdC5zaXplKCkpIHsKLQkJCVNlcnZlclJlc291cmNlQ29tbWFuZCBzcmMgPSAoU2VydmVyUmVzb3VyY2VDb21tYW5kKSByZWRvTGlzdC5nZXQoaSk7Ci0JCQlpZiAoc3JjLmlkLmVxdWFscyhpZCkpIHsKLQkJCQlyZWRvTGlzdC5yZW1vdmUoaSk7Ci0JCQkJbW9kaWZpZWQgPSB0cnVlOwotCQkJfSBlbHNlCi0JCQkJaSsrOwotCQl9Ci0JCWlmIChtb2RpZmllZCkKLQkJCWZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KFBST1BfUkVETywgaWQsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSBpcyBhIGNvbW1hbmQgdGhhdCBjYW4gYmUgdW5kb25lLgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNhblVuZG8oU3RyaW5nIGEsIFN0cmluZyBiKSB7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gdW5kb0xpc3QuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJU2VydmVyUmVzb3VyY2VDb21tYW5kIHNyYyA9IChTZXJ2ZXJSZXNvdXJjZUNvbW1hbmQpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChzcmMuaWQgPT0gYSB8fCBzcmMuaWQgPT0gYikKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSBpcyBhIGNvbW1hbmQgdGhhdCBjYW4gYmUgcmVkb25lLgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNhblJlZG8oU3RyaW5nIGEsIFN0cmluZyBiKSB7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gcmVkb0xpc3QuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJU2VydmVyUmVzb3VyY2VDb21tYW5kIHNyYyA9IChTZXJ2ZXJSZXNvdXJjZUNvbW1hbmQpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChzcmMuaWQgPT0gYSB8fCBzcmMuaWQgPT0gYikKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbW1hbmQgdGhhdCB3b3VsZCBiZSB1bmRvbmUgbmV4dC4KLQkgKiAKLQkgKiBAcGFyYW0gYSBhbiBpZAotCSAqIEByZXR1cm4gYSB0YXNrCi0JICovCi0JcHVibGljIElVbmRvYWJsZU9wZXJhdGlvbiBnZXRVbmRvQ29tbWFuZChTdHJpbmcgYSkgewotCQlpbnQgc2l6ZSA9IHVuZG9MaXN0LnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IHNpemUgLSAxOyBpID49IDA7IGktLSkgewotCQkJU2VydmVyUmVzb3VyY2VDb21tYW5kIHNyYyA9IChTZXJ2ZXJSZXNvdXJjZUNvbW1hbmQpIHVuZG9MaXN0LmdldChpKTsKLQkJCWlmIChzcmMuaWQgPT0gYSkKLQkJCQlyZXR1cm4gc3JjLmNvbW1hbmQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29tbWFuZCB0aGF0IHdvdWxkIGJlIHJlZG9uZSBuZXh0LgotCSAqIAotCSAqIEBwYXJhbSBhIGFuIGlkCi0JICogQHJldHVybiBhIHRhc2sKLQkgKi8KLQlwdWJsaWMgSVVuZG9hYmxlT3BlcmF0aW9uIGdldFJlZG9Db21tYW5kKFN0cmluZyBhKSB7Ci0JCWludCBzaXplID0gcmVkb0xpc3Quc2l6ZSgpOwotCQlmb3IgKGludCBpID0gc2l6ZSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCQlTZXJ2ZXJSZXNvdXJjZUNvbW1hbmQgc3JjID0gKFNlcnZlclJlc291cmNlQ29tbWFuZCkgcmVkb0xpc3QuZ2V0KGkpOwotCQkJaWYgKHNyYy5pZCA9PSBhKQotCQkJCXJldHVybiBzcmMuY29tbWFuZDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNlcnZlciByZXNvdXJjZSBpcyAiZGlydHkiLgotCSAqCi0JICogQHBhcmFtIGlkIGFuIGlkCi0JICogQHJldHVybiBhIHRhc2sKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RpcnR5KFN0cmluZyBpZCkgewotCQlDb21tYW5kTWFuYWdlckluZm8gaW5mbyA9IGdldEV4aXN0aW5nQ29tbWFuZE1hbmFnZXJJbmZvKGlkKTsKLQkJaWYgKGluZm8gPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCXJldHVybiBpbmZvLmlzRGlydHk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc2VydmVyIHJlc291cmNlIGlzIHJlYWQtb25seS4KLQkgKgotCSAqIEBwYXJhbSBpZCBhbiBpZAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUmVhZE9ubHkoU3RyaW5nIGlkKSB7Ci0JCUNvbW1hbmRNYW5hZ2VySW5mbyBpbmZvID0gZ2V0RXhpc3RpbmdDb21tYW5kTWFuYWdlckluZm8oaWQpOwotCQlpZiAoaW5mbyA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gaW5mby5pc1JlYWRPbmx5OwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBzZXJ2ZXIgcmVzb3VyY2UgcmVhZC1vbmx5IGZsYWcuCi0JICogCi0JICogQHBhcmFtIGlkIGFuIGlkCi0JICogQHBhcmFtIHJlYWRPbmx5IDxjb2RlPnRydWU8L2NvZGU+IHRvIHNldCByZWFkLW9ubHksIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWFkT25seShTdHJpbmcgaWQsIGJvb2xlYW4gcmVhZE9ubHkpIHsKLQkJQ29tbWFuZE1hbmFnZXJJbmZvIGluZm8gPSBnZXRFeGlzdGluZ0NvbW1hbmRNYW5hZ2VySW5mbyhpZCk7Ci0JCWlmIChpbmZvID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQlpZiAoaW5mby5pc1JlYWRPbmx5ID09IHJlYWRPbmx5KQotCQkJcmV0dXJuOwotCQlpbmZvLmlzUmVhZE9ubHkgPSByZWFkT25seTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQoUFJPUF9SRUxPQUQsIGlkLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNlcnZlciByZXNvdXJjZSBmaWxlcyBhcmUgcmVhZC1vbmx5LgotCSAqCi0JICogQHBhcmFtIGlkIGFuIGlkCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZmlsZXMgYXJlIHJlYWQtb25seQotCSAqLwotCXB1YmxpYyBib29sZWFuIGFyZUZpbGVzUmVhZE9ubHkoU3RyaW5nIGlkKSB7Ci0JCUNvbW1hbmRNYW5hZ2VySW5mbyBpbmZvID0gZ2V0RXhpc3RpbmdDb21tYW5kTWFuYWdlckluZm8oaWQpOwotCQlpZiAoaW5mbyA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gKGdldFJlYWRPbmx5RmlsZXMoaWQpLmxlbmd0aCA+IDApOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBkaXJ0eSBzdGF0ZSBhbmQgZmlyZXMgYW4gZXZlbnQgaWYgbmVlZGVkLgotCSAqIEBwYXJhbSBkaXJ0eSBib29sZWFuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldERpcnR5U3RhdGUoU3RyaW5nIGlkLCBib29sZWFuIGRpcnR5KSB7Ci0JCUNvbW1hbmRNYW5hZ2VySW5mbyBpbmZvID0gZ2V0RXhpc3RpbmdDb21tYW5kTWFuYWdlckluZm8oaWQpOwotCQlpZiAoaW5mby5pc0RpcnR5ID09IGRpcnR5KQotCQkJcmV0dXJuOwotCi0JCWluZm8uaXNEaXJ0eSA9IGRpcnR5OwotCQlmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChQUk9QX0RJUlRZLCBpZCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogVW5kbyB0aGUgbGFzdCBjb21tYW5kLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVuZG8oU3RyaW5nIGEpIHsKLQkJU2VydmVyUmVzb3VyY2VDb21tYW5kIHNyYyA9IG51bGw7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gdW5kb0xpc3QuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJU2VydmVyUmVzb3VyY2VDb21tYW5kIHNyYzIgPSAoU2VydmVyUmVzb3VyY2VDb21tYW5kKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoc3JjMi5pZCA9PSBhKQotCQkJCXNyYyA9IHNyYzI7Ci0JCX0KLQkJaWYgKHNyYyA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCXRyeSB7Ci0JCQlzcmMuY29tbWFuZC51bmRvKG51bGwsIG51bGwpOwotCQl9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZWUpIHsKLQkJCS8vIGRvIHNvbWV0aGluZwotCQl9Ci0JCXVuZG9MaXN0LnJlbW92ZShzcmMpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChQUk9QX1VORE8sIHNyYy5pZCwgbnVsbCk7Ci0JCXJlZG9MaXN0LmFkZChzcmMpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChQUk9QX1JFRE8sIHNyYy5pZCwgbnVsbCk7Ci0KLQkJQ29tbWFuZE1hbmFnZXJJbmZvIGluZm8gPSBnZXRFeGlzdGluZ0NvbW1hbmRNYW5hZ2VySW5mbyhzcmMuaWQpOwotCQlpZiAoaW5mby5jYW5Db21wbGV0ZWx5VW5kbyAmJiBnZXRVbmRvQ29tbWFuZChzcmMuaWQpID09IG51bGwpCi0JCQlzZXREaXJ0eVN0YXRlKHNyYy5pZCwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIFJlZG8gdGhlIGxhc3QgY29tbWFuZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWRvKFN0cmluZyBhKSB7Ci0JCVNlcnZlclJlc291cmNlQ29tbWFuZCBzcmMgPSBudWxsOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IHJlZG9MaXN0Lml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVNlcnZlclJlc291cmNlQ29tbWFuZCBzcmMyID0gKFNlcnZlclJlc291cmNlQ29tbWFuZCkgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKHNyYzIuaWQgPT0gYSkKLQkJCQlzcmMgPSBzcmMyOwotCQl9Ci0JCWlmIChzcmMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQl0cnkgewotCQkJc3JjLmNvbW1hbmQuZXhlY3V0ZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCBudWxsKTsKLQkJfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGNlKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJcmVkb0xpc3QucmVtb3ZlKHNyYyk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KFBST1BfUkVETywgc3JjLmlkLCBudWxsKTsKLQkJdW5kb0xpc3QuYWRkKHNyYyk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KFBST1BfVU5ETywgc3JjLmlkLCBudWxsKTsKLQotCQlzZXREaXJ0eVN0YXRlKHNyYy5pZCwgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQ2xlYXJzIHRoZSBoaXN0b3J5IGxpc3QuCi0JICogCi0JICogQHBhcmFtIGlkIGFuIGlkCi0JICovCi0JcHVibGljIHZvaWQgcmVzb3VyY2VTYXZlZChTdHJpbmcgaWQpIHsKLQkJQ29tbWFuZE1hbmFnZXJJbmZvIGluZm8gPSBnZXRFeGlzdGluZ0NvbW1hbmRNYW5hZ2VySW5mbyhpZCk7Ci0JCS8vY2xlYXJVbmRvTGlzdChyZXNvdXJjZSk7Ci0JCS8vY2xlYXJSZWRvTGlzdChyZXNvdXJjZSk7Ci0JCWluZm8uY2FuQ29tcGxldGVseVVuZG8gPSB0cnVlOwotCQlzZXREaXJ0eVN0YXRlKGlkLCBmYWxzZSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBvZiByZWFkLW9ubHkgZmlsZXMuCi0JICogCi0JICogQHBhcmFtIHNlcnZlciBhIHNlcnZlcgotCSAqIEByZXR1cm4gYSBwb3NzaWJseSBlbXB0eSBhcnJheSBvZiBmaWxlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUZpbGVbXSBnZXRSZWFkT25seUZpbGVzKElTZXJ2ZXJBdHRyaWJ1dGVzIHNlcnZlcikgewotCQl0cnkgewotCQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJSUZpbGUgZmlsZSA9ICgoU2VydmVyKXNlcnZlcikuZ2V0RmlsZSgpOwotCQkJCi0JCQlpZiAoZmlsZSAhPSBudWxsKQotCQkJCWxpc3QuYWRkKGZpbGUpOwotCQkJCi0JCQkvL2lmICgpCi0JCQkvL0lTZXJ2ZXJDb25maWd1cmF0aW9uIGNvbmZpZyA9IChJU2VydmVyQ29uZmlndXJhdGlvbikgZWxlbWVudDsKLQkJCS8vIFRPRE86IGdldCByZWFkLW9ubHkgZmlsZXMKLQkJCUlGaWxlW10gZmlsZXMgPSBuZXcgSUZpbGVbbGlzdC5zaXplKCldOwotCQkJbGlzdC50b0FycmF5KGZpbGVzKTsKLQkJCXJldHVybiBmaWxlczsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgImdldFJlYWRPbmx5RmlsZXMiLCBlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIElGaWxlW10gZ2V0U2VydmVyUmVzb3VyY2VGaWxlcyhTdHJpbmcgaWQpIHsKLQkJaWYgKGlkID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IElGaWxlWzBdOwotCi0JCUNvbW1hbmRNYW5hZ2VySW5mbyBpbmZvID0gZ2V0RXhpc3RpbmdDb21tYW5kTWFuYWdlckluZm8oaWQpOwotCQlpZiAoaW5mbyA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBJRmlsZVswXTsKLQotCQlyZXR1cm4gZ2V0UmVhZE9ubHlGaWxlcyhpbmZvLndjKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIElGaWxlW10gZ2V0UmVhZE9ubHlGaWxlcyhTdHJpbmcgaWQpIHsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlJRmlsZVtdIGZpbGVzID0gZ2V0U2VydmVyUmVzb3VyY2VGaWxlcyhpZCk7Ci0JCWludCBzaXplID0gZmlsZXMubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJaWYgKGZpbGVzW2ldLmlzUmVhZE9ubHkoKSkKLQkJCQlsaXN0LmFkZChmaWxlc1tpXSk7Ci0JCX0KLQkJCi0JCUlGaWxlW10gZmlsZUxpc3QgPSBuZXcgSUZpbGVbbGlzdC5zaXplKCldOwotCQlsaXN0LnRvQXJyYXkoZmlsZUxpc3QpOwotCQlyZXR1cm4gZmlsZUxpc3Q7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlIHRoZSB0aW1lc3RhbXBzLgotCSAqIAotCSAqIEBwYXJhbSBpZCBhbiBpZAotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZVRpbWVzdGFtcHMoU3RyaW5nIGlkKSB7Ci0JCUNvbW1hbmRNYW5hZ2VySW5mbyBpbmZvID0gZ2V0RXhpc3RpbmdDb21tYW5kTWFuYWdlckluZm8oaWQpOwotCQlpZiAoaW5mbyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkKLQkJaW5mby5maWxlTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJSUZpbGVbXSBmaWxlcyA9IGdldFNlcnZlclJlc291cmNlRmlsZXMoaWQpOwotCQlpZiAoZmlsZXMgIT0gbnVsbCkgewotCQkJaW50IHNpemUgPSBmaWxlcy5sZW5ndGg7Ci0JCQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlpZiAoZmlsZXNbaV0gIT0gbnVsbCkgewotCQkJCQlGaWxlIGYgPSBmaWxlc1tpXS5nZXRMb2NhdGlvbigpLnRvRmlsZSgpOwotCQkJCQlpZiAoZiAhPSBudWxsKSB7Ci0JCQkJCQlsb25nIHRpbWUgPSBmLmxhc3RNb2RpZmllZCgpOwotCQkJCQkJaW5mby5maWxlTWFwLnB1dChmaWxlc1tpXSwgbmV3IExvbmcodGltZSkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWluZm8udGltZXN0YW1wID0gZ2V0VGltZXN0YW1wKGluZm8pOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIGludCBnZXRUaW1lc3RhbXAoQ29tbWFuZE1hbmFnZXJJbmZvIGluZm8pIHsKLQkJSVNlcnZlciBzZXJ2ZXIgPSBpbmZvLndjLmdldE9yaWdpbmFsKCk7Ci0KLQkJaWYgKHNlcnZlciAhPSBudWxsKQotCQkJcmV0dXJuICgoU2VydmVyKXNlcnZlcikuZ2V0VGltZXN0YW1wKCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNDaGFuZ2VkKFN0cmluZyBpZCkgewotCQlDb21tYW5kTWFuYWdlckluZm8gaW5mbyA9IGdldEV4aXN0aW5nQ29tbWFuZE1hbmFnZXJJbmZvKGlkKTsKLQkJaWYgKGluZm8gPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJSUZpbGVbXSBmaWxlcyA9IGdldFNlcnZlclJlc291cmNlRmlsZXMoaWQpOwotCQlpbnQgc2l6ZSA9IGZpbGVzLmxlbmd0aDsKLQotCQlpbnQgY291bnQgPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJY291bnQrKzsKLQkJCUZpbGUgZiA9IGZpbGVzW2ldLmdldExvY2F0aW9uKCkudG9GaWxlKCk7Ci0JCQl0cnkgewotCQkJCUxvbmcgdGltZSA9IChMb25nKSBpbmZvLmZpbGVNYXAuZ2V0KGZpbGVzW2ldKTsKLQkJCQlpZiAodGltZS5sb25nVmFsdWUoKSAhPSBmLmxhc3RNb2RpZmllZCgpKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJCi0JCWludCB0aW1lc3RhbXAgPSBnZXRUaW1lc3RhbXAoaW5mbyk7Ci0JCWlmIChpbmZvLnRpbWVzdGFtcCAhPSB0aW1lc3RhbXApCi0JCQlyZXR1cm4gdHJ1ZTsKLQotCQlpZiAoY291bnQgIT0gaW5mby5maWxlTWFwLnNpemUoKSkKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2VkaXRvci9JT3JkZXJlZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvZWRpdG9yL0lPcmRlcmVkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4NzJmOGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvZWRpdG9yL0lPcmRlcmVkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuZWRpdG9yOwotLyoqCi0gKiBBbiBvYmplY3QgdGhhdCBoYXMgYW4gYWJzb2x1dGUgb3JkZXJpbmcsIGFuZCBjYW4gYmUgb3JkZXJlZCBhZ2FpbnN0IG90aGVyIG9iamVjdHMuCi0gKiAKLSAqIDxwPgotICogW2lzc3VlOiBJdCBpcyBub3RvcmlvdXNseSBkaWZmaWN1bHQgdG8gcGxhY2UgYW55IGtpbmQgb2YKLSAqIHVzZWZ1bCBvcmRlciBvbiBvYmplY3RzIHRoYXQgYXJlIGNvbnRyaWJ1dGVkIGluZGVwZW5kZW50bHkgYnkKLSAqIG5vbi1jb2xsYWJvcmF0aW5nIHBhcnRpZXMuIFRoZSBJT3JkZXJlZCBtZWNoYW5pc20gaXMgd2VhaywgYW5kCi0gKiBjYW4ndCByZWFsbHkgc29sdmUgdGhlIHByb2JsZW0uIElzc3VlcyBvZiBwcmVzZW50YXRpb24gYXJlIHVzdWFsbHkKLSAqIGJlc3QgbGVmdCB0byB0aGUgVUksIHdoaWNoIGNhbiBzb3J0IG9iamVjdHMgYmFzZWQgb24gYXJiaXRyYXJ5Ci0gKiBwcm9wZXJ0aWVzLl0KLSAqIDwvcD4KLSAqIAotICogPHA+VGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuPC9wPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElPcmRlcmVkIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBvcmRlciAoaW5kZXgvcHJpb3JpdHkpLgotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRPcmRlcigpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2VkaXRvci9JU2VydmVyRWRpdG9yQWN0aW9uRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvZWRpdG9yL0lTZXJ2ZXJFZGl0b3JBY3Rpb25GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxNzkxZWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvZWRpdG9yL0lTZXJ2ZXJFZGl0b3JBY3Rpb25GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuZWRpdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuZWRpdG9yLklTZXJ2ZXJFZGl0b3JQYXJ0SW5wdXQ7Ci0vKioKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVNlcnZlckVkaXRvckFjdGlvbkZhY3RvcnkgZXh0ZW5kcyBJT3JkZXJlZCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgaWQuCi0JICogCi0JICogQHJldHVybiBhbiBpZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5hbWUuCi0JICogCi0JICogQHJldHVybiBhIG5hbWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gc2VydmVyIHJlc291cmNlIHR5cGUgKGdpdmVuIGJ5IHRoZQotCSAqIGlkKSBjYW4gYmUgb3BlbmVkIHdpdGggdGhpcyBlZGl0b3IuIFRoaXMgcmVzdWx0IGlzIGJhc2VkIG9uCi0JICogdGhlIHJlc3VsdCBvZiB0aGUgZ2V0RmFjdG9yeUlkcygpIG1ldGhvZC4KLQkgKgotCSAqIEBwYXJhbSBpZCBhbiBpZAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzU2VydmVyRWxlbWVudFR5cGUoU3RyaW5nIGlkKTsKLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGVkaXRvciBwYWdlIHNob3VsZCBiZSB2aXNpYmxlIHdpdGggdGhlIGdpdmVuIHNlcnZlci4KLQkgKiBUaGlzIGFsbG93cyAoZm9yIGluc3RhbmNlKSBjb21wbGV4IGNvbmZpZ3VyYXRpb24gcGFnZXMgdG8gb25seSBiZSBzaG93biB3aGVuIHVzZWQKLQkgKiB3aXRoIG5vbi11bml0dGVzdCBzZXJ2ZXJzLgotCSAqIAotCSAqIEBwYXJhbSBzZXJ2ZXIgYSBzZXJ2ZXIKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBhY3Rpb24gc2hvdWxkIGRpc3BsYXkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGREaXNwbGF5KElTZXJ2ZXJXb3JraW5nQ29weSBzZXJ2ZXIpOwotCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHBhcmFtIHNpdGUgYW4gZWRpdG9yIHNpdGUKLQkgKiBAcGFyYW0gaW5wdXQgYSBzZXJ2ZXIgZWRpdG9yIGlucHV0Ci0JICogQHJldHVybiBhbiBhY3Rpb24KLQkgKi8KLQlwdWJsaWMgSUFjdGlvbiBjcmVhdGVBY3Rpb24oSUVkaXRvclNpdGUgc2l0ZSwgSVNlcnZlckVkaXRvclBhcnRJbnB1dCBpbnB1dCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvZWRpdG9yL0lTZXJ2ZXJFZGl0b3JJbnB1dC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvZWRpdG9yL0lTZXJ2ZXJFZGl0b3JJbnB1dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWVjOGQ5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2VkaXRvci9JU2VydmVyRWRpdG9ySW5wdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlNlcnZlclVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLS8qKgotICogVGhpcyBpcyB0aGUgZWRpdG9yIGlucHV0IGZvciB0aGUgc2VydmVyIGFuZCBzZXJ2ZXIKLSAqIGNvbmZpZ3VyYXRpb24gZWRpdG9yLiBUaGUgaW5wdXQgaW5jbHVkZXMgYm90aCBhIHNlcnZlcgotICogYW5kIHNlcnZlciBjb25maWd1cmF0aW9uLgotICoKLSAqIDxwPlRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLjwvcD4KLSAqLwotcHVibGljIGludGVyZmFjZSBJU2VydmVyRWRpdG9ySW5wdXQgZXh0ZW5kcyBJRWRpdG9ySW5wdXQgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVESVRPUl9JRCA9IFNlcnZlclVJUGx1Z2luLlBMVUdJTl9JRCArICIuZWRpdG9yIjsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNlcnZlciBpZC4KLQkgKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2VydmVySWQoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9lZGl0b3IvSVNlcnZlckVkaXRvclBhZ2VTZWN0aW9uRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvZWRpdG9yL0lTZXJ2ZXJFZGl0b3JQYWdlU2VjdGlvbkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc0Mzg1My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9lZGl0b3IvSVNlcnZlckVkaXRvclBhZ2VTZWN0aW9uRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5lZGl0b3IuU2VydmVyRWRpdG9yU2VjdGlvbjsKLS8qKgotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJU2VydmVyRWRpdG9yUGFnZVNlY3Rpb25GYWN0b3J5IGV4dGVuZHMgSU9yZGVyZWQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIGlkLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGlkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBzZXJ2ZXIgcmVzb3VyY2UgdHlwZSAoZ2l2ZW4gYnkgdGhlCi0JICogaWQpIGNhbiBiZSBvcGVuZWQgd2l0aCB0aGlzIGVkaXRvci4gVGhpcyByZXN1bHQgaXMgYmFzZWQgb24KLQkgKiB0aGUgcmVzdWx0IG9mIHRoZSB0eXBlcyBhdHRyaWJ1dGUuCi0JICoKLQkgKiBAcGFyYW0gaWQgdGhlIHR5cGUgaWQKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1R5cGUoU3RyaW5nIGlkKTsKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEluc2VydGlvbklkKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoaXMgZWRpdG9yIHBhZ2Ugc2VjdGlvbiBzaG91bGQgYmUgdmlzaWJsZSB3aXRoIHRoZSBnaXZlbiBzZXJ2ZXIuCi0JICogVGhpcyBhbGxvd3MgKGZvciBpbnN0YW5jZSkgY29tcGxleCBjb25maWd1cmF0aW9uIHBhZ2VzIHRvIG9ubHkgYmUgc2hvd24gd2hlbiB1c2VkCi0JICogd2l0aCBub24tdW5pdHRlc3Qgc2VydmVycy4KLQkgKiAKLQkgKiBAcGFyYW0gc2VydmVyIGEgc2VydmVyCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc2VjdGlvbiBzaG91bGQgYmUgc2hvd24sIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkQ3JlYXRlU2VjdGlvbihJU2VydmVyV29ya2luZ0NvcHkgc2VydmVyKTsKLQotCS8qKgotCSAqIENyZWF0ZSB0aGUgZWRpdG9yIHBhZ2Ugc2VjdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzZWN0aW9uCi0JICovCi0JcHVibGljIFNlcnZlckVkaXRvclNlY3Rpb24gY3JlYXRlU2VjdGlvbigpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2VkaXRvci9JU2VydmVyRWRpdG9yUGFydEZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2VkaXRvci9JU2VydmVyRWRpdG9yUGFydEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM2MDFkZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9lZGl0b3IvSVNlcnZlckVkaXRvclBhcnRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuZWRpdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcldvcmtpbmdDb3B5OwotLyoqCi0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTZXJ2ZXJFZGl0b3JQYXJ0RmFjdG9yeSBleHRlbmRzIElPcmRlcmVkIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBpZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRpc3BsYXlhYmxlIG5hbWUuCi0JICogCi0JICogQHJldHVybiB0aGUgbmFtZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBzZXJ2ZXIgcmVzb3VyY2UgdHlwZSAoZ2l2ZW4gYnkgdGhlCi0JICogaWQpIGNhbiBiZSBvcGVuZWQgd2l0aCB0aGlzIGVkaXRvci4gVGhpcyByZXN1bHQgaXMgYmFzZWQgb24KLQkgKiB0aGUgcmVzdWx0IG9mIHRoZSB0eXBlcyBhdHRyaWJ1dGUuCi0JICogCi0JICogQHBhcmFtIGlkIGEgc2VydmVyIHR5cGUgaWQKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSB0eXBlIGlzIHN1cHBvcnRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzVHlwZShTdHJpbmcgaWQpOwotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIGEgZ2l2ZW4gaW5zZXJ0aW9uIGlkIGlzIHN1cHBvcnRlZC4KLQkgKiAKLQkgKiBAcGFyYW0gaWQKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBpbnNlcnRpb24gaWQgaXMgc3VwcG9ydGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHNJbnNlcnRpb25JZChTdHJpbmcgaWQpOwotCQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGVkaXRvciBwYWdlIHNob3VsZCBiZSB2aXNpYmxlIHdpdGggdGhlIGdpdmVuIHNlcnZlci4KLQkgKiBUaGlzIGFsbG93cyAoZm9yIGluc3RhbmNlKSBjb21wbGV4IGNvbmZpZ3VyYXRpb24gcGFnZXMgdG8gb25seSBiZSBzaG93biB3aGVuIHVzZWQKLQkgKiB3aXRoIG5vbi11bml0dGVzdCBzZXJ2ZXJzLgotCSAqIAotCSAqIEBwYXJhbSBzZXJ2ZXIgYSBzZXJ2ZXIKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwYWdlIHNob3VsZCBiZSB2aXNpYmxlCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkQ3JlYXRlUGFnZShJU2VydmVyV29ya2luZ0NvcHkgc2VydmVyKTsKLQotCS8qKgotCSAqIENyZWF0ZSB0aGUgZWRpdG9yIHBhZ2UuCi0JICogCi0JICogQHJldHVybiB0aGUgZWRpdG9yIHBhZ2UKLQkgKi8KLQlwdWJsaWMgSUVkaXRvclBhcnQgY3JlYXRlUGFnZSgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2VkaXRvci9PdmVydmlld0VkaXRvclBhcnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2VkaXRvci9PdmVydmlld0VkaXRvclBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY5MjA1My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9lZGl0b3IvT3ZlcnZpZXdFZGl0b3JQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi2gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLkRlYnVnVUlUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU3Bpbm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuQ29udGFpbmVyU2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuUHJlZmVyZW5jZXNVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLkZvcm1Db2xvcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZXZlbnRzLkh5cGVybGlua0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZXZlbnRzLkh5cGVybGlua0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLklXb3JrYmVuY2hIZWxwU3lzdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5TZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlclR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnV0aWwuU29ja2V0VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmVkaXRvci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuU2VydmVyVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5UcmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmNvbW1hbmQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZC5DbG9zYWJsZVdpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZC5UYXNrV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLldpemFyZFRhc2tVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkud2l6YXJkLldpemFyZEZyYWdtZW50OwotLyoqCi0gKiBTZXJ2ZXIgZ2VuZXJhbCBlZGl0b3IgcGFnZS4KLSAqLwotcHVibGljIGNsYXNzIE92ZXJ2aWV3RWRpdG9yUGFydCBleHRlbmRzIFNlcnZlckVkaXRvclBhcnQgewotCXByb3RlY3RlZCBUZXh0IHNlcnZlck5hbWU7Ci0JcHJvdGVjdGVkIFRleHQgc2VydmVyQ29uZmlndXJhdGlvbk5hbWU7Ci0JcHJvdGVjdGVkIFRleHQgaG9zdG5hbWU7Ci0JcHJvdGVjdGVkIENvbWJvIHJ1bnRpbWVDb21ibzsKLQlwcm90ZWN0ZWQgQnV0dG9uIGF1dG9QdWJsaXNoRGVmYXVsdDsKLQlwcm90ZWN0ZWQgQnV0dG9uIGF1dG9QdWJsaXNoRGlzYWJsZTsKLQlwcm90ZWN0ZWQgQnV0dG9uIGF1dG9QdWJsaXNoT3ZlcnJpZGU7Ci0JcHJvdGVjdGVkIFNwaW5uZXIgYXV0b1B1Ymxpc2hUaW1lOwotCi0JcHJvdGVjdGVkIENvbG9yIGNvbG9yRGVmYXVsdDsKLQlwcm90ZWN0ZWQgQ29sb3IgY29sb3JSZWQ7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiB1cGRhdGluZzsKLQotCXByb3RlY3RlZCBJUnVudGltZVtdIHJ1bnRpbWVzOwotCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXI7Ci0KLQlwcm90ZWN0ZWQgSVJ1bnRpbWVMaWZlY3ljbGVMaXN0ZW5lciBydW50aW1lTGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBPdmVydmlld0VkaXRvclBhcnQgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgT3ZlcnZpZXdFZGl0b3JQYXJ0KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENoYW5nZUxpc3RlbmVyKCkgewotCQlsaXN0ZW5lciA9IG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCWlmIChldmVudC5nZXRQcm9wZXJ0eU5hbWUoKS5lcXVhbHMoImNvbmZpZ3VyYXRpb24taWQiKSAmJiBzZXJ2ZXJDb25maWd1cmF0aW9uTmFtZSAhPSBudWxsKSB7Ci0JCQkJCUlGb2xkZXIgZm9sZGVyID0gZ2V0U2VydmVyKCkuZ2V0U2VydmVyQ29uZmlndXJhdGlvbigpOwotCQkJCQlpZiAoZm9sZGVyID09IG51bGwgfHwgIWZvbGRlci5leGlzdHMoKSkKLQkJCQkJCXNlcnZlckNvbmZpZ3VyYXRpb25OYW1lLnNldEZvcmVncm91bmQoY29sb3JSZWQpOwotCQkJCQllbHNlCi0JCQkJCQlzZXJ2ZXJDb25maWd1cmF0aW9uTmFtZS5zZXRGb3JlZ3JvdW5kKGNvbG9yRGVmYXVsdCk7Ci0JCQkJfQotCQkJCXZhbGlkYXRlKCk7Ci0JCQkJaWYgKHVwZGF0aW5nKQotCQkJCQlyZXR1cm47Ci0JCQkJdXBkYXRpbmcgPSB0cnVlOwotCQkJCWlmIChldmVudC5nZXRQcm9wZXJ0eU5hbWUoKS5lcXVhbHMoIm5hbWUiKSkKLQkJCQkJdXBkYXRlTmFtZXMoKTsKLQkJCQllbHNlIGlmIChldmVudC5nZXRQcm9wZXJ0eU5hbWUoKS5lcXVhbHMoImhvc3RuYW1lIikgJiYgaG9zdG5hbWUgIT0gbnVsbCkgewotCQkJCQlob3N0bmFtZS5zZXRUZXh0KChTdHJpbmcpIGV2ZW50LmdldE5ld1ZhbHVlKCkpOwotCQkJCX0gZWxzZSBpZiAoZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkuZXF1YWxzKCJydW50aW1lLWlkIikpIHsKLQkJCQkJU3RyaW5nIHJ1bnRpbWVJZCA9IChTdHJpbmcpIGV2ZW50LmdldE5ld1ZhbHVlKCk7Ci0JCQkJCUlSdW50aW1lIHJ1bnRpbWUgPSBudWxsOwotCQkJCQlpZiAocnVudGltZUlkICE9IG51bGwpCi0JCQkJCQlydW50aW1lID0gU2VydmVyQ29yZS5maW5kUnVudGltZShydW50aW1lSWQpOwotCQkJCQlpZiAocnVudGltZUNvbWJvICE9IG51bGwpIHsKLQkJCQkJCWludCBzaXplID0gcnVudGltZXMubGVuZ3RoOwotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQkJCQlpZiAocnVudGltZXNbaV0uZXF1YWxzKHJ1bnRpbWUpKQotCQkJCQkJCQlydW50aW1lQ29tYm8uc2VsZWN0KGkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChldmVudC5nZXRQcm9wZXJ0eU5hbWUoKS5lcXVhbHMoImNvbmZpZ3VyYXRpb24taWQiKSAmJiBzZXJ2ZXJDb25maWd1cmF0aW9uTmFtZSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBwYXRoID0gKFN0cmluZykgZXZlbnQuZ2V0TmV3VmFsdWUoKTsKLQkJCQkJc2VydmVyQ29uZmlndXJhdGlvbk5hbWUuc2V0VGV4dChwYXRoKTsKLQkJCQl9IGVsc2UgaWYgKGV2ZW50LmdldFByb3BlcnR5TmFtZSgpLmVxdWFscyhTZXJ2ZXIuUFJPUF9BVVRPX1BVQkxJU0hfVElNRSkpIHsKLQkJCQkJSW50ZWdlciBjdXJBdXRvUHVibGlzaFRpbWUgPSAoSW50ZWdlcilldmVudC5nZXROZXdWYWx1ZSgpOwotCQkJCQlhdXRvUHVibGlzaFRpbWUuc2V0U2VsZWN0aW9uKGN1ckF1dG9QdWJsaXNoVGltZS5pbnRWYWx1ZSgpKTsKLQkJCQkJdmFsaWRhdGUoKTsKLQkJCQl9IGVsc2UgaWYgKGV2ZW50LmdldFByb3BlcnR5TmFtZSgpLmVxdWFscyhTZXJ2ZXIuUFJPUF9BVVRPX1BVQkxJU0hfU0VUVElORykpIHsKLQkJCQkJSW50ZWdlciBhdXRvUHVibGlzaFNldHRpbmcgPSAoSW50ZWdlcilldmVudC5nZXROZXdWYWx1ZSgpOwotCQkJCQlpbnQgc2V0dGluZyA9IGF1dG9QdWJsaXNoU2V0dGluZy5pbnRWYWx1ZSgpOwotCQkJCQlhdXRvUHVibGlzaERlZmF1bHQuc2V0U2VsZWN0aW9uKHNldHRpbmcgPT0gU2VydmVyLkFVVE9fUFVCTElTSF9ERUZBVUxUKTsKLQkJCQkJYXV0b1B1Ymxpc2hPdmVycmlkZS5zZXRTZWxlY3Rpb24oc2V0dGluZyA9PSBTZXJ2ZXIuQVVUT19QVUJMSVNIX09WRVJSSURFKTsKLQkJCQkJYXV0b1B1Ymxpc2hEaXNhYmxlLnNldFNlbGVjdGlvbihzZXR0aW5nID09IFNlcnZlci5BVVRPX1BVQkxJU0hfRElTQUJMRSk7Ci0JCQkJCWF1dG9QdWJsaXNoVGltZS5zZXRFbmFibGVkKHNldHRpbmcgPT0gU2VydmVyLkFVVE9fUFVCTElTSF9PVkVSUklERSk7Ci0JCQkJCXZhbGlkYXRlKCk7Ci0JCQkJfQotCQkJCXVwZGF0aW5nID0gZmFsc2U7Ci0JCQl9Ci0JCX07Ci0JCWlmIChzZXJ2ZXIgIT0gbnVsbCkKLQkJCXNlcnZlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVOYW1lcygpIHsKLQkJaWYgKHNlcnZlck5hbWUgIT0gbnVsbCkKLQkJCXNlcnZlck5hbWUuc2V0VGV4dChzZXJ2ZXIuZ2V0TmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBTV1QgY29udHJvbHMgZm9yIHRoaXMgd29ya2JlbmNoIHBhcnQuCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgY29udHJvbAotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGNyZWF0ZVBhcnRDb250cm9sKGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJRm9ybVRvb2xraXQgdG9vbGtpdCA9IGdldEZvcm1Ub29sa2l0KHBhcmVudC5nZXREaXNwbGF5KCkpOwotCQkKLQkJU2Nyb2xsZWRGb3JtIGZvcm0gPSB0b29sa2l0LmNyZWF0ZVNjcm9sbGVkRm9ybShwYXJlbnQpOwotCQlmb3JtLnNldFRleHQoTWVzc2FnZXMuc2VydmVyRWRpdG9yT3ZlcnZpZXdQYWdlVGl0bGUpOwotCQlmb3JtLmdldEJvZHkoKS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCQotCQlDb21wb3NpdGUgY29sdW1uQ29tcCA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKGZvcm0uZ2V0Qm9keSgpKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCS8vbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDEwOwotCQkvL2xheW91dC5tYXJnaW5XaWR0aCA9IDEwOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gMDsKLQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gMTA7Ci0JCWNvbHVtbkNvbXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWNvbHVtbkNvbXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCkpOwotCQkKLQkJLy8gbGVmdCBjb2x1bW4KLQkJQ29tcG9zaXRlIGxlZnRDb2x1bW5Db21wID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUoY29sdW1uQ29tcCk7Ci0JCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gMTA7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IDA7Ci0JCWxlZnRDb2x1bW5Db21wLnNldExheW91dChsYXlvdXQpOwotCQlsZWZ0Q29sdW1uQ29tcC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKSk7Ci0JCQotCQljcmVhdGVHZW5lcmFsU2VjdGlvbihsZWZ0Q29sdW1uQ29tcCwgdG9vbGtpdCk7Ci0JCQotCQlpbnNlcnRTZWN0aW9ucyhsZWZ0Q29sdW1uQ29tcCwgIm9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuZWRpdG9yLm92ZXJ2aWV3LmxlZnQiKTsKLQkJCi0JCS8vIHJpZ2h0IGNvbHVtbgotCQlDb21wb3NpdGUgcmlnaHRDb2x1bW5Db21wID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUoY29sdW1uQ29tcCk7Ci0JCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gMTA7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IDA7Ci0JCXJpZ2h0Q29sdW1uQ29tcC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJcmlnaHRDb2x1bW5Db21wLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpKTsKLQkJCi0JCWNyZWF0ZUF1dG9QdWJsaXNoU2VjdGlvbihyaWdodENvbHVtbkNvbXAsIHRvb2xraXQpOwotCQkKLQkJaW5zZXJ0U2VjdGlvbnMocmlnaHRDb2x1bW5Db21wLCAib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5lZGl0b3Iub3ZlcnZpZXcucmlnaHQiKTsKLQkJCi0JCWZvcm0ucmVmbG93KHRydWUpOwotCQkKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUdlbmVyYWxTZWN0aW9uKENvbXBvc2l0ZSBsZWZ0Q29sdW1uQ29tcCwgRm9ybVRvb2xraXQgdG9vbGtpdCkgewotCQlTZWN0aW9uIHNlY3Rpb24gPSB0b29sa2l0LmNyZWF0ZVNlY3Rpb24obGVmdENvbHVtbkNvbXAsIEV4cGFuZGFibGVDb21wb3NpdGUuVFdJU1RJRSB8IEV4cGFuZGFibGVDb21wb3NpdGUuRVhQQU5ERUQgfCBFeHBhbmRhYmxlQ29tcG9zaXRlLlRJVExFX0JBUiB8IFNlY3Rpb24uREVTQ1JJUFRJT04gfCBFeHBhbmRhYmxlQ29tcG9zaXRlLkZPQ1VTX1RJVExFKTsKLQkJc2VjdGlvbi5zZXRUZXh0KE1lc3NhZ2VzLnNlcnZlckVkaXRvck92ZXJ2aWV3R2VuZXJhbFNlY3Rpb24pOwotCQlzZWN0aW9uLnNldERlc2NyaXB0aW9uKE1lc3NhZ2VzLnNlcnZlckVkaXRvck92ZXJ2aWV3R2VuZXJhbERlc2NyaXB0aW9uKTsKLQkJc2VjdGlvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKSk7Ci0KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKHNlY3Rpb24pOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMzsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDU7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDEwOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gNTsKLQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gMTU7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpKTsKLQkJSVdvcmtiZW5jaEhlbHBTeXN0ZW0gd2hzID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCk7Ci0JCXdocy5zZXRIZWxwKGNvbXBvc2l0ZSwgQ29udGV4dElkcy5FRElUT1JfT1ZFUlZJRVdfUEFHRSk7Ci0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKGNvbXBvc2l0ZSk7Ci0JCXNlY3Rpb24uc2V0Q2xpZW50KGNvbXBvc2l0ZSk7Ci0JCQotCQkvLyBzZXJ2ZXIgbmFtZQotCQlpZiAoc2VydmVyICE9IG51bGwpIHsKLQkJCWNyZWF0ZUxhYmVsKHRvb2xraXQsIGNvbXBvc2l0ZSwgTWVzc2FnZXMuc2VydmVyRWRpdG9yT3ZlcnZpZXdTZXJ2ZXJOYW1lKTsKLQkJCQotCQkJc2VydmVyTmFtZSA9IHRvb2xraXQuY3JlYXRlVGV4dChjb21wb3NpdGUsIHNlcnZlci5nZXROYW1lKCkpOwotCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQlzZXJ2ZXJOYW1lLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQlzZXJ2ZXJOYW1lLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQkJaWYgKHVwZGF0aW5nKQotCQkJCQkJcmV0dXJuOwotCQkJCQl1cGRhdGluZyA9IHRydWU7Ci0JCQkJCWV4ZWN1dGUobmV3IFNldFNlcnZlck5hbWVDb21tYW5kKGdldFNlcnZlcigpLCBzZXJ2ZXJOYW1lLmdldFRleHQoKSkpOwotCQkJCQl1cGRhdGluZyA9IGZhbHNlOwotCQkJCX0KLQkJCX0pOwotCQkJd2hzLnNldEhlbHAoc2VydmVyTmFtZSwgQ29udGV4dElkcy5FRElUT1JfU0VSVkVSKTsKLQkJCi0JCQkvLyBob3N0bmFtZQotCQkJY3JlYXRlTGFiZWwodG9vbGtpdCwgY29tcG9zaXRlLCBNZXNzYWdlcy5zZXJ2ZXJFZGl0b3JPdmVydmlld1NlcnZlckhvc3RuYW1lKTsKLQkJCQotCQkJaG9zdG5hbWUgPSB0b29sa2l0LmNyZWF0ZVRleHQoY29tcG9zaXRlLCBzZXJ2ZXIuZ2V0SG9zdCgpKTsKLQkJCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJaG9zdG5hbWUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCWhvc3RuYW1lLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQkJaWYgKHVwZGF0aW5nKQotCQkJCQkJcmV0dXJuOwotCQkJCQl1cGRhdGluZyA9IHRydWU7Ci0JCQkJCWV4ZWN1dGUobmV3IFNldFNlcnZlckhvc3RuYW1lQ29tbWFuZChnZXRTZXJ2ZXIoKSwgaG9zdG5hbWUuZ2V0VGV4dCgpKSk7Ci0JCQkJCXVwZGF0aW5nID0gZmFsc2U7Ci0JCQkJfQotCQkJfSk7Ci0JCQl3aHMuc2V0SGVscChob3N0bmFtZSwgQ29udGV4dElkcy5FRElUT1JfSE9TVE5BTUUpOwotCQl9Ci0JCQotCQkvLyBydW50aW1lCi0JCWlmIChzZXJ2ZXIgIT0gbnVsbCAmJiBzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpICE9IG51bGwgJiYgc2VydmVyLmdldFNlcnZlclR5cGUoKS5oYXNSdW50aW1lKCkpIHsKLQkJCWZpbmFsIElSdW50aW1lIHJ1bnRpbWUgPSBzZXJ2ZXIuZ2V0UnVudGltZSgpOwotCQkJY3JlYXRlTGFiZWwodG9vbGtpdCwgY29tcG9zaXRlLCBNZXNzYWdlcy5zZXJ2ZXJFZGl0b3JPdmVydmlld1J1bnRpbWUpOwotCQkJCi0JCQlJUnVudGltZVR5cGUgcnVudGltZVR5cGUgPSBzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpLmdldFJ1bnRpbWVUeXBlKCk7Ci0JCQlydW50aW1lcyA9IFNlcnZlclVJUGx1Z2luLmdldFJ1bnRpbWVzKHJ1bnRpbWVUeXBlKTsKLQkJCQotCQkJcnVudGltZUNvbWJvID0gbmV3IENvbWJvKGNvbXBvc2l0ZSwgU1dULlJFQURfT05MWSk7Ci0JCQlydW50aW1lQ29tYm8uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCQl1cGRhdGVSdW50aW1lQ29tYm8oKTsKLQkJCQotCQkJaW50IHNpemUgPSBydW50aW1lcy5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCWlmIChydW50aW1lc1tpXS5lcXVhbHMocnVudGltZSkpCi0JCQkJCXJ1bnRpbWVDb21iby5zZWxlY3QoaSk7Ci0JCQl9Ci0JCQkKLQkJCXJ1bnRpbWVDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQl0cnkgewotCQkJCQkJaWYgKHVwZGF0aW5nKQotCQkJCQkJCXJldHVybjsKLQkJCQkJCXVwZGF0aW5nID0gdHJ1ZTsKLQkJCQkJCUlSdW50aW1lIG5ld1J1bnRpbWUgPSBydW50aW1lc1tydW50aW1lQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKV07Ci0JCQkJCQlleGVjdXRlKG5ldyBTZXRTZXJ2ZXJSdW50aW1lQ29tbWFuZChnZXRTZXJ2ZXIoKSwgbmV3UnVudGltZSkpOwotCQkJCQkJdXBkYXRpbmcgPSBmYWxzZTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCQkvLyBpZ25vcmUKLQkJCQkJfQotCQkJCX0KLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQl3aWRnZXRTZWxlY3RlZChlKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCXdocy5zZXRIZWxwKHJ1bnRpbWVDb21ibywgQ29udGV4dElkcy5FRElUT1JfUlVOVElNRSk7Ci0JCQkKLQkJCUh5cGVybGluayBsaW5rID0gdG9vbGtpdC5jcmVhdGVIeXBlcmxpbmsoY29tcG9zaXRlLCBNZXNzYWdlcy5zZXJ2ZXJFZGl0b3JPdmVydmlld1J1bnRpbWVFZGl0LCBTV1QuTk9ORSk7Ci0JCQlsaW5rLmFkZEh5cGVybGlua0xpc3RlbmVyKG5ldyBIeXBlcmxpbmtBZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGxpbmtBY3RpdmF0ZWQoSHlwZXJsaW5rRXZlbnQgZSkgewotCQkJCQllZGl0UnVudGltZShydW50aW1lKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCWxpbmsuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQpKTsKLQkJCQotCQkJLy8gYWRkIHJ1bnRpbWUgbGlzdGVuZXIKLQkJCXJ1bnRpbWVMaXN0ZW5lciA9IG5ldyBJUnVudGltZUxpZmVjeWNsZUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bnRpbWVDaGFuZ2VkKGZpbmFsIElSdW50aW1lIHJ1bnRpbWUyKSB7Ci0JCQkJCS8vIG1heSBiZSBuYW1lIGNoYW5nZSBvZiBjdXJyZW50IHJ1bnRpbWUKLQkJCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCWlmIChydW50aW1lMi5lcXVhbHMoZ2V0U2VydmVyKCkuZ2V0UnVudGltZSgpKSkgewotCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJaWYgKHVwZGF0aW5nKQotCQkJCQkJCQkJCXJldHVybjsKLQkJCQkJCQkJCXVwZGF0aW5nID0gdHJ1ZTsKLQkJCQkJCQkJCWV4ZWN1dGUobmV3IFNldFNlcnZlclJ1bnRpbWVDb21tYW5kKGdldFNlcnZlcigpLCBydW50aW1lMikpOwotCQkJCQkJCQkJdXBkYXRpbmcgPSBmYWxzZTsKLQkJCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCQkJCQkvLyBpZ25vcmUKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQkKLQkJCQkJCQlpZiAocnVudGltZUNvbWJvICE9IG51bGwpIHsKLQkJCQkJCQkJdXBkYXRlUnVudGltZUNvbWJvKCk7Ci0JCQkJCQkJCQotCQkJCQkJCQlpbnQgc2l6ZTIgPSBydW50aW1lcy5sZW5ndGg7Ci0JCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTI7IGkrKykgewotCQkJCQkJCQkJaWYgKHJ1bnRpbWVzW2ldLmVxdWFscyhydW50aW1lKSkKLQkJCQkJCQkJCQlydW50aW1lQ29tYm8uc2VsZWN0KGkpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9KTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCBydW50aW1lQWRkZWQoZmluYWwgSVJ1bnRpbWUgcnVudGltZTIpIHsKLQkJCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCWlmIChydW50aW1lQ29tYm8gIT0gbnVsbCkgewotCQkJCQkJCQl1cGRhdGVSdW50aW1lQ29tYm8oKTsKLQkJCQkJCQkJCi0JCQkJCQkJCWludCBzaXplMiA9IHJ1bnRpbWVzLmxlbmd0aDsKLQkJCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplMjsgaSsrKSB7Ci0JCQkJCQkJCQlpZiAocnVudGltZXNbaV0uZXF1YWxzKHJ1bnRpbWUpKQotCQkJCQkJCQkJCXJ1bnRpbWVDb21iby5zZWxlY3QoaSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIHJ1bnRpbWVSZW1vdmVkKElSdW50aW1lIHJ1bnRpbWUyKSB7Ci0JCQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQlpZiAocnVudGltZUNvbWJvICE9IG51bGwpIHsKLQkJCQkJCQkJdXBkYXRlUnVudGltZUNvbWJvKCk7Ci0JCQkJCQkJCQotCQkJCQkJCQlpbnQgc2l6ZTIgPSBydW50aW1lcy5sZW5ndGg7Ci0JCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTI7IGkrKykgewotCQkJCQkJCQkJaWYgKHJ1bnRpbWVzW2ldLmVxdWFscyhydW50aW1lKSkKLQkJCQkJCQkJCQlydW50aW1lQ29tYm8uc2VsZWN0KGkpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9KTsKLQkJCQl9Ci0JCQl9OwotCQkJCi0JCQlTZXJ2ZXJDb3JlLmFkZFJ1bnRpbWVMaWZlY3ljbGVMaXN0ZW5lcihydW50aW1lTGlzdGVuZXIpOwotCQl9Ci0JCQotCQkvLyBzZXJ2ZXIgY29uZmlndXJhdGlvbiBwYXRoCi0JCWlmIChzZXJ2ZXIgIT0gbnVsbCAmJiBzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpLmhhc1NlcnZlckNvbmZpZ3VyYXRpb24oKSkgewotCQkJY3JlYXRlTGFiZWwodG9vbGtpdCwgY29tcG9zaXRlLCBNZXNzYWdlcy5zZXJ2ZXJFZGl0b3JPdmVydmlld1NlcnZlckNvbmZpZ3VyYXRpb25QYXRoKTsKLQkJCQotCQkJSUZvbGRlciBmb2xkZXIgPSBzZXJ2ZXIuZ2V0U2VydmVyQ29uZmlndXJhdGlvbigpOwotCQkJaWYgKGZvbGRlciA9PSBudWxsKQotCQkJCXNlcnZlckNvbmZpZ3VyYXRpb25OYW1lID0gdG9vbGtpdC5jcmVhdGVUZXh0KGNvbXBvc2l0ZSwgTWVzc2FnZXMuZWxlbWVudFVua25vd25OYW1lKTsKLQkJCWVsc2UKLQkJCQlzZXJ2ZXJDb25maWd1cmF0aW9uTmFtZSA9IHRvb2xraXQuY3JlYXRlVGV4dChjb21wb3NpdGUsICIiICsgc2VydmVyLmdldFNlcnZlckNvbmZpZ3VyYXRpb24oKS5nZXRGdWxsUGF0aCgpKTsKLQkJCWNvbG9yRGVmYXVsdCA9IHNlcnZlckNvbmZpZ3VyYXRpb25OYW1lLmdldEZvcmVncm91bmQoKTsKLQkJCWNvbG9yUmVkID0gc2VydmVyQ29uZmlndXJhdGlvbk5hbWUuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9SRUQpOyAKLQkJCWlmIChmb2xkZXIgPT0gbnVsbCB8fCAhZm9sZGVyLmV4aXN0cygpKQotCQkJCXNlcnZlckNvbmZpZ3VyYXRpb25OYW1lLnNldEZvcmVncm91bmQoY29sb3JSZWQpOwotCQkJLy9pZiAoIXNlcnZlci5nZXRTZXJ2ZXJDb25maWd1cmF0aW9uKCkuZ2V0RnVsbFBhdGgoKS50b0ZpbGUoKS5leGlzdHMoKSkKLQkJCQotCQkJc2VydmVyQ29uZmlndXJhdGlvbk5hbWUuc2V0RWRpdGFibGUoZmFsc2UpOwotCQkJc2VydmVyQ29uZmlndXJhdGlvbk5hbWUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCQkKLQkJCXdocy5zZXRIZWxwKHNlcnZlckNvbmZpZ3VyYXRpb25OYW1lLCBDb250ZXh0SWRzLkVESVRPUl9DT05GSUdVUkFUSU9OKTsKLQkJCQotCQkJZmluYWwgSUZvbGRlciBjdXJyZW50Rm9sZGVyID0gc2VydmVyLmdldFNlcnZlckNvbmZpZ3VyYXRpb24oKTsKLQkJCUJ1dHRvbiBicm93c2UgPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihjb21wb3NpdGUsIE1lc3NhZ2VzLnNlcnZlckVkaXRvck92ZXJ2aWV3U2VydmVyQ29uZmlndXJhdGlvbkJyb3dzZSwgU1dULlBVU0gpOwotCQkJYnJvd3NlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJQ29udGFpbmVyU2VsZWN0aW9uRGlhbG9nIGRpYWxvZyA9IG5ldyBDb250YWluZXJTZWxlY3Rpb25EaWFsb2coc2VydmVyQ29uZmlndXJhdGlvbk5hbWUuZ2V0U2hlbGwoKSwKLQkJCQkJCWN1cnJlbnRGb2xkZXIsIHRydWUsIE1lc3NhZ2VzLnNlcnZlckVkaXRvck92ZXJ2aWV3U2VydmVyQ29uZmlndXJhdGlvbkJyb3dzZU1lc3NhZ2UpOwotCQkJCQlkaWFsb2cuc2hvd0Nsb3NlZFByb2plY3RzKGZhbHNlKTsKLQkJCQkJCi0JCQkJCWlmIChkaWFsb2cub3BlbigpICE9IFdpbmRvdy5DQU5DRUwpIHsKLQkJCQkJCU9iamVjdFtdIHJlc3VsdCA9IGRpYWxvZy5nZXRSZXN1bHQoKTsKLQkJCQkJCWlmIChyZXN1bHQgIT0gbnVsbCAmJiByZXN1bHQubGVuZ3RoID09IDEpIHsKLQkJCQkJCQlJUGF0aCBwYXRoID0gKElQYXRoKSByZXN1bHRbMF07Ci0JCQkJCQkJCi0JCQkJCQkJSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCQkJCQkJSVJlc291cmNlIHJlc291cmNlID0gcm9vdC5maW5kTWVtYmVyKHBhdGgpOwotCQkJCQkJCWlmIChyZXNvdXJjZSAhPSBudWxsICYmIHJlc291cmNlIGluc3RhbmNlb2YgSUZvbGRlcikgewotCQkJCQkJCQlJRm9sZGVyIGZvbGRlcjIgPSAoSUZvbGRlcikgcmVzb3VyY2U7Ci0JCQkJCQkJCi0JCQkJCQkJCWlmICh1cGRhdGluZykKLQkJCQkJCQkJCXJldHVybjsKLQkJCQkJCQkJdXBkYXRpbmcgPSB0cnVlOwotCQkJCQkJCQlleGVjdXRlKG5ldyBTZXRTZXJ2ZXJDb25maWd1cmF0aW9uRm9sZGVyQ29tbWFuZChnZXRTZXJ2ZXIoKSwgZm9sZGVyMikpOwotCQkJCQkJCQlzZXJ2ZXJDb25maWd1cmF0aW9uTmFtZS5zZXRUZXh0KGZvbGRlcjIuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKTsKLQkJCQkJCQkJdXBkYXRpbmcgPSBmYWxzZTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJCWJyb3dzZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORCkpOwotCQl9Ci0JCQotCQlpZiAoc2VydmVyICE9IG51bGwpIHsKLQkJCUlTZXJ2ZXJUeXBlIHNlcnZlclR5cGUgPSBzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpOwotCQkJaWYgKHNlcnZlclR5cGUuc3VwcG9ydHNMYXVuY2hNb2RlKElMYXVuY2hNYW5hZ2VyLlJVTl9NT0RFKSB8fCBzZXJ2ZXJUeXBlLnN1cHBvcnRzTGF1bmNoTW9kZShJTGF1bmNoTWFuYWdlci5ERUJVR19NT0RFKQotCQkJCQl8fCBzZXJ2ZXJUeXBlLnN1cHBvcnRzTGF1bmNoTW9kZShJTGF1bmNoTWFuYWdlci5QUk9GSUxFX01PREUpKSB7Ci0JCQkJSUxhdW5jaENvbmZpZ3VyYXRpb25UeXBlIGxhdW5jaFR5cGUgPSAoKFNlcnZlclR5cGUpIHNlcnZlclR5cGUpLmdldExhdW5jaENvbmZpZ3VyYXRpb25UeXBlKCk7Ci0JCQkJaWYgKGxhdW5jaFR5cGUgIT0gbnVsbCAmJiBsYXVuY2hUeXBlLmlzUHVibGljKCkpIHsKLQkJCQkJZmluYWwgSHlwZXJsaW5rIGxpbmsgPSB0b29sa2l0LmNyZWF0ZUh5cGVybGluayhjb21wb3NpdGUsIE1lc3NhZ2VzLnNlcnZlckVkaXRvck92ZXJ2aWV3T3BlbkxhdW5jaENvbmZpZ3VyYXRpb24sIFNXVC5OT05FKTsKLQkJCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQkJCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJCQkJbGluay5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkJCQlsaW5rLmFkZEh5cGVybGlua0xpc3RlbmVyKG5ldyBIeXBlcmxpbmtBZGFwdGVyKCkgewotCQkJCQkJcHVibGljIHZvaWQgbGlua0FjdGl2YXRlZChIeXBlcmxpbmtFdmVudCBlKSB7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJSUxhdW5jaENvbmZpZ3VyYXRpb24gbGF1bmNoQ29uZmlnID0gKChTZXJ2ZXIpIGdldFNlcnZlcigpKS5nZXRMYXVuY2hDb25maWd1cmF0aW9uKHRydWUsIG51bGwpOwotCQkJCQkJCQkvLyBUT0RPOiB1c2UgY29ycmVjdCBsYXVuY2ggZ3JvdXAKLQkJCQkJCQkJRGVidWdVSVRvb2xzLm9wZW5MYXVuY2hDb25maWd1cmF0aW9uUHJvcGVydGllc0RpYWxvZyhsaW5rLmdldFNoZWxsKCksIGxhdW5jaENvbmZpZywgIm9yZy5lY2xpcHNlLmRlYnVnLnVpLmxhdW5jaEdyb3VwLnJ1biIpOwotCQkJCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IGNyZWF0ZSBsYXVuY2ggY29uZmlndXJhdGlvbiIsIGNlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF1dG9QdWJsaXNoU2VjdGlvbihDb21wb3NpdGUgcmlnaHRDb2x1bW5Db21wLCBGb3JtVG9vbGtpdCB0b29sa2l0KSB7Ci0JCVNlY3Rpb24gc2VjdGlvbiA9IHRvb2xraXQuY3JlYXRlU2VjdGlvbihyaWdodENvbHVtbkNvbXAsIEV4cGFuZGFibGVDb21wb3NpdGUuVFdJU1RJRSB8IEV4cGFuZGFibGVDb21wb3NpdGUuVElUTEVfQkFSIHwgU2VjdGlvbi5ERVNDUklQVElPTiB8IEV4cGFuZGFibGVDb21wb3NpdGUuRk9DVVNfVElUTEUpOwotCQlzZWN0aW9uLnNldFRleHQoTWVzc2FnZXMuc2VydmVyRWRpdG9yT3ZlcnZpZXdBdXRvUHVibGlzaFNlY3Rpb24pOwotCQlzZWN0aW9uLnNldERlc2NyaXB0aW9uKE1lc3NhZ2VzLnNlcnZlckVkaXRvck92ZXJ2aWV3QXV0b1B1Ymxpc2hEZXNjcmlwdGlvbik7Ci0JCXNlY3Rpb24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCkpOwotCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShzZWN0aW9uKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSA1OwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAxMDsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDU7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IDE1OwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKSk7Ci0JCUlXb3JrYmVuY2hIZWxwU3lzdGVtIHdocyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpOwotCQl3aHMuc2V0SGVscChjb21wb3NpdGUsIENvbnRleHRJZHMuRURJVE9SX09WRVJWSUVXX1BBR0UpOwotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0Zvcihjb21wb3NpdGUpOwotCQlzZWN0aW9uLnNldENsaWVudChjb21wb3NpdGUpOwotCQkKLQkJLy8JIGF1dG8tcHVibGlzaAotCQlpZiAoc2VydmVyICE9IG51bGwpIHsKLQkJCWZpbmFsIFNlcnZlciBzdnIgPSAoU2VydmVyKSBzZXJ2ZXI7Ci0JCQlpbnQgcHVibGlzaFNldHRpbmcgPSBzdnIuZ2V0QXV0b1B1Ymxpc2hTZXR0aW5nKCk7Ci0JCQlhdXRvUHVibGlzaERlZmF1bHQgPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihjb21wb3NpdGUsIE1lc3NhZ2VzLnNlcnZlckVkaXRvck92ZXJ2aWV3QXV0b1B1Ymxpc2hEZWZhdWx0LCBTV1QuUkFESU8pOwotCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJYXV0b1B1Ymxpc2hEZWZhdWx0LnNldExheW91dERhdGEoZGF0YSk7Ci0JCQlhdXRvUHVibGlzaERlZmF1bHQuc2V0U2VsZWN0aW9uKHB1Ymxpc2hTZXR0aW5nID09IFNlcnZlci5BVVRPX1BVQkxJU0hfREVGQVVMVCk7Ci0JCQl3aHMuc2V0SGVscChhdXRvUHVibGlzaERlZmF1bHQsIENvbnRleHRJZHMuRURJVE9SX0FVVE9QVUJMSVNIX0RFRkFVTFQpOwotCQkJCi0JCQlIeXBlcmxpbmsgZWRpdERlZmF1bHRzID0gdG9vbGtpdC5jcmVhdGVIeXBlcmxpbmsoY29tcG9zaXRlLCBNZXNzYWdlcy5zZXJ2ZXJFZGl0b3JPdmVydmlld0F1dG9QdWJsaXNoRGVmYXVsdEVkaXQsIFNXVC5OT05FKTsKLQkJCWVkaXREZWZhdWx0cy5hZGRIeXBlcmxpbmtMaXN0ZW5lcihuZXcgSHlwZXJsaW5rQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBsaW5rQWN0aXZhdGVkKEh5cGVybGlua0V2ZW50IGUpIHsKLQkJCQkJc2hvd1ByZWZlcmVuY2VQYWdlKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCQllZGl0RGVmYXVsdHMuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQpKTsKLQkJCXdocy5zZXRIZWxwKGVkaXREZWZhdWx0cywgQ29udGV4dElkcy5FRElUT1JfQVVUT1BVQkxJU0hfREVGQVVMVCk7Ci0JCQkKLQkJCWF1dG9QdWJsaXNoRGlzYWJsZSA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKGNvbXBvc2l0ZSwgTWVzc2FnZXMuc2VydmVyRWRpdG9yT3ZlcnZpZXdBdXRvUHVibGlzaERpc2FibGUsIFNXVC5SQURJTyk7Ci0JCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJCWF1dG9QdWJsaXNoRGlzYWJsZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkJYXV0b1B1Ymxpc2hEaXNhYmxlLnNldFNlbGVjdGlvbihwdWJsaXNoU2V0dGluZyA9PSBTZXJ2ZXIuQVVUT19QVUJMSVNIX0RJU0FCTEUpOwotCQkJd2hzLnNldEhlbHAoYXV0b1B1Ymxpc2hEaXNhYmxlLCBDb250ZXh0SWRzLkVESVRPUl9BVVRPUFVCTElTSF9ESVNBQkxFKTsKLQkJCQotCQkJYXV0b1B1Ymxpc2hPdmVycmlkZSA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKGNvbXBvc2l0ZSwgTWVzc2FnZXMuc2VydmVyRWRpdG9yT3ZlcnZpZXdBdXRvUHVibGlzaE92ZXJyaWRlLCBTV1QuUkFESU8pOwotCQkJYXV0b1B1Ymxpc2hPdmVycmlkZS5zZXRTZWxlY3Rpb24ocHVibGlzaFNldHRpbmcgPT0gU2VydmVyLkFVVE9fUFVCTElTSF9PVkVSUklERSk7Ci0JCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJCWF1dG9QdWJsaXNoT3ZlcnJpZGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCXdocy5zZXRIZWxwKGF1dG9QdWJsaXNoT3ZlcnJpZGUsIENvbnRleHRJZHMuRURJVE9SX0FVVE9QVUJMSVNIX09WRVJSSURFKTsKLQkJCQotCQkJZmluYWwgTGFiZWwgYXV0b1B1Ymxpc2hUaW1lTGFiZWwgPSB0b29sa2l0LmNyZWF0ZUxhYmVsKGNvbXBvc2l0ZSwgTWVzc2FnZXMuc2VydmVyRWRpdG9yT3ZlcnZpZXdBdXRvUHVibGlzaE92ZXJyaWRlSW50ZXJ2YWwpOwotCQkJZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMjA7Ci0JCQlhdXRvUHVibGlzaFRpbWVMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkJYXV0b1B1Ymxpc2hUaW1lTGFiZWwuc2V0RW5hYmxlZChhdXRvUHVibGlzaE92ZXJyaWRlLmdldFNlbGVjdGlvbigpKTsKLQkJCQotCQkJYXV0b1B1Ymxpc2hUaW1lID0gbmV3IFNwaW5uZXIoY29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJCWF1dG9QdWJsaXNoVGltZS5zZXRNaW5pbXVtKDApOwotCQkJYXV0b1B1Ymxpc2hUaW1lLnNldE1heGltdW0oMTIwKTsKLQkJCWF1dG9QdWJsaXNoVGltZS5zZXRTZWxlY3Rpb24oc3ZyLmdldEF1dG9QdWJsaXNoVGltZSgpKTsKLQkJCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcpOwotCQkJZGF0YS53aWR0aEhpbnQgPSA2MDsKLQkJCWF1dG9QdWJsaXNoVGltZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkJYXV0b1B1Ymxpc2hUaW1lLnNldEVuYWJsZWQoYXV0b1B1Ymxpc2hPdmVycmlkZS5nZXRTZWxlY3Rpb24oKSk7Ci0JCQl3aHMuc2V0SGVscChhdXRvUHVibGlzaFRpbWUsIENvbnRleHRJZHMuRURJVE9SX0FVVE9QVUJMSVNIX09WRVJSSURFKTsKLQkJCQotCQkJYXV0b1B1Ymxpc2hPdmVycmlkZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCWlmICh1cGRhdGluZyB8fCAhYXV0b1B1Ymxpc2hPdmVycmlkZS5nZXRTZWxlY3Rpb24oKSkKLQkJCQkJCXJldHVybjsKLQkJCQkJdXBkYXRpbmcgPSB0cnVlOwotCQkJCQlleGVjdXRlKG5ldyBTZXRTZXJ2ZXJBdXRvUHVibGlzaERlZmF1bHRDb21tYW5kKGdldFNlcnZlcigpLCBTZXJ2ZXIuQVVUT19QVUJMSVNIX09WRVJSSURFKSk7Ci0JCQkJCXVwZGF0aW5nID0gZmFsc2U7Ci0JCQkJCWF1dG9QdWJsaXNoVGltZUxhYmVsLnNldEVuYWJsZWQoYXV0b1B1Ymxpc2hPdmVycmlkZS5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJCWF1dG9QdWJsaXNoVGltZS5zZXRFbmFibGVkKGF1dG9QdWJsaXNoT3ZlcnJpZGUuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCQl2YWxpZGF0ZSgpOwotCQkJCX0KLQkJCX0pOwotCQkJCi0JCQlhdXRvUHVibGlzaERlZmF1bHQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlpZiAodXBkYXRpbmcgfHwgIWF1dG9QdWJsaXNoRGVmYXVsdC5nZXRTZWxlY3Rpb24oKSkKLQkJCQkJCXJldHVybjsKLQkJCQkJdXBkYXRpbmcgPSB0cnVlOwotCQkJCQlleGVjdXRlKG5ldyBTZXRTZXJ2ZXJBdXRvUHVibGlzaERlZmF1bHRDb21tYW5kKGdldFNlcnZlcigpLCBTZXJ2ZXIuQVVUT19QVUJMSVNIX0RFRkFVTFQpKTsKLQkJCQkJdXBkYXRpbmcgPSBmYWxzZTsKLQkJCQkJYXV0b1B1Ymxpc2hUaW1lTGFiZWwuc2V0RW5hYmxlZChhdXRvUHVibGlzaE92ZXJyaWRlLmdldFNlbGVjdGlvbigpKTsKLQkJCQkJYXV0b1B1Ymxpc2hUaW1lLnNldEVuYWJsZWQoYXV0b1B1Ymxpc2hPdmVycmlkZS5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJCXZhbGlkYXRlKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCQkKLQkJCWF1dG9QdWJsaXNoRGlzYWJsZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCWlmICh1cGRhdGluZyB8fCAhYXV0b1B1Ymxpc2hEaXNhYmxlLmdldFNlbGVjdGlvbigpKQotCQkJCQkJcmV0dXJuOwotCQkJCQl1cGRhdGluZyA9IHRydWU7Ci0JCQkJCWV4ZWN1dGUobmV3IFNldFNlcnZlckF1dG9QdWJsaXNoRGVmYXVsdENvbW1hbmQoZ2V0U2VydmVyKCksIFNlcnZlci5BVVRPX1BVQkxJU0hfRElTQUJMRSkpOwotCQkJCQl1cGRhdGluZyA9IGZhbHNlOwotCQkJCQlhdXRvUHVibGlzaFRpbWVMYWJlbC5zZXRFbmFibGVkKGF1dG9QdWJsaXNoT3ZlcnJpZGUuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCQlhdXRvUHVibGlzaFRpbWUuc2V0RW5hYmxlZChhdXRvUHVibGlzaE92ZXJyaWRlLmdldFNlbGVjdGlvbigpKTsKLQkJCQkJdmFsaWRhdGUoKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCQotCQkJYXV0b1B1Ymxpc2hUaW1lLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQkJaWYgKHVwZGF0aW5nKQotCQkJCQkJcmV0dXJuOwotCQkJCQl1cGRhdGluZyA9IHRydWU7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlleGVjdXRlKG5ldyBTZXRTZXJ2ZXJBdXRvUHVibGlzaFRpbWVDb21tYW5kKGdldFNlcnZlcigpLCBhdXRvUHVibGlzaFRpbWUuZ2V0U2VsZWN0aW9uKCkpKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCQkvLyBpZ25vcmUKLQkJCQkJfQotCQkJCQl1cGRhdGluZyA9IGZhbHNlOwotCQkJCQl2YWxpZGF0ZSgpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZWRpdFJ1bnRpbWUoSVJ1bnRpbWUgcnVudGltZSkgewotCQlJUnVudGltZVdvcmtpbmdDb3B5IHJ1bnRpbWVXb3JraW5nQ29weSA9IHJ1bnRpbWUuY3JlYXRlV29ya2luZ0NvcHkoKTsKLQkJaWYgKHNob3dXaXphcmQocnVudGltZVdvcmtpbmdDb3B5KSAhPSBXaW5kb3cuQ0FOQ0VMKSB7Ci0JCQl0cnkgewotCQkJCXJ1bnRpbWVXb3JraW5nQ29weS5zYXZlKGZhbHNlLCBudWxsKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCS8vIGlnbm9yZQotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvd1ByZWZlcmVuY2VQYWdlKCkgewotCQlTdHJpbmcgaWQgPSAib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5wcmVmZXJlbmNlUGFnZSI7Ci0JCWZpbmFsIFByZWZlcmVuY2VEaWFsb2cgZGlhbG9nID0gUHJlZmVyZW5jZXNVdGlsLmNyZWF0ZVByZWZlcmVuY2VEaWFsb2dPbihnZXRTaXRlKCkuZ2V0U2hlbGwoKSwgaWQsIG5ldyBTdHJpbmdbXSB7IGlkIH0sIG51bGwpOwotCQlyZXR1cm4gKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgaW50IHNob3dXaXphcmQoZmluYWwgSVJ1bnRpbWVXb3JraW5nQ29weSBydW50aW1lV29ya2luZ0NvcHkpIHsKLQkJU3RyaW5nIHRpdGxlID0gTWVzc2FnZXMud2l6RWRpdFJ1bnRpbWVXaXphcmRUaXRsZTsKLQkJZmluYWwgV2l6YXJkRnJhZ21lbnQgZnJhZ21lbnQyID0gU2VydmVyVUlQbHVnaW4uZ2V0V2l6YXJkRnJhZ21lbnQocnVudGltZVdvcmtpbmdDb3B5LmdldFJ1bnRpbWVUeXBlKCkuZ2V0SWQoKSk7Ci0JCWlmIChmcmFnbWVudDIgPT0gbnVsbCkKLQkJCXJldHVybiBXaW5kb3cuQ0FOQ0VMOwotCQkKLQkJVGFza01vZGVsIHRhc2tNb2RlbCA9IG5ldyBUYXNrTW9kZWwoKTsKLQkJdGFza01vZGVsLnB1dE9iamVjdChUYXNrTW9kZWwuVEFTS19SVU5USU1FLCBydW50aW1lV29ya2luZ0NvcHkpOwotCi0JCVdpemFyZEZyYWdtZW50IGZyYWdtZW50ID0gbmV3IFdpemFyZEZyYWdtZW50KCkgewotCQkJcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ2hpbGRGcmFnbWVudHMoTGlzdCBsaXN0KSB7Ci0JCQkJbGlzdC5hZGQoZnJhZ21lbnQyKTsKLQkJCQlsaXN0LmFkZChuZXcgV2l6YXJkRnJhZ21lbnQoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHBlcmZvcm1GaW5pc2goSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkJCQlXaXphcmRUYXNrVXRpbC5zYXZlUnVudGltZShnZXRUYXNrTW9kZWwoKSwgbW9uaXRvcik7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQkJfTsKLQkJCi0JCVRhc2tXaXphcmQgd2l6YXJkID0gbmV3IFRhc2tXaXphcmQodGl0bGUsIGZyYWdtZW50LCB0YXNrTW9kZWwpOwotCQl3aXphcmQuc2V0Rm9yY2VQcmV2aW91c0FuZE5leHRCdXR0b25zKHRydWUpOwotCQlDbG9zYWJsZVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgQ2xvc2FibGVXaXphcmREaWFsb2coZ2V0RWRpdG9yU2l0ZSgpLmdldFNoZWxsKCksIHdpemFyZCk7Ci0JCXJldHVybiBkaWFsb2cub3BlbigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVJ1bnRpbWVDb21ibygpIHsKLQkJSVJ1bnRpbWVUeXBlIHJ1bnRpbWVUeXBlID0gc2VydmVyLmdldFNlcnZlclR5cGUoKS5nZXRSdW50aW1lVHlwZSgpOwotCQlydW50aW1lcyA9IFNlcnZlclVJUGx1Z2luLmdldFJ1bnRpbWVzKHJ1bnRpbWVUeXBlKTsKLQkJCi0JCWlmIChTb2NrZXRVdGlsLmlzTG9jYWxob3N0KHNlcnZlci5nZXRIb3N0KCkpICYmIHJ1bnRpbWVzICE9IG51bGwpIHsKLQkJCUxpc3QgcnVudGltZXMyID0gbmV3IEFycmF5TGlzdCgpOwotCQkJaW50IHNpemUgPSBydW50aW1lcy5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCUlSdW50aW1lIHJ1bnRpbWUyID0gcnVudGltZXNbaV07Ci0JCQkJaWYgKCFydW50aW1lMi5pc1N0dWIoKSkKLQkJCQkJcnVudGltZXMyLmFkZChydW50aW1lMik7Ci0JCQl9Ci0JCQlydW50aW1lcyA9IG5ldyBJUnVudGltZVtydW50aW1lczIuc2l6ZSgpXTsKLQkJCXJ1bnRpbWVzMi50b0FycmF5KHJ1bnRpbWVzKTsKLQkJfQotCQkKLQkJaW50IHNpemUgPSBydW50aW1lcy5sZW5ndGg7Ci0JCVN0cmluZ1tdIGl0ZW1zID0gbmV3IFN0cmluZ1tzaXplXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCi0JCQlpdGVtc1tpXSA9IHJ1bnRpbWVzW2ldLmdldE5hbWUoKTsKLQkJCi0JCXJ1bnRpbWVDb21iby5zZXRJdGVtcyhpdGVtcyk7Ci0JfQotCi0JcHJvdGVjdGVkIExhYmVsIGNyZWF0ZUxhYmVsKEZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KSB7Ci0JCUxhYmVsIGxhYmVsID0gdG9vbGtpdC5jcmVhdGVMYWJlbChwYXJlbnQsIHRleHQpOwotCQlsYWJlbC5zZXRGb3JlZ3JvdW5kKHRvb2xraXQuZ2V0Q29sb3JzKCkuZ2V0Q29sb3IoRm9ybUNvbG9ycy5USVRMRSkpOwotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCQkKLQkJaWYgKHNlcnZlciAhPSBudWxsKQotCQkJc2VydmVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQkKLQkJaWYgKHJ1bnRpbWVMaXN0ZW5lciAhPSBudWxsKQotCQkJU2VydmVyQ29yZS5yZW1vdmVSdW50aW1lTGlmZWN5Y2xlTGlzdGVuZXIocnVudGltZUxpc3RlbmVyKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogSW5pdGlhbGl6ZXMgdGhlIGVkaXRvciBwYXJ0IHdpdGggYSBzaXRlIGFuZCBpbnB1dC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJCi0JCWFkZENoYW5nZUxpc3RlbmVyKCk7Ci0JCWluaXRpYWxpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplIHRoZSBmaWVsZHMgaW4gdGhpcyBlZGl0b3IuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJaWYgKHNlcnZlck5hbWUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJdXBkYXRpbmcgPSB0cnVlOwotCQkKLQkJaWYgKHNlcnZlciAhPSBudWxsKSB7Ci0JCQlzZXJ2ZXJOYW1lLnNldFRleHQoc2VydmVyLmdldE5hbWUoKSk7Ci0JCQlpZiAocmVhZE9ubHkpCi0JCQkJc2VydmVyTmFtZS5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JCQllbHNlCi0JCQkJc2VydmVyTmFtZS5zZXRFZGl0YWJsZSh0cnVlKTsKLQkJfQotCQkKLQkJdXBkYXRpbmcgPSBmYWxzZTsKLQkJdmFsaWRhdGUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZSgpIHsKLQkJaWYgKHNlcnZlciAhPSBudWxsICYmIHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkuaGFzU2VydmVyQ29uZmlndXJhdGlvbigpKSB7Ci0JCQlJRm9sZGVyIGZvbGRlciA9IGdldFNlcnZlcigpLmdldFNlcnZlckNvbmZpZ3VyYXRpb24oKTsKLQkJCWlmIChmb2xkZXIgPT0gbnVsbCB8fCAhZm9sZGVyLmV4aXN0cygpKSB7Ci0JCQkJc2V0RXJyb3JNZXNzYWdlKE1lc3NhZ2VzLmVycm9yTWlzc2luZ0NvbmZpZ3VyYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKGF1dG9QdWJsaXNoVGltZS5pc0VuYWJsZWQoKSAmJiBhdXRvUHVibGlzaE92ZXJyaWRlLmdldFNlbGVjdGlvbigpKSB7Ci0JCQlpbnQgaSA9IGF1dG9QdWJsaXNoVGltZS5nZXRTZWxlY3Rpb24oKTsKLQkJCWlmIChpIDwgMSkgewotCQkJCXNldEVycm9yTWVzc2FnZShOTFMuYmluZChNZXNzYWdlcy5zZXJ2ZXJFZGl0b3JPdmVydmlld0F1dG9QdWJsaXNoSW52YWxpZCwgIjEiKSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCQotCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElXb3JrYmVuY2hQYXJ0I3NldEZvY3VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLQkJaWYgKHNlcnZlck5hbWUgIT0gbnVsbCkKLQkJCXNlcnZlck5hbWUuc2V0Rm9jdXMoKTsKLQkJZWxzZSBpZiAoc2VydmVyQ29uZmlndXJhdGlvbk5hbWUgIT0gbnVsbCkKLQkJCXNlcnZlckNvbmZpZ3VyYXRpb25OYW1lLnNldEZvY3VzKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2VkaXRvci9TZXJ2ZXJFZGl0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2VkaXRvci9TZXJ2ZXJFZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJhOGUxMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9lZGl0b3IvU2VydmVyRWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuSVVuZG9hYmxlT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuTXVsdGlQYWdlRWRpdG9yUGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5TZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlcldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuU2VydmVyVUlDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuZWRpdG9yLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC4qOwotLyoqCi0gKiBBIG11bHRpLXBhZ2Ugc2VydmVyIHJlc291cmNlIGVkaXRvci4KLSAqLwotcHVibGljIGNsYXNzIFNlcnZlckVkaXRvciBleHRlbmRzIE11bHRpUGFnZUVkaXRvclBhcnQgewotCS8qKgotCSAqIEludGVybmFsIHBhcnQgYW5kIHNoZWxsIGFjdGl2YXRpb24gbGlzdGVuZXIKLQkgKi8KLQljbGFzcyBBY3RpdmF0aW9uTGlzdGVuZXIgZXh0ZW5kcyBTaGVsbEFkYXB0ZXIgaW1wbGVtZW50cyBJUGFydExpc3RlbmVyIHsKLQkJcHJpdmF0ZSBJV29ya2JlbmNoUGFydCBmQWN0aXZlUGFydDsKLQkJcHJpdmF0ZSBib29sZWFuIGZJc0hhbmRsaW5nQWN0aXZhdGlvbiA9IGZhbHNlOwotCQkKLQkJcHVibGljIHZvaWQgcGFydEFjdGl2YXRlZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCQlmQWN0aXZlUGFydCA9IHBhcnQ7Ci0JCQloYW5kbGVBY3RpdmF0aW9uKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBwYXJ0QnJvdWdodFRvVG9wKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHBhcnRDbG9zZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcGFydERlYWN0aXZhdGVkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJCWZBY3RpdmVQYXJ0ID0gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHBhcnRPcGVuZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2hlbGxBY3RpdmF0ZWQoU2hlbGxFdmVudCBlKSB7Ci0JCQloYW5kbGVBY3RpdmF0aW9uKCk7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgaGFuZGxlQWN0aXZhdGlvbigpIHsKLQkJCWlmIChmSXNIYW5kbGluZ0FjdGl2YXRpb24pCi0JCQkJcmV0dXJuOwotCQkJCi0JCQlpZiAoZkFjdGl2ZVBhcnQgPT0gU2VydmVyRWRpdG9yLnRoaXMpIHsKLQkJCQlmSXNIYW5kbGluZ0FjdGl2YXRpb24gPSB0cnVlOwotCQkJCXRyeSB7Ci0JCQkJCWNoZWNrUmVzb3VyY2VTdGF0ZSgpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCWZJc0hhbmRsaW5nQWN0aXZhdGlvbj0gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCWNsYXNzIExpZmVjeWNsZUxpc3RlbmVyIGltcGxlbWVudHMgSVNlcnZlckxpZmVjeWNsZUxpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgc2VydmVyQWRkZWQoSVNlcnZlciBvbGRTZXJ2ZXIpIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXJ2ZXJDaGFuZ2VkKElTZXJ2ZXIgb2xkU2VydmVyKSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQkJcHVibGljIHZvaWQgc2VydmVyUmVtb3ZlZChJU2VydmVyIG9sZFNlcnZlcikgewotCQkJaWYgKG9sZFNlcnZlci5lcXVhbHMoc2VydmVyKSAmJiAhaXNEaXJ0eSgpKQotCQkJCWNsb3NlRWRpdG9yKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgSVNlcnZlcldvcmtpbmdDb3B5IHNlcnZlcjsKLQlwcm90ZWN0ZWQgU3RyaW5nIHNlcnZlcklkOwotCXByb3RlY3RlZCBTdHJpbmcgc2VydmVyTmFtZTsKLQotCXByb3RlY3RlZCBHbG9iYWxDb21tYW5kTWFuYWdlciBjb21tYW5kTWFuYWdlcjsKLQotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyOwotCi0JcHJvdGVjdGVkIElBY3Rpb24gdW5kb0FjdGlvbjsKLQlwcm90ZWN0ZWQgSUFjdGlvbiByZWRvQWN0aW9uOwotCQotCXByb3RlY3RlZCBUZXh0QWN0aW9uIGN1dEFjdGlvbjsKLQlwcm90ZWN0ZWQgVGV4dEFjdGlvbiBjb3B5QWN0aW9uOwotCXByb3RlY3RlZCBUZXh0QWN0aW9uIHBhc3RlQWN0aW9uOwotCXByb3RlY3RlZCBib29sZWFuIHVwZGF0aW5nQWN0aW9uczsKLQkKLQlwcm90ZWN0ZWQgSUFjdGlvbltdIGVkaXRvckFjdGlvbnM7Ci0KLQlwcm90ZWN0ZWQgamF2YS51dGlsLkxpc3Qgc2VydmVyUGFnZXM7Ci0JCi0JLy8gb24gZm9jdXMgY2hhbmdlIGZsYWcKLQlwcm90ZWN0ZWQgYm9vbGVhbiByZXNvdXJjZURlbGV0ZWQ7Ci0JCi0JLy8gaW5wdXQgZ2l2ZW4gdG8gdGhlIGNvbnRhaW5lZCBwYWdlcwotCXByb3RlY3RlZCBJU2VydmVyRWRpdG9yUGFydElucHV0IGVkaXRvclBhcnRJbnB1dDsKLQkKLQkvLyBzdGF0dXMgbGluZSBhbmQgc3RhdHVzCi0JcHJvdGVjdGVkIElTdGF0dXNMaW5lTWFuYWdlciBzdGF0dXM7Ci0JcHJvdGVjdGVkIFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtIHN0YXR1c0l0ZW07Ci0JCi0JcHJpdmF0ZSBBY3RpdmF0aW9uTGlzdGVuZXIgYWN0aXZhdGlvbkxpc3RlbmVyID0gbmV3IEFjdGl2YXRpb25MaXN0ZW5lcigpOwotCXByb3RlY3RlZCBMaWZlY3ljbGVMaXN0ZW5lciByZXNvdXJjZUxpc3RlbmVyOwotCQotCS8vIFVzZWQgZm9yIGRpc2FibGluZyByZXNvdXJjZSBjaGFuZ2UgY2hlY2sgd2hlbiBzYXZpbmcgdGhyb3VnaCBlZGl0b3IuCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNTYXZpbmcgPSBmYWxzZTsKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIE1hcCBwYWdlVG9GYWN0b3J5ID0gbmV3IEhhc2hNYXAoKTsKLQotCS8qKgotCSAqIFNlcnZlckVkaXRvciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBTZXJ2ZXJFZGl0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JCQotCQlJU2hhcmVkSW1hZ2VzIHNoYXJlZEltYWdlcyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0U2hhcmVkSW1hZ2VzKCk7Ci0JCQotCQl1bmRvQWN0aW9uID0gbmV3IEFjdGlvbigpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlnZXRDb21tYW5kTWFuYWdlcigpLnVuZG8oc2VydmVySWQpOwotCQkJfQotCQl9OwotCQl1bmRvQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQl1bmRvQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihzaGFyZWRJbWFnZXMuZ2V0SW1hZ2VEZXNjcmlwdG9yKElTaGFyZWRJbWFnZXMuSU1HX1RPT0xfVU5ETykpOwotCQkvL3VuZG9BY3Rpb24uc2V0SG92ZXJJbWFnZURlc2NyaXB0b3Ioc2hhcmVkSW1hZ2VzLmdldEltYWdlRGVzY3JpcHRvcihJU2hhcmVkSW1hZ2VzLklNR19UT09MX1VORE9fSE9WRVIpKTsKLQkJLy91bmRvQWN0aW9uLnNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKHNoYXJlZEltYWdlcy5nZXRJbWFnZURlc2NyaXB0b3IoSVNoYXJlZEltYWdlcy5JTUdfVE9PTF9VTkRPX0RJU0FCTEVEKSk7Ci0JCQotCQlyZWRvQWN0aW9uID0gbmV3IEFjdGlvbigpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlnZXRDb21tYW5kTWFuYWdlcigpLnJlZG8oc2VydmVySWQpOwotCQkJfQotCQl9OwotCQlyZWRvQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQlyZWRvQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihzaGFyZWRJbWFnZXMuZ2V0SW1hZ2VEZXNjcmlwdG9yKElTaGFyZWRJbWFnZXMuSU1HX1RPT0xfUkVETykpOwotCQkvL3JlZG9BY3Rpb24uc2V0SG92ZXJJbWFnZURlc2NyaXB0b3Ioc2hhcmVkSW1hZ2VzLmdldEltYWdlRGVzY3JpcHRvcihJU2hhcmVkSW1hZ2VzLklNR19UT09MX1JFRE9fSE9WRVIpKTsKLQkJLy9yZWRvQWN0aW9uLnNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKHNoYXJlZEltYWdlcy5nZXRJbWFnZURlc2NyaXB0b3IoSVNoYXJlZEltYWdlcy5JTUdfVE9PTF9SRURPX0RJU0FCTEVEKSk7Ci0JfQotCi0JLyoqCi0JICogQ2xvc2UgdGhlIGVkaXRvciBjb3JyZWN0bHkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY2xvc2VFZGl0b3IoKSB7Ci0JCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJZ2V0RWRpdG9yU2l0ZSgpLmdldFBhZ2UoKS5jbG9zZUVkaXRvcihTZXJ2ZXJFZGl0b3IudGhpcywgZmFsc2UpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBY3Rpb25zKCkgewotCQlMaXN0IGFjdGlvbkxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQotCQkvLyBhZGQgc2VydmVyIGFjdGlvbnMKLQkJaWYgKHNlcnZlciAhPSBudWxsICYmIHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkgIT0gbnVsbCkgewotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBTZXJ2ZXJFZGl0b3JDb3JlLmdldFNlcnZlckVkaXRvckFjdGlvbkZhY3RvcmllcygpLml0ZXJhdG9yKCk7Ci0JCQlTdHJpbmcgaWQgPSBzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpLmdldElkKCk7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJU2VydmVyRWRpdG9yQWN0aW9uRmFjdG9yeSBmYWN0b3J5ID0gKFNlcnZlckVkaXRvckFjdGlvbkZhY3RvcnkpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZiAoZmFjdG9yeS5zdXBwb3J0c1NlcnZlckVsZW1lbnRUeXBlKGlkKSAmJiBmYWN0b3J5LnNob3VsZERpc3BsYXkoc2VydmVyKSkKLQkJCQkJYWN0aW9uTGlzdC5hZGQoZmFjdG9yeS5jcmVhdGVBY3Rpb24oZ2V0RWRpdG9yU2l0ZSgpLCBlZGl0b3JQYXJ0SW5wdXQpKTsKLQkJCX0KLQkJfQotCi0JCWVkaXRvckFjdGlvbnMgPSBuZXcgSUFjdGlvblthY3Rpb25MaXN0LnNpemUoKV07Ci0JCWFjdGlvbkxpc3QudG9BcnJheShlZGl0b3JBY3Rpb25zKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElTZXJ2ZXJFZGl0b3JQYXJ0RmFjdG9yeSBnZXRQYWdlRmFjdG9yeShTZXJ2ZXJFZGl0b3JQYXJ0IHBhcnQpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiAoSVNlcnZlckVkaXRvclBhcnRGYWN0b3J5KSBwYWdlVG9GYWN0b3J5LmdldChwYXJ0KTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHBhZ2VzIG9mIHRoaXMgbXVsdGktcGFnZSBlZGl0b3IuCi0JICogPHA+Ci0JICogU3ViY2xhc3NlcyBvZiA8Y29kZT5NdWx0aVBhZ2VFZGl0b3I8L2NvZGU+IG11c3QgaW1wbGVtZW50IHRoaXMgbWV0aG9kLgotCSAqIDwvcD4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVQYWdlcygpIHsKLQkJdHJ5IHsKLQkJCWludCBpbmRleCA9IDA7Ci0JCQlzZXJ2ZXJQYWdlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQotCQkJLy8gYWRkIGVkaXRvciBwYWdlcwotCQkJaW50IHBhZ2VDb3VudCA9IDA7Ci0JCQkKLQkJCVN0cmluZyBzZXJ2ZXJUeXBlSWQgPSBudWxsOwotCQkJaWYgKHNlcnZlciAhPSBudWxsICYmIHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkgIT0gbnVsbCkKLQkJCQlzZXJ2ZXJUeXBlSWQgPSBzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpLmdldElkKCk7Ci0JCQkKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gU2VydmVyRWRpdG9yQ29yZS5nZXRTZXJ2ZXJFZGl0b3JQYWdlRmFjdG9yaWVzKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlJU2VydmVyRWRpdG9yUGFydEZhY3RvcnkgZmFjdG9yeSA9IChJU2VydmVyRWRpdG9yUGFydEZhY3RvcnkpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZiAoc2VydmVyVHlwZUlkICE9IG51bGwgJiYgZmFjdG9yeS5zdXBwb3J0c1R5cGUoc2VydmVyVHlwZUlkKSAmJiBmYWN0b3J5LnNob3VsZENyZWF0ZVBhZ2Uoc2VydmVyKSkgewotCQkJCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJBZGRpbmcgcGFnZTogIiArIGZhY3RvcnkuZ2V0SWQoKSArICIgIiArIGVkaXRvclBhcnRJbnB1dCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJRWRpdG9yUGFydCBwYWdlID0gZmFjdG9yeS5jcmVhdGVQYWdlKCk7Ci0JCQkJCQlpZiAocGFnZSAhPSBudWxsKSB7Ci0JCQkJCQkJcGFnZVRvRmFjdG9yeS5wdXQocGFnZSwgZmFjdG9yeSk7Ci0JCQkJCQkJaW5kZXggPSBhZGRQYWdlKHBhZ2UsIGVkaXRvclBhcnRJbnB1dCk7Ci0JCQkJCQkJc2V0UGFnZVRleHQoaW5kZXgsIGZhY3RvcnkuZ2V0TmFtZSgpKTsKLQkJCQkJCQkKLQkJCQkJCQlzZXJ2ZXJQYWdlcy5hZGQocGFnZSk7Ci0JCQkJCQotCQkJCQkJCXBhZ2VDb3VudCArKzsKLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBkaXNwbGF5IGVkaXRvciBwYWdlICIgKyBmYWN0b3J5LmdldElkKCksIGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlzZXRBY3RpdmVQYWdlKDApOwotCQkJCi0JCQkvLyByZWdpc3RlciBmb3IgZXZlbnRzIHRoYXQgbWlnaHQgY2hhbmdlIHRoZSBjdXQvY29weS9wYXN0ZSBhY3Rpb25zCi0JCQlpbnQgY291bnQgPSBnZXRQYWdlQ291bnQoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQkJCUNvbnRyb2wgY29udHJvbCA9IGdldENvbnRyb2woaSk7Ci0JCQkJcmVnaXN0ZXJFdmVudHMoY29udHJvbCk7Ci0JCQl9Ci0JCQl1cGRhdGVBY3Rpb25zKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBjcmVhdGluZyBzZXJ2ZXIgZWRpdG9yIHBhZ2VzIiwgZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoYWN0aXZhdGlvbkxpc3RlbmVyICE9IG51bGwpIHsKLQkJCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gZ2V0U2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpOwotCQkJd2luZG93LmdldFBhcnRTZXJ2aWNlKCkucmVtb3ZlUGFydExpc3RlbmVyKGFjdGl2YXRpb25MaXN0ZW5lcik7Ci0JCQlTaGVsbCBzaGVsbCA9IHdpbmRvdy5nZXRTaGVsbCgpOwotCQkJaWYgKHNoZWxsICE9IG51bGwgJiYgIXNoZWxsLmlzRGlzcG9zZWQoKSkKLQkJCQlzaGVsbC5yZW1vdmVTaGVsbExpc3RlbmVyKGFjdGl2YXRpb25MaXN0ZW5lcik7Ci0JCQlhY3RpdmF0aW9uTGlzdGVuZXIgPSBudWxsOwotCQl9Ci0JCQotCQlpZiAocmVzb3VyY2VMaXN0ZW5lciAhPSBudWxsKQotCQkJU2VydmVyQ29yZS5yZW1vdmVTZXJ2ZXJMaWZlY3ljbGVMaXN0ZW5lcihyZXNvdXJjZUxpc3RlbmVyKTsKLQkJCi0JCWlmIChzZXJ2ZXJOYW1lICE9IG51bGwgJiYgIXNlcnZlci5nZXROYW1lKCkuZXF1YWxzKHNlcnZlck5hbWUpKSB7Ci0JCQkvLyBvbmx5IHByb21wdCBpZiB0aGUgc2VydmVyIGlzIGluIHRoZSB3b3Jrc3BhY2Ugb3IgdGhlcmUgaXMgYSBjb25maWd1cmF0aW9uCi0JCQlpZiAoc2VydmVyLmdldFNlcnZlckNvbmZpZ3VyYXRpb24oKSAhPSBudWxsIHx8ICgoU2VydmVyKXNlcnZlcikuZ2V0RmlsZSgpICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgdGl0bGUgPSBNZXNzYWdlcy5lZGl0b3JTZXJ2ZXJFZGl0b3I7Ci0JCQkJU3RyaW5nIG1lc3NhZ2UgPSBNZXNzYWdlcy5lZGl0b3JSZW5hbWVGaWxlczsKLQkJCQlpZiAoTWVzc2FnZURpYWxvZy5vcGVuUXVlc3Rpb24oZ2V0RWRpdG9yU2l0ZSgpLmdldFNoZWxsKCksIHRpdGxlLCAgbWVzc2FnZSkpCi0JCQkJCXRyeSB7Ci0JCQkJCQkoKFNlcnZlcldvcmtpbmdDb3B5KXNlcnZlcikucmVuYW1lRmlsZXMobnVsbCk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciByZW5hbWluZyBzZXJ2ZXIiLCBlKTsKLQkJCQkJfQotCQkJfQotCQl9Ci0JCQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JCWlmIChjb21tYW5kTWFuYWdlciAhPSBudWxsKQotCQkJY29tbWFuZE1hbmFnZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQkJaWYgKHNlcnZlcklkICE9IG51bGwpCi0JCQljb21tYW5kTWFuYWdlci5yZWxlYXNlQ29tbWFuZE1hbmFnZXIoc2VydmVySWQpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBTYXZlcyB0aGUgY29udGVudHMgb2YgdGhpcyBlZGl0b3IuCi0JICogPHA+Ci0JICogU3ViY2xhc3NlcyBtdXN0IG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGltcGxlbWVudCB0aGUgb3Blbi1zYXZlLWNsb3NlIGxpZmVjeWNsZQotCSAqIGZvciBhbiBlZGl0b3IuICBGb3IgZ3JlYXRlciBkZXRhaWxzLCBzZWUgPGNvZGU+SUVkaXRvclBhcnQ8L2NvZGU+Ci0JICogPC9wPgotCSAqCi0JICogQHNlZSBJRWRpdG9yUGFydAotCSAqLwotCXB1YmxpYyB2b2lkIGRvU2F2ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJLy8gc2V0IHRoZSBpc1NhdmluZyBmbGFnIHRvIHRydWUKLQkJaXNTYXZpbmcgPSB0cnVlOwotCQkKLQkJLy8gY2hlY2sgcGFnZXMgZm9yIGVycm9ycyBmaXJzdAotCQlqYXZhLnV0aWwuTGlzdCBlcnJvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gc2VydmVyUGFnZXMuaXRlcmF0b3IoKTsKLQkJaW50IGNvdW50ID0gMDsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJSUVkaXRvclBhcnQgcGFydCA9IChJRWRpdG9yUGFydCkgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKHBhcnQgaW5zdGFuY2VvZiBTZXJ2ZXJFZGl0b3JQYXJ0KSB7Ci0JCQkJSVN0YXR1c1tdIHN0YXR1czIgPSAoKFNlcnZlckVkaXRvclBhcnQpIHBhcnQpLmdldFNhdmVTdGF0dXMoKTsKLQkJCQlpZiAoc3RhdHVzMiAhPSBudWxsKSB7Ci0JCQkJCWludCBzaXplID0gc3RhdHVzMi5sZW5ndGg7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotCQkJCQkJZXJyb3JzLmFkZCgiWyIgKyBnZXRQYWdlVGV4dChjb3VudCkgKyAiXSAiICsgc3RhdHVzMltpXS5nZXRNZXNzYWdlKCkpOwotCQkJCX0KLQkJCX0KLQkJCWNvdW50ICsrOwotCQl9Ci0JCWlmICghZXJyb3JzLmlzRW1wdHkoKSkgewotCQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJc2IuYXBwZW5kKE1lc3NhZ2VzLmVycm9yRWRpdG9yQ2FudFNhdmUgKyAiXG4iKTsKLQkJCWl0ZXJhdG9yID0gZXJyb3JzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotCQkJCXNiLmFwcGVuZCgiXHQiICsgKChTdHJpbmcpIGl0ZXJhdG9yLm5leHQoKSkgKyAiXG4iKTsKLQotCQkJRWNsaXBzZVV0aWwub3BlbkVycm9yKGdldEVkaXRvclNpdGUoKS5nZXRTaGVsbCgpLCBzYi50b1N0cmluZygpKTsKLQkJCW1vbml0b3Iuc2V0Q2FuY2VsZWQodHJ1ZSk7Ci0JCQkvLyByZXNldCB0aGUgaXNTYXZpbmcgZmxhZwotCQkJaXNTYXZpbmcgPSBmYWxzZTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJdHJ5IHsKLQkJCW1vbml0b3IgPSBQcm9ncmVzc1V0aWwuZ2V0TW9uaXRvckZvcihtb25pdG9yKTsKLQkJCWludCB0aWNrcyA9IDIwMDA7Ci0JCQlTdHJpbmcgbmFtZSA9ICIiOwotCQkJaWYgKHNlcnZlciAhPSBudWxsKQotCQkJCW5hbWUgPSBzZXJ2ZXIuZ2V0TmFtZSgpOwotCQkJbW9uaXRvci5iZWdpblRhc2soTkxTLmJpbmQoTWVzc2FnZXMuc2F2aW5nVGFzaywgbmFtZSksIHRpY2tzKTsKLQkJCWlmIChzZXJ2ZXIgIT0gbnVsbCkKLQkJCQl0aWNrcyAvPSAyOwotCQkJCi0JCQlpZiAoc2VydmVyICE9IG51bGwpICB7Ci0JCQkJc2VydmVyLnNhdmUoZmFsc2UsIFByb2dyZXNzVXRpbC5nZXRTdWJNb25pdG9yRm9yKG1vbml0b3IsIHRpY2tzKSk7Ci0JCQkJZ2V0Q29tbWFuZE1hbmFnZXIoKS5yZXNvdXJjZVNhdmVkKHNlcnZlcklkKTsKLQkJCQljb21tYW5kTWFuYWdlci51cGRhdGVUaW1lc3RhbXBzKHNlcnZlcklkKTsKLQkJCX0KLQkJCQotCQkJSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IFNlcnZlclVJQ29yZS5nZXRMYWJlbFByb3ZpZGVyKCk7Ci0JCQlpZiAoc2VydmVyICE9IG51bGwpCi0JCQkJc2V0UGFydE5hbWUobGFiZWxQcm92aWRlci5nZXRUZXh0KHNlcnZlcikpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3Igc2F2aW5nIHNlcnZlciBlZGl0b3IiLCBlKTsKLQkJCQotCQkJbW9uaXRvci5zZXRDYW5jZWxlZCh0cnVlKTsKLQkJCQotCQkJU3RyaW5nIHRpdGxlID0gTWVzc2FnZXMuZWRpdG9yU2F2ZUVycm9yRGlhbG9nOwotCQkJU3RyaW5nIG1lc3NhZ2UgPSBOTFMuYmluZChNZXNzYWdlcy5lZGl0b3JTYXZlRXJyb3JNZXNzYWdlLCBlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JCQlNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihnZXRFZGl0b3JTaXRlKCkuZ2V0U2hlbGwoKSwgdGl0bGUsICBtZXNzYWdlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCW1vbml0b3IuZG9uZSgpOwotCQl9Ci0JCS8vIHJlc2V0IHRoZSBpc1NhdmluZyBmbGFnCi0JCWlzU2F2aW5nID0gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIFNhdmVzIHRoZSBjb250ZW50cyBvZiB0aGlzIGVkaXRvciB0byBhbm90aGVyIG9iamVjdC4KLQkgKiA8cD4KLQkgKiBTdWJjbGFzc2VzIG11c3Qgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gaW1wbGVtZW50IHRoZSBvcGVuLXNhdmUtY2xvc2UgbGlmZWN5Y2xlCi0JICogZm9yIGFuIGVkaXRvci4gIEZvciBncmVhdGVyIGRldGFpbHMsIHNlZSA8Y29kZT5JRWRpdG9yUGFydDwvY29kZT4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAc2VlIElFZGl0b3JQYXJ0Ci0JICovCi0JcHVibGljIHZvaWQgZG9TYXZlQXMoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBGaXJlIGEgcHJvcGVydHkgY2hhbmdlIGV2ZW50LgotCSAqCi0JICogQHBhcmFtIGkgaW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVByb3BlcnR5Q2hhbmdlKGludCBpKSB7Ci0JCWlmIChpID09IFNlcnZlckVkaXRvclBhcnQuUFJPUF9FUlJPUikKLQkJCXVwZGF0ZVN0YXR1c0Vycm9yKCk7Ci0JCXN1cGVyLmZpcmVQcm9wZXJ0eUNoYW5nZShpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGdsb2JhbCBjb21tYW5kIG1hbmFnZXIuCi0JICogCi0JICogQHJldHVybiB0aGUgZ2xvYmFsIGNvbW1hbmQgbWFuYWdlcgotCSAqLwotCXB1YmxpYyBHbG9iYWxDb21tYW5kTWFuYWdlciBnZXRDb21tYW5kTWFuYWdlcigpIHsKLQkJcmV0dXJuIGNvbW1hbmRNYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVkbyBhY3Rpb24uCi0JICoKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb24KLQkgKi8KLQlwdWJsaWMgSUFjdGlvbiBnZXRSZWRvQWN0aW9uKCkgewotCQlyZXR1cm4gcmVkb0FjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHVuZG8gYWN0aW9uLgotCSAqCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uCi0JICovCi0JcHVibGljIElBY3Rpb24gZ2V0VW5kb0FjdGlvbigpIHsKLQkJcmV0dXJuIHVuZG9BY3Rpb247Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIFNldHMgdGhlIGN1cnNvciBhbmQgc2VsZWN0aW9uIHN0YXRlIGZvciB0aGlzIGVkaXRvciB0byB0aGUgcGFzc2FnZSBkZWZpbmVkCi0JICogYnkgdGhlIGdpdmVuIG1hcmtlci4KLQkgKiA8cD4KLQkgKiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZS4gIEZvciBncmVhdGVyIGRldGFpbHMsIHNlZSA8Y29kZT5JRWRpdG9yUGFydDwvY29kZT4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAc2VlIElFZGl0b3JQYXJ0Ci0JICovCi0JcHVibGljIHZvaWQgZ290b01hcmtlcihJTWFya2VyIG1hcmtlcikgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogVXBkYXRlIHRoZSBjdXQsIGNvcHksIGFuZCBwYXN0ZSBhY3Rpb25zLgotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZUFjdGlvbnNJbXBsKCkgewotCQlpZiAodXBkYXRpbmdBY3Rpb25zKQotCQkJcmV0dXJuOwotCQkKLQkJdXBkYXRpbmdBY3Rpb25zID0gdHJ1ZTsKLQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl1cGRhdGluZ0FjdGlvbnMgPSBmYWxzZTsKLQkJCQl1cGRhdGVBY3Rpb25zKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSB0aGUgY3V0LCBjb3B5LCBhbmQgcGFzdGUgYWN0aW9ucy4KLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVBY3Rpb25zKCkgewotCQljdXRBY3Rpb24udXBkYXRlKCk7Ci0JCWNvcHlBY3Rpb24udXBkYXRlKCk7Ci0JCXBhc3RlQWN0aW9uLnVwZGF0ZSgpOwotCX0KLQkKLQkvKioKLQkgKiBVcGRhdGUgdGhlIGN1dCwgY29weSwgYW5kIHBhc3RlIGFjdGlvbnMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlU3RhdHVzTGluZSgpIHsKLQkJaWYgKHN0YXR1c0l0ZW0gIT0gbnVsbCkgewotCQkJYm9vbGVhbiByZWFkT25seSA9IGZhbHNlOwotCQkJaWYgKHNlcnZlciAhPSBudWxsICYmIGNvbW1hbmRNYW5hZ2VyLmlzUmVhZE9ubHkoc2VydmVySWQpKQotCQkJCXJlYWRPbmx5ID0gdHJ1ZTsKLQkJCQotCQkJaWYgKHJlYWRPbmx5KQotCQkJCXN0YXR1c0l0ZW0uc2V0VGV4dChNZXNzYWdlcy5lZGl0b3JSZWFkT25seSk7Ci0JCQllbHNlCi0JCQkJc3RhdHVzSXRlbS5zZXRUZXh0KE1lc3NhZ2VzLmVkaXRvcldyaXRhYmxlKTsKLQkJfQotCi0JCWlmIChzdGF0dXMgIT0gbnVsbCkgewotCQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJYm9vbGVhbiBmaXJzdCA9IHRydWU7Ci0JCQlpZiAoc2VydmVyICE9IG51bGwpIHsKLQkJCQlJRmlsZVtdIGZpbGVzID0gY29tbWFuZE1hbmFnZXIuZ2V0UmVhZE9ubHlGaWxlcyhzZXJ2ZXJJZCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoIWZpcnN0KQotCQkJCQkJc2IuYXBwZW5kKCIsICIpOwotCQkJCQlzYi5hcHBlbmQoZmlsZXNbaV0uZ2V0TmFtZSgpKTsKLQkJCQkJZmlyc3QgPSBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCQkvKmlmIChzZXJ2ZXJDb25maWd1cmF0aW9uICE9IG51bGwpIHsKLQkJCQlJRmlsZVtdIGZpbGVzID0gY29tbWFuZE1hbmFnZXIuZ2V0UmVhZE9ubHlGaWxlcyhzZXJ2ZXJDb25maWd1cmF0aW9uSWQpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKCFmaXJzdCkKLQkJCQkJCXNiLmFwcGVuZCgiLCAiKTsKLQkJCQkJc2IuYXBwZW5kKGZpbGVzW2ldLmdldE5hbWUoKSk7Ci0JCQkJCWZpcnN0ID0gZmFsc2U7Ci0JCQkJfQotCQkJfSovCi0JCQlpZiAoc2IubGVuZ3RoKCkgPiAxKQotCQkJCXN0YXR1cy5zZXRNZXNzYWdlKE5MUy5iaW5kKE1lc3NhZ2VzLmVkaXRvclJlYWRPbmx5RmlsZXMsIHNiLnRvU3RyaW5nKCkpKTsKLQkJCWVsc2UKLQkJCQlzdGF0dXMuc2V0TWVzc2FnZSgiIik7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlU3RhdHVzRXJyb3IoKSB7Ci0JCWlmIChzdGF0dXMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlTdHJpbmcgZXJyb3IgPSBudWxsOwotCQlJRWRpdG9yUGFydCBwYXJ0ID0gZ2V0QWN0aXZlRWRpdG9yKCk7Ci0JCWlmIChwYXJ0IGluc3RhbmNlb2YgU2VydmVyRWRpdG9yUGFydCkKLQkJCWVycm9yID0gKChTZXJ2ZXJFZGl0b3JQYXJ0KSBwYXJ0KS5nZXRFcnJvck1lc3NhZ2UoKTsKLQkJCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gc2VydmVyUGFnZXMuaXRlcmF0b3IoKTsKLQkJaW50IGNvdW50ID0gMDsKLQkJd2hpbGUgKGVycm9yID09IG51bGwgJiYgaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlwYXJ0ID0gKElFZGl0b3JQYXJ0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAocGFydCBpbnN0YW5jZW9mIFNlcnZlckVkaXRvclBhcnQpIHsKLQkJCQllcnJvciA9ICgoU2VydmVyRWRpdG9yUGFydCkgcGFydCkuZ2V0RXJyb3JNZXNzYWdlKCk7Ci0JCQkJaWYgKGVycm9yICE9IG51bGwpCi0JCQkJCWVycm9yID0gIlsiICsgZ2V0UGFnZVRleHQoY291bnQpICsgIl0gIiArIGVycm9yOwotCQkJfQotCQkJY291bnQgKys7Ci0JCX0KLQkJc3RhdHVzLnNldEVycm9yTWVzc2FnZShlcnJvcik7Ci0JfQotCQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBhZ2VDaGFuZ2UoaW50IG5ld1BhZ2VJbmRleCkgewotCQlzdXBlci5wYWdlQ2hhbmdlKG5ld1BhZ2VJbmRleCk7Ci0JCXVwZGF0ZVN0YXR1c0Vycm9yKCk7Ci0JfQotCQotCS8qKgotCSAqIFNldCB0aGUgc3RhdHVzLgotCSAqIAotCSAqIEBwYXJhbSBzdGF0dXMgYSBzdGF0dXMgbGluZSBtYW5hZ2VyCi0JICogQHBhcmFtIGl0ZW0gYSBzdGF0dXMgY29udHJpYnV0aW9uIGl0ZW0KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdGF0dXMoSVN0YXR1c0xpbmVNYW5hZ2VyIHN0YXR1cywgU3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW0gaXRlbSkgewotCQl0aGlzLnN0YXR1cyA9IHN0YXR1czsKLQkJdGhpcy5zdGF0dXNJdGVtID0gaXRlbTsKLQkJdXBkYXRlU3RhdHVzRXJyb3IoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmVnaXN0ZXIgZm9yIGtleSBhbmQgdHJhdmVyc2FsIGV2ZW50cyB0byBlbmFibGUvZGlzYWJsZSB0aGUgY3V0L2NvcHkvcGFzdGUgYWN0aW9ucy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWdpc3RlckV2ZW50cyhDb250cm9sIGNvbnRyb2wpIHsKLQkJaWYgKGNvbnRyb2wgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCWlmIChjb250cm9sIGluc3RhbmNlb2YgVGV4dCB8fCBjb250cm9sIGluc3RhbmNlb2YgQ29tYm8pIHsKLQkJCS8vIHJlZ2lzdGVyIHRoZSB3b3JsZC4uLiBhbnkgb2YgdGhlc2UgYWN0aW9ucyBjb3VsZCBjYXVzZSB0aGUgc3RhdGUgdG8gY2hhbmdlCi0JCQljb250cm9sLmFkZFRyYXZlcnNlTGlzdGVuZXIobmV3IFRyYXZlcnNlTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQga2V5VHJhdmVyc2VkKFRyYXZlcnNlRXZlbnQgZXZlbnQpIHsKLQkJCQkJdXBkYXRlQWN0aW9uc0ltcGwoKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCWNvbnRyb2wuYWRkS2V5TGlzdGVuZXIobmV3IEtleUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGtleVByZXNzZWQoS2V5RXZlbnQgZXZlbnQpIHsKLQkJCQkJdXBkYXRlQWN0aW9uc0ltcGwoKTsKLQkJCQl9Ci0JCQkJcHVibGljIHZvaWQga2V5UmVsZWFzZWQoS2V5RXZlbnQgZXZlbnQpIHsKLQkJCQkJdXBkYXRlQWN0aW9uc0ltcGwoKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCWNvbnRyb2wuYWRkTW91c2VMaXN0ZW5lcihuZXcgTW91c2VMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBldmVudCkgewotCQkJCQkvLyBkbyBub3RoaW5nCi0JCQkJfQotCQkJCXB1YmxpYyB2b2lkIG1vdXNlVXAoTW91c2VFdmVudCBldmVudCkgewotCQkJCQl1cGRhdGVBY3Rpb25zSW1wbCgpOwotCQkJCX0KLQkJCQlwdWJsaWMgdm9pZCBtb3VzZURvdWJsZUNsaWNrKE1vdXNlRXZlbnQgZXZlbnQpIHsKLQkJCQkJdXBkYXRlQWN0aW9uc0ltcGwoKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCWNvbnRyb2wuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGV2ZW50KSB7Ci0JCQkJCXVwZGF0ZUFjdGlvbnNJbXBsKCk7Ci0JCQkJfQotCQkJCXB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGV2ZW50KSB7Ci0JCQkJCXVwZGF0ZUFjdGlvbnNJbXBsKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCQlpZiAoY29udHJvbCBpbnN0YW5jZW9mIFRleHQpIHsKLQkJCQlUZXh0IHRleHQgPSAoVGV4dCkgY29udHJvbDsKLQkJCQl0ZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBldmVudCkgewotCQkJCQkJdXBkYXRlQWN0aW9uc0ltcGwoKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJCXRleHQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCQkJdXBkYXRlQWN0aW9uc0ltcGwoKTsKLQkJCQkJfQotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkJCXVwZGF0ZUFjdGlvbnNJbXBsKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0gZWxzZSB7Ci0JCQkJQ29tYm8gY29tYm8gPSAoQ29tYm8pIGNvbnRyb2w7Ci0JCQkJY29tYm8uYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGV2ZW50KSB7Ci0JCQkJCQl1cGRhdGVBY3Rpb25zSW1wbCgpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQkJY29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCQkJdXBkYXRlQWN0aW9uc0ltcGwoKTsKLQkJCQkJfQotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkJCXVwZGF0ZUFjdGlvbnNJbXBsKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBDb21wb3NpdGUpIHsKLQkJCUNvbnRyb2xbXSBjaGlsZHJlbiA9ICgoQ29tcG9zaXRlKWNvbnRyb2wpLmdldENoaWxkcmVuKCk7Ci0JCQlpZiAoY2hpbGRyZW4gIT0gbnVsbCkgewotCQkJCWludCBzaXplID0gY2hpbGRyZW4ubGVuZ3RoOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotCQkJCQlyZWdpc3RlckV2ZW50cyhjaGlsZHJlbltpXSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogSW5pdGlhbGl6ZXMgdGhlIGVkaXRvciBwYXJ0IHdpdGggYSBzaXRlIGFuZCBpbnB1dC4KLQkgKiA8cD4KLQkgKiBTdWJjbGFzc2VzIG9mIDxjb2RlPkVkaXRvclBhcnQ8L2NvZGU+IG11c3QgaW1wbGVtZW50IHRoaXMgbWV0aG9kLiAgV2l0aGluCi0JICogdGhlIGltcGxlbWVudGF0aW9uIHN1YmNsYXNzZXMgc2hvdWxkIHZlcmlmeSB0aGF0IHRoZSBpbnB1dCB0eXBlIGlzIGFjY2VwdGFibGUKLQkgKiBhbmQgdGhlbiBzYXZlIHRoZSBzaXRlIGFuZCBpbnB1dC4gIEhlcmUgaXMgc2FtcGxlIGNvZGU6Ci0JICogPC9wPgotCSAqIDxwcmU+Ci0JICoJCWlmICghKGlucHV0IGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dCkpCi0JICoJCQl0aHJvdyBuZXcgUGFydEluaXRFeGNlcHRpb24oIkludmFsaWQgSW5wdXQ6IE11c3QgYmUgSUZpbGVFZGl0b3JJbnB1dCIpOwotCSAqCQlzZXRTaXRlKHNpdGUpOwotCSAqCQlzZXRJbnB1dChlZGl0b3JJbnB1dCk7Ci0JICogPC9wcmU+Ci0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0JCWNvbW1hbmRNYW5hZ2VyID0gR2xvYmFsQ29tbWFuZE1hbmFnZXIuZ2V0SW5zdGFuY2UoKTsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0KLQkJaWYgKGlucHV0IGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dCkgewotCQkJSUZpbGVFZGl0b3JJbnB1dCBmZWkgPSAoSUZpbGVFZGl0b3JJbnB1dCkgaW5wdXQ7Ci0JCQlJRmlsZSBmaWxlID0gZmVpLmdldEZpbGUoKTsKLQkJCWlmIChmaWxlICE9IG51bGwgJiYgZmlsZS5leGlzdHMoKSkgewotCQkJCUlTZXJ2ZXIgc2VydmVyMiA9IFNlcnZlclVJUGx1Z2luLmZpbmRTZXJ2ZXIoZmlsZSk7Ci0JCQkJaWYgKHNlcnZlcjIgIT0gbnVsbCkKLQkJCQkJc2VydmVySWQgPSBzZXJ2ZXIyLmdldElkKCk7Ci0JCQl9Ci0JCQlpZiAoc2VydmVySWQgPT0gbnVsbCkKLQkJCQl0aHJvdyBuZXcgUGFydEluaXRFeGNlcHRpb24oTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JFZGl0b3IsIGZpbGUuZ2V0TmFtZSgpKSk7Ci0JCX0gZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBJU2VydmVyRWRpdG9ySW5wdXQpIHsKLQkJCUlTZXJ2ZXJFZGl0b3JJbnB1dCBzZWkgPSAoSVNlcnZlckVkaXRvcklucHV0KSBpbnB1dDsKLQkJCXNlcnZlcklkID0gc2VpLmdldFNlcnZlcklkKCk7Ci0JCX0KLQotCQlpZiAoc2VydmVySWQgIT0gbnVsbCkgewotCQkJY29tbWFuZE1hbmFnZXIuZ2V0Q29tbWFuZE1hbmFnZXIoc2VydmVySWQpOwotCQkJc2VydmVyID0gY29tbWFuZE1hbmFnZXIuZ2V0U2VydmVyUmVzb3VyY2Uoc2VydmVySWQpOwotCQl9Ci0KLQkJSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IFNlcnZlclVJQ29yZS5nZXRMYWJlbFByb3ZpZGVyKCk7Ci0JCWlmIChzZXJ2ZXIgIT0gbnVsbCkgewotCQkJc2V0UGFydE5hbWUobGFiZWxQcm92aWRlci5nZXRUZXh0KHNlcnZlcikpOwotCQkJc2V0VGl0bGVJbWFnZShsYWJlbFByb3ZpZGVyLmdldEltYWdlKHNlcnZlcikpOwotCQkJc2V0VGl0bGVUb29sVGlwKHNlcnZlcklkKTsKLQkJCXNlcnZlck5hbWUgPSBzZXJ2ZXIuZ2V0TmFtZSgpOwotCQl9IGVsc2UKLQkJCXNldFBhcnROYW1lKCItIik7Ci0KLQkJY3V0QWN0aW9uID0gbmV3IFRleHRBY3Rpb24oc2l0ZS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKSwgVGV4dEFjdGlvbi5DVVRfQUNUSU9OKTsKLQkJY29weUFjdGlvbiA9IG5ldyBUZXh0QWN0aW9uKHNpdGUuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCksIFRleHRBY3Rpb24uQ09QWV9BQ1RJT04pOwotCQlwYXN0ZUFjdGlvbiA9IG5ldyBUZXh0QWN0aW9uKHNpdGUuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCksIFRleHRBY3Rpb24uUEFTVEVfQUNUSU9OKTsKLQotCQlsaXN0ZW5lciA9IG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCWlmIChHbG9iYWxDb21tYW5kTWFuYWdlci5QUk9QX0RJUlRZLmVxdWFscyhldmVudC5nZXRQcm9wZXJ0eU5hbWUoKSkpIHsKLQkJCQkJT2JqZWN0IG9iaiA9IGV2ZW50LmdldE9sZFZhbHVlKCk7Ci0JCQkJCWlmIChvYmogPT0gc2VydmVySWQpCi0JCQkJCQlmaXJlUHJvcGVydHlDaGFuZ2UoUFJPUF9ESVJUWSk7Ci0JCQkJfSBlbHNlIGlmIChHbG9iYWxDb21tYW5kTWFuYWdlci5QUk9QX1VORE8uZXF1YWxzKGV2ZW50LmdldFByb3BlcnR5TmFtZSgpKSkgewotCQkJCQlPYmplY3Qgb2JqID0gZXZlbnQuZ2V0T2xkVmFsdWUoKTsKLQkJCQkJaWYgKG9iaiA9PSBzZXJ2ZXJJZCkKLQkJCQkJCXVwZGF0ZVVuZG9BY3Rpb24oKTsKLQkJCQl9IGVsc2UgaWYgKEdsb2JhbENvbW1hbmRNYW5hZ2VyLlBST1BfUkVETy5lcXVhbHMoZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkpKSB7Ci0JCQkJCU9iamVjdCBvYmogPSBldmVudC5nZXRPbGRWYWx1ZSgpOwotCQkJCQlpZiAob2JqID09IHNlcnZlcklkKQotCQkJCQkJdXBkYXRlUmVkb0FjdGlvbigpOwotCQkJCX0gZWxzZSBpZiAoR2xvYmFsQ29tbWFuZE1hbmFnZXIuUFJPUF9SRUxPQUQuZXF1YWxzKGV2ZW50LmdldFByb3BlcnR5TmFtZSgpKSkgewotCQkJCQlPYmplY3Qgb2JqID0gZXZlbnQuZ2V0T2xkVmFsdWUoKTsKLQkJCQkJaWYgKG9iaiA9PSBzZXJ2ZXJJZCkgewotCQkJCQkJc2VydmVyID0gY29tbWFuZE1hbmFnZXIuZ2V0U2VydmVyUmVzb3VyY2Uoc2VydmVySWQpOwotCQkJCQkJcmVmcmVzaCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9OwotCQlpZiAoc2VydmVyICE9IG51bGwgJiYgY29tbWFuZE1hbmFnZXIuaXNEaXJ0eShzZXJ2ZXJJZCkpCi0JCQlmaXJlUHJvcGVydHlDaGFuZ2UoUFJPUF9ESVJUWSk7Ci0KLQkJY29tbWFuZE1hbmFnZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCQotCQkvLyBjcmVhdGUgZWRpdG9yIGlucHV0Ci0JCVNlcnZlclJlc291cmNlQ29tbWFuZE1hbmFnZXIgc2VydmVyQ29tbWFuZE1hbmFnZXIgPSBudWxsOwotCQlpZiAoc2VydmVyICE9IG51bGwpCi0JCQlzZXJ2ZXJDb21tYW5kTWFuYWdlciA9IG5ldyBTZXJ2ZXJSZXNvdXJjZUNvbW1hbmRNYW5hZ2VyKHRoaXMsIHNlcnZlcklkLCBjb21tYW5kTWFuYWdlcik7Ci0JCWVkaXRvclBhcnRJbnB1dCA9IGNvbW1hbmRNYW5hZ2VyLmdldFBhcnRJbnB1dChzZXJ2ZXJJZCwgc2VydmVyQ29tbWFuZE1hbmFnZXIpOwotCQkKLQkJY3JlYXRlQWN0aW9ucygpOwotCQkKLQkJLy8gYWRkIHJlc291cmNlIGxpc3RlbmVyCi0JCXJlc291cmNlTGlzdGVuZXIgPSBuZXcgTGlmZWN5Y2xlTGlzdGVuZXIoKTsKLQkJU2VydmVyQ29yZS5hZGRTZXJ2ZXJMaWZlY3ljbGVMaXN0ZW5lcihyZXNvdXJjZUxpc3RlbmVyKTsKLQkJCi0JCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gZ2V0U2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpOwotCQl3aW5kb3cuZ2V0UGFydFNlcnZpY2UoKS5hZGRQYXJ0TGlzdGVuZXIoYWN0aXZhdGlvbkxpc3RlbmVyKTsKLQkJd2luZG93LmdldFNoZWxsKCkuYWRkU2hlbGxMaXN0ZW5lcihhY3RpdmF0aW9uTGlzdGVuZXIpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZWRpdG9yIGhhdmUgY2hhbmdlZCBzaW5jZSB0aGUgbGFzdCBzYXZlCi0JICogb3BlcmF0aW9uLgotCSAqIDxwPgotCSAqIFN1YmNsYXNzZXMgbXVzdCBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBpbXBsZW1lbnQgdGhlIG9wZW4tc2F2ZS1jbG9zZSBsaWZlY3ljbGUKLQkgKiBmb3IgYW4gZWRpdG9yLiAgRm9yIGdyZWF0ZXIgZGV0YWlscywgc2VlIDxjb2RlPklFZGl0b3JQYXJ0PC9jb2RlPgotCSAqIDwvcD4KLQkgKgotCSAqIEBzZWUgSUVkaXRvclBhcnQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RpcnR5KCkgewotCQlpZiAoY29tbWFuZE1hbmFnZXIgIT0gbnVsbCkgewotCQkJaWYgKHNlcnZlciAhPSBudWxsICYmIGNvbW1hbmRNYW5hZ2VyLmlzRGlydHkoc2VydmVySWQpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSAic2F2ZSBhcyIgb3BlcmF0aW9uIGlzIHN1cHBvcnRlZCBieSB0aGlzIGVkaXRvci4KLQkgKiA8cD4KLQkgKiBTdWJjbGFzc2VzIG11c3Qgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gaW1wbGVtZW50IHRoZSBvcGVuLXNhdmUtY2xvc2UgbGlmZWN5Y2xlCi0JICogZm9yIGFuIGVkaXRvci4gIEZvciBncmVhdGVyIGRldGFpbHMsIHNlZSA8Y29kZT5JRWRpdG9yUGFydDwvY29kZT4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAc2VlIElFZGl0b3JQYXJ0Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTYXZlQXNBbGxvd2VkKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlIHRoZSB1bmRvIGFjdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVVbmRvQWN0aW9uKCkgewotCQlJVW5kb2FibGVPcGVyYXRpb24gY29tbWFuZCA9IGNvbW1hbmRNYW5hZ2VyLmdldFVuZG9Db21tYW5kKHNlcnZlcklkKTsKLQkJaWYgKGNvbW1hbmQgPT0gbnVsbCkgewotCQkJdW5kb0FjdGlvbi5zZXRUZXh0KE1lc3NhZ2VzLmVkaXRvclVuZG9EaXNhYmxlZCk7Ci0JCQl1bmRvQWN0aW9uLnNldFRvb2xUaXBUZXh0KCIiKTsKLQkJCXVuZG9BY3Rpb24uc2V0RGVzY3JpcHRpb24oIiIpOwotCQkJdW5kb0FjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJfSBlbHNlIHsKLQkJCVN0cmluZyB0ZXh0ID0gTkxTLmJpbmQoTWVzc2FnZXMuZWRpdG9yVW5kb0VuYWJsZWQsIG5ldyBPYmplY3RbXSB7Y29tbWFuZC5nZXRMYWJlbCgpfSk7Ci0JCQl1bmRvQWN0aW9uLnNldFRleHQodGV4dCk7Ci0JCQl1bmRvQWN0aW9uLnNldFRvb2xUaXBUZXh0KGNvbW1hbmQuZ2V0TGFiZWwoKSk7Ci0JCQl1bmRvQWN0aW9uLnNldERlc2NyaXB0aW9uKGNvbW1hbmQuZ2V0TGFiZWwoKSk7Ci0JCQl1bmRvQWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgdGhlIHJlZG8gYWN0aW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVJlZG9BY3Rpb24oKSB7Ci0JCUlVbmRvYWJsZU9wZXJhdGlvbiBjb21tYW5kID0gY29tbWFuZE1hbmFnZXIuZ2V0UmVkb0NvbW1hbmQoc2VydmVySWQpOwotCQlpZiAoY29tbWFuZCA9PSBudWxsKSB7Ci0JCQlyZWRvQWN0aW9uLnNldFRleHQoTWVzc2FnZXMuZWRpdG9yUmVkb0Rpc2FibGVkKTsKLQkJCXJlZG9BY3Rpb24uc2V0VG9vbFRpcFRleHQoIiIpOwotCQkJcmVkb0FjdGlvbi5zZXREZXNjcmlwdGlvbigiIik7Ci0JCQlyZWRvQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQl9IGVsc2UgewotCQkJU3RyaW5nIHRleHQgPSBOTFMuYmluZChNZXNzYWdlcy5lZGl0b3JSZWRvRW5hYmxlZCwgbmV3IE9iamVjdFtdIHtjb21tYW5kLmdldExhYmVsKCl9KTsKLQkJCXJlZG9BY3Rpb24uc2V0VGV4dCh0ZXh0KTsKLQkJCXJlZG9BY3Rpb24uc2V0VG9vbFRpcFRleHQoY29tbWFuZC5nZXRMYWJlbCgpKTsKLQkJCXJlZG9BY3Rpb24uc2V0RGVzY3JpcHRpb24oY29tbWFuZC5nZXRMYWJlbCgpKTsKLQkJCXJlZG9BY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGN1dCBhY3Rpb24uCi0JICogCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbgotCSAqLwotCXB1YmxpYyBJQWN0aW9uIGdldEN1dEFjdGlvbigpIHsKLQkJcmV0dXJuIGN1dEFjdGlvbjsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjb3B5IGFjdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uCi0JICovCi0JcHVibGljIElBY3Rpb24gZ2V0Q29weUFjdGlvbigpIHsKLQkJcmV0dXJuIGNvcHlBY3Rpb247Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgcGFzdGUgYWN0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24KLQkgKi8KLQlwdWJsaWMgSUFjdGlvbiBnZXRQYXN0ZUFjdGlvbigpIHsKLQkJcmV0dXJuIHBhc3RlQWN0aW9uOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBlZGl0b3IgYWN0aW9ucy4KLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uCi0JICovCi0JcHVibGljIElBY3Rpb25bXSBnZXRFZGl0b3JBY3Rpb25zKCkgewotCQlyZXR1cm4gZWRpdG9yQWN0aW9uczsKLQl9Ci0JCi0JLyoqCi0JICogVXBkYXRlIHRoZSBzZXJ2ZXIgcGFnZXMgd2l0aCBuZXcgaW5wdXQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaCgpIHsKLQkJLy8gY3JlYXRlIGVkaXRvciBpbnB1dAotCQlTZXJ2ZXJSZXNvdXJjZUNvbW1hbmRNYW5hZ2VyIHNlcnZlckNvbW1hbmRNYW5hZ2VyID0gbnVsbDsKLQkJaWYgKHNlcnZlciAhPSBudWxsKQotCQkJc2VydmVyQ29tbWFuZE1hbmFnZXIgPSBuZXcgU2VydmVyUmVzb3VyY2VDb21tYW5kTWFuYWdlcih0aGlzLCBzZXJ2ZXJJZCwgY29tbWFuZE1hbmFnZXIpOwotCQllZGl0b3JQYXJ0SW5wdXQgPSBjb21tYW5kTWFuYWdlci5nZXRQYXJ0SW5wdXQoc2VydmVySWQsIHNlcnZlckNvbW1hbmRNYW5hZ2VyKTsKLQkJCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gc2VydmVyUGFnZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJSUVkaXRvclBhcnQgcGFydCA9IChJRWRpdG9yUGFydCkgaXRlcmF0b3IubmV4dCgpOwkJCQkJCQotCQkJdHJ5IHsKLQkJCQlwYXJ0LmluaXQocGFydC5nZXRFZGl0b3JTaXRlKCksIGVkaXRvclBhcnRJbnB1dCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIHJlZnJlc2goKWluZyBlZGl0b3IgcGFydCIsIGUpOwotCQkJfQotCQl9CQotCX0KLQkKLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcm9tcHRSZWFkT25seVNlcnZlckZpbGUoU3RyaW5nIGlkKSB7Ci0JCWNvbW1hbmRNYW5hZ2VyLnNldFJlYWRPbmx5KGlkLCB0cnVlKTsKLQkJU3RyaW5nIHRpdGxlID0gTWVzc2FnZXMuZWRpdG9yUmVzb3VyY2VNb2RpZmllZFRpdGxlOwotCQlTdHJpbmcgbWVzc2FnZSA9IE1lc3NhZ2VzLmVkaXRvclJlYWRPbmx5TWVzc2FnZTsKLQkJTWVzc2FnZURpYWxvZy5vcGVuSW5mb3JtYXRpb24oZ2V0RWRpdG9yU2l0ZSgpLmdldFNoZWxsKCksIHRpdGxlLCBtZXNzYWdlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcm9tcHRSZWxvYWRTZXJ2ZXJGaWxlKFN0cmluZyBpZCwgSVNlcnZlcldvcmtpbmdDb3B5IHdjKSB7Ci0JCVN0cmluZyB0aXRsZSA9IE1lc3NhZ2VzLmVkaXRvclJlc291cmNlTW9kaWZpZWRUaXRsZTsKLQkJU3RyaW5nIG1lc3NhZ2UgPSBNZXNzYWdlcy5lZGl0b3JTZXJ2ZXJNb2RpZmllZE1lc3NhZ2U7Ci0KLQkJaWYgKE1lc3NhZ2VEaWFsb2cub3BlblF1ZXN0aW9uKGdldEVkaXRvclNpdGUoKS5nZXRTaGVsbCgpLCB0aXRsZSwgbWVzc2FnZSkpIHsKLQkJCXRyeSB7Ci0JCQkJLy93Yy5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX09ORSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJLy9UT0RPOiByZWZyZXNoIGxvY2FsIHNlcnZlcgotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciByZWZyZXNoaW5nIHNlcnZlciIsIGUpOwotCQkJfQotCQkJY29tbWFuZE1hbmFnZXIucmVsb2FkKGlkLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotCQlzdXBlci5zZXRGb2N1cygpOwotCX0KLQkKLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjaGVja1Jlc291cmNlU3RhdGUoKSB7Ci0JCS8vIGRvIG5vdCBjaGVjayB0aGUgcmVzb3VyY2Ugc3RhdGUgY2hhbmdlIGlmIHNhdmluZyB0aHJvdWdoIHRoZSBlZGl0b3IKLQkJaWYgKGlzU2F2aW5nKSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCS8vIGNoZWNrIGZvciBkZWxldGVkIGZpbGVzCi0JCWlmIChyZXNvdXJjZURlbGV0ZWQpIHsKLQkJCVN0cmluZyB0aXRsZSA9IE1lc3NhZ2VzLmVkaXRvclJlc291cmNlRGVsZXRlVGl0bGU7Ci0JCQlTdHJpbmcgbWVzc2FnZSA9IG51bGw7Ci0JCQlpZiAoc2VydmVyICE9IG51bGwpCi0JCQkJbWVzc2FnZSA9IE5MUy5iaW5kKE1lc3NhZ2VzLmVkaXRvclJlc291cmNlRGVsZXRlU2VydmVyTWVzc2FnZSwgc2VydmVyLmdldE5hbWUoKSk7Ci0JCQlTdHJpbmdbXSBsYWJlbHMgPSBuZXcgU3RyaW5nW10ge01lc3NhZ2VzLmVkaXRvclJlc291cmNlRGVsZXRlU2F2ZSwgSURpYWxvZ0NvbnN0YW50cy5DTE9TRV9MQUJFTH07Ci0JCQlNZXNzYWdlRGlhbG9nIGRpYWxvZyA9IG5ldyBNZXNzYWdlRGlhbG9nKGdldEVkaXRvclNpdGUoKS5nZXRTaGVsbCgpLCB0aXRsZSwgbnVsbCwgbWVzc2FnZSwgTWVzc2FnZURpYWxvZy5JTkZPUk1BVElPTiwgbGFiZWxzLCAwKTsKLQotCQkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gMCkKLQkJCQlkb1NhdmUobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQllbHNlCi0JCQkJY2xvc2VFZGl0b3IoKTsKLQkJCXJldHVybjsKLQkJfQotCQlyZXNvdXJjZURlbGV0ZWQgPSBmYWxzZTsKLQotCQkvLyBjaGVjayBmb3Igc2VydmVyIGNoYW5nZXMKLQkJaWYgKHNlcnZlcklkICE9IG51bGwpIHsKLQkJCWlmICghY29tbWFuZE1hbmFnZXIuaXNEaXJ0eShzZXJ2ZXJJZCkpIHsKLQkJCQlpZiAoY29tbWFuZE1hbmFnZXIuaGFzQ2hhbmdlZChzZXJ2ZXJJZCkpCi0JCQkJCXByb21wdFJlbG9hZFNlcnZlckZpbGUoc2VydmVySWQsIHNlcnZlcik7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChjb21tYW5kTWFuYWdlci5oYXNDaGFuZ2VkKHNlcnZlcklkKSAmJiAhY29tbWFuZE1hbmFnZXIuYXJlRmlsZXNSZWFkT25seShzZXJ2ZXJJZCkpCi0JCQkJCXByb21wdFJlbG9hZFNlcnZlckZpbGUoc2VydmVySWQsIHNlcnZlcik7Ci0JCQkJZWxzZSBpZiAoY29tbWFuZE1hbmFnZXIuYXJlRmlsZXNSZWFkT25seShzZXJ2ZXJJZCkgJiYgIWNvbW1hbmRNYW5hZ2VyLmlzUmVhZE9ubHkoc2VydmVySWQpKQotCQkJCQlwcm9tcHRSZWFkT25seVNlcnZlckZpbGUoc2VydmVySWQpOwotCQkJfQotCQkJaWYgKGNvbW1hbmRNYW5hZ2VyLmlzUmVhZE9ubHkoc2VydmVySWQpICYmICFjb21tYW5kTWFuYWdlci5hcmVGaWxlc1JlYWRPbmx5KHNlcnZlcklkKSkKLQkJCQljb21tYW5kTWFuYWdlci5zZXRSZWFkT25seShzZXJ2ZXJJZCwgZmFsc2UpOwotCQkJY29tbWFuZE1hbmFnZXIudXBkYXRlVGltZXN0YW1wcyhzZXJ2ZXJJZCk7Ci0JCX0KLQotCQl1cGRhdGVTdGF0dXNMaW5lKCk7Ci0JfQotCQotCS8qKgotCSAqIFNldCB0aGUgdGl0bGUgdG9vbHRpcC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB0aXRsZSB0b29sdGlwCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUaXRsZVRvb2xUaXAoKSB7Ci0JCVNlcnZlciBzZXJ2ZXIyID0gKFNlcnZlcikgc2VydmVyOwotCQlpZiAoc2VydmVyICE9IG51bGwgJiYgc2VydmVyMi5nZXRGaWxlKCkgIT0gbnVsbCkKLQkJCXJldHVybiBzZXJ2ZXIyLmdldEZpbGUoKS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCk7Ci0JCWVsc2UgaWYgKHNlcnZlciAhPSBudWxsKQotCQkJcmV0dXJuIHNlcnZlci5nZXROYW1lKCk7Ci0JCWVsc2UKLQkJCXJldHVybiAiZXJyb3IiOwotCX0KLQkKLQlwdWJsaWMgaW50IGdldE9yaWVudGF0aW9uKCkgewotCQlyZXR1cm4gV2luZG93LmdldERlZmF1bHRPcmllbnRhdGlvbigpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9lZGl0b3IvU2VydmVyRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2VkaXRvci9TZXJ2ZXJFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTRjOTQ4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2VkaXRvci9TZXJ2ZXJFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVN0YXR1c0xpbmVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JVG9vbEJhck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlRyYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQWN0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yOwotLyoqCi0gKiBTZXJ2ZXIgZWRpdG9yIGFjdGlvbiBiYXIgY29udHJpYnV0b3IuCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciBleHRlbmRzIEVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWRVJfRURJVE9SX1NFUEFSQVRPUiA9ICJzZXJ2ZXItZWRpdG9yLWFkZGl0aW9ucyI7Ci0KLQkvLyBjdXJyZW50IGVkaXRvcgotCXByb3RlY3RlZCBTZXJ2ZXJFZGl0b3IgZWRpdG9yOwotCi0JLyoqCi0JICogU2VydmVyRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgU2VydmVyRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgYWN0aXZlIGVkaXRvciBmb3IgdGhlIGNvbnRyaWJ1dG9yLgotCSAqIDxwPgotCSAqIFRoZSA8Y29kZT5FZGl0b3JBY3Rpb25CYXJDb250cmlidXRvcjwvY29kZT4gaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgZG9lcwotCSAqIG5vdGhpbmcuIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50LiBUaGlzIGdlbmVyYWxseSBlbnRhaWxzIGRpc2Nvbm5lY3RpbmcKLQkgKiBmcm9tIHRoZSBvbGQgZWRpdG9yLCBjb25uZWN0aW5nIHRvIHRoZSBuZXcgZWRpdG9yLCBhbmQgdXBkYXRpbmcgdGhlIGFjdGlvbnMKLQkgKiB0byByZWZsZWN0IHRoZSBuZXcgZWRpdG9yLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gdGFyZ2V0RWRpdG9yIHRoZSBuZXcgdGFyZ2V0IGVkaXRvcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZUVkaXRvcihJRWRpdG9yUGFydCB0YXJnZXRFZGl0b3IpIHsKLQkJc3VwZXIuc2V0QWN0aXZlRWRpdG9yKHRhcmdldEVkaXRvcik7Ci0KLQkJaWYgKHRhcmdldEVkaXRvciAhPSBudWxsICYmIHRhcmdldEVkaXRvci5lcXVhbHMoZWRpdG9yKSkKLQkJCXJldHVybjsKLQkJCi0JCUlBY3Rpb25CYXJzIGFjdGlvbkJhcnMgPSBnZXRBY3Rpb25CYXJzKCk7Ci0JCWJvb2xlYW4gYWN0aW9uQmFyc1VwZGF0ZWQgPSBmYWxzZTsKLQotCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKLQkJCWVkaXRvci5zZXRTdGF0dXMobnVsbCwgbnVsbCk7Ci0JCQkKLQkJCUlTdGF0dXNMaW5lTWFuYWdlciBzdGF0dXMgPSBhY3Rpb25CYXJzLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCk7Ci0JCQlzdGF0dXMucmVtb3ZlQWxsKCk7Ci0KLQkJCUlUb29sQmFyTWFuYWdlciB0Ym0gPSBhY3Rpb25CYXJzLmdldFRvb2xCYXJNYW5hZ2VyKCk7Ci0JCQl0Ym0ucmVtb3ZlQWxsKCk7Ci0JCQkKLQkJCWFjdGlvbkJhcnNVcGRhdGVkID0gdHJ1ZTsKLQkJfQotCi0JCWlmICh0YXJnZXRFZGl0b3IgaW5zdGFuY2VvZiBTZXJ2ZXJFZGl0b3IpIHsKLQkJCWVkaXRvciA9IChTZXJ2ZXJFZGl0b3IpIHRhcmdldEVkaXRvcjsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIkVkaXRvciBhY3Rpb24gYmFyIGNvbnRyaWJ1dG9yIGZvcjogIiArIGVkaXRvcik7Ci0JCQllZGl0b3IudXBkYXRlVW5kb0FjdGlvbigpOwotCQkJZWRpdG9yLnVwZGF0ZVJlZG9BY3Rpb24oKTsKLQkJCQotCQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuVU5ETy5nZXRJZCgpLCBlZGl0b3IuZ2V0VW5kb0FjdGlvbigpKTsKLQkJCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LlJFRE8uZ2V0SWQoKSwgZWRpdG9yLmdldFJlZG9BY3Rpb24oKSk7Ci0JCQkKLQkJCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LkNPUFkuZ2V0SWQoKSwgZWRpdG9yLmdldENvcHlBY3Rpb24oKSk7Ci0JCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5DVVQuZ2V0SWQoKSwgZWRpdG9yLmdldEN1dEFjdGlvbigpKTsKLQkJCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LlBBU1RFLmdldElkKCksIGVkaXRvci5nZXRQYXN0ZUFjdGlvbigpKTsKLQkJCQotCQkJSVN0YXR1c0xpbmVNYW5hZ2VyIHN0YXR1cyA9IGFjdGlvbkJhcnMuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKTsKLQkJCVN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtIGl0ZW0gPSBuZXcgU3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW0oImlkIik7Ci0JCQlzdGF0dXMuYWRkKGl0ZW0pOwotCi0JCQllZGl0b3Iuc2V0U3RhdHVzKHN0YXR1cywgaXRlbSk7Ci0JCQllZGl0b3IudXBkYXRlU3RhdHVzTGluZSgpOwotCi0JCQlJQWN0aW9uW10gYWN0aW9ucyA9IGVkaXRvci5nZXRFZGl0b3JBY3Rpb25zKCk7Ci0JCQlJVG9vbEJhck1hbmFnZXIgdGJtID0gYWN0aW9uQmFycy5nZXRUb29sQmFyTWFuYWdlcigpOwotCQkJdGJtLmFkZChuZXcgU2VwYXJhdG9yKFNFUlZFUl9FRElUT1JfU0VQQVJBVE9SKSk7Ci0JCQlib29sZWFuIG1vZGlmaWVkID0gZmFsc2U7Ci0JCQlpZiAoYWN0aW9ucyAhPSBudWxsKSB7Ci0JCQkJaW50IHNpemUgPSBhY3Rpb25zLmxlbmd0aDsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJBdHRlbXB0aW5nIHRvIGFkZCBlZGl0b3IgYWN0aW9uczogIiArIHNpemUpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgImFjdGlvbjogIiArIGFjdGlvbnNbaV0pOwotCQkJCQl0Ym0uYXBwZW5kVG9Hcm91cChTRVJWRVJfRURJVE9SX1NFUEFSQVRPUiwgYWN0aW9uc1tpXSk7Ci0JCQkJCW1vZGlmaWVkID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCWlmIChtb2RpZmllZCkKLQkJCQl0Ym0udXBkYXRlKGZhbHNlKTsKLQkJCWFjdGlvbkJhcnNVcGRhdGVkID0gdHJ1ZTsKLQkJfSBlbHNlCi0JCQllZGl0b3IgPSBudWxsOwotCQkKLQkJaWYgKGFjdGlvbkJhcnNVcGRhdGVkKQotCQkJYWN0aW9uQmFycy51cGRhdGVBY3Rpb25CYXJzKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2VkaXRvci9TZXJ2ZXJFZGl0b3JBY3Rpb25GYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9lZGl0b3IvU2VydmVyRWRpdG9yQWN0aW9uRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDBlNjQ5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2VkaXRvci9TZXJ2ZXJFZGl0b3JBY3Rpb25GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmVkaXRvci5JU2VydmVyRWRpdG9yUGFydElucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuVHJhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5TZXJ2ZXJFZGl0b3JBY3Rpb25GYWN0b3J5RGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci0vKioKLSAqIEEgZGVmYXVsdCBzZXJ2ZXIgdGhhdCBjYW4gYmUgY3JlYXRlZCBmb3IgYSBzZXQgb2YgZ2l2ZW4KLSAqIG5hdHVyZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJFZGl0b3JBY3Rpb25GYWN0b3J5IGltcGxlbWVudHMgSVNlcnZlckVkaXRvckFjdGlvbkZhY3RvcnkgewotCXByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQ7Ci0JcHJpdmF0ZSBTZXJ2ZXJFZGl0b3JBY3Rpb25GYWN0b3J5RGVsZWdhdGUgZGVsZWdhdGU7Ci0KLQkvKioKLQkgKiBTZXJ2ZXJFZGl0b3JBY3Rpb25GYWN0b3J5IGNvbnN0cnVjdG9yLgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IGEgY29uZmlndXJhdGlvbiBlbGVtZW50Ci0JICovCi0JcHVibGljIFNlcnZlckVkaXRvckFjdGlvbkZhY3RvcnkoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGdldENvbmZpZ3VyYXRpb25FbGVtZW50KCkgewotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpZCBvZiB0aGlzIGRlZmF1bHQgc2VydmVyLgotCSAqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJpZCIpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpZCBvZiB0aGlzIGRlZmF1bHQgc2VydmVyLgotCSAqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoIm5hbWUiKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgb3JkZXIuCi0JICoKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0T3JkZXIoKSB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgbyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJvcmRlciIpOwotCQkJcmV0dXJuIEludGVnZXIucGFyc2VJbnQobyk7Ci0JCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGlkcyBvZiB0aGUgc2VydmVyIHJlc291cmNlIGZhY3RvcmllcyAoc3BlY2lmaWVkCi0JICogdXNpbmcgSmF2YS1pbXBvcnQgc3R5bGUpIHRoYXQgdGhpcyBwYWdlIG1heSBzdXBwb3J0LgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZ1tdCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldFR5cGVJZHMoKSB7Ci0JCXRyeSB7Ci0JCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ0eXBlSWRzIiksICIsIik7Ci0JCQl3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJU3RyaW5nIHN0ciA9IHN0Lm5leHRUb2tlbigpOwotCQkJCWlmIChzdHIgIT0gbnVsbCAmJiBzdHIubGVuZ3RoKCkgPiAwKQotCQkJCQlsaXN0LmFkZChzdHIpOwotCQkJfQotCQkJU3RyaW5nW10gcyA9IG5ldyBTdHJpbmdbbGlzdC5zaXplKCldOwotCQkJbGlzdC50b0FycmF5KHMpOwotCQkJcmV0dXJuIHM7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvL1RyYWNlLnRyYWNlKCJDb3VsZCBub3QgZ2V0IHNlcnZlciByZXNvdXJjZSBmcm9tOiAiICsgZWxlbWVudC5nZXRBdHRyaWJ1dGUoInNlcnZlclJlc291cmNlcyIpKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgSVNlcnZlckVkaXRvckFjdGlvbkZhY3Rvcnkjc3VwcG9ydHNTZXJ2ZXJFbGVtZW50VHlwZShTdHJpbmcpCi0JICovCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHNTZXJ2ZXJFbGVtZW50VHlwZShTdHJpbmcgaWQpIHsKLQkJaWYgKGlkID09IG51bGwgfHwgaWQubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlTdHJpbmdbXSBzID0gZ2V0VHlwZUlkcygpOwotCQlpZiAocyA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJaW50IHNpemUgPSBzLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCWlmIChzW2ldLmVuZHNXaXRoKCIqIikpIHsKLQkJCQlpZiAoaWQubGVuZ3RoKCkgPj0gc1tpXS5sZW5ndGgoKSAmJiBpZC5zdGFydHNXaXRoKHNbaV0uc3Vic3RyaW5nKDAsIHNbaV0ubGVuZ3RoKCkgLSAxKSkpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfSBlbHNlIGlmIChpZC5lcXVhbHMoc1tpXSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogCi0JICovCi0JcHVibGljIFNlcnZlckVkaXRvckFjdGlvbkZhY3RvcnlEZWxlZ2F0ZSBnZXREZWxlZ2F0ZSgpIHsKLQkJaWYgKGRlbGVnYXRlID09IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJZGVsZWdhdGUgPSAoU2VydmVyRWRpdG9yQWN0aW9uRmFjdG9yeURlbGVnYXRlKSBlbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7Ci0JCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBjcmVhdGUgc2VydmVyIGFjdGlvbiBmYWN0b3J5IGRlbGVnYXRlIiwgdCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRlbGVnYXRlOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIElTZXJ2ZXJFZGl0b3JBY3Rpb25GYWN0b3J5I3Nob3VsZERpc3BsYXkoSVNlcnZlcldvcmtpbmdDb3B5KQotCSAqLwotCXB1YmxpYyBib29sZWFuIHNob3VsZERpc3BsYXkoSVNlcnZlcldvcmtpbmdDb3B5IHNlcnZlcikgewotCQl0cnkgewotCQkJcmV0dXJuIGdldERlbGVnYXRlKCkuc2hvdWxkRGlzcGxheShzZXJ2ZXIpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgY2FsbGluZyBkZWxlZ2F0ZSIsIGUpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJU2VydmVyRWRpdG9yQWN0aW9uRmFjdG9yeSNjcmVhdGVBY3Rpb24oSUVkaXRvclNpdGUsIElTZXJ2ZXJFZGl0b3JQYXJ0SW5wdXQpCi0JICovCi0JcHVibGljIElBY3Rpb24gY3JlYXRlQWN0aW9uKElFZGl0b3JTaXRlIHNpdGUsIElTZXJ2ZXJFZGl0b3JQYXJ0SW5wdXQgaW5wdXQpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBnZXREZWxlZ2F0ZSgpLmNyZWF0ZUFjdGlvbihzaXRlLCBpbnB1dCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBjYWxsaW5nIGRlbGVnYXRlIiwgZSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9lZGl0b3IvU2VydmVyRWRpdG9yQ29yZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvZWRpdG9yL1NlcnZlckVkaXRvckNvcmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzlkYTExOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9lZGl0b3IvU2VydmVyRWRpdG9yQ29yZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbkRlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuU2VydmVyVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5UcmFjZTsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJFZGl0b3JDb3JlIHsKLQkvLyBjYWNoZWQgY29weSBvZiBhbGwgZWRpdG9yIGZhY3RvcmllcyBhbmQgYWN0aW9ucwotCXByaXZhdGUgc3RhdGljIExpc3QgZWRpdG9yUGFnZUZhY3RvcmllczsKLQlwcml2YXRlIHN0YXRpYyBMaXN0IGVkaXRvclBhZ2VTZWN0aW9uRmFjdG9yaWVzOwotCXByaXZhdGUgc3RhdGljIExpc3QgZWRpdG9yQWN0aW9uRmFjdG9yaWVzOwotCi0JLyoqCi0JICogUmV0dXJucyBhIExpc3Qgb2YgYWxsIGVkaXRvciBwYWdlIGZhY3RvcmllcwotCSAqCi0JICogQHJldHVybiBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRTZXJ2ZXJFZGl0b3JQYWdlRmFjdG9yaWVzKCkgewotCQlpZiAoZWRpdG9yUGFnZUZhY3RvcmllcyA9PSBudWxsKQotCQkJbG9hZEVkaXRvclBhZ2VGYWN0b3JpZXMoKTsKLQkJcmV0dXJuIGVkaXRvclBhZ2VGYWN0b3JpZXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIExpc3Qgb2YgYWxsIGVkaXRvciBwYWdlIHNlY3Rpb24gZmFjdG9yaWVzCi0JICoKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldFNlcnZlckVkaXRvclBhZ2VTZWN0aW9uRmFjdG9yaWVzKCkgewotCQlpZiAoZWRpdG9yUGFnZVNlY3Rpb25GYWN0b3JpZXMgPT0gbnVsbCkKLQkJCWxvYWRFZGl0b3JQYWdlU2VjdGlvbkZhY3RvcmllcygpOwotCQlyZXR1cm4gZWRpdG9yUGFnZVNlY3Rpb25GYWN0b3JpZXM7Ci0JfQotCi0JLyoqCi0JICogTG9hZCB0aGUgZWRpdG9yIHBhZ2UgZmFjdG9yeSBleHRlbnNpb24gcG9pbnQuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBsb2FkRWRpdG9yUGFnZUZhY3RvcmllcygpIHsKLQkJVHJhY2UudHJhY2UoVHJhY2UuQ09ORklHLCAiLT4tIExvYWRpbmcgLmVkaXRvclBhZ2VzIGV4dGVuc2lvbiBwb2ludCAtPi0iKTsKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2YgPSByZWdpc3RyeS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoU2VydmVyVUlQbHVnaW4uUExVR0lOX0lELCBTZXJ2ZXJVSVBsdWdpbi5FWFRFTlNJT05fRURJVE9SX1BBR0VTKTsKLQkJZWRpdG9yUGFnZUZhY3RvcmllcyA9IG5ldyBBcnJheUxpc3QoY2YubGVuZ3RoKTsKLQkJbG9hZEVkaXRvclBhZ2VGYWN0b3JpZXMoY2YpOwotCQlTZXJ2ZXJVSVBsdWdpbi5hZGRSZWdpc3RyeUxpc3RlbmVyKCk7Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLkNPTkZJRywgIi08LSBEb25lIGxvYWRpbmcgLmVkaXRvclBhZ2VzIGV4dGVuc2lvbiBwb2ludCAtPC0iKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkIHRoZSBlZGl0b3IgcGFnZSBmYWN0b3J5IGV4dGVuc2lvbiBwb2ludC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGxvYWRFZGl0b3JQYWdlRmFjdG9yaWVzKElDb25maWd1cmF0aW9uRWxlbWVudFtdIGNmKSB7Ci0JCWludCBzaXplID0gY2YubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJdHJ5IHsKLQkJCQllZGl0b3JQYWdlRmFjdG9yaWVzLmFkZChuZXcgU2VydmVyRWRpdG9yUGFydEZhY3RvcnkoY2ZbaV0pKTsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5DT05GSUcsICIgIExvYWRlZCBlZGl0b3JQYWdlOiAiICsgY2ZbaV0uZ2V0QXR0cmlidXRlKCJpZCIpKTsKLQkJCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiICBDb3VsZCBub3QgbG9hZCBlZGl0b3JQYWdlOiAiICsgY2ZbaV0uZ2V0QXR0cmlidXRlKCJpZCIpLCB0KTsKLQkJCX0KLQkJfQotCQkKLQkJLy8gc29ydCBwYWdlcwotCQlzb3J0T3JkZXJlZExpc3QoZWRpdG9yUGFnZUZhY3Rvcmllcyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGhhbmRsZUVkaXRvclBhZ2VGYWN0b3JpZXNEZWx0YShJRXh0ZW5zaW9uRGVsdGEgZGVsdGEpIHsKLQkJaWYgKGVkaXRvclBhZ2VGYWN0b3JpZXMgPT0gbnVsbCkgLy8gbm90IGxvYWRlZCB5ZXQKLQkJCXJldHVybjsKLQkJCi0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNmID0gZGVsdGEuZ2V0RXh0ZW5zaW9uKCkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCQotCQlpZiAoZGVsdGEuZ2V0S2luZCgpID09IElFeHRlbnNpb25EZWx0YS5BRERFRCkKLQkJCWxvYWRFZGl0b3JQYWdlRmFjdG9yaWVzKGNmKTsKLQkJZWxzZSB7Ci0JCQlpbnQgc2l6ZSA9IGVkaXRvclBhZ2VGYWN0b3JpZXMuc2l6ZSgpOwotCQkJU2VydmVyRWRpdG9yUGFydEZhY3RvcnlbXSBzZXBmID0gbmV3IFNlcnZlckVkaXRvclBhcnRGYWN0b3J5W3NpemVdOwotCQkJZWRpdG9yUGFnZUZhY3Rvcmllcy50b0FycmF5KHNlcGYpOwotCQkJaW50IHNpemUyID0gY2YubGVuZ3RoOwotCQkJCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgc2l6ZTI7IGorKykgewotCQkJCQlpZiAoc2VwZltpXS5nZXRJZCgpLmVxdWFscyhjZltqXS5nZXRBdHRyaWJ1dGUoImlkIikpKSB7Ci0JCQkJCQllZGl0b3JQYWdlRmFjdG9yaWVzLnJlbW92ZShzZXBmW2ldKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIExvYWQgdGhlIGVkaXRvciBwYWdlIHNlY3Rpb24gZmFjdG9yeSBleHRlbnNpb24gcG9pbnQuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBsb2FkRWRpdG9yUGFnZVNlY3Rpb25GYWN0b3JpZXMoKSB7Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLkNPTkZJRywgIi0+LSBMb2FkaW5nIC5lZGl0b3JQYWdlU2VjdGlvbnMgZXh0ZW5zaW9uIHBvaW50IC0+LSIpOwotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjZiA9IHJlZ2lzdHJ5LmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcihTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQsIFNlcnZlclVJUGx1Z2luLkVYVEVOU0lPTl9FRElUT1JfUEFHRV9TRUNUSU9OUyk7Ci0JCWVkaXRvclBhZ2VTZWN0aW9uRmFjdG9yaWVzID0gbmV3IEFycmF5TGlzdChjZi5sZW5ndGgpOwotCQlsb2FkRWRpdG9yUGFnZVNlY3Rpb25GYWN0b3JpZXMoY2YpOwotCQlTZXJ2ZXJVSVBsdWdpbi5hZGRSZWdpc3RyeUxpc3RlbmVyKCk7Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLkNPTkZJRywgIi08LSBEb25lIGxvYWRpbmcgLmVkaXRvclBhZ2VTZWN0aW9ucyBleHRlbnNpb24gcG9pbnQgLTwtIik7Ci0JfQotCi0JLyoqCi0JICogTG9hZCB0aGUgZWRpdG9yIHBhZ2Ugc2VjdGlvbiBmYWN0b3J5IGV4dGVuc2lvbiBwb2ludC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGxvYWRFZGl0b3JQYWdlU2VjdGlvbkZhY3RvcmllcyhJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjZikgewotCQlpbnQgc2l6ZSA9IGNmLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJZWRpdG9yUGFnZVNlY3Rpb25GYWN0b3JpZXMuYWRkKG5ldyBTZXJ2ZXJFZGl0b3JQYWdlU2VjdGlvbkZhY3RvcnkoY2ZbaV0pKTsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5DT05GSUcsICIgIExvYWRlZCBlZGl0b3JQYWdlU2VjdGlvbjogIiArIGNmW2ldLmdldEF0dHJpYnV0ZSgiaWQiKSk7Ci0JCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIiAgQ291bGQgbm90IGxvYWQgZWRpdG9yUGFnZVNlY3Rpb246ICIgKyBjZltpXS5nZXRBdHRyaWJ1dGUoImlkIiksIHQpOwotCQkJfQotCQl9Ci0JCQotCQkvLyBzb3J0IHNlY3Rpb25zCi0JCXNvcnRPcmRlcmVkTGlzdChlZGl0b3JQYWdlU2VjdGlvbkZhY3Rvcmllcyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGhhbmRsZUVkaXRvclBhZ2VTZWN0aW9uRmFjdG9yaWVzRGVsdGEoSUV4dGVuc2lvbkRlbHRhIGRlbHRhKSB7Ci0JCWlmIChlZGl0b3JQYWdlU2VjdGlvbkZhY3RvcmllcyA9PSBudWxsKSAvLyBub3QgbG9hZGVkIHlldAotCQkJcmV0dXJuOwotCQkKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2YgPSBkZWx0YS5nZXRFeHRlbnNpb24oKS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCi0JCWlmIChkZWx0YS5nZXRLaW5kKCkgPT0gSUV4dGVuc2lvbkRlbHRhLkFEREVEKQotCQkJbG9hZEVkaXRvclBhZ2VTZWN0aW9uRmFjdG9yaWVzKGNmKTsKLQkJZWxzZSB7Ci0JCQlpbnQgc2l6ZSA9IGVkaXRvclBhZ2VTZWN0aW9uRmFjdG9yaWVzLnNpemUoKTsKLQkJCVNlcnZlckVkaXRvclBhZ2VTZWN0aW9uRmFjdG9yeVtdIHNlcHMgPSBuZXcgU2VydmVyRWRpdG9yUGFnZVNlY3Rpb25GYWN0b3J5W3NpemVdOwotCQkJZWRpdG9yUGFnZVNlY3Rpb25GYWN0b3JpZXMudG9BcnJheShzZXBzKTsKLQkJCWludCBzaXplMiA9IGNmLmxlbmd0aDsKLQkJCQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHNpemUyOyBqKyspIHsKLQkJCQkJaWYgKHNlcHNbaV0uZ2V0SWQoKS5lcXVhbHMoY2Zbal0uZ2V0QXR0cmlidXRlKCJpZCIpKSkgewotCQkJCQkJZWRpdG9yUGFnZVNlY3Rpb25GYWN0b3JpZXMucmVtb3ZlKHNlcHNbaV0pOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIExpc3Qgb2YgYWxsIGVkaXRvciBhY3Rpb24gZmFjdG9yaWVzLgotCSAqCi0JICogQHJldHVybiBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRTZXJ2ZXJFZGl0b3JBY3Rpb25GYWN0b3JpZXMoKSB7Ci0JCWlmIChlZGl0b3JBY3Rpb25GYWN0b3JpZXMgPT0gbnVsbCkKLQkJCWxvYWRFZGl0b3JBY3Rpb25GYWN0b3JpZXMoKTsKLQkJcmV0dXJuIGVkaXRvckFjdGlvbkZhY3RvcmllczsKLQl9Ci0JCi0JLyoqCi0JICogTG9hZCB0aGUgZWRpdG9yIGFjdGlvbiBmYWN0b3JpZXMgZXh0ZW5zaW9uIHBvaW50LgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgbG9hZEVkaXRvckFjdGlvbkZhY3RvcmllcygpIHsKLQkJVHJhY2UudHJhY2UoVHJhY2UuQ09ORklHLCAiLT4tIExvYWRpbmcgLmVkaXRvckFjdGlvbnMgZXh0ZW5zaW9uIHBvaW50IC0+LSIpOwotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjZiA9IHJlZ2lzdHJ5LmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcihTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQsICJlZGl0b3JBY3Rpb25zIik7Ci0KLQkJaW50IHNpemUgPSBjZi5sZW5ndGg7Ci0JCWVkaXRvckFjdGlvbkZhY3RvcmllcyA9IG5ldyBBcnJheUxpc3Qoc2l6ZSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCWVkaXRvckFjdGlvbkZhY3Rvcmllcy5hZGQobmV3IFNlcnZlckVkaXRvckFjdGlvbkZhY3RvcnkoY2ZbaV0pKTsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5DT05GSUcsICIgIExvYWRlZCBlZGl0b3JBY3Rpb246ICIgKyBjZltpXS5nZXRBdHRyaWJ1dGUoImlkIikpOwotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICIgIENvdWxkIG5vdCBsb2FkIGVkaXRvckFjdGlvbjogIiArIGNmW2ldLmdldEF0dHJpYnV0ZSgiaWQiKSwgdCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIHNvcnQgcGFnZXMKLQkJc29ydE9yZGVyZWRMaXN0KGVkaXRvckFjdGlvbkZhY3Rvcmllcyk7Ci0JCVRyYWNlLnRyYWNlKFRyYWNlLkNPTkZJRywgIi08LSBEb25lIGxvYWRpbmcgLmVkaXRvckFjdGlvbnMgZXh0ZW5zaW9uIHBvaW50IC08LSIpOwotCX0KLQkKLQkvKioKLQkgKiBTb3J0IHRoZSBnaXZlbiBsaXN0IG9mIElPcmRlcmVkIGl0ZW1zIGludG8gaW5kZXhlZCBvcmRlci4gVGhpcyBtZXRob2QKLQkgKiBtb2RpZmllcyB0aGUgb3JpZ2luYWwgbGlzdCwgYnV0IHJldHVybnMgdGhlIHZhbHVlIGZvciBjb252ZW5pZW5jZS4KLQkgKgotCSAqIEBwYXJhbSBsaXN0IGphdmEudXRpbC5MaXN0Ci0JICogQHJldHVybiBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBzb3J0T3JkZXJlZExpc3QoTGlzdCBsaXN0KSB7Ci0JCWlmIChsaXN0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlpbnQgc2l6ZSA9IGxpc3Quc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemUgLSAxOyBpKyspIHsKLQkJCWZvciAoaW50IGogPSBpICsgMTsgaiA8IHNpemU7IGorKykgewotCQkJCUlPcmRlcmVkIGEgPSAoSU9yZGVyZWQpIGxpc3QuZ2V0KGkpOwotCQkJCUlPcmRlcmVkIGIgPSAoSU9yZGVyZWQpIGxpc3QuZ2V0KGopOwotCQkJCWlmIChhLmdldE9yZGVyKCkgPiBiLmdldE9yZGVyKCkpIHsKLQkJCQkJT2JqZWN0IHRlbXAgPSBhOwotCQkJCQlsaXN0LnNldChpLCBiKTsKLQkJCQkJbGlzdC5zZXQoaiwgdGVtcCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9lZGl0b3IvU2VydmVyRWRpdG9ySW5wdXQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2VkaXRvci9TZXJ2ZXJFZGl0b3JJbnB1dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTg2MWFjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2VkaXRvci9TZXJ2ZXJFZGl0b3JJbnB1dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5TZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5JbWFnZVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklNZW1lbnRvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQZXJzaXN0YWJsZUVsZW1lbnQ7Ci0vKioKLSAqIFRoZSBlZGl0b3IgaW5wdXQgZm9yIHNlcnZlciBjb25maWd1cmF0aW9ucyBhbmQgaW5zdGFuY2VzLiBUaGUKLSAqIGlucHV0IHBvaW50cyB0byBhIHJlc291cmNlIHRoYXQgaXMgZWl0aGVyIGFuIGluc3RhbmNlIG9yCi0gKiBjb25maWd1cmF0aW9uLgotICoKLSAqIDxwPkVkaXRvcnMgc3VwcG9ydGluZyB0aGlzIGVkaXRvciBpbnB1dCBzaG91bGQgdXNlIHRoZSBSZXNvdXJjZU1hbmFnZXIKLSAqIHRvIGxvYWQgdGhlaXIgb3duIGNvcHkgb2YgdGhlIHJlc291cmNlLiBFYWNoIGVkaXRvciBpcyByZXNwb25zaWJsZQotICogZm9yIG1hbmFnaW5nIHRoaXMgcmVzb3VyY2UgYW5kIG1ha2luZyBzdXJlIHRoYXQgb25seSBvbmUgY29weSBpcwotICogbG9hZGVkIGZyb20gZGlzayB3aGVuIG11bHRpcGxlIGVkaXRvcnMgYXJlIG9wZW5lZCBvbiB0aGUgc2FtZQotICogcmVzb3VyY2UuPC9wPgotICoKLSAqIDxwPldoZW4gdGhlIGVkaXRvciBzYXZlcyBiYWNrIHRvIHRoZSByZXNvdXJjZSwgdGhlIHNlcnZlciB0b29saW5nCi0gKiB3aWxsIG5vdGljZSB0aGUgY2hhbmdlIGFuZCByZWxvYWQgdGhlIG5ldyBjb25maWd1cmF0aW9uLjwvcD4KLSAqCi0gKiA8cD5FZGl0b3JzIHNob3VsZCBjYWxsIHNldEVkaXRpbmcocmVzb3VyY2UsIHRydWUpIHdoZW4gdGhlIGZpcnN0Ci0gKiBlZGl0b3Igb3BlbnMgb24gYSBwYXJ0aWN1bGFyIHJlc291cmNlLCBhbmQgc2V0RWRpdGluZyhyZXNvdXJjZSwKLSAqIGZhbHNlKSB3aGVuIHRoZSBsYXN0IGVkaXRvciBvbiBhIHJlc291cmNlIGNsb3Nlcy4gVGhpcyB3aWxsCi0gKiBlbnN1cmUgdGhhdCB0aGUgc2VydmVyIHRvb2xpbmcgZG9lcyBub3QgdHJ5IHRvIGVkaXQgdGhlIHJlc291cmNlCi0gKiBhbmQgY2F1c2UgY29uZmxpY3RpbmcgY2hhbmdlcyB3aGlsZSBhbiBlZGl0b3IgaXMgb3Blbi48L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJFZGl0b3JJbnB1dCBpbXBsZW1lbnRzIElTZXJ2ZXJFZGl0b3JJbnB1dCwgSVBlcnNpc3RhYmxlRWxlbWVudCB7Ci0JcHJpdmF0ZSBTdHJpbmcgc2VydmVySWQ7Ci0KLQkvKioKLQkgKiBTZXJ2ZXJFZGl0b3JJbnB1dCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBzZXJ2ZXJJZCBhIHNlcnZlciBpZAotCSAqLwotCXB1YmxpYyBTZXJ2ZXJFZGl0b3JJbnB1dChTdHJpbmcgc2VydmVySWQpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5zZXJ2ZXJJZCA9IHNlcnZlcklkOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZXJ2ZXIgaWQuCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNlcnZlcklkKCkgewotCQlyZXR1cm4gc2VydmVySWQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPYmplY3QjZXF1YWxzKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlpZiAodGhpcyA9PSBvYmopCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKCEob2JqIGluc3RhbmNlb2YgU2VydmVyRWRpdG9ySW5wdXQpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlTZXJ2ZXJFZGl0b3JJbnB1dCBvdGhlciA9IChTZXJ2ZXJFZGl0b3JJbnB1dCkgb2JqOwotCQlpZiAoc2VydmVySWQgPT0gbnVsbCkgewotCQkJaWYgKG90aGVyLnNlcnZlcklkICE9IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwkKLQkJfSBlbHNlIGlmICghc2VydmVySWQuZXF1YWxzKG90aGVyLnNlcnZlcklkKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBlZGl0b3IgaW5wdXQgZXhpc3RzLiAgCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgaXMgcHJpbWFyaWx5IHVzZWQgdG8gZGV0ZXJtaW5lIGlmIGFuIGVkaXRvciBpbnB1dCBzaG91bGQgCi0JICogYXBwZWFyIGluIHRoZSAiRmlsZSBNb3N0IFJlY2VudGx5IFVzZWQiIG1lbnUuICBBbiBlZGl0b3IgaW5wdXQgd2lsbCBhcHBlYXIgCi0JICogaW4gdGhlIGxpc3QgdW50aWwgdGhlIHJldHVybiB2YWx1ZSBvZiA8Y29kZT5leGlzdHM8L2NvZGU+IGJlY29tZXMgCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IG9yIGl0IGRyb3BzIG9mZiB0aGUgYm90dG9tIG9mIHRoZSBsaXN0LgotCSAqCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZWRpdG9yIGlucHV0IGV4aXN0czsgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICoJCW90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGV4aXN0cygpIHsKLQkJaWYgKHNlcnZlcklkICE9IG51bGwgJiYgU2VydmVyQ29yZS5maW5kU2VydmVyKHNlcnZlcklkKSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBvYmplY3Qgd2hpY2ggaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGdpdmVuIGNsYXNzCi0JICogYXNzb2NpYXRlZCB3aXRoIHRoaXMgb2JqZWN0LiBSZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IGlmCi0JICogbm8gc3VjaCBvYmplY3QgY2FuIGJlIGZvdW5kLgotCSAqCi0JICogQHBhcmFtIGFkYXB0ZXIgdGhlIGFkYXB0ZXIgY2xhc3MgdG8gbG9vayB1cAotCSAqIEByZXR1cm4gYSBvYmplY3QgY2FzdGFibGUgdG8gdGhlIGdpdmVuIGNsYXNzLCAKLQkgKiAgICBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIG9iamVjdCBkb2VzIG5vdAotCSAqICAgIGhhdmUgYW4gYWRhcHRlciBmb3IgdGhlIGdpdmVuIGNsYXNzCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJcmV0dXJuIFBsYXRmb3JtLmdldEFkYXB0ZXJNYW5hZ2VyKCkuZ2V0QWRhcHRlcih0aGlzLCBhZGFwdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBJRCBvZiBhbiBlbGVtZW50IGZhY3Rvcnkgd2hpY2ggY2FuIGJlIHVzZWQgdG8gcmVjcmVhdGUgCi0JICogdGhpcyBvYmplY3QuICBBbiBlbGVtZW50IGZhY3RvcnkgZXh0ZW5zaW9uIHdpdGggdGhpcyBJRCBtdXN0IGV4aXN0Ci0JICogd2l0aGluIHRoZSB3b3JrYmVuY2ggcmVnaXN0cnkuCi0JICogCi0JICogQHJldHVybiB0aGUgZWxlbWVudCBmYWN0b3J5IElECi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGYWN0b3J5SWQoKSB7Ci0JCXJldHVybiBTZXJ2ZXJFZGl0b3JJbnB1dEZhY3RvcnkuRkFDVE9SWV9JRDsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcigpIHsKLQkJcmV0dXJuIEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX1NFUlZFUik7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhpcyBlZGl0b3IgaW5wdXQgZm9yIGRpc3BsYXkgcHVycG9zZXMuCi0JICogPHA+Ci0JICogRm9yIGluc3RhbmNlLCBpZiB0aGUgZnVsbHkgcXVhbGlmaWVkIGlucHV0IG5hbWUgaXMKLQkgKiA8Y29kZT4iYVxiXE15RmlsZS5naWYiPC9jb2RlPiwgdGhlIHJldHVybiB2YWx1ZSB3b3VsZCBiZSBqdXN0Ci0JICogPGNvZGU+Ik15RmlsZS5naWYiPC9jb2RlPi4KLQkgKgotCSAqIEByZXR1cm4gdGhlIGZpbGUgbmFtZSBzdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCWlmIChzZXJ2ZXJJZCAhPSBudWxsKSB7Ci0JCQlJU2VydmVyIHNlcnZlciA9IFNlcnZlckNvcmUuZmluZFNlcnZlcihzZXJ2ZXJJZCk7Ci0JCQlpZiAoc2VydmVyICE9IG51bGwpCi0JCQkJcmV0dXJuIHNlcnZlci5nZXROYW1lKCk7Ci0JCQlyZXR1cm4gc2VydmVySWQ7Ci0JCX0KLQkJcmV0dXJuICIiOwotCX0KLQotCS8qCi0JICogUmV0dXJucyBhbiBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCB0byBzYXZlIHRoZSBzdGF0ZSBvZiB0aGlzIGVkaXRvciBpbnB1dC4KLQkgKgotCSAqIEByZXR1cm4gdGhlIHBlcnNpc3RhYmxlIGVsZW1lbnQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMgZWRpdG9yIGlucHV0Ci0JICogICBjYW5ub3QgYmUgcGVyc2lzdGVkCi0JICovCi0JcHVibGljIElQZXJzaXN0YWJsZUVsZW1lbnQgZ2V0UGVyc2lzdGFibGUoKSB7Ci0JCXJldHVybiB0aGlzOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VG9vbFRpcFRleHQoKSB7Ci0JCVN0cmluZyBzID0gbnVsbDsKLQkJaWYgKHNlcnZlcklkICE9IG51bGwpIHsKLQkJCUlTZXJ2ZXIgc2VydmVyID0gU2VydmVyQ29yZS5maW5kU2VydmVyKHNlcnZlcklkKTsKLQkJCWlmIChzZXJ2ZXIgIT0gbnVsbCkgewotCQkJCVNlcnZlciBzZXJ2ZXIyID0gKFNlcnZlcikgc2VydmVyOwotCQkJCWlmIChzZXJ2ZXIyLmdldEZpbGUoKSAhPSBudWxsKSB7Ci0JCQkJCXMgPSBzZXJ2ZXIyLmdldEZpbGUoKS5nZXRGdWxsUGF0aCgpLm1ha2VSZWxhdGl2ZSgpLnRvU3RyaW5nKCk7Ci0JCQkJCWlmIChzLnN0YXJ0c1dpdGgoIi8iKSkKLQkJCQkJCXMgPSBzLnN1YnN0cmluZygxKTsKLQkJCQl9IGVsc2UKLQkJCQkJcyA9IHNlcnZlci5nZXROYW1lKCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHMgPT0gbnVsbCkKLQkJCXMgPSAiIjsKLQkJcmV0dXJuIHM7Ci0JfQotCi0JLyoqCi0JICogU2F2ZXMgdGhlIHN0YXRlIG9mIGFuIGVsZW1lbnQgd2l0aGluIGEgbWVtZW50by4KLQkgKgotCSAqIEBwYXJhbSBtZW1lbnRvIHRoZSBzdG9yYWdlIGFyZWEgZm9yIGVsZW1lbnQgc3RhdGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlU3RhdGUoSU1lbWVudG8gbWVtZW50bykgewotCQlTZXJ2ZXJFZGl0b3JJbnB1dEZhY3Rvcnkuc2F2ZVN0YXRlKG1lbWVudG8sIHRoaXMpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9lZGl0b3IvU2VydmVyRWRpdG9ySW5wdXRGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9lZGl0b3IvU2VydmVyRWRpdG9ySW5wdXRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwYmJjNzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvZWRpdG9yL1NlcnZlckVkaXRvcklucHV0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi2gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFbGVtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTWVtZW50bzsKLS8qKgotICogVGhpcyBmYWN0b3J5IGlzIHVzZWQgaW4gdGhlIHBlcnNpc3RlbmNlIG9mIFNlcnZlclJlc291cmNlRWRpdG9ySW5wdXQKLSAqIGluc3RhbmNlcy4gVGhpcyBhbGxvd3MgdGhlIHVzZXIgdG8gY2xvc2UgdGhlIHdvcmtiZW5jaCB3aXRoIGFuCi0gKiBvcGVuIGVkaXRvciBhbmQgcmVvcGVuIHRvIHRoZSBzYW1lIGVkaXRvci4KLSAqLwotcHVibGljIGNsYXNzIFNlcnZlckVkaXRvcklucHV0RmFjdG9yeSBpbXBsZW1lbnRzIElFbGVtZW50RmFjdG9yeSB7Ci0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgRkFDVE9SWV9JRCA9ICJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmVkaXRvci5pbnB1dC5mYWN0b3J5IjsKLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBTRVJWRVJfSUQgPSAic2VydmVyLWlkIjsKLQotCS8qKgotCSAqIFNlcnZlckVkaXRvcklucHV0RmFjdG9yeSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBTZXJ2ZXJFZGl0b3JJbnB1dEZhY3RvcnkoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKgotCSAqIENyZWF0ZXMgZWRpdG9yIGlucHV0IGJhc2VkIG9uIHRoZSBzdGF0ZSBpbiB0aGUgbWVtZW50by4KLQkgKi8KLQlwdWJsaWMgSUFkYXB0YWJsZSBjcmVhdGVFbGVtZW50KElNZW1lbnRvIG1lbWVudG8pIHsKLQkJLy8gZ2V0IHRoZSByZXNvdXJjZSBuYW1lcwotCQlTdHJpbmcgc2VydmVySWQgPSBtZW1lbnRvLmdldFN0cmluZyhTRVJWRVJfSUQpOwotCQkKLQkJcmV0dXJuIG5ldyBTZXJ2ZXJFZGl0b3JJbnB1dChzZXJ2ZXJJZCk7Ci0JfQotCi0JLyoqCi0JICogU2F2ZXMgdGhlIHN0YXRlIG9mIGFuIGVsZW1lbnQgd2l0aGluIGEgbWVtZW50by4KLQkgKgotCSAqIEBwYXJhbSBtZW1lbnRvIHRoZSBzdG9yYWdlIGFyZWEgZm9yIGVsZW1lbnQgc3RhdGUKLQkgKiBAcGFyYW0gaW5wdXQgc2VydmVyIGVkaXRvciBpbnB1dAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzYXZlU3RhdGUoSU1lbWVudG8gbWVtZW50bywgU2VydmVyRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJaWYgKGlucHV0ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQkKLQkJaWYgKGlucHV0LmdldFNlcnZlcklkKCkgIT0gbnVsbCkKLQkJCW1lbWVudG8ucHV0U3RyaW5nKFNFUlZFUl9JRCwgaW5wdXQuZ2V0U2VydmVySWQoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2VkaXRvci9TZXJ2ZXJFZGl0b3JQYWdlU2VjdGlvbkZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2VkaXRvci9TZXJ2ZXJFZGl0b3JQYWdlU2VjdGlvbkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjA4YTI5MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9lZGl0b3IvU2VydmVyRWRpdG9yUGFnZVNlY3Rpb25GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmVkaXRvci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuVHJhY2U7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgU2VydmVyRWRpdG9yUGFnZVNlY3Rpb25GYWN0b3J5IGltcGxlbWVudHMgSVNlcnZlckVkaXRvclBhZ2VTZWN0aW9uRmFjdG9yeSB7Ci0JcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudDsKLQlwcml2YXRlIEV4cHJlc3Npb24gZkNvbnRleHR1YWxMYXVuY2hFeHByID0gbnVsbDsKLQotCS8qKgotCSAqIFNlcnZlckVkaXRvclBhZ2VTZWN0aW9uRmFjdG9yeSBjb25zdHJ1Y3Rvci4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCBhIGNvbmZpZ3VyYXRpb24gZWxlbWVudAotCSAqLwotCXB1YmxpYyBTZXJ2ZXJFZGl0b3JQYWdlU2VjdGlvbkZhY3RvcnkoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGdldENvbmZpZ3VyYXRpb25FbGVtZW50KCkgewotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpZCBvZiB0aGlzIGZhY3RvcnkuCi0JICoKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImlkIik7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIG9yZGVyLgotCSAqCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldE9yZGVyKCkgewotCQl0cnkgewotCQkJU3RyaW5nIG8gPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgib3JkZXIiKTsKLQkJCXJldHVybiBJbnRlZ2VyLnBhcnNlSW50KG8pOwotCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGluc2VydGlvbiBpZCBvZiB0aGlzIGZhY3RvcnkuCi0JICoKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEluc2VydGlvbklkKCkgewotCQlyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImluc2VydGlvbklkIik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpZHMgb2YgdGhlIHNlcnZlciByZXNvdXJjZSBmYWN0b3JpZXMgKHNwZWNpZmllZAotCSAqIHVzaW5nIEphdmEtaW1wb3J0IHN0eWxlKSB0aGF0IHRoaXMgcGFnZSBtYXkgc3VwcG9ydC4KLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmdbXQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRUeXBlSWRzKCkgewotCQl0cnkgewotCQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihlbGVtZW50LmdldEF0dHJpYnV0ZSgidHlwZUlkcyIpLCAiLCIpOwotCQkJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgewotCQkJCVN0cmluZyBzdHIgPSBzdC5uZXh0VG9rZW4oKTsKLQkJCQlpZiAoc3RyICE9IG51bGwgJiYgc3RyLmxlbmd0aCgpID4gMCkKLQkJCQkJbGlzdC5hZGQoc3RyLnRyaW0oKSk7Ci0JCQl9Ci0JCQlTdHJpbmdbXSBzID0gbmV3IFN0cmluZ1tsaXN0LnNpemUoKV07Ci0JCQlsaXN0LnRvQXJyYXkocyk7Ci0JCQlyZXR1cm4gczsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vVHJhY2UudHJhY2UoIkNvdWxkIG5vdCBnZXQgc2VydmVyIHJlc291cmNlIGZyb206ICIgKyBlbGVtZW50LmdldEF0dHJpYnV0ZSgic2VydmVyUmVzb3VyY2VzIikpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBJU2VydmVyRWRpdG9yUGFnZVNlY3Rpb25GYWN0b3J5I3N1cHBvcnRzVHlwZShTdHJpbmcpCi0JICovCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHNUeXBlKFN0cmluZyBpZCkgewotCQlpZiAoaWQgPT0gbnVsbCB8fCBpZC5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCVN0cmluZ1tdIHMgPSBnZXRUeXBlSWRzKCk7Ci0JCWlmIChzID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQlpbnQgc2l6ZSA9IHMubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJaWYgKHNbaV0uZW5kc1dpdGgoIioiKSkgewotCQkJCWlmIChpZC5sZW5ndGgoKSA+PSBzW2ldLmxlbmd0aCgpICYmIGlkLnN0YXJ0c1dpdGgoc1tpXS5zdWJzdHJpbmcoMCwgc1tpXS5sZW5ndGgoKSAtIDEpKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9IGVsc2UgaWYgKGlkLmVxdWFscyhzW2ldKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgSVNlcnZlckVkaXRvclBhZ2VTZWN0aW9uRmFjdG9yeSNzaG91bGRDcmVhdGVTZWN0aW9uKElTZXJ2ZXJXb3JraW5nQ29weSkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRDcmVhdGVTZWN0aW9uKElTZXJ2ZXJXb3JraW5nQ29weSBzZXJ2ZXIpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBpc0VuYWJsZWQoc2VydmVyKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGNhbGxpbmcgZGVsZWdhdGUiLCBlKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgSVNlcnZlckVkaXRvclBhZ2VTZWN0aW9uRmFjdG9yeSNjcmVhdGVTZWN0aW9uKCkKLQkgKi8KLQlwdWJsaWMgU2VydmVyRWRpdG9yU2VjdGlvbiBjcmVhdGVTZWN0aW9uKCkgewotCQl0cnkgewotCQkJcmV0dXJuIChTZXJ2ZXJFZGl0b3JTZWN0aW9uKSBlbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3QgY3JlYXRlIHNlcnZlciBlZGl0b3Igc2VjdGlvbiIsIHQpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGV4cHJlc3Npb24gdGhhdCByZXByZXNlbnRzIHRoZSBlbmFibGVtZW50IGxvZ2ljIGZvciB0aGUKLQkgKiBjb250ZXh0dWFsIGxhdW5jaCBlbGVtZW50IG9mIHRoaXMgbGF1bmNoIHNob3J0Y3V0IGRlc2NyaXB0aW9uIG9yCi0JICogPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4KLQkgKiBAcmV0dXJuIGFuIGV2YWx1YXRhYmxlIGV4cHJlc3Npb24gb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gaWYgdGhlIGNvbmZpZ3VyYXRpb24gZWxlbWVudCBjYW4ndCBiZQotCSAqICBjb252ZXJ0ZWQuIFJlYXNvbnMgaW5jbHVkZTogKGEpIG5vIGhhbmRsZXIgaXMgYXZhaWxhYmxlIHRvCi0JICogIGNvcGUgd2l0aCBhIGNlcnRhaW4gY29uZmlndXJhdGlvbiBlbGVtZW50IG9yIChiKSB0aGUgWE1MCi0JICogIGV4cHJlc3Npb24gdHJlZSBpcyBtYWxmb3JtZWQuCi0JICovCi0JcHVibGljIEV4cHJlc3Npb24gZ2V0Q29udGV4dHVhbExhdW5jaEVuYWJsZW1lbnRFeHByZXNzaW9uKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoZkNvbnRleHR1YWxMYXVuY2hFeHByID09IG51bGwpIHsKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzID0gZWxlbWVudC5nZXRDaGlsZHJlbihFeHByZXNzaW9uVGFnTmFtZXMuRU5BQkxFTUVOVCk7Ci0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgZW5hYmxlbWVudCA9IGVsZW1lbnRzLmxlbmd0aCA+IDAgPyBlbGVtZW50c1swXSA6IG51bGw7IAotCi0JCQlpZiAoZW5hYmxlbWVudCAhPSBudWxsKQotCQkJCWZDb250ZXh0dWFsTGF1bmNoRXhwciA9IEV4cHJlc3Npb25Db252ZXJ0ZXIuZ2V0RGVmYXVsdCgpLnBlcmZvcm0oZW5hYmxlbWVudCk7Ci0JCX0KLQkJcmV0dXJuIGZDb250ZXh0dWFsTGF1bmNoRXhwcjsKLQl9Ci0KLQkvKioKLQkgKiBFdmFsdWF0ZSB0aGUgZ2l2ZW4gZXhwcmVzc2lvbiB3aXRoaW4gdGhlIGdpdmVuIGNvbnRleHQgYW5kIHJldHVybgotCSAqIHRoZSByZXN1bHQuIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWZmIHJlc3VsdCBpcyBlaXRoZXIgVFJVRSBvciBOT1RfTE9BREVELgotCSAqIFRoaXMgYWxsb3dzIG9wdGltaXN0aWMgaW5jbHVzaW9uIG9mIHNob3J0Y3V0cyBiZWZvcmUgcGx1Z2lucyBhcmUgbG9hZGVkLgotCSAqIFJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGV4cCBpcyA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gZXhwIHRoZSBlbmFibGVtZW50IGV4cHJlc3Npb24gdG8gZXZhbHVhdGUgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAcGFyYW0gY29udGV4dCB0aGUgY29udGV4dCBvZiB0aGUgZXZhbHVhdGlvbi4gVXN1YWxseSwgdGhlCi0JICogIHVzZXIncyBzZWxlY3Rpb24uCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGV2YWx1YXRpbmcgdGhlIGV4cHJlc3Npb24KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBldmFsRW5hYmxlbWVudEV4cHJlc3Npb24oSUV2YWx1YXRpb25Db250ZXh0IGNvbnRleHQsIEV4cHJlc3Npb24gZXhwKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiAoZXhwICE9IG51bGwpID8gKChleHAuZXZhbHVhdGUoY29udGV4dCkpICE9IEV2YWx1YXRpb25SZXN1bHQuRkFMU0UpIDogZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIGVuYWJsZWQgZm9yIHRoZSBnaXZlbiBvYmplY3QuCi0JICogCi0JICogQHBhcmFtIG9iaiBhbiBvYmplY3QKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGVuYWJsZWQKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gaWYgYW55dGhpbmcgZ29lcyB3cm9uZwotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZChPYmplY3Qgb2JqKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChnZXRDb250ZXh0dWFsTGF1bmNoRW5hYmxlbWVudEV4cHJlc3Npb24oKSA9PSBudWxsKQotCQkJcmV0dXJuIHRydWU7Ci0JCUlFdmFsdWF0aW9uQ29udGV4dCBjb250ZXh0ID0gbmV3IEV2YWx1YXRpb25Db250ZXh0KG51bGwsIG9iaik7Ci0JCWNvbnRleHQuYWRkVmFyaWFibGUoInNlcnZlciIsIG9iaik7Ci0JCXJldHVybiBldmFsRW5hYmxlbWVudEV4cHJlc3Npb24oY29udGV4dCwgZ2V0Q29udGV4dHVhbExhdW5jaEVuYWJsZW1lbnRFeHByZXNzaW9uKCkpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiU2VydmVyRWRpdG9yU2VjdGlvbiBbIiArIGdldElkKCkgKyAiLCAiICsgZ2V0SW5zZXJ0aW9uSWQoKSArICIsICIgKyBnZXRPcmRlcigpICsgIl0iOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9lZGl0b3IvU2VydmVyRWRpdG9yUGFydEZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2VkaXRvci9TZXJ2ZXJFZGl0b3JQYXJ0RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzcxMjY4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2VkaXRvci9TZXJ2ZXJFZGl0b3JQYXJ0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuVHJhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgU2VydmVyRWRpdG9yUGFydEZhY3RvcnkgaW1wbGVtZW50cyBJU2VydmVyRWRpdG9yUGFydEZhY3RvcnkgewotCXByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQ7Ci0JcHJpdmF0ZSBFeHByZXNzaW9uIGZDb250ZXh0dWFsTGF1bmNoRXhwciA9IG51bGw7Ci0KLQkvKioKLQkgKiBTZXJ2ZXJFZGl0b3JQYXJ0RmFjdG9yeSBjb25zdHJ1Y3Rvci4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCBhIGNvbmZpZ3VyYXRpb24gZWxlbWVudAotCSAqLwotCXB1YmxpYyBTZXJ2ZXJFZGl0b3JQYXJ0RmFjdG9yeShJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcigpOwotCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnQoKSB7Ci0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGlkIG9mIHRoaXMgcGFydCBmYWN0b3J5LgotCSAqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJpZCIpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoaXMgcGFydCBmYWN0b3J5LiAKLQkgKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJuYW1lIik7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldEluc2VydGlvbklkcygpIHsKLQkJdHJ5IHsKLQkJCVN0cmluZyBpbnNlcnRpb25JZHMgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgiaW5zZXJ0aW9uSWRzIik7Ci0JCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlpZiAoaW5zZXJ0aW9uSWRzICE9IG51bGwgJiYgaW5zZXJ0aW9uSWRzLmxlbmd0aCgpID4gMCkgewotCQkJCVN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoaW5zZXJ0aW9uSWRzLCAiLCIpOwotCQkJCXdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQkJU3RyaW5nIHN0ciA9IHN0Lm5leHRUb2tlbigpOwotCQkJCQlpZiAoc3RyICE9IG51bGwgJiYgc3RyLmxlbmd0aCgpID4gMCkKLQkJCQkJCWxpc3QuYWRkKHN0ci50cmltKCkpOwotCQkJCX0KLQkJCX0KLQkJCVN0cmluZ1tdIHMgPSBuZXcgU3RyaW5nW2xpc3Quc2l6ZSgpXTsKLQkJCWxpc3QudG9BcnJheShzKTsKLQkJCXJldHVybiBzOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy9UcmFjZS50cmFjZSgiQ291bGQgbm90IGdldCBzZXJ2ZXIgcmVzb3VyY2UgZnJvbTogIiArIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJzZXJ2ZXJSZXNvdXJjZXMiKSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgSVNlcnZlckVkaXRvclBhcnRGYWN0b3J5I3N1cHBvcnRzSW5zZXJ0aW9uSWQoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzSW5zZXJ0aW9uSWQoU3RyaW5nIGlkKSB7Ci0JCWlmIChpZCA9PSBudWxsIHx8IGlkLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJU3RyaW5nW10gcyA9IGdldEluc2VydGlvbklkcygpOwotCQlpZiAocyA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJaW50IHNpemUgPSBzLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCWlmIChzW2ldLmVuZHNXaXRoKCIqIikpIHsKLQkJCQlpZiAoaWQubGVuZ3RoKCkgPj0gc1tpXS5sZW5ndGgoKSAmJiBpZC5zdGFydHNXaXRoKHNbaV0uc3Vic3RyaW5nKDAsIHNbaV0ubGVuZ3RoKCkgLSAxKSkpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfSBlbHNlIGlmIChpZC5lcXVhbHMoc1tpXSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG9yZGVyLgotCSAqCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldE9yZGVyKCkgewotCQl0cnkgewotCQkJU3RyaW5nIG8gPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgib3JkZXIiKTsKLQkJCXJldHVybiBJbnRlZ2VyLnBhcnNlSW50KG8pOwotCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgaWRzIG9mIHRoZSBzZXJ2ZXIgYW5kIHNlcnZlciBjb25maWd1cmF0aW9uIHR5cGUgaWRzIChzcGVjaWZpZWQKLQkgKiB1c2luZyBKYXZhLWltcG9ydCBzdHlsZSkgdGhhdCB0aGlzIHBhZ2UgbWF5IHN1cHBvcnQuCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nW10KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0VHlwZUlkcygpIHsKLQkJdHJ5IHsKLQkJCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCVN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoZWxlbWVudC5nZXRBdHRyaWJ1dGUoInR5cGVJZHMiKSwgIiwiKTsKLQkJCXdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQlTdHJpbmcgc3RyID0gc3QubmV4dFRva2VuKCk7Ci0JCQkJaWYgKHN0ciAhPSBudWxsICYmIHN0ci5sZW5ndGgoKSA+IDApCi0JCQkJCWxpc3QuYWRkKHN0ci50cmltKCkpOwotCQkJfQotCQkJU3RyaW5nW10gcyA9IG5ldyBTdHJpbmdbbGlzdC5zaXplKCldOwotCQkJbGlzdC50b0FycmF5KHMpOwotCQkJcmV0dXJuIHM7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvL1RyYWNlLnRyYWNlKCJDb3VsZCBub3QgZ2V0IHNlcnZlciByZXNvdXJjZSBmcm9tOiAiICsgZWxlbWVudC5nZXRBdHRyaWJ1dGUoInNlcnZlclJlc291cmNlcyIpKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgSVNlcnZlckVkaXRvclBhcnRGYWN0b3J5I3N1cHBvcnRzVHlwZShTdHJpbmcpCi0JICovCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHNUeXBlKFN0cmluZyBpZCkgewotCQlpZiAoaWQgPT0gbnVsbCB8fCBpZC5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCVN0cmluZ1tdIHMgPSBnZXRUeXBlSWRzKCk7Ci0JCWlmIChzID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQlpbnQgc2l6ZSA9IHMubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJaWYgKHNbaV0uZW5kc1dpdGgoIioiKSkgewotCQkJCWlmIChpZC5sZW5ndGgoKSA+PSBzW2ldLmxlbmd0aCgpICYmIGlkLnN0YXJ0c1dpdGgoc1tpXS5zdWJzdHJpbmcoMCwgc1tpXS5sZW5ndGgoKSAtIDEpKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9IGVsc2UgaWYgKGlkLmVxdWFscyhzW2ldKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJU2VydmVyRWRpdG9yUGFydEZhY3Rvcnkjc2hvdWxkQ3JlYXRlUGFnZShJU2VydmVyV29ya2luZ0NvcHkpCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkQ3JlYXRlUGFnZShJU2VydmVyV29ya2luZ0NvcHkgc2VydmVyKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gaXNFbmFibGVkKHNlcnZlcik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBjYWxsaW5nIGRlbGVnYXRlIiwgZSk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElTZXJ2ZXJFZGl0b3JQYXJ0RmFjdG9yeSNjcmVhdGVQYWdlKCkKLQkgKi8KLQlwdWJsaWMgSUVkaXRvclBhcnQgY3JlYXRlUGFnZSgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiAoSUVkaXRvclBhcnQpIGVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGNhbGxpbmcgZGVsZWdhdGUiLCBlKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYW4gZXhwcmVzc2lvbiB0aGF0IHJlcHJlc2VudHMgdGhlIGVuYWJsZW1lbnQgbG9naWMgZm9yIHRoZQotCSAqIGNvbnRleHR1YWwgbGF1bmNoIGVsZW1lbnQgb2YgdGhpcyBsYXVuY2ggc2hvcnRjdXQgZGVzY3JpcHRpb24gb3IKLQkgKiA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lLgotCSAqIEByZXR1cm4gYW4gZXZhbHVhdGFibGUgZXhwcmVzc2lvbiBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiB0aGUgY29uZmlndXJhdGlvbiBlbGVtZW50IGNhbid0IGJlCi0JICogIGNvbnZlcnRlZC4gUmVhc29ucyBpbmNsdWRlOiAoYSkgbm8gaGFuZGxlciBpcyBhdmFpbGFibGUgdG8KLQkgKiAgY29wZSB3aXRoIGEgY2VydGFpbiBjb25maWd1cmF0aW9uIGVsZW1lbnQgb3IgKGIpIHRoZSBYTUwKLQkgKiAgZXhwcmVzc2lvbiB0cmVlIGlzIG1hbGZvcm1lZC4KLQkgKi8KLQlwdWJsaWMgRXhwcmVzc2lvbiBnZXRDb250ZXh0dWFsTGF1bmNoRW5hYmxlbWVudEV4cHJlc3Npb24oKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChmQ29udGV4dHVhbExhdW5jaEV4cHIgPT0gbnVsbCkgewotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBlbGVtZW50LmdldENoaWxkcmVuKEV4cHJlc3Npb25UYWdOYW1lcy5FTkFCTEVNRU5UKTsKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBlbmFibGVtZW50ID0gZWxlbWVudHMubGVuZ3RoID4gMCA/IGVsZW1lbnRzWzBdIDogbnVsbDsgCi0KLQkJCWlmIChlbmFibGVtZW50ICE9IG51bGwpCi0JCQkJZkNvbnRleHR1YWxMYXVuY2hFeHByID0gRXhwcmVzc2lvbkNvbnZlcnRlci5nZXREZWZhdWx0KCkucGVyZm9ybShlbmFibGVtZW50KTsKLQkJfQotCQlyZXR1cm4gZkNvbnRleHR1YWxMYXVuY2hFeHByOwotCX0KLQkKLQkvKioKLQkgKiBFdmFsdWF0ZSB0aGUgZ2l2ZW4gZXhwcmVzc2lvbiB3aXRoaW4gdGhlIGdpdmVuIGNvbnRleHQgYW5kIHJldHVybgotCSAqIHRoZSByZXN1bHQuIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWZmIHJlc3VsdCBpcyBlaXRoZXIgVFJVRSBvciBOT1RfTE9BREVELgotCSAqIFRoaXMgYWxsb3dzIG9wdGltaXN0aWMgaW5jbHVzaW9uIG9mIHNob3J0Y3V0cyBiZWZvcmUgcGx1Z2lucyBhcmUgbG9hZGVkLgotCSAqIFJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGV4cCBpcyA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gZXhwIHRoZSBlbmFibGVtZW50IGV4cHJlc3Npb24gdG8gZXZhbHVhdGUgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAcGFyYW0gY29udGV4dCB0aGUgY29udGV4dCBvZiB0aGUgZXZhbHVhdGlvbi4gVXN1YWxseSwgdGhlCi0JICogIHVzZXIncyBzZWxlY3Rpb24uCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGV2YWx1YXRpbmcgdGhlIGV4cHJlc3Npb24KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBldmFsRW5hYmxlbWVudEV4cHJlc3Npb24oSUV2YWx1YXRpb25Db250ZXh0IGNvbnRleHQsIEV4cHJlc3Npb24gZXhwKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiAoZXhwICE9IG51bGwpID8gKChleHAuZXZhbHVhdGUoY29udGV4dCkpICE9IEV2YWx1YXRpb25SZXN1bHQuRkFMU0UpIDogZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIGVuYWJsZWQgZm9yIHRoZSBnaXZlbiBvYmplY3QuCi0JICogCi0JICogQHBhcmFtIG9iaiBhbiBvYmplY3QKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGVuYWJsZWQKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gaWYgYW55dGhpbmcgZ29lcyB3cm9uZwotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZChPYmplY3Qgb2JqKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChnZXRDb250ZXh0dWFsTGF1bmNoRW5hYmxlbWVudEV4cHJlc3Npb24oKSA9PSBudWxsKQotCQkJcmV0dXJuIHRydWU7Ci0JCUlFdmFsdWF0aW9uQ29udGV4dCBjb250ZXh0ID0gbmV3IEV2YWx1YXRpb25Db250ZXh0KG51bGwsIG9iaik7Ci0JCWNvbnRleHQuYWRkVmFyaWFibGUoInNlcnZlciIsIG9iaik7Ci0JCXJldHVybiBldmFsRW5hYmxlbWVudEV4cHJlc3Npb24oY29udGV4dCwgZ2V0Q29udGV4dHVhbExhdW5jaEVuYWJsZW1lbnRFeHByZXNzaW9uKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9lZGl0b3IvU2VydmVyRWRpdG9yUGFydElucHV0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9lZGl0b3IvU2VydmVyRWRpdG9yUGFydElucHV0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5MDQ1YjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvZWRpdG9yL1NlcnZlckVkaXRvclBhcnRJbnB1dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGVyc2lzdGFibGVFbGVtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmVkaXRvci5JU2VydmVyRWRpdG9yUGFydElucHV0OwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFNlcnZlckVkaXRvclBhcnRJbnB1dCBpbXBsZW1lbnRzIElTZXJ2ZXJFZGl0b3JQYXJ0SW5wdXQgewotCXByb3RlY3RlZCBJU2VydmVyV29ya2luZ0NvcHkgc2VydmVyOwotCXByb3RlY3RlZCBib29sZWFuIHNlcnZlclJlYWRPbmx5OwotCXByb3RlY3RlZCBTZXJ2ZXJSZXNvdXJjZUNvbW1hbmRNYW5hZ2VyIHNlcnZlckNvbW1hbmRNYW5hZ2VyOwotCQotCXB1YmxpYyBTZXJ2ZXJFZGl0b3JQYXJ0SW5wdXQoU2VydmVyUmVzb3VyY2VDb21tYW5kTWFuYWdlciBzZXJ2ZXJDb21tYW5kTWFuYWdlciwKLQkJCUlTZXJ2ZXJXb3JraW5nQ29weSBzZXJ2ZXIsICBib29sZWFuIHNlcnZlclJlYWRPbmx5KSB7Ci0JCQotCQl0aGlzLnNlcnZlciA9IHNlcnZlcjsKLQkJdGhpcy5zZXJ2ZXJSZWFkT25seSA9IHNlcnZlclJlYWRPbmx5OwotCQl0aGlzLnNlcnZlckNvbW1hbmRNYW5hZ2VyID0gc2VydmVyQ29tbWFuZE1hbmFnZXI7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuICItIjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRvb2xUaXBUZXh0KCkgewotCQlyZXR1cm4gIi0iOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGV4aXN0cygpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBJUGVyc2lzdGFibGVFbGVtZW50IGdldFBlcnNpc3RhYmxlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZXJ2ZXIgdG8gYmUgZWRpdGVkLgotCSAqCi0JICogQHJldHVybiBJU2VydmVyUmVzb3VyY2UKLQkgKi8KLQlwdWJsaWMgSVNlcnZlcldvcmtpbmdDb3B5IGdldFNlcnZlcigpIHsKLQkJcmV0dXJuIHNlcnZlcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNlcnZlciBpcyByZWFkLW9ubHkuCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXJ2ZXJSZWFkT25seSgpIHsKLQkJcmV0dXJuIHNlcnZlclJlYWRPbmx5OwotCX0KLQkKLQlwdWJsaWMgU2VydmVyUmVzb3VyY2VDb21tYW5kTWFuYWdlciBnZXRTZXJ2ZXJDb21tYW5kTWFuYWdlcigpIHsKLQkJcmV0dXJuIHNlcnZlckNvbW1hbmRNYW5hZ2VyOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIlNlcnZlckVkaXRvclBhcnRJbnB1dCBbIiArIHNlcnZlciArICJdIjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvZWRpdG9yL1NlcnZlclJlc291cmNlQ29tbWFuZE1hbmFnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL2VkaXRvci9TZXJ2ZXJSZXNvdXJjZUNvbW1hbmRNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjYTQzZjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvZWRpdG9yL1NlcnZlclJlc291cmNlQ29tbWFuZE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuSVVuZG9hYmxlT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLk1lc3NhZ2VzOwotLyoqCi0gKiBBIGNvbW1hbmQgbWFuYWdlciBmb3IgYSBzaW5nbGUgc2VydmVyIHJlc291cmNlLgotICovCi1wdWJsaWMgY2xhc3MgU2VydmVyUmVzb3VyY2VDb21tYW5kTWFuYWdlciB7Ci0JcHJvdGVjdGVkIFNlcnZlckVkaXRvciBlZGl0b3I7Ci0JcHJvdGVjdGVkIEdsb2JhbENvbW1hbmRNYW5hZ2VyIGNvbW1hbmRNYW5hZ2VyOwotCXByb3RlY3RlZCBTdHJpbmcgaWQ7Ci0KLQlwdWJsaWMgU2VydmVyUmVzb3VyY2VDb21tYW5kTWFuYWdlcihTZXJ2ZXJFZGl0b3IgZWRpdG9yLCBTdHJpbmcgaWQsIEdsb2JhbENvbW1hbmRNYW5hZ2VyIGNvbW1hbmRNYW5hZ2VyKSB7Ci0JCXRoaXMuZWRpdG9yID0gZWRpdG9yOwotCQl0aGlzLmNvbW1hbmRNYW5hZ2VyID0gY29tbWFuZE1hbmFnZXI7Ci0JCXRoaXMuaWQgPSBpZDsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNSZWFkT25seSgpIHsKLQkJcmV0dXJuIGNvbW1hbmRNYW5hZ2VyLmlzUmVhZE9ubHkoaWQpOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGUgdGhlIGdpdmVuIGNvbW1hbmQgYW5kIHBsYWNlIGl0IGluIHRoZSB1bmRvIHN0YWNrLgotCSAqIElmIHRoZSBjb21tYW5kIGNhbm5vdCBiZSB1bmRvbmUsIHRoZSB1c2VyIHdpbGwgYmUgbm90aWZlZAotCSAqIGJlZm9yZSBpdCBpcyBleGVjdXRlZC4KLQkgKgotCSAqIEBwYXJhbSBvcGVyYXRpb24gYW4gdW5kb2FibGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJVW5kb2FibGVPcGVyYXRpb24gb3BlcmF0aW9uKSB7Ci0JCWlmICghdmFsaWRhdGVFZGl0KCkpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKGNvbW1hbmRNYW5hZ2VyLmlzUmVhZE9ubHkoaWQpKSB7Ci0JCQl3YXJuUmVhZE9ubHkoKTsKLQkJCXJldHVybjsKLQkJfQotCQljb21tYW5kTWFuYWdlci5leGVjdXRlQ29tbWFuZChpZCwgb3BlcmF0aW9uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB3YXJuUmVhZE9ubHkoKSB7Ci0JCVN0cmluZyB0aXRsZSA9IE1lc3NhZ2VzLmVkaXRvclJlc291cmNlV2FyblRpdGxlOwotCQlTdHJpbmcgbWVzc2FnZSA9IE1lc3NhZ2VzLmVkaXRvclJlc291cmNlV2Fybk1lc3NhZ2U7Ci0JCQotCQlNZXNzYWdlRGlhbG9nLm9wZW5XYXJuaW5nKGVkaXRvci5nZXRFZGl0b3JTaXRlKCkuZ2V0U2hlbGwoKSwgdGl0bGUsIG1lc3NhZ2UpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlRWRpdCgpIHsKLQkJaWYgKGNvbW1hbmRNYW5hZ2VyLmlzRGlydHkoaWQpKQotCQkJcmV0dXJuIHRydWU7Ci0KLQkJSUZpbGVbXSBmaWxlcyA9IGNvbW1hbmRNYW5hZ2VyLmdldFJlYWRPbmx5RmlsZXMoaWQpOwotCQlpZiAoZmlsZXMubGVuZ3RoID09IDApCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJCi0JCUlTdGF0dXMgc3RhdHVzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnZhbGlkYXRlRWRpdChmaWxlcywgZWRpdG9yLmdldEVkaXRvclNpdGUoKS5nZXRTaGVsbCgpKTsKLQkJCi0JCWlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKSB7Ci0JCQkvLyBpbmZvcm0gdXNlcgotCQkJU3RyaW5nIG1lc3NhZ2UgPSBNZXNzYWdlcy5lZGl0b3JWYWxpZGF0ZUVkaXRGYWlsdXJlTWVzc2FnZTsKLQkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcihlZGl0b3IuZ2V0RWRpdG9yU2l0ZSgpLmdldFNoZWxsKCksIE1lc3NhZ2VzLmVycm9yRGlhbG9nVGl0bGUsIG1lc3NhZ2UsIHN0YXR1cyk7Ci0JCQkKLQkJCS8vIGNoYW5nZSB0byByZWFkLW9ubHkKLQkJCWNvbW1hbmRNYW5hZ2VyLnNldFJlYWRPbmx5KGlkLCB0cnVlKTsKLQkJCQotCQkJLy8gZG8gbm90IGV4ZWN1dGUgY29tbWFuZAotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCS8vIGNoZWNrIGZpbGUgdGltZXN0YW1wCi0JCUlTZXJ2ZXJBdHRyaWJ1dGVzIHNlcnZlcmZpbGUgPSBjb21tYW5kTWFuYWdlci5nZXRTZXJ2ZXJSZXNvdXJjZShpZCk7Ci0JCWlmIChjb21tYW5kTWFuYWdlci5oYXNDaGFuZ2VkKGlkKSkgewotCQkJaWYgKHNlcnZlcmZpbGUgaW5zdGFuY2VvZiBJU2VydmVyKQotCQkJCWVkaXRvci5wcm9tcHRSZWxvYWRTZXJ2ZXJGaWxlKGlkLCAoSVNlcnZlcldvcmtpbmdDb3B5KSBzZXJ2ZXJmaWxlKTsKLQkJfQotCQkKLQkJLy8gYWxsb3cgZWRpdAotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvZWRpdG9yL1N0YXR1c0xpbmVDb250cmlidXRpb25JdGVtLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9lZGl0b3IvU3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWEzNWVlYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9lZGl0b3IvU3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotoCogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0xhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklTdGF0dXNGaWVsZDsKLS8qKgotICogQ29udHJpYnV0aW9uIGl0ZW0gZm9yIHRoZSBzdGF0dXMgbGluZS4KLSAqLwotcHVibGljIGNsYXNzIFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtIGV4dGVuZHMgQ29udHJpYnV0aW9uSXRlbSBpbXBsZW1lbnRzIElTdGF0dXNGaWVsZCB7Ci0KLQlzdGF0aWMgY2xhc3MgU3RhdHVzTGluZUxhYmVsIGV4dGVuZHMgQ0xhYmVsIHsKLQkJCi0JCXByaXZhdGUgc3RhdGljIGludCBJTkRFTlQ9IDM7IC8vIGxlZnQgYW5kIHJpZ2h0IG1hcmdpbiB1c2VkIGluIENMYWJlbAotCQkKLQkJcHJpdmF0ZSBQb2ludCBmRml4ZWRTaXplOwotCQkKLQkJcHVibGljIFN0YXR1c0xpbmVMYWJlbChDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLQkJCXN1cGVyKHBhcmVudCwgc3R5bGUpOwotCQkJCi0JCQlHQyBnYz0gbmV3IEdDKHBhcmVudCk7Ci0JCQlnYy5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotCQkJUG9pbnQgZXh0ZW50PSBnYy50ZXh0RXh0ZW50KCJNTU1NTU1NTU0iKTsgLy8kTk9OLU5MUy0xJAotCQkJZ2MuZGlzcG9zZSgpOwotCQkJCi0JCQlmRml4ZWRTaXplPSBuZXcgUG9pbnQoZXh0ZW50LnggKyBJTkRFTlQgKiAyLCAxMCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBQb2ludCBjb21wdXRlU2l6ZShpbnQgd0hpbnQsIGludCBoSGludCwgYm9vbGVhbiBjaGFuZ2VkKSB7Ci0JCQlyZXR1cm4gZkZpeGVkU2l6ZTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBmVGV4dDsKLQlwcml2YXRlIEltYWdlIGZJbWFnZTsKLQlwcml2YXRlIFN0YXR1c0xpbmVMYWJlbCBmTGFiZWw7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpdGVtIHdpdGggdGhlIGdpdmVuIGlkLgotCSAqIAotCSAqIEBwYXJhbSBpZCB0aGUgaXRlbSdzIGlkCi0JICovCi0JU3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW0oU3RyaW5nIGlkKSB7Ci0JCXN1cGVyKGlkKTsKLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIElTdGF0dXNGaWVsZCNzZXRUZXh0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgdGV4dCkgewotCQlmVGV4dD0gdGV4dDsKLQkJaWYgKGZMYWJlbCAhPSBudWxsICYmICFmTGFiZWwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlmTGFiZWwuc2V0VGV4dChmVGV4dCk7Ci0JCX0JCQotCX0KLQkKLQkvKgotCSAqIEBzZWUgSVN0YXR1c0ZpZWxkI3NldEltYWdlKEltYWdlKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEltYWdlKEltYWdlIGltYWdlKSB7Ci0JCWZJbWFnZT0gaW1hZ2U7Ci0JCWlmIChmTGFiZWwgIT0gbnVsbCAmJiAhZkxhYmVsLmlzRGlzcG9zZWQoKSkgewotCQkJZkxhYmVsLnNldEltYWdlKGZJbWFnZSk7Ci0JCX0KLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIElDb250cmlidXRpb25JdGVtI2ZpbGwoQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGZpbGwoQ29tcG9zaXRlIHBhcmVudCkgewotCQlmTGFiZWw9IG5ldyBTdGF0dXNMaW5lTGFiZWwocGFyZW50LCBTV1QuU0hBRE9XX0lOKTsKLQkJZkxhYmVsLnNldERhdGEodGhpcyk7Ci0JCQotCQlpZiAoZlRleHQgIT0gbnVsbCkKLQkJCWZMYWJlbC5zZXRUZXh0KGZUZXh0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9lZGl0b3IvVGV4dEFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvZWRpdG9yL1RleHRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDU4YjViZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9lZGl0b3IvVGV4dEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuVHJhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVEVycm9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuQ2xpcGJvYXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVGV4dFRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotLyoqCi0gKiBUZXh0IGFjdGlvbnMgKGN1dCwgY29weSwgcGFzdGUpIGZvciB0aGUgV2ViIGJyb3dzZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXh0QWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKLQlwcm90ZWN0ZWQgRGlzcGxheSBkaXNwbGF5OwotCXByb3RlY3RlZCBDbGlwYm9hcmQgY2xpcGJvYXJkOwotCXByb3RlY3RlZCBieXRlIHR5cGU7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgQ1VUX0FDVElPTiA9IDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIENPUFlfQUNUSU9OID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgUEFTVEVfQUNUSU9OID0gMjsKLQkKLQkvKioKLQkgKiBUZXh0QWN0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHJvdGVjdGVkIFRleHRBY3Rpb24oRGlzcGxheSBkaXNwbGF5LCBieXRlIHR5cGUpIHsKLQkJc3VwZXIoIlRleHQgYWN0aW9uOiAiICsgdHlwZSk7Ci0JCXRoaXMuZGlzcGxheSA9IGRpc3BsYXk7Ci0JCWNsaXBib2FyZCA9IG5ldyBDbGlwYm9hcmQoZGlzcGxheSk7Ci0JCXRoaXMudHlwZSA9IHR5cGU7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRyb2wgZ2V0Q29udHJvbCgpIHsKLQkJQ29udHJvbCBjb250cm9sID0gZGlzcGxheS5nZXRGb2N1c0NvbnRyb2woKTsKLQkJcmV0dXJuIGNvbnRyb2w7Ci0JfQotCQotCXByb3RlY3RlZCBQb2ludCBnZXRDb250cm9sU2VsZWN0aW9uKCkgewotCQlDb250cm9sIGNvbnRyb2wgPSBnZXRDb250cm9sKCk7Ci0JCWlmIChjb250cm9sID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlpZiAoY29udHJvbCBpbnN0YW5jZW9mIFRleHQpIHsKLQkJCVRleHQgdGV4dCA9IChUZXh0KSBjb250cm9sOwotCQkJcmV0dXJuIHRleHQuZ2V0U2VsZWN0aW9uKCk7Ci0JCX0gZWxzZSBpZiAoY29udHJvbCBpbnN0YW5jZW9mIENvbWJvKSB7Ci0JCQlDb21ibyBjb21ibyA9IChDb21ibykgY29udHJvbDsKLQkJCXJldHVybiBjb21iby5nZXRTZWxlY3Rpb24oKTsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0Q29udHJvbFNlbGVjdGlvbihQb2ludCBzZWwpIHsKLQkJQ29udHJvbCBjb250cm9sID0gZ2V0Q29udHJvbCgpOwotCQlpZiAoY29udHJvbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWlmIChjb250cm9sIGluc3RhbmNlb2YgVGV4dCkgewotCQkJVGV4dCB0ZXh0ID0gKFRleHQpIGNvbnRyb2w7Ci0JCQl0ZXh0LnNldFNlbGVjdGlvbihzZWwpOwotCQl9IGVsc2UgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBDb21ibykgewotCQkJQ29tYm8gY29tYm8gPSAoQ29tYm8pIGNvbnRyb2w7Ci0JCQljb21iby5zZXRTZWxlY3Rpb24oc2VsKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldENvbnRyb2xUZXh0KCkgewotCQlDb250cm9sIGNvbnRyb2wgPSBnZXRDb250cm9sKCk7Ci0JCWlmIChjb250cm9sID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlpZiAoY29udHJvbCBpbnN0YW5jZW9mIFRleHQpIHsKLQkJCVRleHQgdGV4dCA9IChUZXh0KSBjb250cm9sOwotCQkJcmV0dXJuIHRleHQuZ2V0VGV4dCgpOwotCQl9IGVsc2UgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBDb21ibykgewotCQkJQ29tYm8gY29tYm8gPSAoQ29tYm8pIGNvbnRyb2w7Ci0JCQlyZXR1cm4gY29tYm8uZ2V0VGV4dCgpOwotCQl9IGVsc2UKLQkJCXJldHVybiBudWxsOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRDb250cm9sVGV4dChTdHJpbmcgdGV4dCkgewotCQlDb250cm9sIGNvbnRyb2wgPSBnZXRDb250cm9sKCk7Ci0JCWlmIChjb250cm9sID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBUZXh0KSB7Ci0JCQlUZXh0IHRleHQyID0gKFRleHQpIGNvbnRyb2w7Ci0JCQl0ZXh0Mi5zZXRUZXh0KHRleHQpOwotCQl9IGVsc2UgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBDb21ibykgewotCQkJQ29tYm8gY29tYm8gPSAoQ29tYm8pIGNvbnRyb2w7Ci0JCQljb21iby5zZXRUZXh0KHRleHQpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIENvcGllcyB0aGUgc2VsZWN0ZWQgdGV4dCB0byB0aGUgY2xpcGJvYXJkLiAgVGhlIHRleHQgd2lsbCBiZSBwdXQgaW4gdGhlIAotCSAqIGNsaXBib2FyZCBpbiBwbGFpbiB0ZXh0IGZvcm1hdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjb3B5KCkgewotCQlQb2ludCBzZWxlY3Rpb24gPSBnZXRDb250cm9sU2VsZWN0aW9uKCk7Ci0JCVN0cmluZyB0ZXh0ID0gZ2V0Q29udHJvbFRleHQoKTsKLQkJaWYgKHNlbGVjdGlvbiA9PSBudWxsIHx8IHRleHQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkKLQkJaW50IGxlbmd0aCA9IHNlbGVjdGlvbi55IC0gc2VsZWN0aW9uLng7Ci0JCWlmIChsZW5ndGggPiAwKSB7Ci0JCQlUZXh0VHJhbnNmZXIgcGxhaW5UZXh0VHJhbnNmZXIgPSBUZXh0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKTsKLQkJCXRyeSB7Ci0JCQkJY2xpcGJvYXJkLnNldENvbnRlbnRzKAotCQkJCQluZXcgU3RyaW5nW10geyB0ZXh0LnN1YnN0cmluZyhzZWxlY3Rpb24ueCwgc2VsZWN0aW9uLnkpIH0sIAotCQkJCQluZXcgVHJhbnNmZXJbXSB7IHBsYWluVGV4dFRyYW5zZmVyIH0pOwotCQkJfSBjYXRjaCAoU1dURXJyb3IgZXJyb3IpIHsKLQkJCQkvLyBDb3B5IHRvIGNsaXBib2FyZCBmYWlsZWQuIFRoaXMgaGFwcGVucyB3aGVuIGFub3RoZXIgYXBwbGljYXRpb24gCi0JCQkJLy8gaXMgYWNjZXNzaW5nIHRoZSBjbGlwYm9hcmQgd2hpbGUgd2UgY29weS4gSWdub3JlIHRoZSBlcnJvci4KLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBNb3ZlcyB0aGUgc2VsZWN0ZWQgdGV4dCB0byB0aGUgY2xpcGJvYXJkLiAgVGhlIHRleHQgd2lsbCBiZSBwdXQgaW4gdGhlIAotCSAqIGNsaXBib2FyZCBpbiBwbGFpbiB0ZXh0IGZvcm1hdCBhbmQgUlRGIGZvcm1hdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjdXQoKXsKLQkJUG9pbnQgc2VsZWN0aW9uID0gZ2V0Q29udHJvbFNlbGVjdGlvbigpOwotCQlpZiAoc2VsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKHNlbGVjdGlvbi55ID4gc2VsZWN0aW9uLngpIHsKLQkJCWNvcHkoKTsKLQkJCWRlbGV0ZSgpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIERlbGV0ZXMgdGhlIGNoYXJhY3RlciB0byB0aGUgcmlnaHQgb2YgdGhlIGNhcmV0LiBEZWxldGUgdGhlIHNlbGVjdGVkIHRleHQgaWYgYW55LgotCSAqLwotCXB1YmxpYyB2b2lkIGRlbGV0ZSgpIHsKLQkJUG9pbnQgc2VsZWN0aW9uID0gZ2V0Q29udHJvbFNlbGVjdGlvbigpOwotCQlTdHJpbmcgdGV4dCA9IGdldENvbnRyb2xUZXh0KCk7Ci0JCWlmIChzZWxlY3Rpb24gPT0gbnVsbCB8fCB0ZXh0ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCi0JCWlmIChzZWxlY3Rpb24ueCAhPSBzZWxlY3Rpb24ueSkgewotCQkJdGV4dCA9IHRleHQuc3Vic3RyaW5nKDAsIHNlbGVjdGlvbi54KSArIHRleHQuc3Vic3RyaW5nKHNlbGVjdGlvbi55KTsKLQkJCXNldENvbnRyb2xUZXh0KHRleHQpOwotCQkJc2V0Q29udHJvbFNlbGVjdGlvbihuZXcgUG9pbnQoc2VsZWN0aW9uLngsIHNlbGVjdGlvbi54KSk7Ci0JCX0KLQl9Ci0JCi0JLyoqIAotCSAqIFJlcGxhY2VzIHRoZSBzZWxlY3Rpb24gd2l0aCB0aGUgY2xpcGJvYXJkIHRleHQgb3IgaW5zZXJ0IHRoZSB0ZXh0IGF0IAotCSAqIHRoZSBjdXJyZW50IGNhcmV0IG9mZnNldCBpZiB0aGVyZSBpcyBubyBzZWxlY3Rpb24uIAotCSAqIElmIHRoZSB3aWRnZXQgaGFzIHRoZSBTV1QuU0lOR0xFIHN0eWxlIGFuZCB0aGUgY2xpcGJvYXJkIHRleHQgY29udGFpbnMKLQkgKiBtb3JlIHRoYW4gb25lIGxpbmUsIG9ubHkgdGhlIGZpcnN0IGxpbmUgd2l0aG91dCBsaW5lIGRlbGltaXRlcnMgaXMgCi0JICogaW5zZXJ0ZWQgaW4gdGhlIHdpZGdldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBwYXN0ZSgpIHsKLQkJVGV4dFRyYW5zZmVyIHRyYW5zZmVyID0gVGV4dFRyYW5zZmVyLmdldEluc3RhbmNlKCk7Ci0JCVBvaW50IHNlbGVjdGlvbiA9IGdldENvbnRyb2xTZWxlY3Rpb24oKTsKLQkJU3RyaW5nIHRleHQgPSBnZXRDb250cm9sVGV4dCgpOwotCQlpZiAoc2VsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQlTdHJpbmcgbmV3VGV4dCA9IChTdHJpbmcpIGNsaXBib2FyZC5nZXRDb250ZW50cyh0cmFuc2Zlcik7Ci0JCWlmIChuZXdUZXh0ICE9IG51bGwgJiYgbmV3VGV4dC5sZW5ndGgoKSA+IDApIHsKLQkJCWlmICh0ZXh0ID09IG51bGwpCi0JCQkJdGV4dCA9IG5ld1RleHQ7Ci0JCQllbHNlCi0JCQkJdGV4dCA9IHRleHQuc3Vic3RyaW5nKDAsIHNlbGVjdGlvbi54KSArIG5ld1RleHQgKyB0ZXh0LnN1YnN0cmluZyhzZWxlY3Rpb24ueSk7Ci0JCQlzZXRDb250cm9sVGV4dCh0ZXh0KTsKLQkKLQkJCS8vIHNldCB0aGUgc2VsZWN0aW9uIHRvIHRoZSBlbmQgb2YgdGhlIHBhc3RlCi0JCQlpbnQgeCA9IHNlbGVjdGlvbi54ICsgbmV3VGV4dC5sZW5ndGgoKTsKLQkJCXNldENvbnRyb2xTZWxlY3Rpb24obmV3IFBvaW50KHgsIHgpKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBFeGVjdXRlIHRoZSBhY3Rpb24uCi0JICovCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlpZiAoZGlzcGxheSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAodHlwZSA9PSBDVVRfQUNUSU9OKQotCQkJY3V0KCk7Ci0JCWVsc2UgaWYgKHR5cGUgPT0gQ09QWV9BQ1RJT04pCi0JCQljb3B5KCk7Ci0JCWVsc2UgaWYgKHR5cGUgPT0gUEFTVEVfQUNUSU9OKQotCQkJcGFzdGUoKTsKLQl9Ci0JCi0JLyoqCi0JICogVXBkYXRlIHRoZSBhY3Rpb25zIGVuYWJsZWQvZGlzYWJsZWQgc3RhdGUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlKCkgewotCQlpZiAoZ2V0Q29udHJvbCgpID09IG51bGwpIHsKLQkJCXNldEVuYWJsZWQoZmFsc2UpOwotCQkJcmV0dXJuOwotCQl9Ci0JCVBvaW50IHNlbGVjdGlvbiA9IGdldENvbnRyb2xTZWxlY3Rpb24oKTsKLQkJU3RyaW5nIHRleHQgPSBnZXRDb250cm9sVGV4dCgpOwotCi0JCXRyeSB7Ci0JCQlpZiAodHlwZSA9PSBDVVRfQUNUSU9OKQotCQkJCXNldEVuYWJsZWQodGV4dCAhPSBudWxsICYmIHRleHQubGVuZ3RoKCkgPiAwICYmIHNlbGVjdGlvbiAhPSBudWxsICYmIHNlbGVjdGlvbi54IDwgc2VsZWN0aW9uLnkpOwotCQkJZWxzZSBpZiAodHlwZSA9PSBDT1BZX0FDVElPTikKLQkJCQlzZXRFbmFibGVkKHRleHQgIT0gbnVsbCAmJiB0ZXh0Lmxlbmd0aCgpID4gMCAmJiBzZWxlY3Rpb24gIT0gbnVsbCAmJiBzZWxlY3Rpb24ueCA8IHNlbGVjdGlvbi55KTsKLQkJCWVsc2UgaWYgKHR5cGUgPT0gUEFTVEVfQUNUSU9OKSB7Ci0JCQkJQ29udHJvbCBjb250cm9sID0gZ2V0Q29udHJvbCgpOwotCQkJCWlmICghY29udHJvbC5pc0VuYWJsZWQoKSkgewotCQkJCQlzZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlpZiAoIShjb250cm9sIGluc3RhbmNlb2YgVGV4dCkpIHsKLQkJCQkJc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0KLQkJCQlUZXh0IHRleHQyID0gKFRleHQpIGNvbnRyb2w7Ci0JCQkJaWYgKCF0ZXh0Mi5nZXRFZGl0YWJsZSgpKSB7Ci0JCQkJCXNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVRleHRUcmFuc2ZlciB0cmFuc2ZlciA9IFRleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpOwotCQkJCVN0cmluZyBuZXdUZXh0ID0gKFN0cmluZykgY2xpcGJvYXJkLmdldENvbnRlbnRzKHRyYW5zZmVyKTsKLQkJCQlzZXRFbmFibGVkKG5ld1RleHQgIT0gbnVsbCAmJiBuZXdUZXh0Lmxlbmd0aCgpID4gMCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciB1cGRhdGluZyB0ZXh0IGFjdGlvbiIsIGUpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL0Nvbm5lY3RlZFVJRGVjb3JhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9Db25uZWN0ZWRVSURlY29yYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTdkMjUyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL0Nvbm5lY3RlZFVJRGVjb3JhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnByb3Zpc2lvbmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLkltYWdlUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKLQotcHVibGljIGNsYXNzIENvbm5lY3RlZFVJRGVjb3JhdG9yIGV4dGVuZHMgVUlEZWNvcmF0b3IgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIHNlcnZlclN0YXRlVW5tYW5hZ2VkID0gbmV3IFN0cmluZ1tdIHsKLQkJIiIsCi0JCU1lc3NhZ2VzLnZpZXdTdGF0dXNTdGFydGluZzQsCi0JCU1lc3NhZ2VzLnZpZXdTdGF0dXNTdGFydGVkMiwKLQkJTWVzc2FnZXMudmlld1N0YXR1c1N0b3BwaW5nNCwKLQkJTWVzc2FnZXMudmlld1N0YXR1c1N0b3BwZWQyfTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIHN0YXJ0aW5nVGV4dCA9IG5ldyBTdHJpbmdbXSB7Ci0JCU1lc3NhZ2VzLnZpZXdTdGF0dXNTdGFydGluZzEsCi0JCU1lc3NhZ2VzLnZpZXdTdGF0dXNTdGFydGluZzIsCi0JCU1lc3NhZ2VzLnZpZXdTdGF0dXNTdGFydGluZzN9OwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIHN0b3BwaW5nVGV4dCA9IG5ldyBTdHJpbmdbXSB7Ci0JCU1lc3NhZ2VzLnZpZXdTdGF0dXNTdG9wcGluZzEsCi0JCU1lc3NhZ2VzLnZpZXdTdGF0dXNTdG9wcGluZzIsCi0JCU1lc3NhZ2VzLnZpZXdTdGF0dXNTdG9wcGluZzN9OwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEltYWdlW10gc3RhcnRpbmdJbWFnZXMgPSBuZXcgSW1hZ2VbXSB7Ci0JCUltYWdlUmVzb3VyY2UuZ2V0SW1hZ2UoSW1hZ2VSZXNvdXJjZS5JTUdfU0VSVkVSX1NUQVRFX1NUQVJUSU5HXzEpLAotCQlJbWFnZVJlc291cmNlLmdldEltYWdlKEltYWdlUmVzb3VyY2UuSU1HX1NFUlZFUl9TVEFURV9TVEFSVElOR18yKSwKLQkJSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZShJbWFnZVJlc291cmNlLklNR19TRVJWRVJfU1RBVEVfU1RBUlRJTkdfMykKLQl9OwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEltYWdlW10gc3RvcHBpbmdJbWFnZXMgPSBuZXcgSW1hZ2VbXSB7Ci0JCUltYWdlUmVzb3VyY2UuZ2V0SW1hZ2UoSW1hZ2VSZXNvdXJjZS5JTUdfU0VSVkVSX1NUQVRFX1NUT1BQSU5HXzEpLAotCQlJbWFnZVJlc291cmNlLmdldEltYWdlKEltYWdlUmVzb3VyY2UuSU1HX1NFUlZFUl9TVEFURV9TVE9QUElOR18yKSwKLQkJSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZShJbWFnZVJlc291cmNlLklNR19TRVJWRVJfU1RBVEVfU1RPUFBJTkdfMikKLQl9OwotCi0JLyoqCi0JICogQHNlZSBVSURlY29yYXRvciNnZXRTdGF0ZUxhYmVsKGludCwgU3RyaW5nLCBpbnQpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTdGF0ZUxhYmVsKGludCBzdGF0ZSwgU3RyaW5nIG1vZGUsIGludCBjb3VudCkgewotCQlpZiAoc3RhdGUgPT0gSVNlcnZlci5TVEFURV9VTktOT1dOKQotCQkJcmV0dXJuICIiOwotCQllbHNlIGlmIChzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1NUQVJUSU5HKQotCQkJcmV0dXJuIHN0YXJ0aW5nVGV4dFtjb3VudF07Ci0JCWVsc2UgaWYgKHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfU1RPUFBJTkcpCi0JCQlyZXR1cm4gc3RvcHBpbmdUZXh0W2NvdW50XTsKLQkJZWxzZSBpZiAoc3RhdGUgPT0gSVNlcnZlci5TVEFURV9TVEFSVEVEKSB7Ci0JCQlpZiAoSUxhdW5jaE1hbmFnZXIuREVCVUdfTU9ERS5lcXVhbHMobW9kZSkpCi0JCQkJcmV0dXJuIE1lc3NhZ2VzLnZpZXdTdGF0dXNTdGFydGVkRGVidWc7Ci0JCQllbHNlIGlmIChJTGF1bmNoTWFuYWdlci5QUk9GSUxFX01PREUuZXF1YWxzKG1vZGUpKQotCQkJCXJldHVybiBNZXNzYWdlcy52aWV3U3RhdHVzU3RhcnRlZFByb2ZpbGU7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIE1lc3NhZ2VzLnZpZXdTdGF0dXNTdGFydGVkOwotCQl9IGVsc2UgaWYgKHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfU1RPUFBFRCkKLQkJCXJldHVybiBNZXNzYWdlcy52aWV3U3RhdHVzU3RvcHBlZDsKLQkJCi0JCXJldHVybiBzZXJ2ZXJTdGF0ZVVubWFuYWdlZFtzdGF0ZV07Ci0JfQotCi0JLyoqCi0JICogQHNlZSBVSURlY29yYXRvciNnZXRTdGF0ZUltYWdlKGludCwgU3RyaW5nLCBpbnQpCi0JICovCi0JcHVibGljIEltYWdlIGdldFN0YXRlSW1hZ2UoaW50IHN0YXRlLCBTdHJpbmcgbW9kZSwgaW50IGNvdW50KSB7Ci0JCWlmIChzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1VOS05PV04pCi0JCQlyZXR1cm4gbnVsbDsKLQkJZWxzZSBpZiAoc3RhdGUgPT0gSVNlcnZlci5TVEFURV9TVEFSVElORykKLQkJCXJldHVybiBzdGFydGluZ0ltYWdlc1tjb3VudF07Ci0JCWVsc2UgaWYgKHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfU1RPUFBJTkcpCi0JCQlyZXR1cm4gc3RvcHBpbmdJbWFnZXNbY291bnRdOwotCQllbHNlIGlmIChzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1NUT1BQRUQpCi0JCQlyZXR1cm4gSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZShJbWFnZVJlc291cmNlLklNR19TRVJWRVJfU1RBVEVfU1RPUFBFRCk7Ci0JCWVsc2UgeyAvL2lmIChzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1NUQVJURUQpIHsKLQkJCS8vU3RyaW5nIG1vZGUgPSBzZXJ2ZXIuZ2V0TW9kZSgpOwotCQkJaWYgKElMYXVuY2hNYW5hZ2VyLkRFQlVHX01PREUuZXF1YWxzKG1vZGUpKQotCQkJCXJldHVybiBJbWFnZVJlc291cmNlLmdldEltYWdlKEltYWdlUmVzb3VyY2UuSU1HX1NFUlZFUl9TVEFURV9TVEFSVEVEX0RFQlVHKTsKLQkJCWVsc2UgaWYgKElMYXVuY2hNYW5hZ2VyLlBST0ZJTEVfTU9ERS5lcXVhbHMobW9kZSkpCi0JCQkJcmV0dXJuIEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2UoSW1hZ2VSZXNvdXJjZS5JTUdfU0VSVkVSX1NUQVRFX1NUQVJURURfUFJPRklMRSk7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2UoSW1hZ2VSZXNvdXJjZS5JTUdfU0VSVkVSX1NUQVRFX1NUQVJURUQpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGNhblJlc3RhcnQoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0dXBBY3Rpb24oQWN0aW9uIGFjdGlvbiwgaW50IGFjdGlvbjIpIHsKLQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KE1lc3NhZ2VzLmFjdGlvblN0b3BUb29sVGlwMik7Ci0JCWFjdGlvbi5zZXRUZXh0KE1lc3NhZ2VzLmFjdGlvblN0b3AyKTsKLQkJYWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19FTENMX0RJU0NPTk5FQ1QpKTsKLQkJYWN0aW9uLnNldEhvdmVySW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX0NMQ0xfRElTQ09OTkVDVCkpOwotCQlhY3Rpb24uc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfRExDTF9ESVNDT05ORUNUKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL01hbmFnZWRVSURlY29yYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvTWFuYWdlZFVJRGVjb3JhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5MjA2YzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvTWFuYWdlZFVJRGVjb3JhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnByb3Zpc2lvbmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5JbWFnZVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBNYW5hZ2VkVUlEZWNvcmF0b3IgZXh0ZW5kcyBVSURlY29yYXRvciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gc2VydmVyU3RhdGVVbm1hbmFnZWQgPSBuZXcgU3RyaW5nW10gewotCQkiIiwKLQkJTWVzc2FnZXMudmlld1N0YXR1c1N0YXJ0aW5nNCwKLQkJTWVzc2FnZXMudmlld1N0YXR1c1N0YXJ0ZWQyLAotCQlNZXNzYWdlcy52aWV3U3RhdHVzU3RvcHBpbmc0LAotCQlNZXNzYWdlcy52aWV3U3RhdHVzU3RvcHBlZDJ9OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gc3RhcnRpbmdUZXh0ID0gbmV3IFN0cmluZ1tdIHsKLQkJTWVzc2FnZXMudmlld1N0YXR1c1N0YXJ0aW5nMSwKLQkJTWVzc2FnZXMudmlld1N0YXR1c1N0YXJ0aW5nMiwKLQkJTWVzc2FnZXMudmlld1N0YXR1c1N0YXJ0aW5nM307Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gc3RvcHBpbmdUZXh0ID0gbmV3IFN0cmluZ1tdIHsKLQkJTWVzc2FnZXMudmlld1N0YXR1c1N0b3BwaW5nMSwKLQkJTWVzc2FnZXMudmlld1N0YXR1c1N0b3BwaW5nMiwKLQkJTWVzc2FnZXMudmlld1N0YXR1c1N0b3BwaW5nM307Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW1hZ2VbXSBzdGFydGluZ0ltYWdlcyA9IG5ldyBJbWFnZVtdIHsKLQkJSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZShJbWFnZVJlc291cmNlLklNR19TRVJWRVJfU1RBVEVfU1RBUlRJTkdfMSksCi0JCUltYWdlUmVzb3VyY2UuZ2V0SW1hZ2UoSW1hZ2VSZXNvdXJjZS5JTUdfU0VSVkVSX1NUQVRFX1NUQVJUSU5HXzIpLAotCQlJbWFnZVJlc291cmNlLmdldEltYWdlKEltYWdlUmVzb3VyY2UuSU1HX1NFUlZFUl9TVEFURV9TVEFSVElOR18zKQotCX07Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW1hZ2VbXSBzdG9wcGluZ0ltYWdlcyA9IG5ldyBJbWFnZVtdIHsKLQkJSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZShJbWFnZVJlc291cmNlLklNR19TRVJWRVJfU1RBVEVfU1RPUFBJTkdfMSksCi0JCUltYWdlUmVzb3VyY2UuZ2V0SW1hZ2UoSW1hZ2VSZXNvdXJjZS5JTUdfU0VSVkVSX1NUQVRFX1NUT1BQSU5HXzIpLAotCQlJbWFnZVJlc291cmNlLmdldEltYWdlKEltYWdlUmVzb3VyY2UuSU1HX1NFUlZFUl9TVEFURV9TVE9QUElOR18yKQotCX07Ci0KLQkvKioKLQkgKiBAc2VlIFVJRGVjb3JhdG9yI2dldFN0YXRlTGFiZWwoaW50LCBTdHJpbmcsIGludCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0YXRlTGFiZWwoaW50IHN0YXRlLCBTdHJpbmcgbW9kZSwgaW50IGNvdW50KSB7Ci0JCWlmIChzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1VOS05PV04pCi0JCQlyZXR1cm4gIiI7Ci0JCWVsc2UgaWYgKHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfU1RBUlRJTkcpCi0JCQlyZXR1cm4gc3RhcnRpbmdUZXh0W2NvdW50XTsKLQkJZWxzZSBpZiAoc3RhdGUgPT0gSVNlcnZlci5TVEFURV9TVE9QUElORykKLQkJCXJldHVybiBzdG9wcGluZ1RleHRbY291bnRdOwotCQllbHNlIGlmIChzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1NUQVJURUQpIHsKLQkJCWlmIChJTGF1bmNoTWFuYWdlci5ERUJVR19NT0RFLmVxdWFscyhtb2RlKSkKLQkJCQlyZXR1cm4gTWVzc2FnZXMudmlld1N0YXR1c1N0YXJ0ZWREZWJ1ZzsKLQkJCWVsc2UgaWYgKElMYXVuY2hNYW5hZ2VyLlBST0ZJTEVfTU9ERS5lcXVhbHMobW9kZSkpCi0JCQkJcmV0dXJuIE1lc3NhZ2VzLnZpZXdTdGF0dXNTdGFydGVkUHJvZmlsZTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gTWVzc2FnZXMudmlld1N0YXR1c1N0YXJ0ZWQ7Ci0JCX0gZWxzZSBpZiAoc3RhdGUgPT0gSVNlcnZlci5TVEFURV9TVE9QUEVEKQotCQkJcmV0dXJuIE1lc3NhZ2VzLnZpZXdTdGF0dXNTdG9wcGVkOwotCQkKLQkJcmV0dXJuIHNlcnZlclN0YXRlVW5tYW5hZ2VkW3N0YXRlXTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFVJRGVjb3JhdG9yI2dldFN0YXRlSW1hZ2UoaW50LCBTdHJpbmcsIGludCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0U3RhdGVJbWFnZShpbnQgc3RhdGUsIFN0cmluZyBtb2RlLCBpbnQgY291bnQpIHsKLQkJaWYgKHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfVU5LTk9XTikKLQkJCXJldHVybiBudWxsOwotCQllbHNlIGlmIChzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1NUQVJUSU5HKQotCQkJcmV0dXJuIHN0YXJ0aW5nSW1hZ2VzW2NvdW50XTsKLQkJZWxzZSBpZiAoc3RhdGUgPT0gSVNlcnZlci5TVEFURV9TVE9QUElORykKLQkJCXJldHVybiBzdG9wcGluZ0ltYWdlc1tjb3VudF07Ci0JCWVsc2UgaWYgKHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfU1RPUFBFRCkKLQkJCXJldHVybiBJbWFnZVJlc291cmNlLmdldEltYWdlKEltYWdlUmVzb3VyY2UuSU1HX1NFUlZFUl9TVEFURV9TVE9QUEVEKTsKLQkJZWxzZSB7IC8vaWYgKHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfU1RBUlRFRCkgewotCQkJLy9TdHJpbmcgbW9kZSA9IHNlcnZlci5nZXRNb2RlKCk7Ci0JCQlpZiAoSUxhdW5jaE1hbmFnZXIuREVCVUdfTU9ERS5lcXVhbHMobW9kZSkpCi0JCQkJcmV0dXJuIEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2UoSW1hZ2VSZXNvdXJjZS5JTUdfU0VSVkVSX1NUQVRFX1NUQVJURURfREVCVUcpOwotCQkJZWxzZSBpZiAoSUxhdW5jaE1hbmFnZXIuUFJPRklMRV9NT0RFLmVxdWFscyhtb2RlKSkKLQkJCQlyZXR1cm4gSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZShJbWFnZVJlc291cmNlLklNR19TRVJWRVJfU1RBVEVfU1RBUlRFRF9QUk9GSUxFKTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZShJbWFnZVJlc291cmNlLklNR19TRVJWRVJfU1RBVEVfU1RBUlRFRCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE1vZHVsZU5hbWUoKSB7Ci0JCXJldHVybiAibW9kdWxlIjsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gY2FuUmVzdGFydCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL1B1Ymxpc2hlZFVJRGVjb3JhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9QdWJsaXNoZWRVSURlY29yYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGY2M2IwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL1B1Ymxpc2hlZFVJRGVjb3JhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnByb3Zpc2lvbmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5JbWFnZVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBQdWJsaXNoZWRVSURlY29yYXRvciBleHRlbmRzIFVJRGVjb3JhdG9yIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBzZXJ2ZXJTdGF0ZVVubWFuYWdlZCA9IG5ldyBTdHJpbmdbXSB7Ci0JCSIiLAotCQlNZXNzYWdlcy52aWV3U3RhdHVzU3RhcnRpbmc0LAotCQlNZXNzYWdlcy52aWV3U3RhdHVzU3RhcnRlZDIsCi0JCU1lc3NhZ2VzLnZpZXdTdGF0dXNTdG9wcGluZzQsCi0JCU1lc3NhZ2VzLnZpZXdTdGF0dXNTdG9wcGVkMn07Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBzdGFydGluZ1RleHQgPSBuZXcgU3RyaW5nW10gewotCQlNZXNzYWdlcy52aWV3U3RhdHVzU3RhcnRpbmcxLAotCQlNZXNzYWdlcy52aWV3U3RhdHVzU3RhcnRpbmcyLAotCQlNZXNzYWdlcy52aWV3U3RhdHVzU3RhcnRpbmczfTsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBzdG9wcGluZ1RleHQgPSBuZXcgU3RyaW5nW10gewotCQlNZXNzYWdlcy52aWV3U3RhdHVzU3RvcHBpbmcxLAotCQlNZXNzYWdlcy52aWV3U3RhdHVzU3RvcHBpbmcyLAotCQlNZXNzYWdlcy52aWV3U3RhdHVzU3RvcHBpbmczfTsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJbWFnZVtdIHN0YXJ0aW5nSW1hZ2VzID0gbmV3IEltYWdlW10gewotCQlJbWFnZVJlc291cmNlLmdldEltYWdlKEltYWdlUmVzb3VyY2UuSU1HX1NFUlZFUl9TVEFURV9TVEFSVElOR18xKSwKLQkJSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZShJbWFnZVJlc291cmNlLklNR19TRVJWRVJfU1RBVEVfU1RBUlRJTkdfMiksCi0JCUltYWdlUmVzb3VyY2UuZ2V0SW1hZ2UoSW1hZ2VSZXNvdXJjZS5JTUdfU0VSVkVSX1NUQVRFX1NUQVJUSU5HXzMpCi0JfTsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJbWFnZVtdIHN0b3BwaW5nSW1hZ2VzID0gbmV3IEltYWdlW10gewotCQlJbWFnZVJlc291cmNlLmdldEltYWdlKEltYWdlUmVzb3VyY2UuSU1HX1NFUlZFUl9TVEFURV9TVE9QUElOR18xKSwKLQkJSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZShJbWFnZVJlc291cmNlLklNR19TRVJWRVJfU1RBVEVfU1RPUFBJTkdfMiksCi0JCUltYWdlUmVzb3VyY2UuZ2V0SW1hZ2UoSW1hZ2VSZXNvdXJjZS5JTUdfU0VSVkVSX1NUQVRFX1NUT1BQSU5HXzIpCi0JfTsKLQotCS8qKgotCSAqIEBzZWUgVUlEZWNvcmF0b3IjZ2V0U3RhdGVMYWJlbChpbnQsIFN0cmluZywgaW50KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3RhdGVMYWJlbChpbnQgc3RhdGUsIFN0cmluZyBtb2RlLCBpbnQgY291bnQpIHsKLQkJaWYgKHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfVU5LTk9XTikKLQkJCXJldHVybiAiIjsKLQkJZWxzZSBpZiAoc3RhdGUgPT0gSVNlcnZlci5TVEFURV9TVEFSVElORykKLQkJCXJldHVybiBzdGFydGluZ1RleHRbY291bnRdOwotCQllbHNlIGlmIChzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1NUT1BQSU5HKQotCQkJcmV0dXJuIHN0b3BwaW5nVGV4dFtjb3VudF07Ci0JCWVsc2UgaWYgKHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfU1RBUlRFRCkgewotCQkJaWYgKElMYXVuY2hNYW5hZ2VyLkRFQlVHX01PREUuZXF1YWxzKG1vZGUpKQotCQkJCXJldHVybiBNZXNzYWdlcy52aWV3U3RhdHVzU3RhcnRlZERlYnVnOwotCQkJZWxzZSBpZiAoSUxhdW5jaE1hbmFnZXIuUFJPRklMRV9NT0RFLmVxdWFscyhtb2RlKSkKLQkJCQlyZXR1cm4gTWVzc2FnZXMudmlld1N0YXR1c1N0YXJ0ZWRQcm9maWxlOwotCQkJZWxzZQotCQkJCXJldHVybiBNZXNzYWdlcy52aWV3U3RhdHVzU3RhcnRlZDsKLQkJfSBlbHNlIGlmIChzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1NUT1BQRUQpCi0JCQlyZXR1cm4gTWVzc2FnZXMudmlld1N0YXR1c1N0b3BwZWQ7Ci0JCQotCQlyZXR1cm4gc2VydmVyU3RhdGVVbm1hbmFnZWRbc3RhdGVdOwotCX0KLQotCS8qKgotCSAqIEBzZWUgVUlEZWNvcmF0b3IjZ2V0U3RhdGVJbWFnZShpbnQsIFN0cmluZywgaW50KQotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRTdGF0ZUltYWdlKGludCBzdGF0ZSwgU3RyaW5nIG1vZGUsIGludCBjb3VudCkgewotCQlpZiAoc3RhdGUgPT0gSVNlcnZlci5TVEFURV9VTktOT1dOKQotCQkJcmV0dXJuIG51bGw7Ci0JCWVsc2UgaWYgKHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfU1RBUlRJTkcpCi0JCQlyZXR1cm4gc3RhcnRpbmdJbWFnZXNbY291bnRdOwotCQllbHNlIGlmIChzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1NUT1BQSU5HKQotCQkJcmV0dXJuIHN0b3BwaW5nSW1hZ2VzW2NvdW50XTsKLQkJZWxzZSBpZiAoc3RhdGUgPT0gSVNlcnZlci5TVEFURV9TVE9QUEVEKQotCQkJcmV0dXJuIEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2UoSW1hZ2VSZXNvdXJjZS5JTUdfU0VSVkVSX1NUQVRFX1NUT1BQRUQpOwotCQllbHNlIHsgLy9pZiAoc3RhdGUgPT0gSVNlcnZlci5TVEFURV9TVEFSVEVEKSB7Ci0JCQkvL1N0cmluZyBtb2RlID0gc2VydmVyLmdldE1vZGUoKTsKLQkJCWlmIChJTGF1bmNoTWFuYWdlci5ERUJVR19NT0RFLmVxdWFscyhtb2RlKSkKLQkJCQlyZXR1cm4gSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZShJbWFnZVJlc291cmNlLklNR19TRVJWRVJfU1RBVEVfU1RBUlRFRF9ERUJVRyk7Ci0JCQllbHNlIGlmIChJTGF1bmNoTWFuYWdlci5QUk9GSUxFX01PREUuZXF1YWxzKG1vZGUpKQotCQkJCXJldHVybiBJbWFnZVJlc291cmNlLmdldEltYWdlKEltYWdlUmVzb3VyY2UuSU1HX1NFUlZFUl9TVEFURV9TVEFSVEVEX1BST0ZJTEUpOwotCQkJZWxzZQotCQkJCXJldHVybiBJbWFnZVJlc291cmNlLmdldEltYWdlKEltYWdlUmVzb3VyY2UuSU1HX1NFUlZFUl9TVEFURV9TVEFSVEVEKTsKLQkJfQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TW9kdWxlTmFtZSgpIHsKLQkJcmV0dXJuICJtb2R1bGUiOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBjYW5SZXN0YXJ0KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL1NlcnZlckVkaXRvckFjdGlvbkZhY3RvcnlEZWxlZ2F0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvU2VydmVyRWRpdG9yQWN0aW9uRmFjdG9yeURlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2MGEzOTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvU2VydmVyRWRpdG9yQWN0aW9uRmFjdG9yeURlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwucHJvdmlzaW9uYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5lZGl0b3IuSVNlcnZlckVkaXRvclBhcnRJbnB1dDsKLS8qKgotICoKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2VydmVyRWRpdG9yQWN0aW9uRmFjdG9yeURlbGVnYXRlIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBlZGl0b3IgYWN0aW9uIHNob3VsZCBiZSB2aXNpYmxlIG9uIHRoZSBnaXZlbgotCSAqIHNlcnZlci4gVGhpcyBhbGxvd3MgYWN0aW9ucyB0byBiZSBmaWx0ZXJlZCBiYXNlZCBvbiB0aGUgc2VydmVyIHR5cGUKLQkgKiBvciBzZXJ2ZXIgYXR0cmlidXRlcy4KLQkgKiAKLQkgKiBAcGFyYW0gc2VydmVyIHRoZSBzZXJ2ZXIgYmVpbmcgZWRpdGVkCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgYWN0aW9uIHNob3VsZCBiZSBkaXNwbGF5ZWQsIG9yCi0JICogICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIHNob3VsZERpc3BsYXkoSVNlcnZlcldvcmtpbmdDb3B5IHNlcnZlcikgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gc2l0ZSB0aGUgZWRpdG9yIHNpdGUKLQkgKiBAcGFyYW0gaW5wdXQgdGhlIHNlcnZlciBlZGl0b3IgcG9ydCBpbnB1dAotCSAqIEByZXR1cm4gYW4gYWN0aW9uIHRoYXQgY2FuIGJlIHJ1biBhZ2FpbnN0IHRoZSBzZXJ2ZXIKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgSUFjdGlvbiBjcmVhdGVBY3Rpb24oSUVkaXRvclNpdGUgc2l0ZSwgSVNlcnZlckVkaXRvclBhcnRJbnB1dCBpbnB1dCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvVUlEZWNvcmF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL1VJRGVjb3JhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlOTk1MmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvVUlEZWNvcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5wcm92aXNpb25hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuSW1hZ2VSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLk1lc3NhZ2VzOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVUlEZWNvcmF0b3IgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFDVElPTl9TVE9QID0gMDsKLQotCS8qKgotCSAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBnaXZlbiBzdGF0ZS4KLQkgKgotCSAqIEBwYXJhbSBzdGF0ZSBhIHNlcnZlciBzdGF0ZQotCSAqIEBwYXJhbSBtb2RlIGEgbGF1bmNoIG1vZGUKLQkgKiBAcGFyYW0gY291bnQgYSB0aW1lciBjb3VudAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0U3RhdGVMYWJlbChpbnQgc3RhdGUsIFN0cmluZyBtb2RlLCBpbnQgY291bnQpOwotCi0JLyoqCi0JICogUmV0dXJucyBhbiBpbWFnZSByZXByZXNlbnRpbmcgdGhlIGdpdmVuIHN0YXRlLgotCSAqIAotCSAqIEBwYXJhbSBzdGF0ZSBhIHNlcnZlciBzdGF0ZQotCSAqIEBwYXJhbSBtb2RlIGEgbGF1bmNoIG1vZGUKLQkgKiBAcGFyYW0gY291bnQgYSB0aW1lciBjb3VudAotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuamZhY2UucGFydHMuSUltYWdlCi0JICovCi0JcHVibGljIGFic3RyYWN0IEltYWdlIGdldFN0YXRlSW1hZ2UoaW50IHN0YXRlLCBTdHJpbmcgbW9kZSwgaW50IGNvdW50KTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0TW9kdWxlTmFtZSgpIHsKLQkJcmV0dXJuICJtb2R1bGUiOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBjYW5SZXN0YXJ0KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldHVwQWN0aW9uKEFjdGlvbiBhY3Rpb24sIGludCBhY3Rpb24yKSB7Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dChNZXNzYWdlcy5hY3Rpb25TdG9wVG9vbFRpcCk7Ci0JCWFjdGlvbi5zZXRUZXh0KE1lc3NhZ2VzLmFjdGlvblN0b3ApOwotCQlhY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX0VMQ0xfU1RPUCkpOwotCQlhY3Rpb24uc2V0SG92ZXJJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfQ0xDTF9TVE9QKSk7Ci0JCWFjdGlvbi5zZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19ETENMX1NUT1ApKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvVUlEZWNvcmF0b3JNYW5hZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9VSURlY29yYXRvck1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU1ZmRjZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9VSURlY29yYXRvck1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5wcm92aXNpb25hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyVHlwZTsKLQotcHVibGljIGNsYXNzIFVJRGVjb3JhdG9yTWFuYWdlciB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBVSURlY29yYXRvciBkZWNvcmF0b3IgPSBuZXcgTWFuYWdlZFVJRGVjb3JhdG9yKCk7Ci0JCi0JcHVibGljIHN0YXRpYyBVSURlY29yYXRvciBnZXRVSURlY29yYXRvcihJU2VydmVyVHlwZSBzZXJ2ZXJUeXBlKSB7Ci0JCXJldHVybiBkZWNvcmF0b3I7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9BYnN0cmFjdFNlcnZlckFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL0Fic3RyYWN0U2VydmVyQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkNmFhZjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL0Fic3RyYWN0U2VydmVyQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlldy5zZXJ2ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLlNlbGVjdGlvblByb3ZpZGVyQWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci0vKioKLSAqIEFuIGFic3RyYWN0IGNsYXNzIGZvciBhbiBhY3Rpb24gb24gYSBzZXJ2ZXIuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFNlcnZlckFjdGlvbiBleHRlbmRzIFNlbGVjdGlvblByb3ZpZGVyQWN0aW9uIHsKLQlwdWJsaWMgU2hlbGwgc2hlbGw7Ci0KLQlwdWJsaWMgQWJzdHJhY3RTZXJ2ZXJBY3Rpb24oU2hlbGwgc2hlbGwsIElTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlciwgU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIoc2VsZWN0aW9uUHJvdmlkZXIsIG5hbWUpOwotCQl0aGlzLnNoZWxsID0gc2hlbGw7Ci0JCXNldEVuYWJsZWQoZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoaXMgc2VydmVyIGNhbiBjdXJyZW50bHkgYmUgYWN0ZWQgb24uCi0JICoKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKiBAcGFyYW0gc2VydmVyIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyCi0JICovCi0JcHVibGljIGFic3RyYWN0IGJvb2xlYW4gYWNjZXB0KElTZXJ2ZXIgc2VydmVyKTsKLQotCS8qKgotCSAqIFBlcmZvcm0gYWN0aW9uIG9uIHRoaXMgc2VydmVyLgotCSAqIEBwYXJhbSBzZXJ2ZXIgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXIKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBwZXJmb3JtKElTZXJ2ZXIgc2VydmVyKTsKLQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBnZXRTdHJ1Y3R1cmVkU2VsZWN0aW9uKCkuaXRlcmF0b3IoKTsKLQkJT2JqZWN0IG9iaiA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIElTZXJ2ZXIpIHsKLQkJCUlTZXJ2ZXIgc2VydmVyID0gKElTZXJ2ZXIpIG9iajsKLQkJCWlmIChhY2NlcHQoc2VydmVyKSkKLQkJCQlwZXJmb3JtKHNlcnZlcik7Ci0JCQlzZWxlY3Rpb25DaGFuZ2VkKGdldFN0cnVjdHVyZWRTZWxlY3Rpb24oKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgdGhlIGVuYWJsZSBzdGF0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gc2VsIGEgc2VsZWN0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwpIHsKLQkJaWYgKHNlbC5pc0VtcHR5KCkpIHsKLQkJCXNldEVuYWJsZWQoZmFsc2UpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWJvb2xlYW4gZW5hYmxlZCA9IGZhbHNlOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IHNlbC5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3Qgb2JqID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElTZXJ2ZXIpIHsKLQkJCQlJU2VydmVyIHNlcnZlciA9IChJU2VydmVyKSBvYmo7Ci0JCQkJaWYgKGFjY2VwdChzZXJ2ZXIpKQotCQkJCQllbmFibGVkID0gdHJ1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXNldEVuYWJsZWQoZW5hYmxlZCk7CQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvRGVsZXRlQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvRGVsZXRlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzOGU4YTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL0RlbGV0ZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXcuc2VydmVyczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlckNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5EZWxldGVTZXJ2ZXJEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLS8qKgotICogQWN0aW9uIGZvciBkZWxldGluZyBzZXJ2ZXIgcmVzb3VyY2VzLgotICovCi1wdWJsaWMgY2xhc3MgRGVsZXRlQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKLQlwcm90ZWN0ZWQgSVNlcnZlcltdIHNlcnZlcnM7Ci0JcHJvdGVjdGVkIElGb2xkZXJbXSBjb25maWdzOwotCXByb3RlY3RlZCBTaGVsbCBzaGVsbDsKLQotCS8qKgotCSAqIERlbGV0ZUFjdGlvbiBjb25zdHJ1Y3Rvci4KLQkgKiAKLQkgKiBAcGFyYW0gc2hlbGwgYSBzaGVsbAotCSAqIEBwYXJhbSBzZXJ2ZXIgYSBzZXJ2ZXIKLQkgKi8KLQlwdWJsaWMgRGVsZXRlQWN0aW9uKFNoZWxsIHNoZWxsLCBJU2VydmVyIHNlcnZlcikgewotCQl0aGlzKHNoZWxsLCBuZXcgSVNlcnZlcltdIHsgc2VydmVyIH0pOwotCX0KLQotCS8qKgotCSAqIERlbGV0ZUFjdGlvbiBjb25zdHJ1Y3Rvci4KLQkgKiAKLQkgKiBAcGFyYW0gc2hlbGwgYSBzaGVsbAotCSAqIEBwYXJhbSBzZXJ2ZXJzIGFuIGFycmF5IG9mIHNlcnZlcnMKLQkgKi8KLQlwdWJsaWMgRGVsZXRlQWN0aW9uKFNoZWxsIHNoZWxsLCBJU2VydmVyW10gc2VydmVycykgewotCQlzdXBlcihNZXNzYWdlcy5hY3Rpb25EZWxldGUpOwotCQl0aGlzLnNoZWxsID0gc2hlbGw7Ci0JCQotCQl0aGlzLnNlcnZlcnMgPSBzZXJ2ZXJzOwotCQkKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkKLQkJaW50IHNpemUgPSBzZXJ2ZXJzLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCWlmIChzZXJ2ZXJzW2ldLmdldFNlcnZlckNvbmZpZ3VyYXRpb24oKSAhPSBudWxsKQotCQkJCWxpc3QuYWRkKHNlcnZlcnNbaV0uZ2V0U2VydmVyQ29uZmlndXJhdGlvbigpKTsKLQkJfQotCQkKLQkJLy8gcmVtb3ZlIGNvbmZpZ3VyYXRpb25zIHRoYXQgYXJlIHN0aWxsIHJlZmVyZW5jZWQgYnkgb3RoZXIgc2VydmVycwotCQlJU2VydmVyW10gc2VydmVyczIgPSBTZXJ2ZXJDb3JlLmdldFNlcnZlcnMoKTsKLQkJaWYgKHNlcnZlcnMyICE9IG51bGwpIHsKLQkJCWludCBzaXplMiA9IHNlcnZlcnMyLmxlbmd0aDsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgc2l6ZTI7IGorKykgewotCQkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCQlpZiAoc2VydmVyc1tpXS5lcXVhbHMoc2VydmVyczJbal0pKQotCQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCX0KLQkJCQlpZiAoIWZvdW5kKSB7Ci0JCQkJCUlGb2xkZXIgZm9sZGVyID0gc2VydmVyczJbal0uZ2V0U2VydmVyQ29uZmlndXJhdGlvbigpOwotCQkJCQlpZiAoZm9sZGVyICE9IG51bGwgJiYgbGlzdC5jb250YWlucyhmb2xkZXIpKQotCQkJCQkJbGlzdC5yZW1vdmUoZm9sZGVyKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCWNvbmZpZ3MgPSBuZXcgSUZvbGRlcltsaXN0LnNpemUoKV07Ci0JCWxpc3QudG9BcnJheShjb25maWdzKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnZva2VkIHdoZW4gYW4gYWN0aW9uIG9jY3Vycy4gCi0JICovCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlEZWxldGVTZXJ2ZXJEaWFsb2cgZHNkID0gbmV3IERlbGV0ZVNlcnZlckRpYWxvZyhzaGVsbCwgc2VydmVycywgY29uZmlncyk7Ci0JCWRzZC5vcGVuKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9Nb2RpZnlNb2R1bGVzQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvTW9kaWZ5TW9kdWxlc0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGZhMjYxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9Nb2RpZnlNb2R1bGVzQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXcuc2VydmVyczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLkNsb3NhYmxlV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLk1vZGlmeU1vZHVsZXNXaXphcmQ7Ci0vKioKLSAqIEFjdGlvbiB0byBtb2RpZnkgdGhlIG1vZHVsZXMgb2YgYSBzZXJ2ZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2RpZnlNb2R1bGVzQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaFBhcnQgcGFydDsKLQlwcm90ZWN0ZWQgSVNlcnZlciBzZXJ2ZXI7Ci0KLQkvKioKLQkgKiBNb2RpZnlNb2R1bGVzQWN0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHNlcnZlciBhIHNlcnZlcgotCSAqLwotCXB1YmxpYyBNb2RpZnlNb2R1bGVzQWN0aW9uKElTZXJ2ZXIgc2VydmVyKSB7Ci0JCXN1cGVyKE1lc3NhZ2VzLmFjdGlvbk1vZGlmeU1vZHVsZXMpOwotCQl0aGlzLnNlcnZlciA9IHNlcnZlcjsKLQl9Ci0KLQkvKgotCSAqIE5vdGlmaWVzIHRoaXMgYWN0aW9uIGRlbGVnYXRlIHRoYXQgdGhlIHNlbGVjdGlvbiBpbiB0aGUgd29ya2JlbmNoIGhhcyBjaGFuZ2VkLiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlzZXJ2ZXIgPSBudWxsOwotCQkKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCU9iamVjdCBvYmogPSBzZWwuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgSVNlcnZlcikKLQkJCQlzZXJ2ZXIgPSAoSVNlcnZlcikgb2JqOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSU9iamVjdEFjdGlvbkRlbGVnYXRlI3NldEFjdGl2ZVBhcnQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24sIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZVBhcnQoSUFjdGlvbiBhY3Rpb24sIElXb3JrYmVuY2hQYXJ0IHRhcmdldFBhcnQpIHsKLQkJcGFydCA9IHRhcmdldFBhcnQ7Ci0JfQotCi0JLyoKLQkgKiBQZXJmb3JtcyB0aGlzIGFjdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJaWYgKHNlcnZlciA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkKLQkJU2hlbGwgc2hlbGwgPSBwYXJ0LmdldFNpdGUoKS5nZXRTaGVsbCgpOwotCQkvL2lmICghU2VydmVyVUlVdGlsLnByb21wdElmRGlydHkoc2hlbGwsIHNlcnZlcikpCi0JCS8vCXJldHVybjsKLQkJCi0JCS8vIGNoZWNrIGlmIHRoZXJlIGFyZSBhbnkgcHJvamVjdHMgZmlyc3QKLQkJLy8gZ2V0IGN1cnJlbnRseSBkZXBsb3llZCBtb2R1bGVzCi0JCUxpc3QgZGVwbG95ZWQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgbW9kdWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSU1vZHVsZVtdIGN1cnJlbnRNb2R1bGVzID0gc2VydmVyLmdldE1vZHVsZXMoKTsKLQkJaWYgKGN1cnJlbnRNb2R1bGVzICE9IG51bGwpIHsKLQkJCWludCBzaXplID0gY3VycmVudE1vZHVsZXMubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlkZXBsb3llZC5hZGQoY3VycmVudE1vZHVsZXNbaV0pOwotCQkJfQotCQl9Ci0KLQkJLy8gZ2V0IHJlbWFpbmluZyBtb2R1bGVzCi0JCUlNb2R1bGVbXSBtb2R1bGVzMiA9IFNlcnZlclV0aWwuZ2V0TW9kdWxlcyhzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpLmdldFJ1bnRpbWVUeXBlKCkuZ2V0TW9kdWxlVHlwZXMoKSk7Ci0JCWlmIChtb2R1bGVzICE9IG51bGwpIHsKLQkJCWludCBzaXplID0gbW9kdWxlczIubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlJTW9kdWxlIG1vZHVsZSA9IG1vZHVsZXMyW2ldOwotCQkJCWlmICghZGVwbG95ZWQuY29udGFpbnMobW9kdWxlKSkgewotCQkJCQlJU3RhdHVzIHN0YXR1cyA9IHNlcnZlci5jYW5Nb2RpZnlNb2R1bGVzKG5ldyBJTW9kdWxlW10geyBtb2R1bGUgfSwgbnVsbCwgbnVsbCk7Ci0JCQkJCWlmIChzdGF0dXMgIT0gbnVsbCAmJiBzdGF0dXMuZ2V0U2V2ZXJpdHkoKSAhPSBJU3RhdHVzLkVSUk9SKQotCQkJCQkJbW9kdWxlcy5hZGQobW9kdWxlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmIChkZXBsb3llZC5pc0VtcHR5KCkgJiYgbW9kdWxlcy5pc0VtcHR5KCkpIHsKLQkJCU1lc3NhZ2VEaWFsb2cub3BlbkluZm9ybWF0aW9uKHNoZWxsLCBNZXNzYWdlcy5kZWZhdWx0RGlhbG9nVGl0bGUsIE1lc3NhZ2VzLmRpYWxvZ0FkZFJlbW92ZU1vZHVsZXNOb25lKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCU1vZGlmeU1vZHVsZXNXaXphcmQgd2l6YXJkID0gbmV3IE1vZGlmeU1vZHVsZXNXaXphcmQoc2VydmVyKTsKLQkJQ2xvc2FibGVXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IENsb3NhYmxlV2l6YXJkRGlhbG9nKHNoZWxsLCB3aXphcmQpOwotCQlkaWFsb2cub3BlbigpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvTW9kdWxlU2VydmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvTW9kdWxlU2VydmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0NTI0NjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL01vZHVsZVNlcnZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXcuc2VydmVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotLyoqCi0gKiBBIHV0aWxpdHkgY2xhc3MgZm9yIHJlZmVyZW5jaW5nIGEgc2VydmVyIGFuZCBhIG1vZHVsZSBhdCB0aGUgc2FtZSB0aW1lLgotICovCi1wdWJsaWMgY2xhc3MgTW9kdWxlU2VydmVyIHsKLQkvKioKLQkgKiBUaGUgc2VydmVyCi0JICovCi0JcHVibGljIElTZXJ2ZXIgc2VydmVyOwotCQotCS8qKgotCSAqIFRoZSBtb2R1bGUKLQkgKi8KLQlwdWJsaWMgSU1vZHVsZVtdIG1vZHVsZTsKLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgbW9kdWxlLXNlcnZlci4KLQkgKiAKLQkgKiBAcGFyYW0gc2VydmVyIHRoZSBzZXJ2ZXIKLQkgKiBAcGFyYW0gbW9kdWxlIHRoZSBtb2R1bGUKLQkgKi8KLQlwdWJsaWMgTW9kdWxlU2VydmVyKElTZXJ2ZXIgc2VydmVyLCBJTW9kdWxlW10gbW9kdWxlKSB7Ci0JCXRoaXMuc2VydmVyID0gc2VydmVyOwotCQl0aGlzLm1vZHVsZSA9IG1vZHVsZTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBPYmplY3QjZXF1YWxzKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlpZiAoIShvYmogaW5zdGFuY2VvZiBNb2R1bGVTZXJ2ZXIpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJTW9kdWxlU2VydmVyIG1zID0gKE1vZHVsZVNlcnZlcikgb2JqOwotCQlpZiAoIW1zLnNlcnZlci5lcXVhbHMoc2VydmVyKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCWlmIChtcy5tb2R1bGUubGVuZ3RoICE9IG1vZHVsZS5sZW5ndGgpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQlpbnQgc2l6ZSA9IG1vZHVsZS5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlpZiAoIW1vZHVsZVtpXS5lcXVhbHMobXMubW9kdWxlW2ldKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgT2JqZWN0I3RvU3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCXNiLmFwcGVuZCgiU2VydmVyLU1vZHVsZSBbIiArIHNlcnZlci5nZXRJZCgpICsgIi8iICsgc2VydmVyLmdldE5hbWUoKSArICIsICgiKTsKLQkJCi0JCWludCBzaXplID0gbW9kdWxlLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCWlmIChpID4gMCkKLQkJCQlzYi5hcHBlbmQoIiwgIik7Ci0JCQlzYi5hcHBlbmQobW9kdWxlW2ldLmdldE5hbWUoKSk7Ci0JCX0KLQkJc2IuYXBwZW5kKCIpXSIpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvTW9kdWxlU2xvc2hBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9Nb2R1bGVTbG9zaEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2Y2OTBmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9Nb2R1bGVTbG9zaEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXcuc2VydmVyczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLkNsb3NhYmxlV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLk1vZGlmeU1vZHVsZXNXaXphcmQ7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgTW9kdWxlU2xvc2hBY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFNlcnZlckFjdGlvbiB7Ci0JcHVibGljIE1vZHVsZVNsb3NoQWN0aW9uKFNoZWxsIHNoZWxsLCBJU2VsZWN0aW9uUHJvdmlkZXIgc2VsZWN0aW9uUHJvdmlkZXIsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKHNoZWxsLCBzZWxlY3Rpb25Qcm92aWRlciwgbmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhpcyBzZXJ2ZXIgY2FuIGN1cnJlbnRseSBiZSBhY3RlZCBvbi4KLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKiBAcGFyYW0gc2VydmVyIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyCi0JICovCi0JcHVibGljIGJvb2xlYW4gYWNjZXB0KElTZXJ2ZXIgc2VydmVyKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm0gYWN0aW9uIG9uIHRoaXMgc2VydmVyLgotCSAqIEBwYXJhbSBzZXJ2ZXIgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBwZXJmb3JtKGZpbmFsIElTZXJ2ZXIgc2VydmVyKSB7Ci0JCWlmIChzZXJ2ZXIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCS8vaWYgKCFTZXJ2ZXJVSVV0aWwucHJvbXB0SWZEaXJ0eShzaGVsbCwgc2VydmVyKSkKLQkJLy8JcmV0dXJuOwotCQkKLQkJLy8gY2hlY2sgaWYgdGhlcmUgYXJlIGFueSBwcm9qZWN0cyBmaXJzdAotCQkvLyBnZXQgY3VycmVudGx5IGRlcGxveWVkIG1vZHVsZXMKLQkJTGlzdCBkZXBsb3llZCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBtb2R1bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlJTW9kdWxlW10gY3VycmVudE1vZHVsZXMgPSBzZXJ2ZXIuZ2V0TW9kdWxlcygpOwotCQlpZiAoY3VycmVudE1vZHVsZXMgIT0gbnVsbCkgewotCQkJaW50IHNpemUgPSBjdXJyZW50TW9kdWxlcy5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCWRlcGxveWVkLmFkZChjdXJyZW50TW9kdWxlc1tpXSk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBnZXQgcmVtYWluaW5nIG1vZHVsZXMKLQkJSU1vZHVsZVtdIG1vZHVsZXMyID0gU2VydmVyVXRpbC5nZXRNb2R1bGVzKHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkuZ2V0UnVudGltZVR5cGUoKS5nZXRNb2R1bGVUeXBlcygpKTsKLQkJaWYgKG1vZHVsZXMgIT0gbnVsbCkgewotCQkJaW50IHNpemUgPSBtb2R1bGVzMi5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCUlNb2R1bGUgbW9kdWxlID0gbW9kdWxlczJbaV07Ci0JCQkJaWYgKCFkZXBsb3llZC5jb250YWlucyhtb2R1bGUpKSB7Ci0JCQkJCUlTdGF0dXMgc3RhdHVzID0gc2VydmVyLmNhbk1vZGlmeU1vZHVsZXMobmV3IElNb2R1bGVbXSB7IG1vZHVsZSB9LCBudWxsLCBudWxsKTsKLQkJCQkJaWYgKHN0YXR1cyAhPSBudWxsICYmIHN0YXR1cy5nZXRTZXZlcml0eSgpICE9IElTdGF0dXMuRVJST1IpCi0JCQkJCQltb2R1bGVzLmFkZChtb2R1bGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJaWYgKGRlcGxveWVkLmlzRW1wdHkoKSAmJiBtb2R1bGVzLmlzRW1wdHkoKSkgewotCQkJTWVzc2FnZURpYWxvZy5vcGVuSW5mb3JtYXRpb24oc2hlbGwsIE1lc3NhZ2VzLmRlZmF1bHREaWFsb2dUaXRsZSwgTWVzc2FnZXMuZGlhbG9nQWRkUmVtb3ZlTW9kdWxlc05vbmUpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJTW9kaWZ5TW9kdWxlc1dpemFyZCB3aXphcmQgPSBuZXcgTW9kaWZ5TW9kdWxlc1dpemFyZChzZXJ2ZXIpOwotCQlDbG9zYWJsZVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgQ2xvc2FibGVXaXphcmREaWFsb2coc2hlbGwsIHdpemFyZCk7Ci0JCWRpYWxvZy5vcGVuKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9Nb25pdG9yU2VydmVyQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvTW9uaXRvclNlcnZlckFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjAyNjc1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9Nb25pdG9yU2VydmVyQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlldy5zZXJ2ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci0vKioKLSAqIEFjdGlvbiBmb3IgbW9uaXRvcmluZyBhIHNlcnZlci4KLSAqLwotcHVibGljIGNsYXNzIE1vbml0b3JTZXJ2ZXJBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotCXByb3RlY3RlZCBJU2VydmVyIHNlcnZlcjsKLQlwcm90ZWN0ZWQgU2hlbGwgc2hlbGw7Ci0KLQkvKioKLQkgKiBNb25pdG9yU2VydmVyQWN0aW9uIGNvbnN0cnVjdG9yLgotCSAqIAotCSAqIEBwYXJhbSBzaGVsbCBhIHNoZWxsCi0JICogQHBhcmFtIHNlcnZlciBhIHNlcnZlcgotCSAqLwotCXB1YmxpYyBNb25pdG9yU2VydmVyQWN0aW9uKFNoZWxsIHNoZWxsLCBJU2VydmVyIHNlcnZlcikgewotCQlzdXBlcihNZXNzYWdlcy5hY3Rpb25Nb25pdG9yUHJvcGVydGllcyk7Ci0JCXRoaXMuc2hlbGwgPSBzaGVsbDsKLQkJdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7Ci0JfQotCi0JLyoqCi0JICogSW52b2tlZCB3aGVuIGFuIGFjdGlvbiBvY2N1cnMuIAotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJTW9uaXRvclNlcnZlckRpYWxvZyBtc2QgPSBuZXcgTW9uaXRvclNlcnZlckRpYWxvZyhzaGVsbCwgc2VydmVyKTsKLQkJbXNkLm9wZW4oKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL01vbml0b3JTZXJ2ZXJEaWFsb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9Nb25pdG9yU2VydmVyRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmMmZiYzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL01vbml0b3JTZXJ2ZXJEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3LnNlcnZlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlld2Vycy5Nb25pdG9yQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLS8qKgotICogRGlhbG9nIHRoYXQgcHJvbXB0cyBhIHVzZXIgdG8gbW9uaXRvciBwb3J0cyBmcm9tIGEgZ2l2ZW4gc2VydmVyLgotICovCi1wdWJsaWMgY2xhc3MgTW9uaXRvclNlcnZlckRpYWxvZyBleHRlbmRzIERpYWxvZyB7Ci0JcHJvdGVjdGVkIElTZXJ2ZXIgc2VydmVyOwotCXByb3RlY3RlZCBNb25pdG9yQ29tcG9zaXRlIG1vbml0b3JDb21wOwotCi0JLyoqCi0JICogTW9uaXRvclNlcnZlckRpYWxvZyBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIEBwYXJhbSBwYXJlbnRTaGVsbCB0aGUgcGFyZW50IHNoZWxsCi0JICogQHBhcmFtIHNlcnZlciB0aGUgc2VydmVyCi0JICovCi0JcHVibGljIE1vbml0b3JTZXJ2ZXJEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIElTZXJ2ZXIgc2VydmVyKSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsKTsKLQkJdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7Ci0KLQkJc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICoKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBuZXdTaGVsbCkgewotCQlzdXBlci5jb25maWd1cmVTaGVsbChuZXdTaGVsbCk7Ci0JCW5ld1NoZWxsLnNldFRleHQoTWVzc2FnZXMuZGlhbG9nTW9uaXRvclRpdGxlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuT0tfSUQsIElEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsIHRydWUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyBjcmVhdGUgYSBjb21wb3NpdGUgd2l0aCBzdGFuZGFyZCBtYXJnaW5zIGFuZCBzcGFjaW5nCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSBjb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5WRVJUSUNBTF9NQVJHSU4pOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLkhPUklaT05UQUxfTUFSR0lOKTsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IGNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLlZFUlRJQ0FMX1NQQUNJTkcpOwotCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLkhPUklaT05UQUxfU1BBQ0lORyk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlkYXRhLndpZHRoSGludCA9IDU1MDsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0JCWNvbXBvc2l0ZS5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotCQkvL1dvcmtiZW5jaEhlbHAuc2V0SGVscChjb21wb3NpdGUsIENvbnRleHRJZHMuVEVSTUlOQVRFX1NFUlZFUl9ESUFMT0cpOwotCQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5XUkFQKTsKLQkJbGFiZWwuc2V0VGV4dChOTFMuYmluZChNZXNzYWdlcy5kaWFsb2dNb25pdG9yRGVzY3JpcHRpb24sIG5ldyBTdHJpbmdbXSB7IHNlcnZlci5nZXROYW1lKCkgfSApKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCW1vbml0b3JDb21wID0gbmV3IE1vbml0b3JDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9ORSwgbnVsbCwgc2VydmVyKTsKLQkJbW9uaXRvckNvbXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCkpOwotCQkKLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChjb21wb3NpdGUpOwotCQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvTW9uaXRvclNlcnZlclBvcnRBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9Nb25pdG9yU2VydmVyUG9ydEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjNiNjMwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9Nb25pdG9yU2VydmVyUG9ydEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXcuc2VydmVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuSU1vbml0b3JlZFNlcnZlclBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLklTZXJ2ZXJNb25pdG9yTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuU2VydmVyTW9uaXRvck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlRyYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0vKioKLSAqIE1vbml0b3IgYSBzZXJ2ZXIgcG9ydC4KLSAqLwotcHVibGljIGNsYXNzIE1vbml0b3JTZXJ2ZXJQb3J0QWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKLQlwcm90ZWN0ZWQgU2hlbGwgc2hlbGw7Ci0JcHJvdGVjdGVkIElTZXJ2ZXIgc2VydmVyOwotCXByb3RlY3RlZCBTZXJ2ZXJQb3J0IHBvcnQ7Ci0JcHJvdGVjdGVkIElNb25pdG9yZWRTZXJ2ZXJQb3J0IG1vbml0b3JlZFBvcnQ7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gY2hlY2tlZDsKLQkKLQlwdWJsaWMgTW9uaXRvclNlcnZlclBvcnRBY3Rpb24oU2hlbGwgc2hlbGwsIElTZXJ2ZXIgc2VydmVyLCBTZXJ2ZXJQb3J0IHBvcnQpIHsKLQkJc3VwZXIoTkxTLmJpbmQoTWVzc2FnZXMuYWN0aW9uTW9uaXRvclBvcnQsIG5ldyBTdHJpbmdbXSB7IHBvcnQuZ2V0UG9ydCgpICsgIiIsIHBvcnQuZ2V0TmFtZSgpIH0pKTsKLQkJCi0JCXRoaXMuc2hlbGwgPSBzaGVsbDsKLQkJdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7Ci0JCXRoaXMucG9ydCA9IHBvcnQ7Ci0JCQotCQlJTW9uaXRvcmVkU2VydmVyUG9ydFtdIG1zcHMgPSBTZXJ2ZXJNb25pdG9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldE1vbml0b3JlZFBvcnRzKHNlcnZlcik7Ci0JCWlmIChtc3BzICE9IG51bGwpIHsKLQkJCWludCBzaXplID0gbXNwcy5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCWlmIChwb3J0LmVxdWFscyhtc3BzW2ldLmdldFNlcnZlclBvcnQoKSkgJiYgLy8gbXNwc1tpXS5pc1N0YXJ0ZWQoKSAmJgotCQkJCQkJKG1zcHNbaV0uZ2V0Q29udGVudFR5cGVzKCkgPT0gbnVsbCB8fCBtc3BzW2ldLmdldENvbnRlbnRUeXBlcygpLmxlbmd0aCA9PSAwIHx8Ci0JCQkJCQkocG9ydC5nZXRDb250ZW50VHlwZXMoKSAhPSBudWxsICYmIG1zcHNbaV0uZ2V0Q29udGVudFR5cGVzKCkubGVuZ3RoID09IHBvcnQuZ2V0Q29udGVudFR5cGVzKCkubGVuZ3RoKSkpCi0JCQkJCW1vbml0b3JlZFBvcnQgPSBtc3BzW2ldOwotCQkJfQotCQl9Ci0KLQkJY2hlY2tlZCA9IG1vbml0b3JlZFBvcnQgIT0gbnVsbDsgLy8gJiYgbW9uaXRvcmVkUG9ydC5pc1N0YXJ0ZWQoKTsKLQkJc2V0Q2hlY2tlZChjaGVja2VkKTsKLQl9Ci0KLQkvKioKLQkgKiBFbmFibGUgb3IgZGlzYWJsZSBtb25pdG9yaW5nLgotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJSVNlcnZlck1vbml0b3JNYW5hZ2VyIHNtbSA9IFNlcnZlck1vbml0b3JNYW5hZ2VyLmdldEluc3RhbmNlKCk7Ci0JCWlmIChjaGVja2VkKSB7Ci0JCQlzbW0ucmVtb3ZlTW9uaXRvcihtb25pdG9yZWRQb3J0KTsKLQkJfSBlbHNlIHsKLQkJCWlmIChtb25pdG9yZWRQb3J0ID09IG51bGwpCi0JCQkJbW9uaXRvcmVkUG9ydCA9IHNtbS5jcmVhdGVNb25pdG9yKHNlcnZlciwgcG9ydCwgLTEsIG51bGwpOwotCQkJCi0JCQl0cnkgewotCQkJCXNtbS5zdGFydE1vbml0b3IobW9uaXRvcmVkUG9ydCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBtb25pdG9yIiwgZSk7Ci0JCQl9Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL09wZW5BY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9PcGVuQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0NDM1ZjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL09wZW5BY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotoCogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3LnNlcnZlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5TZXJ2ZXJVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlRyYWNlOwotLyoqCi0gKiAiT3BlbiIgbWVudSBhY3Rpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBPcGVuQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKLQlwcm90ZWN0ZWQgSVNlcnZlciBzZXJ2ZXI7Ci0KLQkvKioKLQkgKiBPcGVuQWN0aW9uIGNvbnN0cnVjdG9yLgotCSAqIAotCSAqIEBwYXJhbSBzZXJ2ZXIgYSBzZXJ2ZXIKLQkgKi8KLQlwdWJsaWMgT3BlbkFjdGlvbihJU2VydmVyIHNlcnZlcikgewotCQlzdXBlcihNZXNzYWdlcy5hY3Rpb25PcGVuKTsKLQkKLQkJdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7Ci0JCXNldEVuYWJsZWQoc2VydmVyLmdldFNlcnZlclR5cGUoKSAhPSBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBJbXBsZW1lbnRhdGlvbiBvZiBtZXRob2QgZGVmaW5lZCBvbiA8Y29kZT5JQWN0aW9uPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCXRyeSB7Ci0JCQlTZXJ2ZXJVSVBsdWdpbi5lZGl0U2VydmVyKHNlcnZlcik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBlZGl0aW5nIGVsZW1lbnQiLCBlKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvUHVibGlzaEFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL1B1Ymxpc2hBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg2Y2U4ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvUHVibGlzaEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi2gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXcuc2VydmVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlB1Ymxpc2hTZXJ2ZXJKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5TZXJ2ZXJVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLS8qKgotICogUHVibGlzaCB0byBhIHNlcnZlci4KLSAqLwotcHVibGljIGNsYXNzIFB1Ymxpc2hBY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFNlcnZlckFjdGlvbiB7Ci0JcHVibGljIFB1Ymxpc2hBY3Rpb24oU2hlbGwgc2hlbGwsIElTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlciwgU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIoc2hlbGwsIHNlbGVjdGlvblByb3ZpZGVyLCBuYW1lKTsKLQkJdHJ5IHsKLQkJCXNlbGVjdGlvbkNoYW5nZWQoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb25Qcm92aWRlci5nZXRTZWxlY3Rpb24oKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoaXMgc2VydmVyIGNhbiBjdXJyZW50bHkgYmUgYWN0ZWQgb24uCi0JICogQHJldHVybiBib29sZWFuCi0JICogQHBhcmFtIHNlcnZlciBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcgotCSAqLwotCXB1YmxpYyBib29sZWFuIGFjY2VwdChJU2VydmVyIHNlcnZlcikgewotCQlyZXR1cm4gc2VydmVyLmNhblB1Ymxpc2goKS5pc09LKCk7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybSBhY3Rpb24gb24gdGhpcyBzZXJ2ZXIuCi0JICogQHBhcmFtIHNlcnZlciBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcgotCSAqLwotCXB1YmxpYyB2b2lkIHBlcmZvcm0oZmluYWwgSVNlcnZlciBzZXJ2ZXIpIHsKLQkJaWYgKCFTZXJ2ZXJVSVBsdWdpbi5wcm9tcHRJZkRpcnR5KHNoZWxsLCBzZXJ2ZXIpKQotCQkJcmV0dXJuOwotCQkKLQkJaWYgKCFTZXJ2ZXJVSVBsdWdpbi5zYXZlRWRpdG9ycygpKQotCQkJcmV0dXJuOwotCi0JCVB1Ymxpc2hTZXJ2ZXJKb2IgcHVibGlzaEpvYiA9IG5ldyBQdWJsaXNoU2VydmVySm9iKHNlcnZlciwgSVNlcnZlci5QVUJMSVNIX0lOQ1JFTUVOVEFMLCBmYWxzZSk7Ci0JCXB1Ymxpc2hKb2Iuc2V0VXNlcih0cnVlKTsKLQkJcHVibGlzaEpvYi5zY2hlZHVsZSgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvUmVtb3ZlTW9kdWxlQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvUmVtb3ZlTW9kdWxlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyZmM3YmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL1JlbW92ZU1vZHVsZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXcuc2VydmVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLS8qKgotICogQWN0aW9uIGZvciByZW1vdmluZyBhIG1vZHVsZSBmcm9tIGEgc2VydmVyLgotICovCi1wdWJsaWMgY2xhc3MgUmVtb3ZlTW9kdWxlQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKLQlwcm90ZWN0ZWQgSVNlcnZlciBzZXJ2ZXI7Ci0JcHJvdGVjdGVkIElNb2R1bGUgbW9kdWxlOwotCXByb3RlY3RlZCBTaGVsbCBzaGVsbDsKLQotCS8qKgotCSAqIFJlbW92ZU1vZHVsZUFjdGlvbiBjb25zdHJ1Y3Rvci4KLQkgKiAKLQkgKiBAcGFyYW0gc2hlbGwgYSBzaGVsbAotCSAqIEBwYXJhbSBzZXJ2ZXIgYSBzZXJ2ZXIKLQkgKiBAcGFyYW0gbW9kdWxlIGEgbW9kdWxlCi0JICovCi0JcHVibGljIFJlbW92ZU1vZHVsZUFjdGlvbihTaGVsbCBzaGVsbCwgSVNlcnZlciBzZXJ2ZXIsIElNb2R1bGUgbW9kdWxlKSB7Ci0JCXN1cGVyKE1lc3NhZ2VzLmFjdGlvblJlbW92ZSk7Ci0JCXRoaXMuc2hlbGwgPSBzaGVsbDsKLQkJCi0JCXRoaXMuc2VydmVyID0gc2VydmVyOwotCQl0aGlzLm1vZHVsZSA9IG1vZHVsZTsKLQl9Ci0KLQkvKioKLQkgKiBJbnZva2VkIHdoZW4gYW4gYWN0aW9uIG9jY3Vycy4gCi0JICovCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlpZiAoTWVzc2FnZURpYWxvZy5vcGVuQ29uZmlybShzaGVsbCwgTWVzc2FnZXMuZGVmYXVsdERpYWxvZ1RpdGxlLCBNZXNzYWdlcy5kaWFsb2dSZW1vdmVNb2R1bGVDb25maXJtKSkgewotCQkJdHJ5IHsKLQkJCQlJU2VydmVyV29ya2luZ0NvcHkgd2MgPSBzZXJ2ZXIuY3JlYXRlV29ya2luZ0NvcHkoKTsKLQkJCQl3Yy5tb2RpZnlNb2R1bGVzKG51bGwsIG5ldyBJTW9kdWxlW10geyBtb2R1bGUgfSwgbnVsbCk7Ci0JCQkJd2Muc2F2ZSh0cnVlLCBudWxsKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL1Jlc3RhcnRBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9SZXN0YXJ0QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNTkxZjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL1Jlc3RhcnRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotoCogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3LnNlcnZlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5SZXN0YXJ0U2VydmVySm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuU2VydmVyVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5UcmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLlVJRGVjb3JhdG9yTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLS8qKgotICogUmVzdGFydCBhIHNlcnZlci4KLSAqLwotcHVibGljIGNsYXNzIFJlc3RhcnRBY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFNlcnZlckFjdGlvbiB7Ci0JcHJvdGVjdGVkIFN0cmluZyBtb2RlOwotCi0JcHVibGljIFJlc3RhcnRBY3Rpb24oU2hlbGwgc2hlbGwsIElTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlciwgU3RyaW5nIG5hbWUpIHsKLQkJdGhpcyhzaGVsbCwgc2VsZWN0aW9uUHJvdmlkZXIsIG5hbWUsIG51bGwpOwotCX0KLQotCXB1YmxpYyBSZXN0YXJ0QWN0aW9uKFNoZWxsIHNoZWxsLCBJU2VsZWN0aW9uUHJvdmlkZXIgc2VsZWN0aW9uUHJvdmlkZXIsIFN0cmluZyBuYW1lLCBTdHJpbmcgbW9kZSkgewotCQlzdXBlcihzaGVsbCwgc2VsZWN0aW9uUHJvdmlkZXIsIG5hbWUpOwotCQl0cnkgewotCQkJc2VsZWN0aW9uQ2hhbmdlZCgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvblByb3ZpZGVyLmdldFNlbGVjdGlvbigpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCXRoaXMubW9kZSA9IG1vZGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhpcyBzZXJ2ZXIgY2FuIGN1cnJlbnRseSBiZSBhY3RlZCBvbi4KLQkgKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqIEBwYXJhbSBzZXJ2ZXIgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXIKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoSVNlcnZlciBzZXJ2ZXIpIHsKLQkJU3RyaW5nIG1vZGUyID0gbW9kZTsKLQkJaWYgKG1vZGUyID09IG51bGwpCi0JCQltb2RlMiA9IHNlcnZlci5nZXRNb2RlKCk7Ci0JCXJldHVybiBzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpICE9IG51bGwgJiYgVUlEZWNvcmF0b3JNYW5hZ2VyLmdldFVJRGVjb3JhdG9yKHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkpLmNhblJlc3RhcnQoKSAmJiBzZXJ2ZXIuY2FuUmVzdGFydChtb2RlMikuaXNPSygpOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm0gYWN0aW9uIG9uIHRoaXMgc2VydmVyLgotCSAqIEBwYXJhbSBzZXJ2ZXIgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBwZXJmb3JtKElTZXJ2ZXIgc2VydmVyKSB7Ci0JCWlmICghU2VydmVyVUlQbHVnaW4ucHJvbXB0SWZEaXJ0eShzaGVsbCwgc2VydmVyKSkKLQkJCXJldHVybjsKLQkJCi0JCXRyeSB7Ci0JCQlTdHJpbmcgbGF1bmNoTW9kZSA9IG1vZGU7Ci0JCQlpZiAobGF1bmNoTW9kZSA9PSBudWxsKQotCQkJCWxhdW5jaE1vZGUgPSBzZXJ2ZXIuZ2V0TW9kZSgpOwotCQkJUmVzdGFydFNlcnZlckpvYiByZXN0YXJ0Sm9iID0gbmV3IFJlc3RhcnRTZXJ2ZXJKb2Ioc2VydmVyLCBsYXVuY2hNb2RlKTsKLQkJCXJlc3RhcnRKb2Iuc2NoZWR1bGUoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIHJlc3RhcnRpbmcgc2VydmVyIiwgZSk7Ci0JCX0JCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9SZXN0YXJ0TW9kdWxlQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvUmVzdGFydE1vZHVsZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWZkOTgyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9SZXN0YXJ0TW9kdWxlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlldy5zZXJ2ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci0vKioKLSAqIFJlc3RhcnQgYSBtb2R1bGUgb24gYSBzZXJ2ZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXN0YXJ0TW9kdWxlQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKLQlwcm90ZWN0ZWQgSVNlcnZlciBzZXJ2ZXI7Ci0JcHJvdGVjdGVkIElNb2R1bGVbXSBtb2R1bGU7Ci0KLQlwdWJsaWMgUmVzdGFydE1vZHVsZUFjdGlvbihJU2VydmVyIHNlcnZlciwgSU1vZHVsZVtdIG1vZHVsZSkgewotCQlzdXBlcigpOwotCQl0aGlzLnNlcnZlciA9IHNlcnZlcjsKLQkJdGhpcy5tb2R1bGUgPSBtb2R1bGU7Ci0JCQotCQlpbnQgc2l6ZSA9IG1vZHVsZS5sZW5ndGg7Ci0JCXNldFRleHQoTkxTLmJpbmQoTWVzc2FnZXMuYWN0aW9uUmVzdGFydE1vZHVsZSwgbW9kdWxlW3NpemUgLSAxXS5nZXROYW1lKCkpKTsKLQkJCi0JCXNldEVuYWJsZWQoc2VydmVyLmNhbkNvbnRyb2xNb2R1bGUobW9kdWxlLCBudWxsKS5pc09LKCkgJiYgc2VydmVyLmdldE1vZHVsZVN0YXRlKG1vZHVsZSkgIT0gSVNlcnZlci5TVEFURV9TVE9QUEVEKTsKLQl9Ci0KLQkvKioKLQkgKiBJbXBsZW1lbnRhdGlvbiBvZiBtZXRob2QgZGVmaW5lZCBvbiA8Y29kZT5JQWN0aW9uPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCXNlcnZlci5yZXN0YXJ0TW9kdWxlKG1vZHVsZSwgbnVsbCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9TZXJ2ZXJBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9TZXJ2ZXJBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDUwMDMxMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvU2VydmVyQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlldy5zZXJ2ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5TZWxlY3Rpb25Qcm92aWRlckFjdGlvbjsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJBY3Rpb24gZXh0ZW5kcyBTZWxlY3Rpb25Qcm92aWRlckFjdGlvbiB7Ci0JcHJvdGVjdGVkIFNoZWxsIHNoZWxsOwotCXByb3RlY3RlZCBieXRlIGFjdGlvbjsKLQotCXB1YmxpYyBTZXJ2ZXJBY3Rpb24oU2hlbGwgc2hlbGwsIElTZWxlY3Rpb25Qcm92aWRlciBwcm92aWRlciwgU3RyaW5nIGxhYmVsLCBieXRlIGFjdGlvbikgewotCQlzdXBlcihwcm92aWRlciwgbGFiZWwpOwotCQl0aGlzLnNoZWxsID0gc2hlbGw7Ci0JCXRoaXMuYWN0aW9uID0gYWN0aW9uOwotCQlzZXRFbmFibGVkKFNlcnZlckFjdGlvbkhlbHBlci5pc0FjdGlvbkVuYWJsZWQoZ2V0U2VsZWN0aW9uKCksIGFjdGlvbikpOwotCX0KLQkKLQkvKioKLQkgKiBOb3RpZmllcyB0aGlzIGFjdGlvbiB0aGF0IHRoZSBnaXZlbiAobm9uLXN0cnVjdHVyZWQpIHNlbGVjdGlvbiBoYXMgY2hhbmdlZAotCSAqIGluIHRoZSBzZWxlY3Rpb24gcHJvdmlkZXIuCi0JICogPHA+Ci0JICogVGhlIDxjb2RlPlNlbGVjdGlvblByb3ZpZGVyQWN0aW9uPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZAotCSAqIGRvZXMgbm90aGluZy4gU3ViY2xhc3NlcyBtYXkgcmVpbXBsZW1lbnQgdG8gcmVhY3QgdG8gdGhpcyBzZWxlY3Rpb24gY2hhbmdlLgotCSAqIDwvcD4KLQkgKgotCSAqIEBwYXJhbSBzZWxlY3Rpb24gdGhlIG5ldyBzZWxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXNldEVuYWJsZWQoU2VydmVyQWN0aW9uSGVscGVyLmlzQWN0aW9uRW5hYmxlZChzZWxlY3Rpb24sIGFjdGlvbikpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlzZXRFbmFibGVkKFNlcnZlckFjdGlvbkhlbHBlci5pc0FjdGlvbkVuYWJsZWQoc2VsZWN0aW9uLCBhY3Rpb24pKTsKLQl9Ci0JCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyA8Y29kZT5JQWN0aW9uPC9jb2RlPiBtZXRob2QKLQkgKiBkb2VzIG5vdGhpbmcuICBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZAotCSAqIGlmIHRoZXkgZG8gbm90IG5lZWQgaW5mb3JtYXRpb24gZnJvbSB0aGUgdHJpZ2dlcmluZyBldmVudCwKLQkgKiBvciBvdmVycmlkZSA8Y29kZT5ydW4oRXZlbnQpPC9jb2RlPiBpZiB0aGV5IGRvLgotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJU2VydmVyQWN0aW9uSGVscGVyLnBlcmZvcm1BY3Rpb24oc2hlbGwsIGdldFNlbGVjdGlvbigpLCBhY3Rpb24pOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvU2VydmVyQWN0aW9uSGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvU2VydmVyQWN0aW9uSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3NjY1MzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL1NlcnZlckFjdGlvbkhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3LnNlcnZlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuSW1hZ2VSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuYWN0aW9ucy5OZXdTZXJ2ZXJXaXphcmRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgU2VydmVyQWN0aW9uSGVscGVyIHsKLQkvKioKLQkgKiBDb25zdGFudHMgZm9yIGFjdGlvbnMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgQUNUSU9OX09QRU4gPSAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBBQ1RJT05fREVMRVRFID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgQUNUSU9OX0JPT0tNQVJLID0gMjsKLQotCXByaXZhdGUgU2VydmVyQWN0aW9uSGVscGVyKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBmaWxsQ29udGV4dE1lbnUoU2hlbGwgc2hlbGwsIElTZWxlY3Rpb24gc2VsZWN0aW9uLCBJTWVudU1hbmFnZXIgbWVudSkgewotCQlNZW51TWFuYWdlciBuZXdNZW51ID0gbmV3IE1lbnVNYW5hZ2VyKE1lc3NhZ2VzLmFjdGlvbk5ldyk7Ci0JCWZpbGxOZXdDb250ZXh0TWVudShzaGVsbCwgc2VsZWN0aW9uLCBuZXdNZW51KTsKLQkJbWVudS5hZGQobmV3TWVudSk7Ci0JCWZpbGxPdGhlckNvbnRleHRNZW51KHNoZWxsLCBzZWxlY3Rpb24sIG1lbnUpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgZmlsbE5ld0NvbnRleHRNZW51KFNoZWxsIHNoZWxsLCBJU2VsZWN0aW9uIHNlbGVjdGlvbiwgSU1lbnVNYW5hZ2VyIG1lbnUpIHsKLQkJSUFjdGlvbiBuZXdTZXJ2ZXJBY3Rpb24gPSBuZXcgTmV3U2VydmVyV2l6YXJkQWN0aW9uKCk7Ci0JCW5ld1NlcnZlckFjdGlvbi5zZXRUZXh0KE1lc3NhZ2VzLmFjdGlvbk5ld1NlcnZlcik7Ci0JCW1lbnUuYWRkKG5ld1NlcnZlckFjdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGZpbGxPdGhlckNvbnRleHRNZW51KFNoZWxsIHNoZWxsLCBJU2VsZWN0aW9uIHNlbGVjdGlvbiwgSU1lbnVNYW5hZ2VyIG1lbnUpIHsKLQkJaWYgKHNlbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWlmIChzZWxlY3Rpb24uaXNFbXB0eSgpIHx8ICEoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pKQotCQkJcmV0dXJuOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBhZGRTZXJ2ZXJBY3Rpb25zKFNoZWxsIHNoZWxsLCBJTWVudU1hbmFnZXIgbWVudSwgSVNlcnZlciBzZXJ2ZXIpIHsKLQkJZmluYWwgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihzZXJ2ZXIpOwotCQlJU2VsZWN0aW9uUHJvdmlkZXIgcHJvdmlkZXIgPSBuZXcgSVNlbGVjdGlvblByb3ZpZGVyKCkgewotCQkJcHVibGljIHZvaWQgYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCQkvLyBkbyBub3RoaW5nCi0JCQl9Ci0JCQlwdWJsaWMgSVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKSB7Ci0JCQkJcmV0dXJuIHNlbGVjdGlvbjsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQkJLy8gZG8gbm90aGluZwotCQkJfQotCQkJcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsKSB7Ci0JCQkJLy8gZG8gbm90aGluZwotCQkJfQotCQl9OwotCQotCQkvLyBjcmVhdGUgdGhlIGRlYnVnIGFjdGlvbgotCQlBY3Rpb24gZGVidWdBY3Rpb24gPSBuZXcgU3RhcnRBY3Rpb24oc2hlbGwsIHByb3ZpZGVyLCAiZGVidWciLCBJTGF1bmNoTWFuYWdlci5ERUJVR19NT0RFKTsKLQkJZGVidWdBY3Rpb24uc2V0VG9vbFRpcFRleHQoTWVzc2FnZXMuYWN0aW9uRGVidWdUb29sVGlwKTsKLQkJZGVidWdBY3Rpb24uc2V0VGV4dChNZXNzYWdlcy5hY3Rpb25EZWJ1Zyk7Ci0JCWRlYnVnQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19FTENMX1NUQVJUX0RFQlVHKSk7Ci0JCWRlYnVnQWN0aW9uLnNldEhvdmVySW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX0NMQ0xfU1RBUlRfREVCVUcpKTsKLQkJZGVidWdBY3Rpb24uc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfRExDTF9TVEFSVF9ERUJVRykpOwotCQltZW51LmFkZChkZWJ1Z0FjdGlvbik7Ci0JCi0JCS8vIGNyZWF0ZSB0aGUgc3RhcnQgYWN0aW9uCi0JCUFjdGlvbiBydW5BY3Rpb24gPSBuZXcgU3RhcnRBY3Rpb24oc2hlbGwsIHByb3ZpZGVyLCAic3RhcnQiLCBJTGF1bmNoTWFuYWdlci5SVU5fTU9ERSk7Ci0JCXJ1bkFjdGlvbi5zZXRUb29sVGlwVGV4dChNZXNzYWdlcy5hY3Rpb25TdGFydFRvb2xUaXApOwotCQlydW5BY3Rpb24uc2V0VGV4dChNZXNzYWdlcy5hY3Rpb25TdGFydCk7Ci0JCXJ1bkFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfRUxDTF9TVEFSVCkpOwotCQlydW5BY3Rpb24uc2V0SG92ZXJJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfQ0xDTF9TVEFSVCkpOwotCQlydW5BY3Rpb24uc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfRExDTF9TVEFSVCkpOwotCQltZW51LmFkZChydW5BY3Rpb24pOwotCQkKLQkJLy8gY3JlYXRlIHRoZSBwcm9maWxlIGFjdGlvbgotCQlBY3Rpb24gcHJvZmlsZUFjdGlvbiA9IG5ldyBTdGFydEFjdGlvbihzaGVsbCwgcHJvdmlkZXIsICJwcm9maWxlIiwgSUxhdW5jaE1hbmFnZXIuUFJPRklMRV9NT0RFKTsKLQkJcHJvZmlsZUFjdGlvbi5zZXRUb29sVGlwVGV4dChNZXNzYWdlcy5hY3Rpb25Qcm9maWxlVG9vbFRpcCk7Ci0JCXByb2ZpbGVBY3Rpb24uc2V0VGV4dChNZXNzYWdlcy5hY3Rpb25Qcm9maWxlKTsKLQkJcHJvZmlsZUFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfRUxDTF9TVEFSVF9QUk9GSUxFKSk7Ci0JCXByb2ZpbGVBY3Rpb24uc2V0SG92ZXJJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfQ0xDTF9TVEFSVF9QUk9GSUxFKSk7Ci0JCXByb2ZpbGVBY3Rpb24uc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfRExDTF9TVEFSVF9QUk9GSUxFKSk7Ci0JCW1lbnUuYWRkKHByb2ZpbGVBY3Rpb24pOwotCQotCQkvLyBjcmVhdGUgdGhlIHJlc3RhcnQgYWN0aW9uCi0JCU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKE1lc3NhZ2VzLmFjdGlvblJlc3RhcnQpOwotCQkKLQkJQWN0aW9uIHJlc3RhcnRBY3Rpb24gPSBuZXcgUmVzdGFydEFjdGlvbihzaGVsbCwgcHJvdmlkZXIsICJyZXN0YXJ0IiwgSUxhdW5jaE1hbmFnZXIuUlVOX01PREUpOwotCQlyZXN0YXJ0QWN0aW9uLnNldFRvb2xUaXBUZXh0KE1lc3NhZ2VzLmFjdGlvblJlc3RhcnRUb29sVGlwKTsKLQkJcmVzdGFydEFjdGlvbi5zZXRUZXh0KE1lc3NhZ2VzLmFjdGlvblJlc3RhcnQpOwotCQlyZXN0YXJ0QWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19FTENMX1JFU1RBUlQpKTsKLQkJcmVzdGFydEFjdGlvbi5zZXRIb3ZlckltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19DTENMX1JFU1RBUlQpKTsKLQkJcmVzdGFydEFjdGlvbi5zZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19ETENMX1JFU1RBUlQpKTsKLQkJbWVudU1hbmFnZXIuYWRkKHJlc3RhcnRBY3Rpb24pOwotCQkvL21lbnUuYWRkKHJlc3RhcnRBY3Rpb24pOwotCQltZW51LmFkZChtZW51TWFuYWdlcik7Ci0KLQkJLy8gY3JlYXRlIHRoZSBzdG9wIGFjdGlvbgotCQkvKkFjdGlvbiBzdG9wQWN0aW9uID0gbmV3IFN0b3BBY3Rpb24oc2hlbGwsIHByb3ZpZGVyLCAic3RvcCIsIElTZXJ2ZXJGYWN0b3J5LlNFUlZFUl9TVEFURV9TRVRfTUFOQUdFRCk7Ci0JCXN0b3BBY3Rpb24uc2V0VG9vbFRpcFRleHQoTWVzc2FnZXMuYWN0aW9uU3RvcFRvb2xUaXAiKSk7Ci0JCXN0b3BBY3Rpb24uc2V0VGV4dChNZXNzYWdlcy5hY3Rpb25TdG9wIikpOwotCQlzdG9wQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19FTENMX1NUT1ApKTsKLQkJc3RvcEFjdGlvbi5zZXRIb3ZlckltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19DTENMX1NUT1ApKTsKLQkJc3RvcEFjdGlvbi5zZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19ETENMX1NUT1ApKTsKLQkJbWVudS5hZGQoc3RvcEFjdGlvbik7Ci0KLQkJLy8gY3JlYXRlIHRoZSBkaXNjb25uZWN0IGFjdGlvbgotCQlBY3Rpb24gZGlzY29ubmVjdEFjdGlvbiA9IG5ldyBTdG9wQWN0aW9uKHNoZWxsLCBwcm92aWRlciwgImRpc2Nvbm5lY3QiLCBJU2VydmVyRmFjdG9yeS5TRVJWRVJfU1RBVEVfU0VUX0FUVEFDSEVEKTsKLQkJZGlzY29ubmVjdEFjdGlvbi5zZXRUb29sVGlwVGV4dChNZXNzYWdlcy5hY3Rpb25TdG9wVG9vbFRpcDIiKSk7Ci0JCWRpc2Nvbm5lY3RBY3Rpb24uc2V0VGV4dChNZXNzYWdlcy5hY3Rpb25TdG9wMiIpKTsKLQkJZGlzY29ubmVjdEFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfRUxDTF9ESVNDT05ORUNUKSk7Ci0JCWRpc2Nvbm5lY3RBY3Rpb24uc2V0SG92ZXJJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfQ0xDTF9ESVNDT05ORUNUKSk7Ci0JCWRpc2Nvbm5lY3RBY3Rpb24uc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfRExDTF9ESVNDT05ORUNUKSk7Ci0JCW1lbnUuYWRkKGRpc2Nvbm5lY3RBY3Rpb24pOyovCi0KLQkJLy8gY3JlYXRlIHRoZSBwdWJsaXNoIGFjdGlvbgotCQlBY3Rpb24gcHVibGlzaEFjdGlvbiA9IG5ldyBQdWJsaXNoQWN0aW9uKHNoZWxsLCBwcm92aWRlciwgInB1Ymxpc2giKTsKLQkJcHVibGlzaEFjdGlvbi5zZXRUb29sVGlwVGV4dChNZXNzYWdlcy5hY3Rpb25QdWJsaXNoVG9vbFRpcCk7Ci0JCXB1Ymxpc2hBY3Rpb24uc2V0VGV4dChNZXNzYWdlcy5hY3Rpb25QdWJsaXNoKTsKLQkJcHVibGlzaEFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfRUxDTF9QVUJMSVNIKSk7Ci0JCXB1Ymxpc2hBY3Rpb24uc2V0SG92ZXJJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfQ0xDTF9QVUJMSVNIKSk7Ci0JCXB1Ymxpc2hBY3Rpb24uc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfRExDTF9QVUJMSVNIKSk7Ci0JCW1lbnUuYWRkKHB1Ymxpc2hBY3Rpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0FjdGlvbkVuYWJsZWQoSVNlbGVjdGlvbiBzZWxlY3Rpb24sIGJ5dGUgYWN0aW9uKSB7Ci0JCWlmIChzZWxlY3Rpb24gPT0gbnVsbCB8fCBhY3Rpb24gPCAwKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWlmIChzZWxlY3Rpb24uaXNFbXB0eSgpIHx8ICEoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQkKLQkJaWYgKGFjdGlvbiA9PSBBQ1RJT05fT1BFTikgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9IGVsc2UgaWYgKGFjdGlvbiA9PSBBQ1RJT05fREVMRVRFKSB7Ci0JCQkvLyBnZXQgc2VsZWN0aW9uIGJ1dCBhdm9pZCBubyBzZWxlY3Rpb24gb3IgbXVsdGlwbGUgc2VsZWN0aW9uCi0JCQlJTW9kdWxlW10gbW9kdWxlID0gbnVsbDsKLQkJCWlmICghc2VsLmlzRW1wdHkoKSkgewotCQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gc2VsLml0ZXJhdG9yKCk7Ci0JCQkJT2JqZWN0IG9iaiA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgTW9kdWxlU2VydmVyKSB7Ci0JCQkJCU1vZHVsZVNlcnZlciBtcyA9IChNb2R1bGVTZXJ2ZXIpIG9iajsKLQkJCQkJbW9kdWxlID0gbXMubW9kdWxlOwotCQkJCX0KLQkJCQlpZiAoaXRlcmF0b3IuaGFzTmV4dCgpKQotCQkJCQltb2R1bGUgPSBudWxsOwotCQkJfQotCQkJCi0JCQlyZXR1cm4gKG1vZHVsZSA9PSBudWxsIHx8IG1vZHVsZS5sZW5ndGggPT0gMSk7Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHBlcmZvcm1BY3Rpb24oU2hlbGwgc2hlbGwsIElTZWxlY3Rpb24gc2VsZWN0aW9uLCBieXRlIGFjdGlvbikgewotCQkvL2lmICghaXNBY3Rpb25FbmFibGVkKHNlbGVjdGlvbiwgYWN0aW9uKSkKLQkJLy8JcmV0dXJuIGZhbHNlOwotCi0JCWlmIChzZWxlY3Rpb24gPT0gbnVsbCB8fCBhY3Rpb24gPCAwKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWlmIChzZWxlY3Rpb24uaXNFbXB0eSgpIHx8ICEoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCi0JCWlmIChhY3Rpb24gPT0gQUNUSU9OX09QRU4pIHsKLQkJCWlmIChzZWwuc2l6ZSgpICE9IDEpCi0JCQkJcmV0dXJuIGZhbHNlOwotCi0JCQlPYmplY3Qgb2JqID0gc2VsLmdldEZpcnN0RWxlbWVudCgpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElTZXJ2ZXIpIHsKLQkJCQlBY3Rpb24gb3BlbiA9IG5ldyBPcGVuQWN0aW9uKChJU2VydmVyKSBvYmopOwotCQkJCW9wZW4ucnVuKCk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gZWxzZSBpZiAoYWN0aW9uID09IEFDVElPTl9ERUxFVEUpIHsKLQkJCS8vIGdldCBzZWxlY3Rpb24gYnV0IGF2b2lkIG5vIHNlbGVjdGlvbiBvciBtdWx0aXBsZSBzZWxlY3Rpb24KLQkJCUlTZXJ2ZXIgc2VydmVyID0gbnVsbDsKLQkJCUlNb2R1bGVbXSBtb2R1bGUgPSBudWxsOwotCQkJaWYgKCFzZWwuaXNFbXB0eSgpKSB7Ci0JCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBzZWwuaXRlcmF0b3IoKTsKLQkJCQlPYmplY3Qgb2JqID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBJU2VydmVyKQotCQkJCQlzZXJ2ZXIgPSAoSVNlcnZlcikgb2JqOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBNb2R1bGVTZXJ2ZXIpIHsKLQkJCQkJTW9kdWxlU2VydmVyIG1zID0gKE1vZHVsZVNlcnZlcikgb2JqOwotCQkJCQlzZXJ2ZXIgPSBtcy5zZXJ2ZXI7Ci0JCQkJCW1vZHVsZSA9IG1zLm1vZHVsZTsKLQkJCQl9Ci0JCQkJaWYgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQlzZXJ2ZXIgPSBudWxsOwotCQkJCQltb2R1bGUgPSBudWxsOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJaWYgKG1vZHVsZSA9PSBudWxsKQotCQkJCW5ldyBEZWxldGVBY3Rpb24oc2hlbGwsIHNlcnZlcikucnVuKCk7Ci0JCQllbHNlIGlmIChtb2R1bGUubGVuZ3RoID09IDEpCi0JCQkJbmV3IFJlbW92ZU1vZHVsZUFjdGlvbihzaGVsbCwgc2VydmVyLCBtb2R1bGVbMF0pLnJ1bigpOwotCQkJCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhbiBhY3Rpb24gb2YgdGhlIHNwZWNpZmllZCB0eXBlLCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgZ2xvYmFsLgotCSAqIAotCSAqIEBwYXJhbSBzaGVsbCBhIHNoZWxsCi0JICogQHBhcmFtIHByb3ZpZGVyIGEgc2VsZWN0aW9uIHByb3ZpZGVyCi0JICogQHBhcmFtIGFjdGlvbiBhbiBhY3Rpb24KLQkgKiBAcmV0dXJuIGFuIGFjdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUFjdGlvbiBnZXRBY3Rpb24oU2hlbGwgc2hlbGwsIElTZWxlY3Rpb25Qcm92aWRlciBwcm92aWRlciwgYnl0ZSBhY3Rpb24pIHsKLQkJaWYgKGFjdGlvbiA9PSBBQ1RJT05fREVMRVRFKSB7Ci0JCQlyZXR1cm4gbmV3IFNlcnZlckFjdGlvbihzaGVsbCwgcHJvdmlkZXIsIE1lc3NhZ2VzLmFjdGlvbkRlbGV0ZSwgU2VydmVyQWN0aW9uSGVscGVyLkFDVElPTl9ERUxFVEUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvU2VydmVyVGFibGVMYWJlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvU2VydmVyVGFibGVMYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4MmEwNjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL1NlcnZlclRhYmxlTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3LnNlcnZlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVNoYXJlZEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlclR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLlNlcnZlclVJQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLkRlZmF1bHRTZXJ2ZXJMYWJlbERlY29yYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLkltYWdlUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlNlcnZlclVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuVUlEZWNvcmF0b3JNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLS8qKgotICogU2VydmVyIHRhYmxlIGxhYmVsIHByb3ZpZGVyLgotICovCi1wdWJsaWMgY2xhc3MgU2VydmVyVGFibGVMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlciB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBzeW5jU3RhdGUgPSBuZXcgU3RyaW5nW10gewotCQlNZXNzYWdlcy52aWV3U3luY09rYXksCi0JCU1lc3NhZ2VzLnZpZXdTeW5jUmVzdGFydCwKLQkJTWVzc2FnZXMudmlld1N5bmNQdWJsaXNoLAotCQlNZXNzYWdlcy52aWV3U3luY1Jlc3RhcnRQdWJsaXNoLAotCQlNZXNzYWdlcy52aWV3U3luY1B1Ymxpc2hpbmd9OwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gc3luY1N0YXRlVW5tYW5hZ2VkID0gbmV3IFN0cmluZ1tdIHsKLQkJTWVzc2FnZXMudmlld1N5bmNPa2F5MiwKLQkJTWVzc2FnZXMudmlld1N5bmNSZXN0YXJ0MiwKLQkJTWVzc2FnZXMudmlld1N5bmNQdWJsaXNoMiwKLQkJTWVzc2FnZXMudmlld1N5bmNSZXN0YXJ0UHVibGlzaDIsCi0JCU1lc3NhZ2VzLnZpZXdTeW5jUHVibGlzaGluZzJ9OwotCi0JcHJpdmF0ZSBpbnQgY291bnQgPSAwOwotCQotCXByb3RlY3RlZCBEZWZhdWx0U2VydmVyTGFiZWxEZWNvcmF0b3IgZGVjb3JhdG9yID0gbmV3IERlZmF1bHRTZXJ2ZXJMYWJlbERlY29yYXRvcigpOwotCQotCXByb3RlY3RlZCBJU2VydmVyIGRlZmF1bHRTZXJ2ZXI7Ci0KLQkvKioKLQkgKiBTZXJ2ZXJUYWJsZUxhYmVsUHJvdmlkZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgU2VydmVyVGFibGVMYWJlbFByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWRlY29yYXRvci5kaXNwb3NlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdFNlcnZlcihJU2VydmVyIGRzKSB7Ci0JCWRlZmF1bHRTZXJ2ZXIgPSBkczsKLQl9Ci0JCi0JcHVibGljIElTZXJ2ZXIgZ2V0RGVmYXVsdFNlcnZlcigpIHsKLQkJcmV0dXJuIGRlZmF1bHRTZXJ2ZXI7Ci0JfQotCi0JcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNb2R1bGVTZXJ2ZXIpIHsKLQkJCU1vZHVsZVNlcnZlciBtcyA9IChNb2R1bGVTZXJ2ZXIpIGVsZW1lbnQ7Ci0JCQlpZiAoY29sdW1uSW5kZXggPT0gMCkgewotCQkJCXJldHVybiBTZXJ2ZXJVSUNvcmUuZ2V0TGFiZWxQcm92aWRlcigpLmdldEltYWdlKG1zLm1vZHVsZVttcy5tb2R1bGUubGVuZ3RoIC0gMV0pOwotCQkJfSBlbHNlIGlmIChjb2x1bW5JbmRleCA9PSAxKQotCQkJCXJldHVybiBnZXRTdGF0ZUltYWdlKG1zLnNlcnZlci5nZXRTZXJ2ZXJUeXBlKCksIG1zLnNlcnZlci5nZXRNb2R1bGVTdGF0ZShtcy5tb2R1bGUpLCBudWxsKTsKLQkJCWVsc2UgaWYgKGNvbHVtbkluZGV4ID09IDIpIHsKLQkJCQlJU3RhdHVzIHN0YXR1cyA9ICgoU2VydmVyKSBtcy5zZXJ2ZXIpLmdldE1vZHVsZVN0YXR1cyhtcy5tb2R1bGUpOwotCQkJCWlmIChzdGF0dXMgIT0gbnVsbCkgewotCQkJCQlJU2hhcmVkSW1hZ2VzIHNoYXJlZEltYWdlcyA9IFNlcnZlclVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V29ya2JlbmNoKCkuZ2V0U2hhcmVkSW1hZ2VzKCk7Ci0JCQkJCWlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKQotCQkJCQkJcmV0dXJuIHNoYXJlZEltYWdlcy5nZXRJbWFnZShJU2hhcmVkSW1hZ2VzLklNR19PQkpTX0VSUk9SX1RTSyk7Ci0JCQkJCWVsc2UgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuV0FSTklORykKLQkJCQkJCXJldHVybiBzaGFyZWRJbWFnZXMuZ2V0SW1hZ2UoSVNoYXJlZEltYWdlcy5JTUdfT0JKU19XQVJOX1RTSyk7Ci0JCQkJCWVsc2UgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuSU5GTykKLQkJCQkJCXJldHVybiBzaGFyZWRJbWFnZXMuZ2V0SW1hZ2UoSVNoYXJlZEltYWdlcy5JTUdfT0JKU19JTkZPX1RTSyk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJSVNlcnZlciBzZXJ2ZXIgPSAoSVNlcnZlcikgZWxlbWVudDsKLQkJaWYgKGNvbHVtbkluZGV4ID09IDApIHsKLQkJCWlmIChzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpICE9IG51bGwpIHsKLQkJCQlJbWFnZSBpbWFnZSA9IEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2Uoc2VydmVyLmdldFNlcnZlclR5cGUoKS5nZXRJZCgpKTsKLQkJCQlJU3RhdHVzIHN0YXR1cyA9ICgoU2VydmVyKSBzZXJ2ZXIpLmdldFNlcnZlclN0YXR1cygpOwotCQkJCWlmIChkZWZhdWx0U2VydmVyICE9IG51bGwgJiYgZGVmYXVsdFNlcnZlci5lcXVhbHMoc2VydmVyKSB8fCBzdGF0dXMgIT0gbnVsbCkgewotCQkJCQlJbWFnZSBkZWNvcmF0ZWQgPSBkZWNvcmF0b3IuZGVjb3JhdGVJbWFnZShpbWFnZSwgZWxlbWVudCk7Ci0JCQkJCWlmIChkZWNvcmF0ZWQgIT0gbnVsbCkKLQkJCQkJCXJldHVybiBkZWNvcmF0ZWQ7Ci0JCQkJfQotCQkJCXJldHVybiBpbWFnZTsKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9IGVsc2UgaWYgKGNvbHVtbkluZGV4ID09IDEpIHsKLQkJCUlTZXJ2ZXJUeXBlIHNlcnZlclR5cGUgPSBzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpOwotCQkJaWYgKHNlcnZlclR5cGUgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCS8vaWYgKHNlcnZlclR5cGUuZ2V0U2VydmVyU3RhdGVTZXQoKSA9PSBJU2VydmVyVHlwZS5TRVJWRVJfU1RBVEVfU0VUX1BVQkxJU0hFRCkKLQkJCS8vCXJldHVybiBudWxsOwotCQkJcmV0dXJuIGdldFNlcnZlclN0YXRlSW1hZ2Uoc2VydmVyKTsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1vZHVsZVNlcnZlcikgewotCQkJTW9kdWxlU2VydmVyIG1zID0gKE1vZHVsZVNlcnZlcikgZWxlbWVudDsKLQkJCWlmIChjb2x1bW5JbmRleCA9PSAwKSB7Ci0JCQkJaW50IHNpemUgPSBtcy5tb2R1bGUubGVuZ3RoOwotCQkJCXJldHVybiBtcy5tb2R1bGVbc2l6ZSAtIDFdLmdldE5hbWUoKTsKLQkJCX0gZWxzZSBpZiAoY29sdW1uSW5kZXggPT0gMSkKLQkJCQlyZXR1cm4gZ2V0U3RhdGVMYWJlbChtcy5zZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpLCBtcy5zZXJ2ZXIuZ2V0TW9kdWxlU3RhdGUobXMubW9kdWxlKSwgbnVsbCk7Ci0JCQllbHNlIGlmIChjb2x1bW5JbmRleCA9PSAyKSB7Ci0JCQkJSVN0YXR1cyBzdGF0dXMgPSAoKFNlcnZlcikgbXMuc2VydmVyKS5nZXRNb2R1bGVTdGF0dXMobXMubW9kdWxlKTsKLQkJCQlpZiAoc3RhdHVzICE9IG51bGwpCi0JCQkJCXJldHVybiBzdGF0dXMuZ2V0TWVzc2FnZSgpOwotCQkJCXJldHVybiAiIjsKLQkJCX0KLQkJfQotCQlJU2VydmVyIHNlcnZlciA9IChJU2VydmVyKSBlbGVtZW50OwotCQlpZiAoY29sdW1uSW5kZXggPT0gMCkKLQkJCXJldHVybiBub3ROdWxsKHNlcnZlci5nZXROYW1lKCkpOwotCQllbHNlIGlmIChjb2x1bW5JbmRleCA9PSAxKSB7Ci0JCQlJU2VydmVyVHlwZSBzZXJ2ZXJUeXBlID0gc2VydmVyLmdldFNlcnZlclR5cGUoKTsKLQkJCWlmIChzZXJ2ZXJUeXBlICE9IG51bGwpCi0JCQkJcmV0dXJuIGdldFNlcnZlclN0YXRlTGFiZWwoc2VydmVyKTsKLQkJCQotCQkJcmV0dXJuICIiOwotCQl9IGVsc2UgaWYgKGNvbHVtbkluZGV4ID09IDIpIHsKLQkJCUlTdGF0dXMgc3RhdHVzID0gKChTZXJ2ZXIpIHNlcnZlcikuZ2V0U2VydmVyU3RhdHVzKCk7Ci0JCQlpZiAoc3RhdHVzICE9IG51bGwpCi0JCQkJcmV0dXJuIHN0YXR1cy5nZXRNZXNzYWdlKCk7Ci0JCQkKLQkJCWlmIChzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpID09IG51bGwpCi0JCQkJcmV0dXJuICIiOwotCQkJCi0JCQkvL2lmIChzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpLmhhc1NlcnZlckNvbmZpZ3VyYXRpb24oKSAmJiBzZXJ2ZXIuZ2V0U2VydmVyQ29uZmlndXJhdGlvbigpID09IG51bGwpCi0JCQkvLwlyZXR1cm4gTWVzc2FnZXMudmlld05vQ29uZmlndXJhdGlvbiIpOwotCQkJCi0JCQlpZiAoc2VydmVyLmdldFNlcnZlclN0YXRlKCkgPT0gSVNlcnZlci5TVEFURV9VTktOT1dOKQotCQkJCXJldHVybiAiIjsKLQkJCQotCQkJU3RyaW5nIHNlcnZlcklkID0gc2VydmVyLmdldElkKCk7Ci0JCQlpZiAoU2VydmVyVGFibGVWaWV3ZXIucHVibGlzaGluZy5jb250YWlucyhzZXJ2ZXJJZCkpCi0JCQkJcmV0dXJuIHN5bmNTdGF0ZVs0XTsKLQkJCQotCQkJaW50IGkgPSAwOwotCQkJLy9pZiAoc2VydmVyLmdldFNlcnZlclJlc3RhcnRTdGF0ZSgpKQotCQkJaWYgKCgoU2VydmVyKXNlcnZlcikuc2hvdWxkUmVzdGFydCgpKQotCQkJCWkgPSAxOwotCQkJCi0JCQkvLyByZXB1Ymxpc2gKLQkJCWlmICgoKFNlcnZlcilzZXJ2ZXIpLnNob3VsZFB1Ymxpc2goKSkKLQkJCQlpICs9IDI7Ci0JCQkKLQkJCS8vSVNlcnZlclR5cGUgc2VydmVyVHlwZSA9IHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCk7Ci0JCQkvLyBUT0RPOiBzdGF0ZSBzZXQKLQkJCS8vaWYgKHNlcnZlclR5cGUuZ2V0U2VydmVyU3RhdGVTZXQoKSA9PSBJU2VydmVyVHlwZS5TRVJWRVJfU1RBVEVfU0VUX01BTkFHRUQpCi0JCQkJcmV0dXJuIHN5bmNTdGF0ZVtpXTsKLQkJCS8vcmV0dXJuIHN5bmNTdGF0ZVVubWFuYWdlZFtpXTsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gIi0iOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIG5vdE51bGwoU3RyaW5nIHMpIHsKLQkJaWYgKHMgPT0gbnVsbCkKLQkJCXJldHVybiAiIjsKLQkJcmV0dXJuIHM7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gaW1hZ2UgcmVwcmVzZW50aW5nIHRoZSBzZXJ2ZXIncyBzdGF0ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLmpmYWNlLnBhcnRzLklJbWFnZQotCSAqIEBwYXJhbSBzZXJ2ZXIgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXIKLQkgKi8KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0U2VydmVyU3RhdGVJbWFnZShJU2VydmVyIHNlcnZlcikgewotCQlyZXR1cm4gZ2V0U3RhdGVJbWFnZShzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpLCBzZXJ2ZXIuZ2V0U2VydmVyU3RhdGUoKSwgc2VydmVyLmdldE1vZGUoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBpbWFnZSByZXByZXNlbnRpbmcgdGhlIGdpdmVuIHN0YXRlLgotCSAqIAotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuamZhY2UucGFydHMuSUltYWdlCi0JICovCi0JcHJvdGVjdGVkIEltYWdlIGdldFN0YXRlSW1hZ2UoSVNlcnZlclR5cGUgc2VydmVyVHlwZSwgaW50IHN0YXRlLCBTdHJpbmcgbW9kZSkgewotCQlyZXR1cm4gVUlEZWNvcmF0b3JNYW5hZ2VyLmdldFVJRGVjb3JhdG9yKHNlcnZlclR5cGUpLmdldFN0YXRlSW1hZ2Uoc3RhdGUsIG1vZGUsIGNvdW50KTsKLQkJLyppZiAoc3RhdGUgPT0gSVNlcnZlci5TVEFURV9VTktOT1dOKQotCQkJcmV0dXJuIG51bGw7Ci0JCWVsc2UgaWYgKHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfU1RBUlRJTkcpCi0JCQlyZXR1cm4gc3RhcnRpbmdJbWFnZXNbY291bnRdOwotCQllbHNlIGlmIChzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1NUT1BQSU5HKQotCQkJcmV0dXJuIHN0b3BwaW5nSW1hZ2VzW2NvdW50XTsKLQkJZWxzZSBpZiAoc3RhdGUgPT0gSVNlcnZlci5TVEFURV9TVE9QUEVEKQotCQkJcmV0dXJuIEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2UoSW1hZ2VSZXNvdXJjZS5JTUdfU0VSVkVSX1NUQVRFX1NUT1BQRUQpOwotCQllbHNlIHsgLy9pZiAoc3RhdGUgPT0gSVNlcnZlci5TVEFURV9TVEFSVEVEKSB7Ci0JCQkvL1N0cmluZyBtb2RlID0gc2VydmVyLmdldE1vZGUoKTsKLQkJCWlmIChJTGF1bmNoTWFuYWdlci5ERUJVR19NT0RFLmVxdWFscyhtb2RlKSkKLQkJCQlyZXR1cm4gSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZShJbWFnZVJlc291cmNlLklNR19TRVJWRVJfU1RBVEVfU1RBUlRFRF9ERUJVRyk7Ci0JCQllbHNlIGlmIChJTGF1bmNoTWFuYWdlci5QUk9GSUxFX01PREUuZXF1YWxzKG1vZGUpKQotCQkJCXJldHVybiBJbWFnZVJlc291cmNlLmdldEltYWdlKEltYWdlUmVzb3VyY2UuSU1HX1NFUlZFUl9TVEFURV9TVEFSVEVEX1BST0ZJTEUpOwotCQkJZWxzZQotCQkJCXJldHVybiBJbWFnZVJlc291cmNlLmdldEltYWdlKEltYWdlUmVzb3VyY2UuSU1HX1NFUlZFUl9TVEFURV9TVEFSVEVEKTsKLQkJfSovCi0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBzZXJ2ZXIncyBzdGF0ZS4KLQkgKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBzZXJ2ZXIgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXIKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlcnZlclN0YXRlTGFiZWwoSVNlcnZlciBzZXJ2ZXIpIHsKLQkJcmV0dXJuIGdldFN0YXRlTGFiZWwoc2VydmVyLmdldFNlcnZlclR5cGUoKSwgc2VydmVyLmdldFNlcnZlclN0YXRlKCksIHNlcnZlci5nZXRNb2RlKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBnaXZlbiBzdGF0ZS4KLQkgKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U3RhdGVMYWJlbChJU2VydmVyVHlwZSBzZXJ2ZXJUeXBlLCBpbnQgc3RhdGUsIFN0cmluZyBtb2RlKSB7Ci0JCXJldHVybiBVSURlY29yYXRvck1hbmFnZXIuZ2V0VUlEZWNvcmF0b3Ioc2VydmVyVHlwZSkuZ2V0U3RhdGVMYWJlbChzdGF0ZSwgbW9kZSwgY291bnQpOwotCQkvKmlmIChzdGF0ZVNldCA9PSBJU2VydmVyVHlwZS5TRVJWRVJfU1RBVEVfU0VUX1BVQkxJU0hFRCkKLQkJCXJldHVybiAiIjsKLQkJCi0JCWlmIChzdGF0ZVNldCA9PSBJU2VydmVyVHlwZS5TRVJWRVJfU1RBVEVfU0VUX01BTkFHRUQpIHsKLQkJCWlmIChzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1VOS05PV04pCi0JCQkJcmV0dXJuICIiOwotCQkJZWxzZSBpZiAoc3RhdGUgPT0gSVNlcnZlci5TVEFURV9TVEFSVElORykKLQkJCQlyZXR1cm4gc3RhcnRpbmdUZXh0W2NvdW50XTsKLQkJCWVsc2UgaWYgKHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfU1RPUFBJTkcpCi0JCQkJcmV0dXJuIHN0b3BwaW5nVGV4dFtjb3VudF07Ci0JCQllbHNlIGlmIChzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1NUQVJURUQpIHsKLQkJCQlpZiAoSUxhdW5jaE1hbmFnZXIuREVCVUdfTU9ERS5lcXVhbHMobW9kZSkpCi0JCQkJCXJldHVybiBNZXNzYWdlcy52aWV3U3RhdHVzU3RhcnRlZERlYnVnIik7Ci0JCQkJZWxzZSBpZiAoSUxhdW5jaE1hbmFnZXIuUFJPRklMRV9NT0RFLmVxdWFscyhtb2RlKSkKLQkJCQkJcmV0dXJuIE1lc3NhZ2VzLnZpZXdTdGF0dXNTdGFydGVkUHJvZmlsZSIpOwotCQkJCWVsc2UKLQkJCQkJcmV0dXJuIE1lc3NhZ2VzLnZpZXdTdGF0dXNTdGFydGVkIik7Ci0JCQl9IGVsc2UgaWYgKHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfU1RPUFBFRCkKLQkJCQlyZXR1cm4gTWVzc2FnZXMudmlld1N0YXR1c1N0b3BwZWQiKTsKLQkJfQotCQkKLQkJcmV0dXJuIHNlcnZlclN0YXRlVW5tYW5hZ2VkW3N0YXRlXTsqLwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhbmltYXRlKCkgewotCQljb3VudCArKzsKLQkJaWYgKGNvdW50ID4gMikKLQkJCWNvdW50ID0gMDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL1NlcnZlclRhYmxlVmlld2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvU2VydmVyVGFibGVWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTcxMzg5NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvU2VydmVyVGFibGVWaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlldy5zZXJ2ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5TZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnV0aWwuUHVibGlzaEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5UcmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQWN0aW9uRmFjdG9yeTsKLS8qKgotICogVHJlZSB2aWV3IHNob3dpbmcgc2VydmVycyBhbmQgdGhlaXIgYXNzb2NpYXRpb25zLgotICovCi1wdWJsaWMgY2xhc3MgU2VydmVyVGFibGVWaWV3ZXIgZXh0ZW5kcyBUcmVlVmlld2VyIHsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBST09UID0gInJvb3QiOwotCi0JcHJvdGVjdGVkIElTZXJ2ZXJMaWZlY3ljbGVMaXN0ZW5lciBzZXJ2ZXJSZXNvdXJjZUxpc3RlbmVyOwotCXByb3RlY3RlZCBJUHVibGlzaExpc3RlbmVyIHB1Ymxpc2hMaXN0ZW5lcjsKLQlwcm90ZWN0ZWQgSVNlcnZlckxpc3RlbmVyIHNlcnZlckxpc3RlbmVyOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBPYmplY3QgZGVsZXRlZEVsZW1lbnQgPSBudWxsOwotCQotCS8vcHJvdGVjdGVkIHN0YXRpYyBTaGVsbCBmU2hlbGw7Ci0KLQkvLyBzZXJ2ZXJzIHRoYXQgYXJlIGN1cnJlbnRseSBwdWJsaXNoaW5nIGFuZCBzdGFydGluZwotCXByb3RlY3RlZCBzdGF0aWMgTGlzdCBwdWJsaXNoaW5nID0gbmV3IEFycmF5TGlzdCgpOwotCXByb3RlY3RlZCBzdGF0aWMgTGlzdCBzdGFydGluZyA9IG5ldyBBcnJheUxpc3QoKTsKLQkKLQlwcm90ZWN0ZWQgU2VydmVyVGFibGVMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXI7Ci0JcHJvdGVjdGVkIElTZWxlY3Rpb25MaXN0ZW5lciBkc0xpc3RlbmVyOwotCi0JcHJvdGVjdGVkIFNlcnZlcnNWaWV3IHZpZXc7Ci0JCi0JcHVibGljIGNsYXNzIFNlcnZlckNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyLCBJVHJlZUNvbnRlbnRQcm92aWRlciB7Ci0JCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgZWxlbWVudCkgewotCQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJSVNlcnZlcltdIHNlcnZlcnMgPSBTZXJ2ZXJDb3JlLmdldFNlcnZlcnMoKTsKLQkJCWlmIChzZXJ2ZXJzICE9IG51bGwpIHsKLQkJCQlpbnQgc2l6ZSA9IHNlcnZlcnMubGVuZ3RoOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJCWlmICghKChTZXJ2ZXIpc2VydmVyc1tpXSkuaXNQcml2YXRlKCkpCi0JCQkJCQlsaXN0LmFkZChzZXJ2ZXJzW2ldKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbGlzdC50b0FycmF5KCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHRoZVZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCi0JCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNb2R1bGVTZXJ2ZXIpIHsKLQkJCQlNb2R1bGVTZXJ2ZXIgbXMgPSAoTW9kdWxlU2VydmVyKSBlbGVtZW50OwotCQkJCXRyeSB7Ci0JCQkJCUlNb2R1bGVbXSBjaGlsZHJlbiA9IG1zLnNlcnZlci5nZXRDaGlsZE1vZHVsZXMobXMubW9kdWxlLCBudWxsKTsKLQkJCQkJaW50IHNpemUgPSBjaGlsZHJlbi5sZW5ndGg7Ci0JCQkJCU1vZHVsZVNlcnZlcltdIG1zMiA9IG5ldyBNb2R1bGVTZXJ2ZXJbc2l6ZV07Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJCQlpbnQgc2l6ZTIgPSBtcy5tb2R1bGUubGVuZ3RoOwotCQkJCQkJSU1vZHVsZVtdIG1vZHVsZSA9IG5ldyBJTW9kdWxlW3NpemUyICsgMV07Ci0JCQkJCQlTeXN0ZW0uYXJyYXljb3B5KG1zLm1vZHVsZSwgMCwgbW9kdWxlLCAwLCBzaXplMik7Ci0JCQkJCQltb2R1bGVbc2l6ZTJdID0gY2hpbGRyZW5baV07Ci0JCQkJCQltczJbaV0gPSBuZXcgTW9kdWxlU2VydmVyKG1zLnNlcnZlciwgbW9kdWxlKTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gbXMyOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJSVNlcnZlciBzZXJ2ZXIgPSAoSVNlcnZlcikgZWxlbWVudDsKLQkJCUlNb2R1bGVbXSBtb2R1bGVzID0gc2VydmVyLmdldE1vZHVsZXMoKTsgCi0JCQlpbnQgc2l6ZSA9IG1vZHVsZXMubGVuZ3RoOwotCQkJTW9kdWxlU2VydmVyW10gbXMgPSBuZXcgTW9kdWxlU2VydmVyW3NpemVdOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQltc1tpXSA9IG5ldyBNb2R1bGVTZXJ2ZXIoc2VydmVyLCBuZXcgSU1vZHVsZVtdIHsgbW9kdWxlc1tpXSB9KTsKLQkJCX0KLQkJCXJldHVybiBtczsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KSB7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1vZHVsZVNlcnZlcikgewotCQkJCU1vZHVsZVNlcnZlciBtcyA9IChNb2R1bGVTZXJ2ZXIpIGVsZW1lbnQ7Ci0JCQkJcmV0dXJuIG1zLnNlcnZlcjsKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTW9kdWxlU2VydmVyKSB7Ci0JCQkJLy8gQ2hlY2sgaWYgdGhlIG1vZHVsZSBzZXJ2ZXIgaGFzIGNoaWxkIG1vZHVsZXMuCi0JCQkJTW9kdWxlU2VydmVyIGN1ck1vZHVsZVNlcnZlciA9IChNb2R1bGVTZXJ2ZXIpZWxlbWVudDsKLQkJCQlJU2VydmVyIGN1clNlcnZlciA9IGN1ck1vZHVsZVNlcnZlci5zZXJ2ZXI7Ci0JCQkJSU1vZHVsZVtdIGN1ck1vZHVsZSA9IGN1ck1vZHVsZVNlcnZlci5tb2R1bGU7Ci0JCQkJaWYgKGN1clNlcnZlciAhPSBudWxsICYmICBjdXJNb2R1bGUgIT0gbnVsbCkgewotCQkJCQlJTW9kdWxlW10gY3VyQ2hpbGRNb2R1bGUgPSBjdXJTZXJ2ZXIuZ2V0Q2hpbGRNb2R1bGVzKGN1ck1vZHVsZSwgbnVsbCk7Ci0JCQkJCWlmIChjdXJDaGlsZE1vZHVsZSAhPSBudWxsICYmIGN1ckNoaWxkTW9kdWxlLmxlbmd0aCA+IDApCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJCi0JCQlJU2VydmVyIHNlcnZlciA9IChJU2VydmVyKSBlbGVtZW50OwotCQkJcmV0dXJuIHNlcnZlci5nZXRNb2R1bGVzKCkubGVuZ3RoID4gMDsKLQkJfQotCX0KLQotCS8qcHJvdGVjdGVkIHZvaWQgY3JlYXRlSG92ZXJIZWxwKFNoZWxsIHBhcmVudCwgUG9pbnQgcCkgewotCQlpZiAoZlNoZWxsICE9IG51bGwpIHsKLQkJCWZTaGVsbC5kaXNwb3NlKCk7Ci0JCQlmU2hlbGwgPSBudWxsOwotCQl9Ci0JCWZTaGVsbCA9IG5ldyBTaGVsbChwYXJlbnQsIFNXVC5OT19GT0NVUyB8IFNXVC5PTl9UT1AgfCBTV1QuUkVTSVpFIHwgU1dULk5PX1RSSU0pOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAzOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAzOwotCQlmU2hlbGwuc2V0TGF5b3V0KGxheW91dCk7Ci0JCQotCQlEaXNwbGF5IGRpc3BsYXkgPSBwYXJlbnQuZ2V0RGlzcGxheSgpOwotCQlTdHlsZWRUZXh0IHRleHQgPSBuZXcgU3R5bGVkVGV4dChmU2hlbGwsIFNXVC5OT05FKTsKLQkJdGV4dC5zZXRGb3JlZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0lORk9fRk9SRUdST1VORCkpOwotCQl0ZXh0LnNldEJhY2tncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfSU5GT19CQUNLR1JPVU5EKSk7Ci0JCXRleHQuYXBwZW5kKCJUZXN0aW5nXG5UaGlzIGlzIG11bHRpLWxpbmUiKTsKLQkJCi0JCWZTaGVsbC5zZXRMb2NhdGlvbihwLngsIHAueSk7Ci0JCWZTaGVsbC5zZXRCYWNrZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMQUNLKSk7Ci0JCWZTaGVsbC5wYWNrKCk7Ci0JCWZTaGVsbC5zZXRWaXNpYmxlKHRydWUpOwotCX0qLwotCi0JcHJvdGVjdGVkIFRocmVhZCB0aHJlYWQgPSBudWxsOwotCXByb3RlY3RlZCBib29sZWFuIHN0b3BUaHJlYWQgPSBmYWxzZTsKLQkKLQlwcm90ZWN0ZWQgdm9pZCBzdGFydFRocmVhZCgpIHsKLQkJc3RvcFRocmVhZCA9IGZhbHNlOwotCQlpZiAodGhyZWFkICE9IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQl0aHJlYWQgPSBuZXcgVGhyZWFkKCJTZXJ2ZXJzIFZpZXcgQW5pbWF0b3IiKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJd2hpbGUgKCFzdG9wVGhyZWFkKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlsYWJlbFByb3ZpZGVyLmFuaW1hdGUoKTsKLQkJCQkJCWZpbmFsIE9iamVjdFtdIHJvb3RFbGVtZW50cyA9ICgoSVRyZWVDb250ZW50UHJvdmlkZXIpZ2V0Q29udGVudFByb3ZpZGVyKCkpLmdldEVsZW1lbnRzKG51bGwpOyAKLQkJCQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQlpZiAoZ2V0VHJlZSgpICE9IG51bGwgJiYgIWdldFRyZWUoKS5pc0Rpc3Bvc2VkKCkpCi0JCQkJCQkJCQl1cGRhdGUocm9vdEVsZW1lbnRzLCBudWxsKTsKLQkJCQkJCQl9Ci0JCQkJCQl9KTsKLQkJCQkJCVRocmVhZC5zbGVlcCgyNTApOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiRXJyb3IgaW4gYW5pbWF0ZWQgc2VydmVyIHZpZXciLCBlKTsKLQkJCQkJfQotCQkJCQl0aHJlYWQgPSBudWxsOwotCQkJCX0KLQkJCX0KLQkJfTsKLQkJdGhyZWFkLnNldERhZW1vbih0cnVlKTsKLQkJdGhyZWFkLnN0YXJ0KCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3RvcFRocmVhZCgpIHsKLQkJc3RvcFRocmVhZCA9IHRydWU7Ci0JfQotCi0JLyoqCi0JICogU2VydmVyVGFibGVWaWV3ZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gdmlldyB0aGUgdmlldyAKLQkgKiBAcGFyYW0gdHJlZSB0aGUgdHJlZQotCSAqLwotCXB1YmxpYyBTZXJ2ZXJUYWJsZVZpZXdlcihmaW5hbCBTZXJ2ZXJzVmlldyB2aWV3LCBmaW5hbCBUcmVlIHRyZWUpIHsKLQkJc3VwZXIodHJlZSk7Ci0JCXRoaXMudmlldyA9IHZpZXc7Ci0JCS8qdHJlZS5hZGRNb3VzZU1vdmVMaXN0ZW5lcihuZXcgTW91c2VNb3ZlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb3VzZU1vdmUoTW91c2VFdmVudCBlKSB7Ci0JCQkJaWYgKGZTaGVsbCAhPSBudWxsKSB7Ci0JCQkJCWZTaGVsbC5kaXNwb3NlKCk7Ci0JCQkJCWZTaGVsbCA9IG51bGw7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJdHJlZS5hZGRNb3VzZVRyYWNrTGlzdGVuZXIobmV3IE1vdXNlVHJhY2tMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vdXNlRW50ZXIoTW91c2VFdmVudCBldmVudCkgewotCQkJCS8vIGlnbm9yZQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBtb3VzZUV4aXQoTW91c2VFdmVudCBldmVudCkgewotCQkJCS8vIGlnbm9yZQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBtb3VzZUhvdmVyKE1vdXNlRXZlbnQgZXZlbnQpIHsKLQkJCQljcmVhdGVIb3ZlckhlbHAodHJlZS5nZXRTaGVsbCgpLCB0cmVlLnRvRGlzcGxheShldmVudC54LCBldmVudC55KSk7Ci0JCQl9Ci0JCX0pOyovCi0JCi0JCXNldENvbnRlbnRQcm92aWRlcihuZXcgU2VydmVyQ29udGVudFByb3ZpZGVyKCkpOwotCQlsYWJlbFByb3ZpZGVyID0gbmV3IFNlcnZlclRhYmxlTGFiZWxQcm92aWRlcigpOwotCQlzZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpOwotCQlzZXRTb3J0ZXIobmV3IFZpZXdlclNvcnRlcigpIHsKLQkJCS8vIGVtcHR5Ci0JCX0pOwotCQotCQlzZXRJbnB1dChST09UKTsKLQkKLQkJYWRkTGlzdGVuZXJzKCk7Ci0JCQotCQlJQWN0aW9uQmFycyBhY3Rpb25CYXJzID0gdmlldy5nZXRWaWV3U2l0ZSgpLmdldEFjdGlvbkJhcnMoKTsKLQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuREVMRVRFLmdldElkKCksIG5ldyBTZXJ2ZXJBY3Rpb24oZ2V0Q29udHJvbCgpLmdldFNoZWxsKCksIHRoaXMsICJEZWxldGUgaXQhIiwgU2VydmVyQWN0aW9uSGVscGVyLkFDVElPTl9ERUxFVEUpKTsKLQkJCi0JCS8vIFRPRE86IGFkZCBkZWZhdWx0IHNlcnZlciBsaXN0ZW5lcgotCQkvKmRzTGlzdGVuZXIgPSBuZXcgSVNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJV29ya2JlbmNoUGFydCBwYXJ0LCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQkJCWlmICghKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSkKLQkJCQkJcmV0dXJuOwotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQkJCWZpbmFsIE9iamVjdCBvYmogPSBzZWwuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJSVByb2plY3QgcHJvaiA9IG51bGw7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElSZXNvdXJjZSkgewotCQkJCQlJUmVzb3VyY2UgcmVzID0gKElSZXNvdXJjZSkgb2JqOwotCQkJCQlwcm9qID0gcmVzLmdldFByb2plY3QoKTsKLQkJCQl9Ci0JCQkJaWYgKHByb2ogPT0gbnVsbCAmJiBvYmogIT0gbnVsbCkgewotCQkJCQl0cnkgewotCQkJCQkJSVJlc291cmNlIHJlcyA9IChJUmVzb3VyY2UpIFBsYXRmb3JtLmdldEFkYXB0ZXJNYW5hZ2VyKCkuZ2V0QWRhcHRlcihvYmosIElSZXNvdXJjZS5jbGFzcyk7Ci0JCQkJCQlpZiAocmVzICE9IG51bGwpCi0JCQkJCQkJcHJvaiA9IHJlcy5nZXRQcm9qZWN0KCk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBpZ25vcmUKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAocHJvaiAhPSBudWxsKSB7Ci0JCQkJCWZpbmFsIElQcm9qZWN0IHByb2plY3QgPSBwcm9qOwotCQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCWlmIChnZXRUcmVlKCkgPT0gbnVsbCB8fCBnZXRUcmVlKCkuaXNEaXNwb3NlZCgpKQotCQkJCQkJCQlyZXR1cm47Ci0KLQkJCQkJCQlJU2VydmVyIGRlZmF1bHRTZXJ2ZXIgPSBudWxsOwotCQkJCQkJCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKLQkJCQkJCQkJSVByb2plY3RQcm9wZXJ0aWVzIHByb3BzID0gU2VydmVyQ29yZS5nZXRQcm9qZWN0UHJvcGVydGllcyhwcm9qZWN0KTsKLQkJCQkJCQkJZGVmYXVsdFNlcnZlciA9IHByb3BzLmdldERlZmF1bHRTZXJ2ZXIoKTsKLQkJCQkJCQl9Ci0JCQkJCQkJSVNlcnZlciBvbGREZWZhdWx0U2VydmVyID0gbGFiZWxQcm92aWRlci5nZXREZWZhdWx0U2VydmVyKCk7Ci0JCQkJCQkJaWYgKChvbGREZWZhdWx0U2VydmVyID09IG51bGwgJiYgZGVmYXVsdFNlcnZlciA9PSBudWxsKQotCQkJCQkJCQkJfHwgKG9sZERlZmF1bHRTZXJ2ZXIgIT0gbnVsbCAmJiBvbGREZWZhdWx0U2VydmVyLmVxdWFscyhkZWZhdWx0U2VydmVyKSkpCi0JCQkJCQkJCXJldHVybjsKLQkJCQkJCQlsYWJlbFByb3ZpZGVyLnNldERlZmF1bHRTZXJ2ZXIoZGVmYXVsdFNlcnZlcik7Ci0JCQkJCQkJCi0JCQkJCQkJaWYgKG9sZERlZmF1bHRTZXJ2ZXIgIT0gbnVsbCkKLQkJCQkJCQkJcmVmcmVzaChvbGREZWZhdWx0U2VydmVyKTsKLQkJCQkJCQlpZiAoZGVmYXVsdFNlcnZlciAhPSBudWxsKQotCQkJCQkJCQlyZWZyZXNoKGRlZmF1bHRTZXJ2ZXIpOwotCQkJCQkJfQotCQkJCQl9KTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCXZpZXcuZ2V0Vmlld1NpdGUoKS5nZXRQYWdlKCkuYWRkU2VsZWN0aW9uTGlzdGVuZXIoZHNMaXN0ZW5lcik7Ki8KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCXNlcnZlclJlc291cmNlTGlzdGVuZXIgPSBuZXcgSVNlcnZlckxpZmVjeWNsZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VydmVyQWRkZWQoSVNlcnZlciBzZXJ2ZXIpIHsKLQkJCQlhZGRTZXJ2ZXIoc2VydmVyKTsKLQkJCQlzZXJ2ZXIuYWRkU2VydmVyTGlzdGVuZXIoc2VydmVyTGlzdGVuZXIpOwotCQkJCSgoU2VydmVyKSBzZXJ2ZXIpLmFkZFB1Ymxpc2hMaXN0ZW5lcihwdWJsaXNoTGlzdGVuZXIpOwotCQkJfQotCQkJcHVibGljIHZvaWQgc2VydmVyQ2hhbmdlZChJU2VydmVyIHNlcnZlcikgewotCQkJCXJlZnJlc2hTZXJ2ZXIoc2VydmVyKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHNlcnZlclJlbW92ZWQoSVNlcnZlciBzZXJ2ZXIpIHsKLQkJCQlyZW1vdmVTZXJ2ZXIoc2VydmVyKTsKLQkJCQlzZXJ2ZXIucmVtb3ZlU2VydmVyTGlzdGVuZXIoc2VydmVyTGlzdGVuZXIpOwotCQkJCSgoU2VydmVyKSBzZXJ2ZXIpLnJlbW92ZVB1Ymxpc2hMaXN0ZW5lcihwdWJsaXNoTGlzdGVuZXIpOwotCQkJfQotCQl9OwotCQlTZXJ2ZXJDb3JlLmFkZFNlcnZlckxpZmVjeWNsZUxpc3RlbmVyKHNlcnZlclJlc291cmNlTGlzdGVuZXIpOwotCQkKLQkJcHVibGlzaExpc3RlbmVyID0gbmV3IFB1Ymxpc2hBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgcHVibGlzaFN0YXJ0ZWQoSVNlcnZlciBzZXJ2ZXIpIHsKLQkJCQloYW5kbGVQdWJsaXNoQ2hhbmdlKHNlcnZlciwgdHJ1ZSk7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyB2b2lkIHB1Ymxpc2hGaW5pc2hlZChJU2VydmVyIHNlcnZlciwgSVN0YXR1cyBzdGF0dXMpIHsKLQkJCQloYW5kbGVQdWJsaXNoQ2hhbmdlKHNlcnZlciwgZmFsc2UpOwotCQkJfQotCQl9OwotCQkKLQkJc2VydmVyTGlzdGVuZXIgPSBuZXcgSVNlcnZlckxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VydmVyQ2hhbmdlZChTZXJ2ZXJFdmVudCBldmVudCkgewotCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJaW50IGV2ZW50S2luZCA9IGV2ZW50LmdldEtpbmQoKTsKLQkJCQlJU2VydmVyIHNlcnZlciA9IGV2ZW50LmdldFNlcnZlcigpOwotCQkJCWlmICgoZXZlbnRLaW5kICYgU2VydmVyRXZlbnQuU0VSVkVSX0NIQU5HRSkgIT0gMCkgewotCQkJCQkvLyBzZXJ2ZXIgY2hhbmdlIGV2ZW50Ci0JCQkJCWlmICgoZXZlbnRLaW5kICYgU2VydmVyRXZlbnQuU1RBVEVfQ0hBTkdFKSAhPSAwKSB7Ci0JCQkJCQlyZWZyZXNoU2VydmVyKHNlcnZlcik7Ci0JCQkJCQlpbnQgc3RhdGUgPSBldmVudC5nZXRTdGF0ZSgpOwotCQkJCQkJU3RyaW5nIGlkID0gc2VydmVyLmdldElkKCk7Ci0JCQkJCQlpZiAoc3RhdGUgPT0gSVNlcnZlci5TVEFURV9TVEFSVElORyB8fCBzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1NUT1BQSU5HKSB7Ci0JCQkJCQkJaWYgKCFzdGFydGluZy5jb250YWlucyhpZCkpIHsKLQkJCQkJCQkJaWYgKHN0YXJ0aW5nLmlzRW1wdHkoKSkKLQkJCQkJCQkJCXN0YXJ0VGhyZWFkKCk7Ci0JCQkJCQkJCXN0YXJ0aW5nLmFkZChpZCk7Ci0JCQkJCQkJfQotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlpZiAoc3RhcnRpbmcuY29udGFpbnMoaWQpKSB7Ci0JCQkJCQkJCXN0YXJ0aW5nLnJlbW92ZShpZCk7Ci0JCQkJCQkJCWlmIChzdGFydGluZy5pc0VtcHR5KCkpCi0JCQkJCQkJCQlzdG9wVGhyZWFkKCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9IGVsc2UKLQkJCQkJCXJlZnJlc2hTZXJ2ZXIoc2VydmVyKTsKLQkJCQl9IGVsc2UgaWYgKChldmVudEtpbmQgJiBTZXJ2ZXJFdmVudC5NT0RVTEVfQ0hBTkdFKSAhPSAwKSB7Ci0JCQkJCS8vIG1vZHVsZSBjaGFuZ2UgZXZlbnQKLQkJCQkJaWYgKChldmVudEtpbmQgJiBTZXJ2ZXJFdmVudC5TVEFURV9DSEFOR0UpICE9IDAgfHwgKGV2ZW50S2luZCAmIFNlcnZlckV2ZW50LlBVQkxJU0hfU1RBVEVfQ0hBTkdFKSAhPSAwKSB7Ci0JCQkJCQlyZWZyZXNoU2VydmVyKHNlcnZlcik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCQotCQkvLyBhZGQgbGlzdGVuZXJzIHRvIHNlcnZlcnMKLQkJSVNlcnZlcltdIHNlcnZlcnMgPSBTZXJ2ZXJDb3JlLmdldFNlcnZlcnMoKTsKLQkJaWYgKHNlcnZlcnMgIT0gbnVsbCkgewotCQkJaW50IHNpemUgPSBzZXJ2ZXJzLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJc2VydmVyc1tpXS5hZGRTZXJ2ZXJMaXN0ZW5lcihzZXJ2ZXJMaXN0ZW5lcik7Ci0JCQkJKChTZXJ2ZXIpIHNlcnZlcnNbaV0pLmFkZFB1Ymxpc2hMaXN0ZW5lcihwdWJsaXNoTGlzdGVuZXIpOwotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTZXJ2ZXIoZmluYWwgSVNlcnZlciBzZXJ2ZXIpIHsKLQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl0cnkgewotCQkJCQlyZWZyZXNoKHNlcnZlcik7Ci0JCQkJCUlTZWxlY3Rpb24gc2VsID0gU2VydmVyVGFibGVWaWV3ZXIudGhpcy5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJU2VydmVyVGFibGVWaWV3ZXIudGhpcy5zZXRTZWxlY3Rpb24oc2VsKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkvLyBpZ25vcmUKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZURpc3Bvc2UoRGlzcG9zZUV2ZW50IGV2ZW50KSB7Ci0JCXN0b3BUaHJlYWQoKTsKLQkJLy92aWV3LmdldFZpZXdTaXRlKCkuZ2V0UGFnZSgpLnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKGRzTGlzdGVuZXIpOwotCi0JCVNlcnZlckNvcmUucmVtb3ZlU2VydmVyTGlmZWN5Y2xlTGlzdGVuZXIoc2VydmVyUmVzb3VyY2VMaXN0ZW5lcik7Ci0JCQotCQkvLyByZW1vdmUgbGlzdGVuZXJzIGZyb20gc2VydmVyCi0JCUlTZXJ2ZXJbXSBzZXJ2ZXJzID0gU2VydmVyQ29yZS5nZXRTZXJ2ZXJzKCk7Ci0JCWlmIChzZXJ2ZXJzICE9IG51bGwpIHsKLQkJCWludCBzaXplID0gc2VydmVycy5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCXNlcnZlcnNbaV0ucmVtb3ZlU2VydmVyTGlzdGVuZXIoc2VydmVyTGlzdGVuZXIpOwotCQkJCSgoU2VydmVyKSBzZXJ2ZXJzW2ldKS5yZW1vdmVQdWJsaXNoTGlzdGVuZXIocHVibGlzaExpc3RlbmVyKTsKLQkJCX0KLQkJfQotCQotCQlzdXBlci5oYW5kbGVEaXNwb3NlKGV2ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB0aGUgcHVibGlzaCBzdGF0ZSBjaGFuZ2VzLgotCSAqIEBwYXJhbSBzZXJ2ZXIgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXIKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVQdWJsaXNoQ2hhbmdlKElTZXJ2ZXIgc2VydmVyLCBib29sZWFuIGlzUHVibGlzaGluZykgewotCQlTdHJpbmcgc2VydmVySWQgPSBzZXJ2ZXIuZ2V0SWQoKTsKLQkJaWYgKGlzUHVibGlzaGluZykKLQkJCXB1Ymxpc2hpbmcuYWRkKHNlcnZlcklkKTsKLQkJZWxzZQotCQkJcHVibGlzaGluZy5yZW1vdmUoc2VydmVySWQpOwotCQotCQlyZWZyZXNoU2VydmVyKHNlcnZlcik7Ci0JfQotCQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVNlcnZlck1vZHVsZXNDaGFuZ2VkKElTZXJ2ZXIgc2VydmVyMikgewotCQlpZiAoc2VydmVyMiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCUlTZXJ2ZXJbXSBzZXJ2ZXJzID0gU2VydmVyQ29yZS5nZXRTZXJ2ZXJzKCk7Ci0JCWlmIChzZXJ2ZXJzICE9IG51bGwpIHsKLQkJCWludCBzaXplID0gc2VydmVycy5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCWlmIChzZXJ2ZXIyLmVxdWFscyhzZXJ2ZXJzW2ldKSkKLQkJCQkJcmVmcmVzaChzZXJ2ZXJzW2ldKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDYWxsZWQgd2hlbiBhbiBlbGVtZW50IGlzIGFkZGVkLgotCSAqIEBwYXJhbSBzZXJ2ZXIgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXIKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVTZXJ2ZXJSZXNvdXJjZUFkZGVkKElTZXJ2ZXIgc2VydmVyKSB7Ci0JCWFkZChudWxsLCBzZXJ2ZXIpOwotCX0KLQkKLQkvKnByb3RlY3RlZCB2b2lkIGhhbmRsZVNlcnZlclJlc291cmNlQWRkZWQoSVNlcnZlckNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgewotCQljb25maWd1cmF0aW9uQ2hhbmdlKGNvbmZpZ3VyYXRpb24sIHRydWUpOwotCX0qLwotCQotCS8qKgotCSAqIENhbGxlZCB3aGVuIGFuIGVsZW1lbnQgaXMgY2hhbmdlZC4KLQkgKiBAcGFyYW0gc2VydmVyIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlU2VydmVyUmVzb3VyY2VDaGFuZ2VkKElTZXJ2ZXIgc2VydmVyKSB7Ci0JCXJlZnJlc2goc2VydmVyKTsKLQl9Ci0JCi0JLypwcm90ZWN0ZWQgdm9pZCBoYW5kbGVTZXJ2ZXJSZXNvdXJjZUNoYW5nZWQoSVNlcnZlckNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgewotCQlJU2VydmVyW10gc2VydmVycyA9IFNlcnZlckNvcmUuZ2V0U2VydmVycygpOwotCQlpZiAoc2VydmVycyAhPSBudWxsKSB7Ci0JCQlpbnQgc2l6ZSA9IHNlcnZlcnMubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlJU2VydmVyQ29uZmlndXJhdGlvbiBjb25maWcgPSBzZXJ2ZXJzW2ldLmdldFNlcnZlckNvbmZpZ3VyYXRpb24oKTsKLQkJCQlpZiAoY29uZmlndXJhdGlvbi5lcXVhbHMoY29uZmlnKSkKLQkJCQkJcmVmcmVzaChzZXJ2ZXJzW2ldKTsKLQkJCX0KLQkJfQotCX0qLwotCQotCS8qKgotCSAqIENhbGxlZCB3aGVuIGFuIGVsZW1lbnQgaXMgcmVtb3ZlZC4KLQkgKiBAcGFyYW0gc2VydmVyIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlU2VydmVyUmVzb3VyY2VSZW1vdmVkKElTZXJ2ZXIgc2VydmVyKSB7Ci0JCXJlbW92ZShzZXJ2ZXIpOwotCi0JCVN0cmluZyBzZXJ2ZXJJZCA9IHNlcnZlci5nZXRJZCgpOwotCQlwdWJsaXNoaW5nLnJlbW92ZShzZXJ2ZXJJZCk7Ci0KLQkJdmlldy5nZXRWaWV3U2l0ZSgpLmdldEFjdGlvbkJhcnMoKS5nZXRTdGF0dXNMaW5lTWFuYWdlcigpLnNldE1lc3NhZ2UobnVsbCwgbnVsbCk7Ci0JfQotCQotCS8qcHJvdGVjdGVkIHZvaWQgaGFuZGxlU2VydmVyUmVzb3VyY2VSZW1vdmVkKElTZXJ2ZXJDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHsKLQkJY29uZmlndXJhdGlvbkNoYW5nZShjb25maWd1cmF0aW9uLCBmYWxzZSk7Ci0JfSovCi0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkU2VydmVyKGZpbmFsIElTZXJ2ZXIgc2VydmVyKSB7Ci0JCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJYWRkKFJPT1QsIHNlcnZlcik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTZXJ2ZXIoZmluYWwgSVNlcnZlciBzZXJ2ZXIpIHsKLQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlyZW1vdmUoc2VydmVyKTsKLQkJCX0KLQkJfSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9TZXJ2ZXJzVmlldy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL1NlcnZlcnNWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlNGZlMzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL1NlcnZlcnNWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXcuc2VydmVyczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuSURlYnVnVUlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuSURlYnVnVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlRyYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5TZXJ2ZXJEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRORDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkZpbGVUcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5SZXNvdXJjZVRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MubmF2aWdhdG9yLkxvY2FsU2VsZWN0aW9uVHJhbnNmZXI7Ci0vKioKLSAqIFZpZXcgb2Ygc2VydmVyLCB0aGVpciBjb25maWd1cmF0aW9ucyBhbmQgc3RhdHVzLgotICovCi1wdWJsaWMgY2xhc3MgU2VydmVyc1ZpZXcgZXh0ZW5kcyBWaWV3UGFydCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19DT0xVTU5fV0lEVEggPSAiY29sdW1uV2lkdGgiOwotCi0JcHJvdGVjdGVkIGludFtdIGNvbHM7Ci0KLQlwcm90ZWN0ZWQgVHJlZSB0cmVlVGFibGU7Ci0JcHJvdGVjdGVkIFNlcnZlclRhYmxlVmlld2VyIHRhYmxlVmlld2VyOwotCi0JLy8gYWN0aW9ucyBvbiBhIHNlcnZlcgotCXByb3RlY3RlZCBBY3Rpb25bXSBhY3Rpb25zOwotCXByb3RlY3RlZCBNZW51TWFuYWdlciByZXN0YXJ0TWVudTsKLQotCS8qKgotCSAqIFNlcnZlcnNWaWV3IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFNlcnZlcnNWaWV3KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIGNyZWF0ZVBhcnRDb250cm9sIG1ldGhvZCBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQgYSBwYXJlbnQgY29tcG9zaXRlCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQl0cmVlVGFibGUgPSBuZXcgVHJlZShwYXJlbnQsIFNXVC5TSU5HTEUgfCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuTk9ORSk7Ci0JCXRyZWVUYWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCQl0cmVlVGFibGUuc2V0TGluZXNWaXNpYmxlKGZhbHNlKTsKLQkJdHJlZVRhYmxlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQl0cmVlVGFibGUuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0cmVlVGFibGUsIENvbnRleHRJZHMuVklFV19TRVJWRVJTKTsKLQkJCi0JCS8vIGFkZCBjb2x1bW5zCi0JCVRyZWVDb2x1bW4gY29sdW1uID0gbmV3IFRyZWVDb2x1bW4odHJlZVRhYmxlLCBTV1QuU0lOR0xFKTsKLQkJY29sdW1uLnNldFRleHQoTWVzc2FnZXMudmlld1NlcnZlcik7Ci0JCWNvbHVtbi5zZXRXaWR0aChjb2xzWzBdKTsKLQkJCi0JCVRyZWVDb2x1bW4gY29sdW1uMiA9IG5ldyBUcmVlQ29sdW1uKHRyZWVUYWJsZSwgU1dULlNJTkdMRSk7Ci0JCWNvbHVtbjIuc2V0VGV4dChNZXNzYWdlcy52aWV3U3RhdHVzKTsKLQkJY29sdW1uMi5zZXRXaWR0aChjb2xzWzFdKTsKLQkJCi0JCVRyZWVDb2x1bW4gY29sdW1uMyA9IG5ldyBUcmVlQ29sdW1uKHRyZWVUYWJsZSwgU1dULlNJTkdMRSk7Ci0JCWNvbHVtbjMuc2V0VGV4dChNZXNzYWdlcy52aWV3U3luYyk7Ci0JCWNvbHVtbjMuc2V0V2lkdGgoY29sc1syXSk7Ci0JCQotCQl0YWJsZVZpZXdlciA9IG5ldyBTZXJ2ZXJUYWJsZVZpZXdlcih0aGlzLCB0cmVlVGFibGUpOwotCQlpbml0aWFsaXplQWN0aW9ucyh0YWJsZVZpZXdlcik7Ci0JCQotCQl0cmVlVGFibGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXRyeSB7Ci0JCQkJCS8qVGFibGVJdGVtIGl0ZW0gPSB0YWJsZS5nZXRTZWxlY3Rpb24oKVswXTsKLQkJCQkJSVNlcnZlclJlc291cmNlIHJlc291cmNlID0gKElTZXJ2ZXJSZXNvdXJjZSkgaXRlbS5nZXREYXRhKCk7Ci0JCQkJCUlTZXJ2ZXJSZXNvdXJjZUZhY3RvcnkgZmFjdG9yeSA9IFNlcnZlclV0aWwuZ2V0U2VydmVyUmVzb3VyY2VGYWN0b3J5KHJlc291cmNlKTsKLQkJCQkJU3RyaW5nIGxhYmVsID0gU2VydmVyTGFiZWxQcm92aWRlci5nZXRJbnN0YW5jZSgpLmdldFRleHQoZmFjdG9yeSk7Ci0JCQkJCWxhYmVsICs9ICIgKCI7Ci0JCQkJCWxhYmVsICs9IFNlcnZlckNvcmUuZ2V0UmVzb3VyY2VNYW5hZ2VyKCkuZ2V0U2VydmVyUmVzb3VyY2VMb2NhdGlvbihyZXNvdXJjZSkuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLnN1YnN0cmluZygxKTsKLQkJCQkJbGFiZWwgKz0gIikiOwotCQkJCQlnZXRWaWV3U2l0ZSgpLmdldEFjdGlvbkJhcnMoKS5nZXRTdGF0dXNMaW5lTWFuYWdlcigpLnNldE1lc3NhZ2UoU2VydmVyTGFiZWxQcm92aWRlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlKGZhY3RvcnkpLCBsYWJlbCk7Ci0JCQkJCQotCQkJCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJU2VydmVyKSB7Ci0JCQkJCQlJU2VydmVyIHNlcnZlciA9IChJU2VydmVyKSByZXNvdXJjZTsKLQkJCQkJCUlMYXVuY2hNYW5hZ2VyIGxhdW5jaE1hbmFnZXIgPSBEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TGF1bmNoTWFuYWdlcigpOwotCQkJCQkJSUxhdW5jaFtdIGxhdW5jaGVzID0gbGF1bmNoTWFuYWdlci5nZXRMYXVuY2hlcygpOwotCQkJCQkJaW50IHNpemUgPSBsYXVuY2hlcy5sZW5ndGg7Ci0JCQkJCQlmb3IgKGludCBpID0gc2l6ZS0xOyBpID49IDA7IGktLSkgewotCQkJCQkJCUlMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZyA9IGxhdW5jaGVzW2ldLmdldExhdW5jaENvbmZpZ3VyYXRpb24oKTsKLQkJCQkJCQlpZiAoTEFVTkNIX0NPTkZJR1VSQVRJT05fVFlQRV9JRC5lcXVhbHMoY29uZmlnLmdldFR5cGUoKS5nZXRJZGVudGlmaWVyKCkpICYmCi0JCQkJCQkJCQlTZXJ2ZXJDb3JlLmdldFNlcnZlclJlZihzZXJ2ZXIpLmVxdWFscyhjb25maWcuZ2V0QXR0cmlidXRlKFNFUlZFUl9SRUYsIChTdHJpbmcpbnVsbCkpKSB7Ci0JCQkJCQkJCXNlbGVjdFNlcnZlclByb2Nlc3MobGF1bmNoZXNbaV0pOwotCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ki8KLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlnZXRWaWV3U2l0ZSgpLmdldEFjdGlvbkJhcnMoKS5nZXRTdGF0dXNMaW5lTWFuYWdlcigpLnNldE1lc3NhZ2UobnVsbCwgIiIpOwotCQkJCX0KLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXRyeSB7Ci0JCQkJCVRyZWVJdGVtIGl0ZW0gPSB0cmVlVGFibGUuZ2V0U2VsZWN0aW9uKClbMF07Ci0JCQkJCU9iamVjdCBkYXRhID0gaXRlbS5nZXREYXRhKCk7Ci0JCQkJCWlmICghKGRhdGEgaW5zdGFuY2VvZiBJU2VydmVyKSkKLQkJCQkJCXJldHVybjsKLQkJCQkJSVNlcnZlciBzZXJ2ZXIgPSAoSVNlcnZlcikgZGF0YTsKLQkJCQkJU2VydmVyVUlQbHVnaW4uZWRpdFNlcnZlcihzZXJ2ZXIpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBvcGVuIHNlcnZlciIsIGUpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCQotCQlNZW51TWFuYWdlciBtZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcigiI1BvcHVwTWVudSIpOwotCQltZW51TWFuYWdlci5zZXRSZW1vdmVBbGxXaGVuU2hvd24odHJ1ZSk7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gdHJlZVRhYmxlLmdldFNoZWxsKCk7Ci0JCW1lbnVNYW5hZ2VyLmFkZE1lbnVMaXN0ZW5lcihuZXcgSU1lbnVMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWdyKSB7Ci0JCQkJZmlsbENvbnRleHRNZW51KHNoZWxsLCBtZ3IpOwotCQkJfQotCQl9KTsKLQkJTWVudSBtZW51ID0gbWVudU1hbmFnZXIuY3JlYXRlQ29udGV4dE1lbnUocGFyZW50KTsKLQkJdHJlZVRhYmxlLnNldE1lbnUobWVudSk7Ci0JCWdldFNpdGUoKS5yZWdpc3RlckNvbnRleHRNZW51KG1lbnVNYW5hZ2VyLCB0YWJsZVZpZXdlcik7Ci0JCWdldFNpdGUoKS5zZXRTZWxlY3Rpb25Qcm92aWRlcih0YWJsZVZpZXdlcik7Ci0JCQotCQlpbml0RHJhZ0FuZERyb3AoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElWaWV3U2l0ZSBzaXRlLCBJTWVtZW50byBtZW1lbnRvKSB0aHJvd3MgUGFydEluaXRFeGNlcHRpb24gewotCQlzdXBlci5pbml0KHNpdGUsIG1lbWVudG8pOwotCQljb2xzID0gbmV3IGludFszXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKLQkJCWNvbHNbaV0gPSAyMDA7Ci0JCQlpZiAobWVtZW50byAhPSBudWxsKSB7Ci0JCQkJSW50ZWdlciBpbiA9IG1lbWVudG8uZ2V0SW50ZWdlcihUQUdfQ09MVU1OX1dJRFRIICsgaSk7Ci0JCQkJaWYgKGluICE9IG51bGwgJiYgaW4uaW50VmFsdWUoKSA+IDUpCi0JCQkJCWNvbHNbaV0gPSBpbi5pbnRWYWx1ZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2F2ZVN0YXRlKElNZW1lbnRvIG1lbWVudG8pIHsKLQkJVHJlZUNvbHVtbltdIHRjID0gdHJlZVRhYmxlLmdldENvbHVtbnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKLQkJCWludCB3aWR0aCA9IHRjW2ldLmdldFdpZHRoKCk7Ci0JCQlpZiAod2lkdGggIT0gMCkKLQkJCQltZW1lbnRvLnB1dEludGVnZXIoVEFHX0NPTFVNTl9XSURUSCArIGksIHdpZHRoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNlbGVjdFNlcnZlclByb2Nlc3MoT2JqZWN0IHByb2Nlc3MpIHsKLQkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpIDsKLQkJaWYgKHdpbmRvdyAhPSBudWxsKSB7Ci0JCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gd2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLQkJCWlmIChwYWdlICE9IG51bGwpIHsKLQkJCQlJV29ya2JlbmNoUGFydCBwYXJ0ID0gcGFnZS5maW5kVmlldyhJRGVidWdVSUNvbnN0YW50cy5JRF9ERUJVR19WSUVXKTsKLQkJCQlpZiAocGFydCAhPSBudWxsKSB7Ci0JCQkJCUlEZWJ1Z1ZpZXcgdmlldyA9IChJRGVidWdWaWV3KXBhcnQuZ2V0QWRhcHRlcihJRGVidWdWaWV3LmNsYXNzKTsKLQkJCQkJaWYgKHZpZXcgIT0gbnVsbCkgewotCQkJCQkJVmlld2VyIHZpZXdlciA9IHZpZXcuZ2V0Vmlld2VyKCk7Ci0JCQkJCQlpZiAodmlld2VyICE9IG51bGwpIHsKLQkJCQkJCQl2aWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHByb2Nlc3MpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemUgYWN0aW9ucwotCSAqIAotCSAqIEBwYXJhbSBwcm92aWRlciBhIHNlbGVjdGlvbiBwcm92aWRlcgotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVBY3Rpb25zKElTZWxlY3Rpb25Qcm92aWRlciBwcm92aWRlcikgewotCQlTaGVsbCBzaGVsbCA9IGdldFNpdGUoKS5nZXRTaGVsbCgpOwotCi0JCS8vIGNyZWF0ZSB0aGUgZGVidWcgYWN0aW9uCi0JCUFjdGlvbiBkZWJ1Z0FjdGlvbiA9IG5ldyBTdGFydEFjdGlvbihzaGVsbCwgcHJvdmlkZXIsICJkZWJ1ZyIsIElMYXVuY2hNYW5hZ2VyLkRFQlVHX01PREUpOwotCQlkZWJ1Z0FjdGlvbi5zZXRUb29sVGlwVGV4dChNZXNzYWdlcy5hY3Rpb25EZWJ1Z1Rvb2xUaXApOwotCQlkZWJ1Z0FjdGlvbi5zZXRUZXh0KE1lc3NhZ2VzLmFjdGlvbkRlYnVnKTsKLQkJZGVidWdBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX0VMQ0xfU1RBUlRfREVCVUcpKTsKLQkJZGVidWdBY3Rpb24uc2V0SG92ZXJJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfQ0xDTF9TVEFSVF9ERUJVRykpOwotCQlkZWJ1Z0FjdGlvbi5zZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19ETENMX1NUQVJUX0RFQlVHKSk7Ci0JCi0JCS8vIGNyZWF0ZSB0aGUgc3RhcnQgYWN0aW9uCi0JCUFjdGlvbiBydW5BY3Rpb24gPSBuZXcgU3RhcnRBY3Rpb24oc2hlbGwsIHByb3ZpZGVyLCAic3RhcnQiLCBJTGF1bmNoTWFuYWdlci5SVU5fTU9ERSk7Ci0JCXJ1bkFjdGlvbi5zZXRUb29sVGlwVGV4dChNZXNzYWdlcy5hY3Rpb25TdGFydFRvb2xUaXApOwotCQlydW5BY3Rpb24uc2V0VGV4dChNZXNzYWdlcy5hY3Rpb25TdGFydCk7Ci0JCXJ1bkFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfRUxDTF9TVEFSVCkpOwotCQlydW5BY3Rpb24uc2V0SG92ZXJJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfQ0xDTF9TVEFSVCkpOwotCQlydW5BY3Rpb24uc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfRExDTF9TVEFSVCkpOwotCQkKLQkJLy8gY3JlYXRlIHRoZSBwcm9maWxlIGFjdGlvbgotCQlBY3Rpb24gcHJvZmlsZUFjdGlvbiA9IG5ldyBTdGFydEFjdGlvbihzaGVsbCwgcHJvdmlkZXIsICJwcm9maWxlIiwgSUxhdW5jaE1hbmFnZXIuUFJPRklMRV9NT0RFKTsKLQkJcHJvZmlsZUFjdGlvbi5zZXRUb29sVGlwVGV4dChNZXNzYWdlcy5hY3Rpb25Qcm9maWxlVG9vbFRpcCk7Ci0JCXByb2ZpbGVBY3Rpb24uc2V0VGV4dChNZXNzYWdlcy5hY3Rpb25Qcm9maWxlKTsKLQkJcHJvZmlsZUFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfRUxDTF9TVEFSVF9QUk9GSUxFKSk7Ci0JCXByb2ZpbGVBY3Rpb24uc2V0SG92ZXJJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfQ0xDTF9TVEFSVF9QUk9GSUxFKSk7Ci0JCXByb2ZpbGVBY3Rpb24uc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfRExDTF9TVEFSVF9QUk9GSUxFKSk7Ci0JCi0JCS8vIGNyZWF0ZSB0aGUgcmVzdGFydCBtZW51Ci0JCXJlc3RhcnRNZW51ID0gbmV3IE1lbnVNYW5hZ2VyKE1lc3NhZ2VzLmFjdGlvblJlc3RhcnQpOwotCQkKLQkJQWN0aW9uIHJlc3RhcnRBY3Rpb24gPSBuZXcgUmVzdGFydEFjdGlvbihzaGVsbCwgcHJvdmlkZXIsICJyZXN0YXJ0RGVidWciLCBJTGF1bmNoTWFuYWdlci5ERUJVR19NT0RFKTsKLQkJcmVzdGFydEFjdGlvbi5zZXRUb29sVGlwVGV4dChNZXNzYWdlcy5hY3Rpb25EZWJ1Z1Rvb2xUaXApOwotCQlyZXN0YXJ0QWN0aW9uLnNldFRleHQoTWVzc2FnZXMuYWN0aW9uRGVidWcpOwotCQlyZXN0YXJ0QWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19FTENMX1NUQVJUX0RFQlVHKSk7Ci0JCXJlc3RhcnRBY3Rpb24uc2V0SG92ZXJJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfQ0xDTF9TVEFSVF9ERUJVRykpOwotCQlyZXN0YXJ0QWN0aW9uLnNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX0RMQ0xfU1RBUlRfREVCVUcpKTsKLQkJcmVzdGFydE1lbnUuYWRkKHJlc3RhcnRBY3Rpb24pOwotCQkKLQkJcmVzdGFydEFjdGlvbiA9IG5ldyBSZXN0YXJ0QWN0aW9uKHNoZWxsLCBwcm92aWRlciwgInJlc3RhcnRSdW4iLCBJTGF1bmNoTWFuYWdlci5SVU5fTU9ERSk7Ci0JCXJlc3RhcnRBY3Rpb24uc2V0VG9vbFRpcFRleHQoTWVzc2FnZXMuYWN0aW9uUmVzdGFydFRvb2xUaXApOwotCQlyZXN0YXJ0QWN0aW9uLnNldFRleHQoTWVzc2FnZXMuYWN0aW9uU3RhcnQpOwotCQlyZXN0YXJ0QWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19FTENMX1NUQVJUKSk7Ci0JCXJlc3RhcnRBY3Rpb24uc2V0SG92ZXJJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfQ0xDTF9TVEFSVCkpOwotCQlyZXN0YXJ0QWN0aW9uLnNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX0RMQ0xfU1RBUlQpKTsKLQkJcmVzdGFydE1lbnUuYWRkKHJlc3RhcnRBY3Rpb24pOwotCQkKLQkJcmVzdGFydEFjdGlvbiA9IG5ldyBSZXN0YXJ0QWN0aW9uKHNoZWxsLCBwcm92aWRlciwgInJlc3RhcnRQcm9maWxlIiwgSUxhdW5jaE1hbmFnZXIuUFJPRklMRV9NT0RFKTsKLQkJcmVzdGFydEFjdGlvbi5zZXRUb29sVGlwVGV4dChNZXNzYWdlcy5hY3Rpb25SZXN0YXJ0VG9vbFRpcCk7Ci0JCXJlc3RhcnRBY3Rpb24uc2V0VGV4dChNZXNzYWdlcy5hY3Rpb25Qcm9maWxlKTsKLQkJcmVzdGFydEFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfRUxDTF9TVEFSVF9QUk9GSUxFKSk7Ci0JCXJlc3RhcnRBY3Rpb24uc2V0SG92ZXJJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfQ0xDTF9TVEFSVF9QUk9GSUxFKSk7Ci0JCXJlc3RhcnRBY3Rpb24uc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfRExDTF9TVEFSVF9QUk9GSUxFKSk7Ci0JCXJlc3RhcnRNZW51LmFkZChyZXN0YXJ0QWN0aW9uKTsKLQkJCi0JCS8vIGNyZWF0ZSB0aGUgcmVzdGFydCBhY3Rpb24KLQkJcmVzdGFydEFjdGlvbiA9IG5ldyBSZXN0YXJ0QWN0aW9uKHNoZWxsLCBwcm92aWRlciwgInJlc3RhcnQiKTsKLQkJcmVzdGFydEFjdGlvbi5zZXRUb29sVGlwVGV4dChNZXNzYWdlcy5hY3Rpb25SZXN0YXJ0VG9vbFRpcCk7Ci0JCXJlc3RhcnRBY3Rpb24uc2V0VGV4dChNZXNzYWdlcy5hY3Rpb25SZXN0YXJ0KTsKLQkJcmVzdGFydEFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfRUxDTF9SRVNUQVJUKSk7Ci0JCXJlc3RhcnRBY3Rpb24uc2V0SG92ZXJJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfQ0xDTF9SRVNUQVJUKSk7Ci0JCXJlc3RhcnRBY3Rpb24uc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfRExDTF9SRVNUQVJUKSk7Ci0KLQkJLy8gY3JlYXRlIHRoZSBzdG9wIGFjdGlvbgotCQlBY3Rpb24gc3RvcEFjdGlvbiA9IG5ldyBTdG9wQWN0aW9uKHNoZWxsLCBwcm92aWRlciwgInN0b3AiKTsKLQkJc3RvcEFjdGlvbi5zZXRUb29sVGlwVGV4dChNZXNzYWdlcy5hY3Rpb25TdG9wVG9vbFRpcCk7Ci0JCXN0b3BBY3Rpb24uc2V0VGV4dChNZXNzYWdlcy5hY3Rpb25TdG9wKTsKLQkJc3RvcEFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfRUxDTF9TVE9QKSk7Ci0JCXN0b3BBY3Rpb24uc2V0SG92ZXJJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfQ0xDTF9TVE9QKSk7Ci0JCXN0b3BBY3Rpb24uc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfRExDTF9TVE9QKSk7Ci0KLQkJLy8gY3JlYXRlIHRoZSBkaXNjb25uZWN0IGFjdGlvbgotCQkvKkFjdGlvbiBkaXNjb25uZWN0QWN0aW9uID0gbmV3IFN0b3BBY3Rpb24oc2hlbGwsIHByb3ZpZGVyLCAiZGlzY29ubmVjdCIsIElTZXJ2ZXJUeXBlLlNFUlZFUl9TVEFURV9TRVRfQVRUQUNIRUQpOwotCQlkaXNjb25uZWN0QWN0aW9uLnNldFRvb2xUaXBUZXh0KE1lc3NhZ2VzLmFjdGlvblN0b3BUb29sVGlwMiIpKTsKLQkJZGlzY29ubmVjdEFjdGlvbi5zZXRUZXh0KE1lc3NhZ2VzLmFjdGlvblN0b3AyIikpOwotCQlkaXNjb25uZWN0QWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19FTENMX0RJU0NPTk5FQ1QpKTsKLQkJZGlzY29ubmVjdEFjdGlvbi5zZXRIb3ZlckltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19DTENMX0RJU0NPTk5FQ1QpKTsKLQkJZGlzY29ubmVjdEFjdGlvbi5zZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19ETENMX0RJU0NPTk5FQ1QpKTsqLwotCi0JCS8vIGNyZWF0ZSB0aGUgcHVibGlzaCBhY3Rpb24KLQkJQWN0aW9uIHB1Ymxpc2hBY3Rpb24gPSBuZXcgUHVibGlzaEFjdGlvbihzaGVsbCwgcHJvdmlkZXIsICJwdWJsaXNoIik7Ci0JCXB1Ymxpc2hBY3Rpb24uc2V0VG9vbFRpcFRleHQoTWVzc2FnZXMuYWN0aW9uUHVibGlzaFRvb2xUaXApOwotCQlwdWJsaXNoQWN0aW9uLnNldFRleHQoTWVzc2FnZXMuYWN0aW9uUHVibGlzaCk7Ci0JCXB1Ymxpc2hBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX0VMQ0xfUFVCTElTSCkpOwotCQlwdWJsaXNoQWN0aW9uLnNldEhvdmVySW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX0NMQ0xfUFVCTElTSCkpOwotCQlwdWJsaXNoQWN0aW9uLnNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX0RMQ0xfUFVCTElTSCkpOwotCQkKLQkJLy8gY3JlYXRlIHRoZSBtb2R1bGUgc2xvc2ggZGlhbG9nIGFjdGlvbgotCQlBY3Rpb24gYWRkTW9kdWxlQWN0aW9uID0gbmV3IE1vZHVsZVNsb3NoQWN0aW9uKHNoZWxsLCBwcm92aWRlciwgIm1vZHVsZXMiKTsKLQkJYWRkTW9kdWxlQWN0aW9uLnNldFRvb2xUaXBUZXh0KE1lc3NhZ2VzLmFjdGlvbk1vZGlmeU1vZHVsZXNUb29sVGlwKTsKLQkJYWRkTW9kdWxlQWN0aW9uLnNldFRleHQoTWVzc2FnZXMuYWN0aW9uTW9kaWZ5TW9kdWxlcyk7Ci0JCWFkZE1vZHVsZUFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfRVRPT0xfTU9ESUZZX01PRFVMRVMpKTsKLQkJYWRkTW9kdWxlQWN0aW9uLnNldEhvdmVySW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX0NUT09MX01PRElGWV9NT0RVTEVTKSk7Ci0JCWFkZE1vZHVsZUFjdGlvbi5zZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19EVE9PTF9NT0RJRllfTU9EVUxFUykpOwotCQkKLQkJYWN0aW9ucyA9IG5ldyBBY3Rpb25bN107Ci0JCWFjdGlvbnNbMF0gPSBkZWJ1Z0FjdGlvbjsKLQkJYWN0aW9uc1sxXSA9IHJ1bkFjdGlvbjsKLQkJYWN0aW9uc1syXSA9IHByb2ZpbGVBY3Rpb247Ci0JCWFjdGlvbnNbM10gPSByZXN0YXJ0QWN0aW9uOwotCQlhY3Rpb25zWzRdID0gc3RvcEFjdGlvbjsKLQkJYWN0aW9uc1s1XSA9IHB1Ymxpc2hBY3Rpb247Ci0JCWFjdGlvbnNbNl0gPSBhZGRNb2R1bGVBY3Rpb247Ci0JCQotCQkvLyBhZGQgdG9vbGJhciBidXR0b25zCi0JCUlDb250cmlidXRpb25NYW5hZ2VyIGNtID0gZ2V0Vmlld1NpdGUoKS5nZXRBY3Rpb25CYXJzKCkuZ2V0VG9vbEJhck1hbmFnZXIoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhY3Rpb25zLmxlbmd0aCAtIDE7IGkrKykgewotCQkJY20uYWRkKGFjdGlvbnNbaV0pOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZmlsbENvbnRleHRNZW51KFNoZWxsIHNoZWxsLCBJTWVudU1hbmFnZXIgbWVudSkgewotCQkvLyBnZXQgc2VsZWN0aW9uIGJ1dCBhdm9pZCBubyBzZWxlY3Rpb24gb3IgbXVsdGlwbGUgc2VsZWN0aW9uCi0JCUlTZXJ2ZXIgc2VydmVyID0gbnVsbDsKLQkJSU1vZHVsZVtdIG1vZHVsZSA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmICghc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsKLQkJCU9iamVjdCBvYmogPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgSVNlcnZlcikKLQkJCQlzZXJ2ZXIgPSAoSVNlcnZlcikgb2JqOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1vZHVsZVNlcnZlcikgewotCQkJCU1vZHVsZVNlcnZlciBtcyA9IChNb2R1bGVTZXJ2ZXIpIG9iajsKLQkJCQlzZXJ2ZXIgPSBtcy5zZXJ2ZXI7Ci0JCQkJbW9kdWxlID0gbXMubW9kdWxlOwotCQkJfQotCQkJaWYgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCXNlcnZlciA9IG51bGw7Ci0JCQkJbW9kdWxlID0gbnVsbDsKLQkJCX0KLQkJfQotCQkKLQkJLy8gbmV3IGFjdGlvbgotCQlNZW51TWFuYWdlciBuZXdNZW51ID0gbmV3IE1lbnVNYW5hZ2VyKE1lc3NhZ2VzLmFjdGlvbk5ldyk7Ci0JCVNlcnZlckFjdGlvbkhlbHBlci5maWxsTmV3Q29udGV4dE1lbnUobnVsbCwgc2VsZWN0aW9uLCBuZXdNZW51KTsKLQkJbWVudS5hZGQobmV3TWVudSk7Ci0JCQotCQkvLyBvcGVuIGFjdGlvbgotCQlpZiAoc2VydmVyICE9IG51bGwpIHsKLQkJCW1lbnUuYWRkKG5ldyBPcGVuQWN0aW9uKHNlcnZlcikpOwotCQkJaWYgKHNlcnZlci5nZXRTZXJ2ZXJTdGF0ZSgpID09IElTZXJ2ZXIuU1RBVEVfVU5LTk9XTikKLQkJCQltZW51LmFkZChuZXcgVXBkYXRlU3RhdHVzQWN0aW9uKHNlcnZlcikpOwotCQkJbWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJCQotCQkJaWYgKG1vZHVsZSA9PSBudWxsKQotCQkJCW1lbnUuYWRkKG5ldyBEZWxldGVBY3Rpb24oc2hlbGwsIHNlcnZlcikpOwotCQkJZWxzZSBpZiAobW9kdWxlLmxlbmd0aCA9PSAxKQotCQkJCW1lbnUuYWRkKG5ldyBSZW1vdmVNb2R1bGVBY3Rpb24oc2hlbGwsIHNlcnZlciwgbW9kdWxlWzBdKSk7Ci0JCQltZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCQkJCi0JCQkvLyBzZXJ2ZXIgYWN0aW9ucwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhY3Rpb25zLmxlbmd0aCAtIDE7IGkrKykgewotCQkJCWlmIChpID09IDMpCi0JCQkJCW1lbnUuYWRkKHJlc3RhcnRNZW51KTsKLQkJCQllbHNlCi0JCQkJCW1lbnUuYWRkKGFjdGlvbnNbaV0pOwotCQkJfQotCQkJCi0JCQkvLyBtb25pdG9yCi0JCQlpZiAoc2VydmVyLmdldFNlcnZlclR5cGUoKSAhPSBudWxsKSB7Ci0JCQkJZmluYWwgTWVudU1hbmFnZXIgbWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoTWVzc2FnZXMuYWN0aW9uTW9uaXRvcik7Ci0JCQkJCi0JCQkJZmluYWwgSVNlcnZlciBzZXJ2ZXIyID0gc2VydmVyOwotCQkJCWZpbmFsIFNoZWxsIHNoZWxsMiA9IHNoZWxsOwotCQkJCW1lbnVNYW5hZ2VyLmFkZE1lbnVMaXN0ZW5lcihuZXcgSU1lbnVMaXN0ZW5lcigpIHsKLQkJCQkJcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtYW5hZ2VyKSB7Ci0JCQkJCQltZW51TWFuYWdlci5yZW1vdmVBbGwoKTsKLQkJCQkJCWlmIChzZXJ2ZXIyLmdldEFkYXB0ZXIoU2VydmVyRGVsZWdhdGUuY2xhc3MpICE9IG51bGwpIHsKLQkJCQkJCQlTZXJ2ZXJQb3J0W10gcG9ydHMgPSBzZXJ2ZXIyLmdldFNlcnZlclBvcnRzKG51bGwpOwotCQkJCQkJCWlmIChwb3J0cyAhPSBudWxsKSB7Ci0JCQkJCQkJCWludCBzaXplID0gcG9ydHMubGVuZ3RoOwotCQkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCQkJCQkJaWYgKCFwb3J0c1tpXS5pc0FkdmFuY2VkKCkpCi0JCQkJCQkJCQkJbWVudU1hbmFnZXIuYWRkKG5ldyBNb25pdG9yU2VydmVyUG9ydEFjdGlvbihzaGVsbDIsIHNlcnZlcjIsIHBvcnRzW2ldKSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJCWlmICghbWVudU1hbmFnZXIuaXNFbXB0eSgpKQotCQkJCQkJCW1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCQkJCQkJCi0JCQkJCQltZW51TWFuYWdlci5hZGQobmV3IE1vbml0b3JTZXJ2ZXJBY3Rpb24oc2hlbGwyLCBzZXJ2ZXIyKSk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQkKLQkJCQkvLyBhZGQgYW4gaW5pdGlhbCBtZW51IGl0ZW0gc28gdGhhdCB0aGUgbWVudSBhcHBlYXJzIGNvcnJlY3RseQotCQkJCW1lbnVNYW5hZ2VyLmFkZChuZXcgTW9uaXRvclNlcnZlckFjdGlvbihzaGVsbCwgc2VydmVyKSk7Ci0JCQkJbWVudS5hZGQobWVudU1hbmFnZXIpOwotCQkJfQotCQkJbWVudS5hZGQobmV3IFN3aXRjaFNlcnZlckxvY2F0aW9uQWN0aW9uKHNlcnZlcikpOwotCQl9Ci0JCQotCQlpZiAoc2VydmVyICE9IG51bGwgJiYgbW9kdWxlICE9IG51bGwpIHsKLQkJCW1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0JCQltZW51LmFkZChuZXcgUmVzdGFydE1vZHVsZUFjdGlvbihzZXJ2ZXIsIG1vZHVsZSkpOwotCQl9Ci0JCQotCQltZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCQltZW51LmFkZChhY3Rpb25zWzZdKTsKLQkJCi0JCW1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMpKTsKLQkJbWVudS5hZGQobmV3IFNlcGFyYXRvcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUysiLWVuZCIpKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLQkJaWYgKHRyZWVUYWJsZSAhPSBudWxsKQotCQkJdHJlZVRhYmxlLnNldEZvY3VzKCk7Ci0JfQotCi0JLyoqCi0gICAgKiBBZGRzIGRyYWcgYW5kIGRyb3Agc3VwcG9ydCB0byB0aGUgU2VydmVycyB2aWV3LgotICAgICovCi0gICBwcm90ZWN0ZWQgdm9pZCBpbml0RHJhZ0FuZERyb3AoKSB7Ci0JCWludCBvcHMgPSBETkQuRFJPUF9DT1BZOwotCQlUcmFuc2ZlcltdIHRyYW5zZmVycyA9IG5ldyBUcmFuc2ZlcltdIHsgTG9jYWxTZWxlY3Rpb25UcmFuc2Zlci5nZXRJbnN0YW5jZSgpLAotCQkJUmVzb3VyY2VUcmFuc2Zlci5nZXRJbnN0YW5jZSgpLCBGaWxlVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSB9OwotCQkvL3RhYmxlVmlld2VyLmFkZERyYWdTdXBwb3J0KG9wcywgdHJhbnNmZXJzLCBuZXcgU2VydmVyc1ZpZXdEcmFnQWRhcHRlcih2aWV3ZXIpKTsKLQkJdGFibGVWaWV3ZXIuYWRkRHJvcFN1cHBvcnQob3BzIHwgRE5ELkRST1BfREVGQVVMVCwgdHJhbnNmZXJzLCBuZXcgU2VydmVyc1ZpZXdEcm9wQWRhcHRlcih0YWJsZVZpZXdlcikpOwotICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9TZXJ2ZXJzVmlld0Ryb3BBZGFwdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvU2VydmVyc1ZpZXdEcm9wQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTU3MDBiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9TZXJ2ZXJzVmlld0Ryb3BBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi2gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXcuc2VydmVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJEcm9wQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRORDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyb3BUYXJnZXRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkZpbGVUcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRyYW5zZmVyRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlJlc291cmNlVHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MubmF2aWdhdG9yLkxvY2FsU2VsZWN0aW9uVHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5hY3Rpb25zLlJ1bk9uU2VydmVyQWN0aW9uRGVsZWdhdGU7Ci0vKioKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJzVmlld0Ryb3BBZGFwdGVyIGV4dGVuZHMgVmlld2VyRHJvcEFkYXB0ZXIgewotCXByb3RlY3RlZCBTZXJ2ZXJzVmlld0Ryb3BBZGFwdGVyKFZpZXdlciB2aWV3ZXIpIHsKLQkJc3VwZXIodmlld2VyKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZHJhZ0VudGVyKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQuZGV0YWlsID09IERORC5EUk9QX0RFRkFVTFQpCi0JCQlldmVudC5kZXRhaWwgPSBETkQuRFJPUF9DT1BZOwotCi0JCXN1cGVyLmRyYWdFbnRlcihldmVudCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybURyb3AoT2JqZWN0IGRhdGEpIHsKLQkJT2JqZWN0IHRhcmdldCA9IGdldEN1cnJlbnRUYXJnZXQoKTsKLQkJSVNlcnZlciBzZXJ2ZXIgPSBudWxsOwotCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgSVNlcnZlcikKLQkJCXNlcnZlciA9IChJU2VydmVyKSB0YXJnZXQ7Ci0JCQotCQlpZiAoc2VydmVyID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQlmaW5hbCBJU2VydmVyIGZpbmFsU2VydmVyID0gc2VydmVyOwotCQlSdW5PblNlcnZlckFjdGlvbkRlbGVnYXRlIHJvcyA9IG5ldyBSdW5PblNlcnZlckFjdGlvbkRlbGVnYXRlKCkgewotCQkJcHVibGljIElTZXJ2ZXIgZ2V0U2VydmVyKElNb2R1bGUgbW9kdWxlLCBTdHJpbmcgbGF1bmNoTW9kZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJcmV0dXJuIGZpbmFsU2VydmVyOwotCQkJfQotCQl9OwotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigpIHsKLQkJCS8vCi0JCX07Ci0JCWlmIChkYXRhIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgZGF0YTsKLQkJCWRhdGEgPSBzZWwuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCX0KLQkJcm9zLnNlbGVjdGlvbkNoYW5nZWQoYWN0aW9uLCBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihkYXRhKSk7Ci0JCQotCQkvL2lmICghYWN0aW9uLmlzRW5hYmxlZCgpKQotCQkvLwlyZXR1cm4gZmFsc2U7Ci0JCQotCQlyb3MucnVuKGFjdGlvbik7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRHJvcChPYmplY3QgdGFyZ2V0LCBpbnQgb3BlcmF0aW9uLCBUcmFuc2ZlckRhdGEgdHJhbnNmZXJUeXBlKSB7Ci0JCWlmICh0YXJnZXQgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJLypJU2VydmVyIHNlcnZlciA9IG51bGw7Ci0JCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBJU2VydmVyKQotCQkJc2VydmVyID0gKElTZXJ2ZXIpIHRhcmdldDsqLwotCQkvL2lmICghU2VydmVyVUlQbHVnaW4uaGFzTW9kdWxlQXJ0aWZhY3QodGFyZ2V0KSkKLQkJLy8JcmV0dXJuIGZhbHNlOwotCQkKLQkJU3lzdGVtLm91dC5wcmludGxuKCJUYXJnZXQ6ICIgKyB0YXJnZXQgKyAiICIgKyBvcGVyYXRpb24gKyAiICIgKyB0cmFuc2ZlclR5cGUpOwotCQkKLQkJaWYgKEZpbGVUcmFuc2Zlci5nZXRJbnN0YW5jZSgpLmlzU3VwcG9ydGVkVHlwZSh0cmFuc2ZlclR5cGUpKQotCQkJcmV0dXJuIHRydWU7Ci0JCWlmIChSZXNvdXJjZVRyYW5zZmVyLmdldEluc3RhbmNlKCkuaXNTdXBwb3J0ZWRUeXBlKHRyYW5zZmVyVHlwZSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKExvY2FsU2VsZWN0aW9uVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKS5pc1N1cHBvcnRlZFR5cGUodHJhbnNmZXJUeXBlKSkKLQkJCXJldHVybiB0cnVlOwotCQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLSAgICAqIFJldHVybnMgdGhlIHJlc291cmNlIHNlbGVjdGlvbiBmcm9tIHRoZSBMb2NhbFNlbGVjdGlvblRyYW5zZmVyLgotICAgICogCi0gICAgKiBAcmV0dXJuIHRoZSByZXNvdXJjZSBzZWxlY3Rpb24gZnJvbSB0aGUgTG9jYWxTZWxlY3Rpb25UcmFuc2ZlcgotICAgICovCi0gICAvKnByaXZhdGUgSVJlc291cmNlW10gZ2V0U2VsZWN0ZWRSZXNvdXJjZXMoKSB7Ci0gICAgICAgQXJyYXlMaXN0IHNlbGVjdGVkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgICAgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBMb2NhbFNlbGVjdGlvblRyYW5zZmVyLmdldEluc3RhbmNlKCkKLSAgICAgICAgICAgICAgIC5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLSAgICAgICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3NlbCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBzc2VsLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgT2JqZWN0IG8gPSBpLm5leHQoKTsKLSAgICAgICAgICAgICAgIGlmIChvIGluc3RhbmNlb2YgSVJlc291cmNlKSB7Ci0gICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRSZXNvdXJjZXMuYWRkKG8pOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgZWxzZSBpZiAobyBpbnN0YW5jZW9mIElBZGFwdGFibGUpIHsKLSAgICAgICAgICAgICAgICAgICBJQWRhcHRhYmxlIGEgPSAoSUFkYXB0YWJsZSkgbzsKLSAgICAgICAgICAgICAgICAgICBJUmVzb3VyY2UgciA9IChJUmVzb3VyY2UpIGEuZ2V0QWRhcHRlcihJUmVzb3VyY2UuY2xhc3MpOwotICAgICAgICAgICAgICAgICAgIGlmIChyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRSZXNvdXJjZXMuYWRkKHIpOwotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgfQotICAgICAgIH0KLSAgICAgICByZXR1cm4gKElSZXNvdXJjZVtdKSBzZWxlY3RlZFJlc291cmNlcy50b0FycmF5KG5ldyBJUmVzb3VyY2Vbc2VsZWN0ZWRSZXNvdXJjZXMuc2l6ZSgpXSk7Ci0gICB9Ki8KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvU3RhcnRBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9TdGFydEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2EzN2MzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9TdGFydEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi2gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXcuc2VydmVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuUHVibGlzaFNlcnZlckpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuU2VydmVyUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlclR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlN0YXJ0U2VydmVySm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuU2VydmVyVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5UcmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLS8qKgotICogU3RhcnQgYSBzZXJ2ZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBTdGFydEFjdGlvbiBleHRlbmRzIEFic3RyYWN0U2VydmVyQWN0aW9uIHsKLQlwcm90ZWN0ZWQgU3RyaW5nIGxhdW5jaE1vZGUgPSBJTGF1bmNoTWFuYWdlci5SVU5fTU9ERTsKLQkKLQlwdWJsaWMgU3RhcnRBY3Rpb24oU2hlbGwgc2hlbGwsIElTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlciwgU3RyaW5nIG5hbWUsIFN0cmluZyBsYXVuY2hNb2RlKSB7Ci0JCXN1cGVyKHNoZWxsLCBzZWxlY3Rpb25Qcm92aWRlciwgbmFtZSk7Ci0JCXRoaXMubGF1bmNoTW9kZSA9IGxhdW5jaE1vZGU7Ci0JCXRyeSB7Ci0JCQlzZWxlY3Rpb25DaGFuZ2VkKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uUHJvdmlkZXIuZ2V0U2VsZWN0aW9uKCkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHNlcnZlciBjYW4gY3VycmVudGx5IGJlIGFjdGVkIG9uLgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqIEBwYXJhbSBzZXJ2ZXIgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXIKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoSVNlcnZlciBzZXJ2ZXIpIHsKLQkJcmV0dXJuIHNlcnZlci5jYW5TdGFydChsYXVuY2hNb2RlKS5pc09LKCk7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybSBhY3Rpb24gb24gdGhpcyBzZXJ2ZXIuCi0JICogQHBhcmFtIHNlcnZlciBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcgotCSAqLwotCXB1YmxpYyB2b2lkIHBlcmZvcm0oZmluYWwgSVNlcnZlciBzZXJ2ZXIpIHsKLQkJLy9pZiAoIVNlcnZlclVJVXRpbC5wcm9tcHRJZkRpcnR5KHNoZWxsLCBzZXJ2ZXIpKQotCQkvLwlyZXR1cm47CQkJCQotCQkKLQkJaWYgKCFTZXJ2ZXJVSVBsdWdpbi5zYXZlRWRpdG9ycygpKQotCQkJcmV0dXJuOwotCQkKLQkJaWYgKCFTZXJ2ZXJQcmVmZXJlbmNlcy5nZXRJbnN0YW5jZSgpLmlzQXV0b1B1Ymxpc2hpbmcoKSkgewotCQkJU3RhcnRTZXJ2ZXJKb2Igc3RhcnRKb2IgPSBuZXcgU3RhcnRTZXJ2ZXJKb2Ioc2VydmVyLCBsYXVuY2hNb2RlKTsKLQkJCXN0YXJ0Sm9iLnNjaGVkdWxlKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCXRyeSB7Ci0JCQlQdWJsaXNoU2VydmVySm9iIHB1Ymxpc2hKb2IgPSBuZXcgUHVibGlzaFNlcnZlckpvYihzZXJ2ZXIsIElTZXJ2ZXIuUFVCTElTSF9JTkNSRU1FTlRBTCwgZmFsc2UpOyAKLQkJCVN0YXJ0U2VydmVySm9iIHN0YXJ0Sm9iID0gbmV3IFN0YXJ0U2VydmVySm9iKHNlcnZlciwgbGF1bmNoTW9kZSk7Ci0JCQkKLQkJCWlmICgoKFNlcnZlclR5cGUpc2VydmVyLmdldFNlcnZlclR5cGUoKSkuc3RhcnRCZWZvcmVQdWJsaXNoKCkpIHsKLQkJCQlzdGFydEpvYi5zZXROZXh0Sm9iKHB1Ymxpc2hKb2IpOwotCQkJCXN0YXJ0Sm9iLnNjaGVkdWxlKCk7Ci0JCQl9IGVsc2UgewotCQkJCXB1Ymxpc2hKb2Iuc2V0TmV4dEpvYihzdGFydEpvYik7Ci0JCQkJcHVibGlzaEpvYi5zY2hlZHVsZSgpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3Igc3RhcnRpbmcgc2VydmVyIiwgZSk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL1N0b3BBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9TdG9wQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhYmFiMGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL1N0b3BBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3LnNlcnZlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuU2VydmVyVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotLyoqCi0gKiBTdG9wICh0ZXJtaW5hdGUpIGEgc2VydmVyLgotICovCi1wdWJsaWMgY2xhc3MgU3RvcEFjdGlvbiBleHRlbmRzIEFic3RyYWN0U2VydmVyQWN0aW9uIHsKLQlwdWJsaWMgU3RvcEFjdGlvbihTaGVsbCBzaGVsbCwgSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyLCBTdHJpbmcgbmFtZSkgewotCQlzdXBlcihzaGVsbCwgc2VsZWN0aW9uUHJvdmlkZXIsIG5hbWUpOwotCQl0cnkgewotCQkJc2VsZWN0aW9uQ2hhbmdlZCgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvblByb3ZpZGVyLmdldFNlbGVjdGlvbigpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhpcyBzZXJ2ZXIgY2FuIGN1cnJlbnRseSBiZSBhY3RlZCBvbi4KLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKiBAcGFyYW0gc2VydmVyIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyCi0JICovCi0JcHVibGljIGJvb2xlYW4gYWNjZXB0KElTZXJ2ZXIgc2VydmVyKSB7Ci0JCWlmIChzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpICE9IG51bGwgJiYgc2VydmVyLmNhblN0b3AoKS5pc09LKCk7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybSBhY3Rpb24gb24gdGhpcyBzZXJ2ZXIuCi0JICogQHBhcmFtIHNlcnZlciBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcgotCSAqLwotCXB1YmxpYyB2b2lkIHBlcmZvcm0oZmluYWwgSVNlcnZlciBzZXJ2ZXIpIHsKLQkJU2VydmVyVUlQbHVnaW4uYWRkVGVybWluYXRpb25XYXRjaChzaGVsbCwgc2VydmVyLCBTZXJ2ZXJVSVBsdWdpbi5TVE9QKTsKLQkKLQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlNZXNzYWdlRGlhbG9nIGRpYWxvZyA9IG5ldyBNZXNzYWdlRGlhbG9nKHNoZWxsLCBNZXNzYWdlcy5kZWZhdWx0RGlhbG9nVGl0bGUsIG51bGwsCi0JCQkJCQlOTFMuYmluZChNZXNzYWdlcy5kaWFsb2dTdG9wcGluZ1NlcnZlciwgc2VydmVyLmdldE5hbWUoKSksIE1lc3NhZ2VEaWFsb2cuSU5GT1JNQVRJT04sIG5ldyBTdHJpbmdbMF0sIDApOwotCQkJCWRpYWxvZy5zZXRCbG9ja09uT3BlbihmYWxzZSk7Ci0JCQkJZGlhbG9nLm9wZW4oKTsKLQkKLQkJCQlzZXJ2ZXIuc3RvcChmYWxzZSk7Ci0JCQkJZGlhbG9nLmNsb3NlKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3L3NlcnZlcnMvU3dpdGNoU2VydmVyTG9jYXRpb25BY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9Td2l0Y2hTZXJ2ZXJMb2NhdGlvbkFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWFkZjc5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9Td2l0Y2hTZXJ2ZXJMb2NhdGlvbkFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXcuc2VydmVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKLS8qKgotICogQWN0aW9uIHRvIHN3aXRjaCBhIHNlcnZlcidzIGxvY2F0aW9uIGJldHdlZW4gdGhlIHdvcmtzcGFjZSBhbmQgbWV0YWRhdGEuCi0gKi8KLXB1YmxpYyBjbGFzcyBTd2l0Y2hTZXJ2ZXJMb2NhdGlvbkFjdGlvbiBleHRlbmRzIEFjdGlvbiB7Ci0JcHJvdGVjdGVkIFNlcnZlciBzZXJ2ZXI7Ci0KLQkvKioKLQkgKiBBbiBhY3Rpb24gdG8gc3dpdGNoIGEgc2VydmVyJ3MgbG9jYXRpb24gYmV0d2VlbiB0aGUgd29ya3NwYWNlIGFuZCBtZXRhZGF0YS4KLQkgKiAKLQkgKiBAcGFyYW0gc2VydmVyIGEgc2VydmVycwotCSAqLwotCXB1YmxpYyBTd2l0Y2hTZXJ2ZXJMb2NhdGlvbkFjdGlvbihJU2VydmVyIHNlcnZlcikgewotCQlzdXBlcigpOwotCQl0aGlzLnNlcnZlciA9IChTZXJ2ZXIpIHNlcnZlcjsKLQkJaWYgKHRoaXMuc2VydmVyLmdldEZpbGUoKSAhPSBudWxsKQotCQkJc2V0VGV4dChNZXNzYWdlcy5hY3Rpb25Nb3ZlU2VydmVyVG9NZXRhZGF0YSk7Ci0JCWVsc2UKLQkJCXNldFRleHQoTWVzc2FnZXMuYWN0aW9uTW92ZVNlcnZlclRvV29ya3NwYWNlKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnZva2VkIHdoZW4gYW4gYWN0aW9uIG9jY3Vycy4gCi0JICovCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQl0cnkgewotCQkJU2VydmVyLnN3aXRjaExvY2F0aW9uKHNlcnZlciwgbnVsbCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCS8vIGlnbm9yZSBmb3Igbm93Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL1VwZGF0ZVN0YXR1c0FjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlldy9zZXJ2ZXJzL1VwZGF0ZVN0YXR1c0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzFlMzI5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXcvc2VydmVycy9VcGRhdGVTdGF0dXNBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3LnNlcnZlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci0vKioKLSAqIEFjdGlvbiB0byB1cGRhdGUgYSBzZXJ2ZXIncyBzdGF0dXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBVcGRhdGVTdGF0dXNBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotCXByb3RlY3RlZCBJU2VydmVyIHNlcnZlcjsKLQotCS8qKgotCSAqIEFuIGFjdGlvbiB0byB1cGRhdGUgdGhlIHN0YXR1cyBvZiBhIHNlcnZlci4KLQkgKiAKLQkgKiBAcGFyYW0gc2VydmVyIGEgc2VydmVyCi0JICovCi0JcHVibGljIFVwZGF0ZVN0YXR1c0FjdGlvbihJU2VydmVyIHNlcnZlcikgewotCQlzdXBlcihNZXNzYWdlcy5hY3Rpb25VcGRhdGVTdGF0dXMpOwotCQl0aGlzLnNlcnZlciA9IHNlcnZlcjsKLQl9Ci0KLQkvKioKLQkgKiBJbnZva2VkIHdoZW4gYW4gYWN0aW9uIG9jY3Vycy4gCi0JICovCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlVcGRhdGVTZXJ2ZXJKb2Igam9iID0gbmV3IFVwZGF0ZVNlcnZlckpvYihzZXJ2ZXIpOwotCQlqb2Iuc2NoZWR1bGUoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9BYnN0cmFjdFRhYmxlQ29tcG9zaXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL0Fic3RyYWN0VGFibGVDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFlYTUzMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL0Fic3RyYWN0VGFibGVDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFRhYmxlQ29tcG9zaXRlIGV4dGVuZHMgQ29tcG9zaXRlIHsKLQlwcm90ZWN0ZWQgVGFibGUgdGFibGU7Ci0JcHJvdGVjdGVkIFRhYmxlVmlld2VyIHRhYmxlVmlld2VyOwotCi0JcHVibGljIEFic3RyYWN0VGFibGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0JCXN1cGVyKHBhcmVudCwgc3R5bGUpOwotCQkKLQkJY3JlYXRlV2lkZ2V0cygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVdpZGdldHMoKSB7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMTsKLQkJc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlzZXRMYXlvdXREYXRhKGRhdGEpOwotCQkKLQkJY3JlYXRlVGFibGUoKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5GSUxMX1ZFUlRJQ0FMKTsKLQkJdGFibGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJdGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCQljcmVhdGVUYWJsZVZpZXdlcigpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVUYWJsZSgpIHsKLQkJdGFibGUgPSBuZXcgVGFibGUodGhpcywgU1dULkJPUkRFUiB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5TSU5HTEUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVUYWJsZVZpZXdlcigpIHsKLQkJdGFibGVWaWV3ZXIgPSBuZXcgTG9ja2VkVGFibGVWaWV3ZXIodGFibGUpOwotCX0KLQotCXByb3RlY3RlZCBUYWJsZVZpZXdlciBnZXRUYWJsZVZpZXdlcigpIHsKLQkJcmV0dXJuIHRhYmxlVmlld2VyOwotCX0KLQotCXByb3RlY3RlZCBPYmplY3QgZ2V0U2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsMikgewotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbDI7Ci0JCXJldHVybiBzZWwuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCXRhYmxlVmlld2VyLnJlZnJlc2goKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVmcmVzaChPYmplY3Qgb2JqKSB7Ci0JCXRhYmxlVmlld2VyLnJlZnJlc2gob2JqKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmUoT2JqZWN0IG9iaikgewotCQl0YWJsZVZpZXdlci5yZW1vdmUob2JqKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9BYnN0cmFjdFRyZWVDb21wb3NpdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvQWJzdHJhY3RUcmVlQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4NmRhNDAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9BYnN0cmFjdFRyZWVDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlld2VyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuRG91YmxlQ2xpY2tFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklEb3VibGVDbGlja0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlclNvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLk1lc3NhZ2VzOwotLyoqCi0gKiAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VHJlZUNvbXBvc2l0ZSBleHRlbmRzIENvbXBvc2l0ZSB7Ci0JcHJvdGVjdGVkIFRyZWUgdHJlZTsKLQlwcm90ZWN0ZWQgVHJlZVZpZXdlciB0cmVlVmlld2VyOwotCXByb3RlY3RlZCBMYWJlbCBkZXNjcmlwdGlvbjsKLQkKLQlwdWJsaWMgQWJzdHJhY3RUcmVlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotCQlzdXBlcihwYXJlbnQsIHN0eWxlKTsKLQkJCi0JCWNyZWF0ZVdpZGdldHMoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlV2lkZ2V0cygpIHsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSAzOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gMzsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJc2V0TGF5b3V0KGxheW91dCk7Ci0JCQotCQlTdHJpbmcgZGVzY3JpcHRpb25UZXh0ID0gZ2V0RGVzY3JpcHRpb25MYWJlbCgpOwotCQlpZiAoZGVzY3JpcHRpb25UZXh0ICE9IG51bGwpIHsKLQkJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHRoaXMsIFNXVC5XUkFQKTsKLQkJCWxhYmVsLnNldFRleHQoZGVzY3JpcHRpb25UZXh0KTsKLQkJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSKTsKLQkJCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJfQotCQkKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwodGhpcywgU1dULldSQVApOwotCQlsYWJlbC5zZXRUZXh0KGdldFRpdGxlTGFiZWwoKSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSKTsKLQkJaWYgKGRlc2NyaXB0aW9uVGV4dCAhPSBudWxsKQotCQkJZGF0YS52ZXJ0aWNhbEluZGVudCA9IDc7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkKLQkJU3RyaW5nIGRldGFpbHMgPSBnZXREZXRhaWxzTGFiZWwoKTsKLQkJaWYgKGRldGFpbHMgIT0gbnVsbCkgewotCQkJTGluayBwcmVmTGluayA9IG5ldyBMaW5rKHRoaXMsIFNXVC5OT05FKTsKLQkJCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQpOwotCQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQlwcmVmTGluay5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkJcHJlZkxpbmsuc2V0VGV4dCgiPGE+IiArIGRldGFpbHMgKyAiPC9hPiIpOwotCQkJcHJlZkxpbmsuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlkZXRhaWxzU2VsZWN0ZWQoKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQkKLQkJdHJlZSA9IG5ldyBUcmVlKHRoaXMsIFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuU0lOR0xFKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJdHJlZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkKLQkJdHJlZVZpZXdlciA9IG5ldyBUcmVlVmlld2VyKHRyZWUpOwotCQl0cmVlVmlld2VyLnNldFNvcnRlcihuZXcgVmlld2VyU29ydGVyKCkpOwotCQl0cmVlVmlld2VyLmFkZERvdWJsZUNsaWNrTGlzdGVuZXIobmV3IElEb3VibGVDbGlja0xpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgZG91YmxlQ2xpY2soRG91YmxlQ2xpY2tFdmVudCBldmVudCkgewotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHMgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50LmdldFNlbGVjdGlvbigpOwotCQkJCU9iamVjdCBlbGVtZW50ID0gcy5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQlpZiAodHJlZVZpZXdlci5pc0V4cGFuZGFibGUoZWxlbWVudCkpCi0JCQkJCXRyZWVWaWV3ZXIuc2V0RXhwYW5kZWRTdGF0ZShlbGVtZW50LCAhdHJlZVZpZXdlci5nZXRFeHBhbmRlZFN0YXRlKGVsZW1lbnQpKTsKLQkJICAgIH0KLQkJfSk7Ci0JCQotCQlsYWJlbCA9IG5ldyBMYWJlbCh0aGlzLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoIiIpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0NFTlRFUik7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQkvLyB2aWV3IGNvbXBvc2l0ZQotCQlDb21wb3NpdGUgY29tcCA9IG5ldyBDb21wb3NpdGUodGhpcywgU1dULk5PTkUpOwotCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSAzOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJY29tcC5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSKTsKLQkJY29tcC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkKLQkJbGFiZWwgPSBuZXcgTGFiZWwoY29tcCwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLnZpZXdCeSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIpOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQotCQlmaW5hbCBDb21ibyBjb21ibyA9IG5ldyBDb21ibyhjb21wLCBTV1QuRFJPUF9ET1dOIHwgU1dULlJFQURfT05MWSk7Ci0JCWNvbWJvLnNldEl0ZW1zKGdldENvbWJvT3B0aW9ucygpKTsKLQkJY29tYm8uc2VsZWN0KDEpOwotCQljb21iby5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0NFTlRFUikpOwotCQljb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJaW50IHNlbCA9IGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCQkJdmlld09wdGlvblNlbGVjdGVkKChieXRlKSBzZWwpOwotCQkJfQotCQl9KTsKLQkJCi0JCWlmIChoYXNEZXNjcmlwdGlvbigpKSB7Ci0JCQlkZXNjcmlwdGlvbiA9IG5ldyBMYWJlbCh0aGlzLCBTV1QuV1JBUCk7Ci0JCQlkZXNjcmlwdGlvbi5zZXRUZXh0KE1lc3NhZ2VzLndpekRlc2NyaXB0aW9uKTsKLQkJCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSKTsKLQkJCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJZGF0YS5oZWlnaHRIaW50ID0gMzU7Ci0JCQlkZXNjcmlwdGlvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQl9Ci0JCQotCQl0cmVlLmZvcmNlRm9jdXMoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXREZXNjcmlwdGlvbkxhYmVsKCk7Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRUaXRsZUxhYmVsKCk7Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZ1tdIGdldENvbWJvT3B0aW9ucygpOwotCQotCXByb3RlY3RlZCBib29sZWFuIGhhc0Rlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIHRleHQpIHsKLQkJaWYgKGRlc2NyaXB0aW9uICE9IG51bGwgJiYgdGV4dCAhPSBudWxsKQotCQkJZGVzY3JpcHRpb24uc2V0VGV4dChNZXNzYWdlcy53aXpEZXNjcmlwdGlvbiArICIgIiArIHRleHQpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCB2aWV3T3B0aW9uU2VsZWN0ZWQoYnl0ZSBvcHRpb24pOwotCQotCXByb3RlY3RlZCBUcmVlVmlld2VyIGdldFRyZWVWaWV3ZXIoKSB7Ci0JCXJldHVybiB0cmVlVmlld2VyOwotCX0KLQotCXByb3RlY3RlZCBPYmplY3QgZ2V0U2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsMikgewotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbDI7Ci0JCXJldHVybiBzZWwuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCXRyZWVWaWV3ZXIucmVmcmVzaCgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZWZyZXNoKE9iamVjdCBvYmopIHsKLQkJdHJlZVZpZXdlci5yZWZyZXNoKG9iaik7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlKE9iamVjdCBvYmopIHsKLQkJdHJlZVZpZXdlci5yZW1vdmUob2JqKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERldGFpbHNMYWJlbCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGRldGFpbHNTZWxlY3RlZCgpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL0Fic3RyYWN0VHJlZUNvbnRlbnRQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9BYnN0cmFjdFRyZWVDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNiODc4NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL0Fic3RyYWN0VHJlZUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlNlcnZlclVJUGx1Z2luOwotLyoqCi0gKiBSdW50aW1lIHR5cGUgY29udGVudCBwcm92aWRlci4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VHJlZUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElUcmVlQ29udGVudFByb3ZpZGVyIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgU1RZTEVfRkxBVCA9IDA7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBST09UID0gInJvb3QiOwotCi0JcHJvdGVjdGVkIGJ5dGUgc3R5bGU7Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0IGluaXRpYWxTZWxlY3Rpb247Ci0KLQlwdWJsaWMgY2xhc3MgVHJlZUVsZW1lbnQgewotCQlTdHJpbmcgdGV4dDsKLQkJTGlzdCBjb250ZW50czsKLQl9Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0W10gZWxlbWVudHM7Ci0JcHJvdGVjdGVkIE1hcCBlbGVtZW50VG9QYXJlbnRNYXAgPSBuZXcgSGFzaE1hcCgyKTsKLQlwcm90ZWN0ZWQgTWFwIHRleHRNYXAgPSBuZXcgSGFzaE1hcCgyKTsKLQotCS8qKgotCSAqIEFic3RyYWN0VHJlZUNvbnRlbnRQcm92aWRlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBzdHlsZSBhIHN0eWxlIHBhcmFtZXRlcgotCSAqLwotCXB1YmxpYyBBYnN0cmFjdFRyZWVDb250ZW50UHJvdmlkZXIoYnl0ZSBzdHlsZSkgewotCQlzdXBlcigpOwotCQl0aGlzLnN0eWxlID0gc3R5bGU7Ci0JCQotCQlmaWxsVHJlZSgpOwotCX0KLQotCXB1YmxpYyBBYnN0cmFjdFRyZWVDb250ZW50UHJvdmlkZXIoYnl0ZSBzdHlsZSwgYm9vbGVhbiBpbml0KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuc3R5bGUgPSBzdHlsZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBmaWxsVHJlZSgpOwotCi0JcHJvdGVjdGVkIHZvaWQgY2xlYW4oKSB7Ci0JCWVsZW1lbnRzID0gbnVsbDsKLQkJZWxlbWVudFRvUGFyZW50TWFwID0gbmV3IEhhc2hNYXAoMik7Ci0JCXRleHRNYXAgPSBuZXcgSGFzaE1hcCgyKTsKLQkJCi0JCWluaXRpYWxTZWxlY3Rpb24gPSBudWxsOwotCX0KLQotCXByb3RlY3RlZCBUcmVlRWxlbWVudCBnZXRPckNyZWF0ZShMaXN0IGxpc3QsIFN0cmluZyB0ZXh0KSB7Ci0JCXRyeSB7Ci0JCQlPYmplY3Qgb2JqID0gdGV4dE1hcC5nZXQodGV4dCk7Ci0JCQlpZiAob2JqICE9IG51bGwpCi0JCQkJcmV0dXJuIChUcmVlRWxlbWVudCkgb2JqOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCVRyZWVFbGVtZW50IGVsZW1lbnQgPSBuZXcgVHJlZUVsZW1lbnQoKTsKLQkJZWxlbWVudC50ZXh0ID0gdGV4dDsKLQkJZWxlbWVudC5jb250ZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJdGV4dE1hcC5wdXQodGV4dCwgZWxlbWVudCk7Ci0JCWxpc3QuYWRkKGVsZW1lbnQpOwotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0JCi0JcHJvdGVjdGVkIFRyZWVFbGVtZW50IGdldE9yQ3JlYXRlKExpc3QgbGlzdCwgU3RyaW5nIGlkLCBTdHJpbmcgdGV4dCkgewotCQl0cnkgewotCQkJT2JqZWN0IG9iaiA9IHRleHRNYXAuZ2V0KGlkKTsKLQkJCWlmIChvYmogIT0gbnVsbCkKLQkJCQlyZXR1cm4gKFRyZWVFbGVtZW50KSBvYmo7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJVHJlZUVsZW1lbnQgZWxlbWVudCA9IG5ldyBUcmVlRWxlbWVudCgpOwotCQllbGVtZW50LnRleHQgPSB0ZXh0OwotCQllbGVtZW50LmNvbnRlbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQl0ZXh0TWFwLnB1dChpZCwgZWxlbWVudCk7Ci0JCWxpc3QuYWRkKGVsZW1lbnQpOwotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0KLQlwcm90ZWN0ZWQgVHJlZUVsZW1lbnQgZ2V0QnlUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gKFRyZWVFbGVtZW50KSB0ZXh0TWFwLmdldCh0ZXh0KTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBUcmVlRWxlbWVudCBnZXRQYXJlbnRJbXBsKE9iamVjdCBvYmopIHsKLQkJdHJ5IHsKLQkJCXJldHVybiAoVHJlZUVsZW1lbnQpIGVsZW1lbnRUb1BhcmVudE1hcC5nZXQob2JqKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRGlzcG9zZXMgb2YgdGhpcyBjb250ZW50IHByb3ZpZGVyLiAgCi0JICogVGhpcyBpcyBjYWxsZWQgYnkgdGhlIHZpZXdlciB3aGVuIGl0IGlzIGRpc3Bvc2VkLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBlbGVtZW50cyB0byBkaXNwbGF5IGluIHRoZSB2aWV3ZXIgCi0JICogd2hlbiBpdHMgaW5wdXQgaXMgc2V0IHRvIHRoZSBnaXZlbiBlbGVtZW50LiAKLQkgKiBUaGVzZSBlbGVtZW50cyBjYW4gYmUgcHJlc2VudGVkIGFzIHJvd3MgaW4gYSB0YWJsZSwgaXRlbXMgaW4gYSBsaXN0LCBldGMuCi0JICogVGhlIHJlc3VsdCBpcyBub3QgbW9kaWZpZWQgYnkgdGhlIHZpZXdlci4KLQkgKgotCSAqIEBwYXJhbSBlbGVtZW50IHRoZSBpbnB1dCBlbGVtZW50Ci0JICogQHJldHVybiB0aGUgYXJyYXkgb2YgZWxlbWVudHMgdG8gZGlzcGxheSBpbiB0aGUgdmlld2VyCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiBlbGVtZW50czsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKHN0eWxlID09IFNUWUxFX0ZMQVQpCi0JCQlyZXR1cm4gbnVsbDsKLQkJZWxzZSBpZiAoIShlbGVtZW50IGluc3RhbmNlb2YgVHJlZUVsZW1lbnQpKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlUcmVlRWxlbWVudCBydGUgPSAoVHJlZUVsZW1lbnQpIGVsZW1lbnQ7Ci0JCXJldHVybiBydGUuY29udGVudHMudG9BcnJheSgpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChzdHlsZSA9PSBTVFlMRV9GTEFUKQotCQkJcmV0dXJuIG51bGw7Ci0JCS8vZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFRyZWVFbGVtZW50KQotCQkvLwlyZXR1cm4gbnVsbDsKLQotCQlyZXR1cm4gZ2V0UGFyZW50SW1wbChlbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotCQlpZiAoc3R5bGUgPT0gU1RZTEVfRkxBVCkKLQkJCXJldHVybiBmYWxzZTsKLQkJLy9lbHNlIGlmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBUcmVlRWxlbWVudCkpCi0JCS8vCXJldHVybiBmYWxzZTsKLQkJT2JqZWN0W10gY2hpbGRyZW4gPSBnZXRDaGlsZHJlbihlbGVtZW50KTsKLQkJcmV0dXJuIGNoaWxkcmVuICE9IG51bGwgJiYgY2hpbGRyZW4ubGVuZ3RoID4gMDsKLQotCQkvL3JldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIE5vdGlmaWVzIHRoaXMgY29udGVudCBwcm92aWRlciB0aGF0IHRoZSBnaXZlbiB2aWV3ZXIncyBpbnB1dAotCSAqIGhhcyBiZWVuIHN3aXRjaGVkIHRvIGEgZGlmZmVyZW50IGVsZW1lbnQuCi0JICogPHA+Ci0JICogQSB0eXBpY2FsIHVzZSBmb3IgdGhpcyBtZXRob2QgaXMgcmVnaXN0ZXJpbmcgdGhlIGNvbnRlbnQgcHJvdmlkZXIgYXMgYSBsaXN0ZW5lcgotCSAqIHRvIGNoYW5nZXMgb24gdGhlIG5ldyBpbnB1dCAodXNpbmcgbW9kZWwtc3BlY2lmaWMgbWVhbnMpLCBhbmQgZGVyZWdpc3RlcmluZyB0aGUgdmlld2VyIAotCSAqIGZyb20gdGhlIG9sZCBpbnB1dC4gSW4gcmVzcG9uc2UgdG8gdGhlc2UgY2hhbmdlIG5vdGlmaWNhdGlvbnMsIHRoZSBjb250ZW50IHByb3ZpZGVyCi0JICogcHJvcGFnYXRlcyB0aGUgY2hhbmdlcyB0byB0aGUgdmlld2VyLgotCSAqIDwvcD4KLQkgKgotCSAqIEBwYXJhbSB2aWV3ZXIgdGhlIHZpZXdlcgotCSAqIEBwYXJhbSBvbGRJbnB1dCB0aGUgb2xkIGlucHV0IGVsZW1lbnQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSB2aWV3ZXIKLQkgKiAgIGRpZCBub3QgcHJldmlvdXNseSBoYXZlIGFuIGlucHV0Ci0JICogQHBhcmFtIG5ld0lucHV0IHRoZSBuZXcgaW5wdXQgZWxlbWVudCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHZpZXdlcgotCSAqICAgZG9lcyBub3QgaGF2ZSBhbiBpbnB1dAotCSAqLwotCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHJpdmF0ZSBPYmplY3RbXSBnZXRBbGxPYmplY3RzKCkgewotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCU9iamVjdFtdIG9iaiA9IGdldEVsZW1lbnRzKG51bGwpOwotCQlpZiAob2JqICE9IG51bGwpIHsKLQkJCWludCBzaXplID0gb2JqLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJaWYgKCEob2JqW2ldIGluc3RhbmNlb2YgQWJzdHJhY3RUcmVlQ29udGVudFByb3ZpZGVyLlRyZWVFbGVtZW50KSkKLQkJCQkJbGlzdC5hZGQob2JqW2ldKTsKLQkJCQlnZXRBbGxDaGlsZHJlbihsaXN0LCBvYmpbaV0pOwotCQkJfQotCQl9Ci0JCXJldHVybiBsaXN0LnRvQXJyYXkoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZ2V0QWxsQ2hpbGRyZW4oTGlzdCBsaXN0LCBPYmplY3QgZWxlbWVudCkgewotCQlPYmplY3RbXSBvYmogPSBnZXRDaGlsZHJlbihlbGVtZW50KTsKLQkJaWYgKG9iaiAhPSBudWxsKSB7Ci0JCQlpbnQgc2l6ZSA9IG9iai5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCWlmICghKG9ialtpXSBpbnN0YW5jZW9mIEFic3RyYWN0VHJlZUNvbnRlbnRQcm92aWRlci5UcmVlRWxlbWVudCkpCi0JCQkJCWxpc3QuYWRkKG9ialtpXSk7Ci0JCQkJZ2V0QWxsQ2hpbGRyZW4obGlzdCwgb2JqW2ldKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0SW5pdGlhbFNlbGVjdGlvbigpIHsKLQkJaWYgKGluaXRpYWxTZWxlY3Rpb24gPT0gbnVsbCkgewotCQkJSW5pdGlhbFNlbGVjdGlvblByb3ZpZGVyIGlzcCA9IFNlcnZlclVJUGx1Z2luLmdldEluaXRpYWxTZWxlY3Rpb25Qcm92aWRlcigpOwotCQkJaW5pdGlhbFNlbGVjdGlvbiA9IGlzcC5nZXRJbml0aWFsU2VsZWN0aW9uKGdldEFsbE9iamVjdHMoKSk7Ci0JCX0KLQkJcmV0dXJuIGluaXRpYWxTZWxlY3Rpb247Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvQWJzdHJhY3RUcmVlTGFiZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9BYnN0cmFjdFRyZWVMYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0ZjY2YzAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9BYnN0cmFjdFRyZWVMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlld2VyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU2hhcmVkSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0vKioKLSAqIEFic3RyYWN0IHRyZWUgbGFiZWwgcHJvdmlkZXIuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFRyZWVMYWJlbFByb3ZpZGVyIGV4dGVuZHMgQmFzZUxhYmVsUHJvdmlkZXIgewotCS8qKgotCSAqIEFic3RyYWN0VHJlZUxhYmVsUHJvdmlkZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3RUcmVlTGFiZWxQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEJhc2VMYWJlbFByb3ZpZGVyI2dldEltYWdlKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBTZXJ2ZXJUcmVlQ29udGVudFByb3ZpZGVyLlRyZWVFbGVtZW50KSB7Ci0JCQlJU2hhcmVkSW1hZ2VzIHNoYXJlZEltYWdlcyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0U2hhcmVkSW1hZ2VzKCk7Ci0JCQlyZXR1cm4gc2hhcmVkSW1hZ2VzLmdldEltYWdlKElTaGFyZWRJbWFnZXMuSU1HX09CSl9GT0xERVIpOwotCQl9Ci0JCXJldHVybiBnZXRJbWFnZUltcGwoZWxlbWVudCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhbiBpbWFnZSBmb3IgdGhlIGdpdmVuIGVsZW1lbnQuCi0JICogIAotCSAqIEBwYXJhbSBlbGVtZW50IGFuIGVsZW1lbnQKLQkgKiBAcmV0dXJuIGFuIGltYWdlCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IEltYWdlIGdldEltYWdlSW1wbChPYmplY3QgZWxlbWVudCk7Ci0KLQkvKioKLQkgKiBAc2VlIEJhc2VMYWJlbFByb3ZpZGVyI2dldFRleHQoT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFNlcnZlclRyZWVDb250ZW50UHJvdmlkZXIuVHJlZUVsZW1lbnQpIHsKLQkJCXJldHVybiAoKFNlcnZlclRyZWVDb250ZW50UHJvdmlkZXIuVHJlZUVsZW1lbnQpIGVsZW1lbnQpLnRleHQ7Ci0JCX0KLQkJcmV0dXJuIGdldFRleHRJbXBsKGVsZW1lbnQpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYSBsYWJlbCBmb3IgdGhlIGdpdmVuIGVsZW1lbnQuCi0JICogIAotCSAqIEBwYXJhbSBlbGVtZW50IGFuIGVsZW1lbnQKLQkgKiBAcmV0dXJuIGEgbGFiZWwKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFRleHRJbXBsKE9iamVjdCBlbGVtZW50KTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL0Jhc2VMYWJlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL0Jhc2VMYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiYTU2ZjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9CYXNlTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXdlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0vKioKLSAqIEEgYmFzaWMgbGFiZWwgcHJvdmlkZXIuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElMYWJlbFByb3ZpZGVyIHsKLQkvKioKLQkgKiBCYXNlTGFiZWxQcm92aWRlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBCYXNlTGFiZWxQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI2FkZExpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElMYWJlbFByb3ZpZGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSUxhYmVsUHJvdmlkZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQlyZXR1cm4gIiI7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNpc0xhYmVsUHJvcGVydHkoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNyZW1vdmVMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgbm90TnVsbChTdHJpbmcgcykgewotCQlpZiAocyA9PSBudWxsKQotCQkJcmV0dXJuICIiOwotCQlyZXR1cm4gczsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9EZWZhdWx0Vmlld2VyU29ydGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL0RlZmF1bHRWaWV3ZXJTb3J0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRiOTU4Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL0RlZmF1bHRWaWV3ZXJTb3J0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJTb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlclR5cGU7Ci0vKioKLSAqIENsYXNzIHVzZWQgdG8gc29ydCBjYXRlZ29yaWVzLCBydW50aW1lIHR5cGVzLCBhbmQgc2VydmVyIHR5cGVzIGluIHRoZQotICogTmV3IHdpemFyZHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWZhdWx0Vmlld2VyU29ydGVyIGV4dGVuZHMgVmlld2VyU29ydGVyIHsKLQkvKioKLQkgKiBAc2VlIFZpZXdlclNvcnRlciNjb21wYXJlKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyLCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBpbnQgY29tcGFyZShWaWV3ZXIgdmlld2VyLCBPYmplY3QgbzEsIE9iamVjdCBvMikgewotCQlpZiAobzEgaW5zdGFuY2VvZiBBYnN0cmFjdFRyZWVDb250ZW50UHJvdmlkZXIuVHJlZUVsZW1lbnQpCi0JCQlvMSA9ICgoQWJzdHJhY3RUcmVlQ29udGVudFByb3ZpZGVyLlRyZWVFbGVtZW50KSBvMSkudGV4dDsKLQkJCi0JCWlmIChvMiBpbnN0YW5jZW9mIEFic3RyYWN0VHJlZUNvbnRlbnRQcm92aWRlci5UcmVlRWxlbWVudCkKLQkJCW8yID0gKChBYnN0cmFjdFRyZWVDb250ZW50UHJvdmlkZXIuVHJlZUVsZW1lbnQpIG8yKS50ZXh0OwotCQkKLQkJLy8gZmlsdGVyIG91dCBzdHJpbmdzCi0JCWlmIChvMSBpbnN0YW5jZW9mIFN0cmluZyAmJiBvMiBpbnN0YW5jZW9mIFN0cmluZykKLQkJCXJldHVybiBjb21wYXJlQ2F0ZWdvcmllcygoU3RyaW5nKSBvMSwgKFN0cmluZykgbzIpOwotCQlpZiAobzEgaW5zdGFuY2VvZiBTdHJpbmcpCi0JCQlyZXR1cm4gLTE7Ci0JCWlmIChvMiBpbnN0YW5jZW9mIFN0cmluZykKLQkJCXJldHVybiAxOwotCQkKLQkJaWYgKG8xIGluc3RhbmNlb2YgSVJ1bnRpbWVUeXBlICYmIG8yIGluc3RhbmNlb2YgSVJ1bnRpbWVUeXBlKQotCQkJcmV0dXJuIGNvbXBhcmVSdW50aW1lVHlwZXMoKElSdW50aW1lVHlwZSkgbzEsIChJUnVudGltZVR5cGUpIG8yKTsKLQkJCi0JCWlmIChvMSBpbnN0YW5jZW9mIElTZXJ2ZXJUeXBlICYmIG8yIGluc3RhbmNlb2YgSVNlcnZlclR5cGUpCi0JCQlyZXR1cm4gY29tcGFyZVNlcnZlclR5cGVzKChJU2VydmVyVHlwZSkgbzEsIChJU2VydmVyVHlwZSkgbzIpOwotCQkKLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyoqCi0JICogU29ydCB0d28gY2F0ZWdvcnkgbmFtZXMuCi0JICogCi0JICogQHBhcmFtIHMxIHRoZSBmaXJzdCBjYXRlZ29yeQotCSAqIEBwYXJhbSBzMiB0aGUgc2Vjb25kIGNhdGVnb3J5Ci0JICogQHJldHVybiBhIG5lZ2F0aXZlIG51bWJlciBpZiB0aGUgZmlyc3QgZWxlbWVudCBpcyBsZXNzICB0aGFuIHRoZSAKLQkgKiAgICBzZWNvbmQgZWxlbWVudDsgdGhlIHZhbHVlIDxjb2RlPjA8L2NvZGU+IGlmIHRoZSBmaXJzdCBlbGVtZW50IGlzCi0JICogICAgZXF1YWwgdG8gdGhlIHNlY29uZCBlbGVtZW50OyBhbmQgYSBwb3NpdGl2ZSBudW1iZXIgaWYgdGhlIGZpcnN0Ci0JICogICAgZWxlbWVudCBpcyBncmVhdGVyIHRoYW4gdGhlIHNlY29uZCBlbGVtZW50Ci0JICovCi0JcHJvdGVjdGVkIGludCBjb21wYXJlQ2F0ZWdvcmllcyhTdHJpbmcgczEsIFN0cmluZyBzMikgewotCQlyZXR1cm4gczEuY29tcGFyZVRvKHMyKTsKLQl9Ci0KLQkvKioKLQkgKiBTb3J0IHR3byBydW50aW1lIHR5cGVzLgotCSAqIAotCSAqIEBwYXJhbSByMSB0aGUgZmlyc3QgcnVudGltZSB0eXBlCi0JICogQHBhcmFtIHIyIHRoZSBzZWNvbmQgcnVudGltZSB0eXBlCi0JICogQHJldHVybiBhIG5lZ2F0aXZlIG51bWJlciBpZiB0aGUgZmlyc3QgZWxlbWVudCBpcyBsZXNzICB0aGFuIHRoZSAKLQkgKiAgICBzZWNvbmQgZWxlbWVudDsgdGhlIHZhbHVlIDxjb2RlPjA8L2NvZGU+IGlmIHRoZSBmaXJzdCBlbGVtZW50IGlzCi0JICogICAgZXF1YWwgdG8gdGhlIHNlY29uZCBlbGVtZW50OyBhbmQgYSBwb3NpdGl2ZSBudW1iZXIgaWYgdGhlIGZpcnN0Ci0JICogICAgZWxlbWVudCBpcyBncmVhdGVyIHRoYW4gdGhlIHNlY29uZCBlbGVtZW50Ci0JICovCi0JcHJvdGVjdGVkIGludCBjb21wYXJlUnVudGltZVR5cGVzKElSdW50aW1lVHlwZSByMSwgSVJ1bnRpbWVUeXBlIHIyKSB7Ci0JCXJldHVybiByMS5nZXROYW1lKCkuY29tcGFyZVRvSWdub3JlQ2FzZShyMi5nZXROYW1lKCkpOwotCX0KLQotCS8qKgotCSAqIFNvcnQgdHdvIHNlcnZlciB0eXBlcy4KLQkgKiAKLQkgKiBAcGFyYW0gczEgdGhlIGZpcnN0IHNlcnZlciB0eXBlCi0JICogQHBhcmFtIHMyIHRoZSBzZWNvbmQgc2VydmVyIHR5cGUKLQkgKiBAcmV0dXJuIGEgbmVnYXRpdmUgbnVtYmVyIGlmIHRoZSBmaXJzdCBlbGVtZW50IGlzIGxlc3MgIHRoYW4gdGhlIAotCSAqICAgIHNlY29uZCBlbGVtZW50OyB0aGUgdmFsdWUgPGNvZGU+MDwvY29kZT4gaWYgdGhlIGZpcnN0IGVsZW1lbnQgaXMKLQkgKiAgICBlcXVhbCB0byB0aGUgc2Vjb25kIGVsZW1lbnQ7IGFuZCBhIHBvc2l0aXZlIG51bWJlciBpZiB0aGUgZmlyc3QKLQkgKiAgICBlbGVtZW50IGlzIGdyZWF0ZXIgdGhhbiB0aGUgc2Vjb25kIGVsZW1lbnQKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGNvbXBhcmVTZXJ2ZXJUeXBlcyhJU2VydmVyVHlwZSBzMSwgSVNlcnZlclR5cGUgczIpIHsKLQkJcmV0dXJuIHMxLmdldE5hbWUoKS5jb21wYXJlVG9JZ25vcmVDYXNlKHMyLmdldE5hbWUoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvSUxvY2tlZExhYmVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvSUxvY2tlZExhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE3MWUwMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL0lMb2NrZWRMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlld2VyczsKLS8qKgotICogRXh0ZW5kcyA8Y29kZT5JVGFibGVMYWJlbFByb3ZpZGVyPC9jb2RlPiB3aXRoIG1ldGhvZHMgdG8gcHJvdmlkZQotICogbG9jayBpbmZvcm1hdGlvbi4KLSAqLwotcHVibGljIGludGVyZmFjZSBJTG9ja2VkTGFiZWxQcm92aWRlciB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgbG9jayBpbmZvIGZvciB0aGUgZWxlbWVudC4gVGhpcyB2YWx1ZSB3aWxsIGJlIHVzZWQKLQkgKiB0byBjaGFuZ2UgdGhlIHByZXNlbnRhdGlvbiBvZiB0aGUgdGFibGUgcm93LgotCSAqCi0JICogQHBhcmFtIGVsZW1lbnQgdGhlIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGVudGlyZSByb3csIG9yIAotCSAqICAgIDxjb2RlPm51bGw8L2NvZGU+IGluZGljYXRpbmcgdGhhdCBubyBpbnB1dCBvYmplY3QgaXMgc2V0Ci0JICogICAgaW4gdGhlIHZpZXdlcgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGl0ZW0gaXMgbG9ja2VkLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogICAgb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNMb2NrZWQoT2JqZWN0IGVsZW1lbnQpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvSW5pdGlhbFNlbGVjdGlvblByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL0luaXRpYWxTZWxlY3Rpb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWRiZmY5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvSW5pdGlhbFNlbGVjdGlvblByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXdlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlclNvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlclR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5TZXJ2ZXJVSVBsdWdpbjsKLS8qKgotICogQ2xhc3MgdXNlZCB0byBzb3J0IGNhdGVnb3JpZXMsIHJ1bnRpbWUgdHlwZXMsIGFuZCBzZXJ2ZXIgdHlwZXMgaW4gdGhlCi0gKiBOZXcgd2l6YXJkcy4KLSAqLwotcHVibGljIGNsYXNzIEluaXRpYWxTZWxlY3Rpb25Qcm92aWRlciBleHRlbmRzIFZpZXdlclNvcnRlciB7Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEluaXRpYWxTZWxlY3Rpb24oT2JqZWN0W10gb2JqKSB7Ci0JCWlmIChvYmogPT0gbnVsbCB8fCBvYmoubGVuZ3RoID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCWlmIChvYmpbMF0gaW5zdGFuY2VvZiBJUnVudGltZVR5cGUpIHsKLQkJCWludCBzaXplID0gb2JqLmxlbmd0aDsKLQkJCUlSdW50aW1lVHlwZVtdIHJ0ID0gbmV3IElSdW50aW1lVHlwZVtzaXplXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotCQkJCXJ0W2ldID0gKElSdW50aW1lVHlwZSkgb2JqW2ldOwotCQkJcmV0dXJuIGdldEluaXRpYWxTZWxlY3Rpb24ocnQpOwotCQl9Ci0JCQotCQlpZiAob2JqWzBdIGluc3RhbmNlb2YgSVNlcnZlclR5cGUpIHsKLQkJCWludCBzaXplID0gb2JqLmxlbmd0aDsKLQkJCUlTZXJ2ZXJUeXBlW10gc3QgPSBuZXcgSVNlcnZlclR5cGVbc2l6ZV07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLQkJCQlzdFtpXSA9IChJU2VydmVyVHlwZSkgb2JqW2ldOwotCQkJcmV0dXJuIGdldEluaXRpYWxTZWxlY3Rpb24oc3QpOwotCQl9Ci0JCQotCQlpZiAob2JqWzBdIGluc3RhbmNlb2YgSVNlcnZlcikgewotCQkJaW50IHNpemUgPSBvYmoubGVuZ3RoOwotCQkJSVNlcnZlcltdIHN0ID0gbmV3IElTZXJ2ZXJbc2l6ZV07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLQkJCQlzdFtpXSA9IChJU2VydmVyKSBvYmpbaV07Ci0JCQlyZXR1cm4gZ2V0SW5pdGlhbFNlbGVjdGlvbihzdCk7Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBzZXJ2ZXJUeXBlcwotCSAqIEByZXR1cm4gdGhlIGluaXRpYWwgc2VsZWN0aW9uCi0JICovCi0JcHVibGljIElTZXJ2ZXJUeXBlIGdldEluaXRpYWxTZWxlY3Rpb24oSVNlcnZlclR5cGVbXSBzZXJ2ZXJUeXBlcykgewotCQlpZiAoc2VydmVyVHlwZXMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkKLQkJaW50IHNpemUgPSBzZXJ2ZXJUeXBlcy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlpZiAoaGFzUnVudGltZShzZXJ2ZXJUeXBlc1tpXSkpCi0JCQkJcmV0dXJuIHNlcnZlclR5cGVzW2ldOwotCQl9Ci0JCXJldHVybiBzZXJ2ZXJUeXBlc1swXTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gc2VydmVycwotCSAqIEByZXR1cm4gdGhlIGluaXRpYWwgc2VsZWN0aW9uCi0JICovCi0JcHVibGljIElTZXJ2ZXIgZ2V0SW5pdGlhbFNlbGVjdGlvbihJU2VydmVyW10gc2VydmVycykgewotCQlpZiAoc2VydmVycyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlyZXR1cm4gc2VydmVyc1swXTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gcnVudGltZVR5cGVzCi0JICogQHJldHVybiB0aGUgaW5pdGlhbCBzZWxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgSVJ1bnRpbWVUeXBlIGdldEluaXRpYWxTZWxlY3Rpb24oSVJ1bnRpbWVUeXBlW10gcnVudGltZVR5cGVzKSB7Ci0JCWlmIChydW50aW1lVHlwZXMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkKLQkJaW50IHNpemUgPSBydW50aW1lVHlwZXMubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJaWYgKGhhc1J1bnRpbWUocnVudGltZVR5cGVzW2ldKSkKLQkJCQlyZXR1cm4gcnVudGltZVR5cGVzW2ldOwotCQl9Ci0JCXJldHVybiBydW50aW1lVHlwZXNbMF07Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzUnVudGltZShJU2VydmVyVHlwZSBzZXJ2ZXJUeXBlKSB7Ci0JCXJldHVybiBoYXNSdW50aW1lKHNlcnZlclR5cGUuZ2V0UnVudGltZVR5cGUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzUnVudGltZShJUnVudGltZVR5cGUgcnVudGltZVR5cGUpIHsKLQkJaWYgKHJ1bnRpbWVUeXBlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUlSdW50aW1lW10gcnVudGltZXMgPSBTZXJ2ZXJVSVBsdWdpbi5nZXRSdW50aW1lcyhydW50aW1lVHlwZSk7Ci0JCXJldHVybiBydW50aW1lcyAhPSBudWxsICYmIHJ1bnRpbWVzLmxlbmd0aCA+IDA7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvSW5zdGFsbGFibGVTZXJ2ZXJDb21wb3NpdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvSW5zdGFsbGFibGVTZXJ2ZXJDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQwMGU4YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL0luc3RhbGxhYmxlU2VydmVyQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXdlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLklJbnN0YWxsYWJsZVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLk1lc3NhZ2VzOwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEluc3RhbGxhYmxlU2VydmVyQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RUcmVlQ29tcG9zaXRlIHsKLQlwcm90ZWN0ZWQgSUluc3RhbGxhYmxlU2VydmVyIHNlbGVjdGlvbjsKLQlwcm90ZWN0ZWQgSW5zdGFsbGFibGVTZXJ2ZXJTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcjsKLQkKLQlwcm90ZWN0ZWQgSW5zdGFsbGFibGVTZXJ2ZXJDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyOwotCXByb3RlY3RlZCBib29sZWFuIGluaXRpYWxTZWxlY3Rpb24gPSB0cnVlOwotCQotCXB1YmxpYyBpbnRlcmZhY2UgSW5zdGFsbGFibGVTZXJ2ZXJTZWxlY3Rpb25MaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIGluc3RhbGxhYmxlU2VydmVyU2VsZWN0ZWQoSUluc3RhbGxhYmxlU2VydmVyIHNlcnZlcik7Ci0JfQotCi0JcHVibGljIEluc3RhbGxhYmxlU2VydmVyQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSwgSW5zdGFsbGFibGVTZXJ2ZXJTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcjIpIHsKLQkJc3VwZXIocGFyZW50LCBzdHlsZSk7Ci0JCXRoaXMubGlzdGVuZXIgPSBsaXN0ZW5lcjI7Ci0JCi0JCWNvbnRlbnRQcm92aWRlciA9IG5ldyBJbnN0YWxsYWJsZVNlcnZlckNvbnRlbnRQcm92aWRlcihJbnN0YWxsYWJsZVNlcnZlckNvbnRlbnRQcm92aWRlci5TVFlMRV9WRU5ET1IpOwotCQl0cmVlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXIpOwotCQl0cmVlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IEluc3RhbGxhYmxlU2VydmVyTGFiZWxQcm92aWRlcigpKTsKLQkJdHJlZVZpZXdlci5zZXRJbnB1dChBYnN0cmFjdFRyZWVDb250ZW50UHJvdmlkZXIuUk9PVCk7Ci0KLQkJdHJlZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCU9iamVjdCBvYmogPSBnZXRTZWxlY3Rpb24oZXZlbnQuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBJSW5zdGFsbGFibGVTZXJ2ZXIpIHsKLQkJCQkJc2VsZWN0aW9uID0gKElJbnN0YWxsYWJsZVNlcnZlcikgb2JqOwotCQkJCQlzZXREZXNjcmlwdGlvbihzZWxlY3Rpb24uZ2V0RGVzY3JpcHRpb24oKSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJc2VsZWN0aW9uID0gbnVsbDsKLQkJCQkJc2V0RGVzY3JpcHRpb24oIiIpOwotCQkJCX0KLQkJCQlsaXN0ZW5lci5pbnN0YWxsYWJsZVNlcnZlclNlbGVjdGVkKHNlbGVjdGlvbik7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJdHJlZVZpZXdlci5zZXRTb3J0ZXIobmV3IFZpZXdlclNvcnRlcigpIHsKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShWaWV3ZXIgdmlld2VyLCBPYmplY3QgZTEsIE9iamVjdCBlMikgewotCQkJCWlmIChlMSBpbnN0YW5jZW9mIElJbnN0YWxsYWJsZVNlcnZlciAmJiAhKGUyIGluc3RhbmNlb2YgSUluc3RhbGxhYmxlU2VydmVyKSkKLQkJCQkJcmV0dXJuIDE7Ci0JCQkJaWYgKCEoZTEgaW5zdGFuY2VvZiBJSW5zdGFsbGFibGVTZXJ2ZXIpICYmIGUyIGluc3RhbmNlb2YgSUluc3RhbGxhYmxlU2VydmVyKQotCQkJCQlyZXR1cm4gLTE7Ci0JCQkJaWYgKCEoZTEgaW5zdGFuY2VvZiBJSW5zdGFsbGFibGVTZXJ2ZXIgJiYgZTIgaW5zdGFuY2VvZiBJSW5zdGFsbGFibGVTZXJ2ZXIpKQotCQkJCQlyZXR1cm4gc3VwZXIuY29tcGFyZSh2aWV3ZXIsIGUxLCBlMik7Ci0JCQkJSUluc3RhbGxhYmxlU2VydmVyIHIxID0gKElJbnN0YWxsYWJsZVNlcnZlcikgZTE7Ci0JCQkJSUluc3RhbGxhYmxlU2VydmVyIHIyID0gKElJbnN0YWxsYWJsZVNlcnZlcikgZTI7Ci0JCQkJcmV0dXJuIHIxLmdldE5hbWUoKS5jb21wYXJlVG9JZ25vcmVDYXNlKHIyLmdldE5hbWUoKSk7Ci0JCQl9Ci0JCX0pOwotCQl0cmVlVmlld2VyLmV4cGFuZFRvTGV2ZWwoMik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKLQkJc3VwZXIuc2V0VmlzaWJsZSh2aXNpYmxlKTsKLQkJaWYgKHZpc2libGUgJiYgaW5pdGlhbFNlbGVjdGlvbikgewotCQkJaW5pdGlhbFNlbGVjdGlvbiA9IGZhbHNlOwotCQkJaWYgKGNvbnRlbnRQcm92aWRlci5nZXRJbml0aWFsU2VsZWN0aW9uKCkgIT0gbnVsbCkKLQkJCQl0cmVlVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihjb250ZW50UHJvdmlkZXIuZ2V0SW5pdGlhbFNlbGVjdGlvbigpKSwgdHJ1ZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRpdGxlTGFiZWwoKSB7Ci0JCXJldHVybiBNZXNzYWdlcy5pbnN0YWxsYWJsZVNlcnZlckNvbXBUcmVlOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVzY3JpcHRpb25MYWJlbCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldENvbWJvT3B0aW9ucygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7IE1lc3NhZ2VzLm5hbWUsCi0JCQlNZXNzYWdlcy52ZW5kb3IsIE1lc3NhZ2VzLnZlcnNpb24gfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2aWV3T3B0aW9uU2VsZWN0ZWQoYnl0ZSBvcHRpb24pIHsKLQkJSVNlbGVjdGlvbiBzZWwgPSB0cmVlVmlld2VyLmdldFNlbGVjdGlvbigpOwotCQl0cmVlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgSW5zdGFsbGFibGVTZXJ2ZXJDb250ZW50UHJvdmlkZXIob3B0aW9uKSk7Ci0JCXRyZWVWaWV3ZXIuc2V0U2VsZWN0aW9uKHNlbCk7Ci0JfQotCi0JcHVibGljIElJbnN0YWxsYWJsZVNlcnZlciBnZXRTZWxlY3RlZEluc3RhbGxhYmxlU2VydmVyKCkgewotCQlyZXR1cm4gc2VsZWN0aW9uOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL0luc3RhbGxhYmxlU2VydmVyQ29udGVudFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL0luc3RhbGxhYmxlU2VydmVyQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkZDY4NGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9JbnN0YWxsYWJsZVNlcnZlckNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXdlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLklJbnN0YWxsYWJsZVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuU2VydmVyUGx1Z2luOwotLyoqCi0gKiBJbnN0YWxsYWJsZSBzZXJ2ZXIgY29udGVudCBwcm92aWRlci4KLSAqLwotcHVibGljIGNsYXNzIEluc3RhbGxhYmxlU2VydmVyQ29udGVudFByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RUcmVlQ29udGVudFByb3ZpZGVyIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgU1RZTEVfVkVORE9SID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgU1RZTEVfVkVSU0lPTiA9IDI7Ci0KLQlwdWJsaWMgSW5zdGFsbGFibGVTZXJ2ZXJDb250ZW50UHJvdmlkZXIoYnl0ZSBzdHlsZSkgewotCQlzdXBlcihzdHlsZSwgZmFsc2UpOwotCQkKLQkJZmlsbFRyZWUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBmaWxsVHJlZSgpIHsKLQkJY2xlYW4oKTsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoc3R5bGUgIT0gU1RZTEVfRkxBVCkgewotCQkJSUluc3RhbGxhYmxlU2VydmVyW10gaWlzID0gU2VydmVyUGx1Z2luLmdldEluc3RhbGxhYmxlU2VydmVycygpOwotCQkJaWYgKGlpcyAhPSBudWxsKSB7Ci0JCQkJaW50IHNpemUgPSBpaXMubGVuZ3RoOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJCUlJbnN0YWxsYWJsZVNlcnZlciBpcyA9IGlpc1tpXTsKLQkJCQkJVHJlZUVsZW1lbnQgZWxlID0gbnVsbDsKLQkJCQkJaWYgKHN0eWxlID09IFNUWUxFX1ZFTkRPUikgewotCQkJCQkJZWxlID0gZ2V0T3JDcmVhdGUobGlzdCwgaXMuZ2V0VmVuZG9yKCkpOwotCQkJCQkJZWxlLmNvbnRlbnRzLmFkZChpcyk7Ci0JCQkJCQllbGVtZW50VG9QYXJlbnRNYXAucHV0KGlzLCBlbGUpOwotCQkJCQl9IGVsc2UgaWYgKHN0eWxlID09IFNUWUxFX1ZFUlNJT04pIHsKLQkJCQkJCWVsZSA9IGdldE9yQ3JlYXRlKGxpc3QsIGlzLmdldFZlcnNpb24oKSk7Ci0JCQkJCQllbGUuY29udGVudHMuYWRkKGlzKTsKLQkJCQkJCWVsZW1lbnRUb1BhcmVudE1hcC5wdXQoaXMsIGVsZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlJSW5zdGFsbGFibGVTZXJ2ZXJbXSBpaXMgPSBTZXJ2ZXJQbHVnaW4uZ2V0SW5zdGFsbGFibGVTZXJ2ZXJzKCk7Ci0JCQlpZiAoaWlzICE9IG51bGwpIHsKLQkJCQlpbnQgc2l6ZSA9IGlpcy5sZW5ndGg7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCi0JCQkJCWxpc3QuYWRkKGlpc1tpXSk7Ci0JCQl9Ci0JCX0KLQkJZWxlbWVudHMgPSBsaXN0LnRvQXJyYXkoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9JbnN0YWxsYWJsZVNlcnZlckxhYmVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvSW5zdGFsbGFibGVTZXJ2ZXJMYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjYjcwNzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9JbnN0YWxsYWJsZVNlcnZlckxhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLklJbnN0YWxsYWJsZVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLkltYWdlUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotLyoqCi0gKiBJbnN0YWxsYWJsZSBzZXJ2ZXIgbGFiZWwgcHJvdmlkZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBJbnN0YWxsYWJsZVNlcnZlckxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdFRyZWVMYWJlbFByb3ZpZGVyIHsKLQkvKioKLQkgKiBJbnN0YWxsYWJsZVNlcnZlckxhYmVsUHJvdmlkZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgSW5zdGFsbGFibGVTZXJ2ZXJMYWJlbFByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRJbWFnZUltcGwoT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2UoSW1hZ2VSZXNvdXJjZS5JTUdfU0VSVkVSKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRleHRJbXBsKE9iamVjdCBlbGVtZW50KSB7Ci0JCUlJbnN0YWxsYWJsZVNlcnZlciBpcyA9IChJSW5zdGFsbGFibGVTZXJ2ZXIpIGVsZW1lbnQ7Ci0JCXJldHVybiBub3ROdWxsKGlzLmdldE5hbWUoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvTG9ja2VkQ2hlY2tib3hUYWJsZVZpZXdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9Mb2NrZWRDaGVja2JveFRhYmxlVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhMDZiNGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9Mb2NrZWRDaGVja2JveFRhYmxlVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlld2VyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hUYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0OwotLyoqCi0gKgotICovCi1wdWJsaWMgY2xhc3MgTG9ja2VkQ2hlY2tib3hUYWJsZVZpZXdlciBleHRlbmRzIENoZWNrYm94VGFibGVWaWV3ZXIgewotCXByb3RlY3RlZCBDb2xvciBjb2xvcjsKLQotCXB1YmxpYyBMb2NrZWRDaGVja2JveFRhYmxlVmlld2VyKFRhYmxlIHRhYmxlKSB7Ci0JCXN1cGVyKHRhYmxlKTsKLQkJY3JlYXRlQ29sb3IodGFibGUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbG9yKENvbnRyb2wgYykgewotCQljb2xvciA9IG5ldyBDb2xvcihjLmdldERpc3BsYXkoKSwgMjU1LCAyNTUsIDIyNSk7Ci0JCWMuYWRkRGlzcG9zZUxpc3RlbmVyKG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZSkgewotCQkJCWNvbG9yLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgZG9VcGRhdGVJdGVtKFdpZGdldCB3aWRnZXQsIE9iamVjdCBlbGVtZW50LCBib29sZWFuIGZ1bGxNYXApIHsKLQkJaWYgKGNvbG9yID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmICh3aWRnZXQgaW5zdGFuY2VvZiBUYWJsZUl0ZW0pIHsKLQkJCVRhYmxlSXRlbSBpdGVtID0gKFRhYmxlSXRlbSkgd2lkZ2V0OwotCQkJaWYgKGdldExhYmVsUHJvdmlkZXIoKSBpbnN0YW5jZW9mIElMb2NrZWRMYWJlbFByb3ZpZGVyKSB7Ci0JCQkJSUxvY2tlZExhYmVsUHJvdmlkZXIgcHJvdmlkZXIgPSAoSUxvY2tlZExhYmVsUHJvdmlkZXIpIGdldExhYmVsUHJvdmlkZXIoKTsKLQkJCQlpZiAocHJvdmlkZXIuaXNMb2NrZWQoZWxlbWVudCkpIHsKLQkJCQkJaXRlbS5zZXRCYWNrZ3JvdW5kKGNvbG9yKTsKLQkJCQkJaXRlbS5zZXRJbWFnZSgwLCBudWxsKTsKLQkJCQl9IGVsc2UKLQkJCQkJaXRlbS5zZXRCYWNrZ3JvdW5kKG51bGwpOwotCQkJfQotCQl9Ci0JCXN1cGVyLmRvVXBkYXRlSXRlbSh3aWRnZXQsIGVsZW1lbnQsIGZ1bGxNYXApOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL0xvY2tlZFRhYmxlVmlld2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL0xvY2tlZFRhYmxlVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlYzJkMTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9Mb2NrZWRUYWJsZVZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXdlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0OwotLyoqCi0gKgotICovCi1wdWJsaWMgY2xhc3MgTG9ja2VkVGFibGVWaWV3ZXIgZXh0ZW5kcyBUYWJsZVZpZXdlciB7Ci0JcHJvdGVjdGVkIENvbG9yIGNvbG9yOwotCi0JcHVibGljIExvY2tlZFRhYmxlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJY3JlYXRlQ29sb3IocGFyZW50KTsKLQl9Ci0JCi0JcHVibGljIExvY2tlZFRhYmxlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotCQlzdXBlcihwYXJlbnQsIHN0eWxlKTsKLQkJY3JlYXRlQ29sb3IocGFyZW50KTsKLQl9Ci0KLQlwdWJsaWMgTG9ja2VkVGFibGVWaWV3ZXIoVGFibGUgdGFibGUpIHsKLQkJc3VwZXIodGFibGUpOwotCQljcmVhdGVDb2xvcih0YWJsZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29sb3IoQ29udHJvbCBjKSB7Ci0JCWNvbG9yID0gbmV3IENvbG9yKGMuZ2V0RGlzcGxheSgpLCAyNTUsIDI1NSwgMjI1KTsKLQkJYy5hZGREaXNwb3NlTGlzdGVuZXIobmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBlKSB7Ci0JCQkJY29sb3IuZGlzcG9zZSgpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkb1VwZGF0ZUl0ZW0oV2lkZ2V0IHdpZGdldCwgT2JqZWN0IGVsZW1lbnQsIGJvb2xlYW4gZnVsbE1hcCkgewotCQlpZiAoY29sb3IgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKHdpZGdldCBpbnN0YW5jZW9mIFRhYmxlSXRlbSkgewotCQkJVGFibGVJdGVtIGl0ZW0gPSAoVGFibGVJdGVtKSB3aWRnZXQ7Ci0JCQlpZiAoZ2V0TGFiZWxQcm92aWRlcigpIGluc3RhbmNlb2YgSUxvY2tlZExhYmVsUHJvdmlkZXIpIHsKLQkJCQlJTG9ja2VkTGFiZWxQcm92aWRlciBwcm92aWRlciA9IChJTG9ja2VkTGFiZWxQcm92aWRlcikgZ2V0TGFiZWxQcm92aWRlcigpOwotCQkJCWlmIChwcm92aWRlci5pc0xvY2tlZChlbGVtZW50KSkgewotCQkJCQlpdGVtLnNldEJhY2tncm91bmQoY29sb3IpOwotCQkJCQlpdGVtLnNldEltYWdlKDAsIG51bGwpOwotCQkJCX0gZWxzZQotCQkJCQlpdGVtLnNldEJhY2tncm91bmQobnVsbCk7Ci0JCQl9Ci0JCX0KLQkJc3VwZXIuZG9VcGRhdGVJdGVtKHdpZGdldCwgZWxlbWVudCwgZnVsbE1hcCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvTW9uaXRvckNvbXBvc2l0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9Nb25pdG9yQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3OTc2OTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9Nb25pdG9yQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXdlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLklNb25pdG9yZWRTZXJ2ZXJQb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5JU2VydmVyTW9uaXRvck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlck1vbml0b3JNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuRWNsaXBzZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlNXVFV0aWw7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgTW9uaXRvckNvbXBvc2l0ZSBleHRlbmRzIENvbXBvc2l0ZSB7Ci0JLy9wcm90ZWN0ZWQgU2VydmVyUG9ydCBzZWxlY3Rpb247Ci0JcHJvdGVjdGVkIFBvcnRTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcjsKLQlwcm90ZWN0ZWQgSVNlcnZlciBzZXJ2ZXI7Ci0JCi0JcHJvdGVjdGVkIElTZXJ2ZXJNb25pdG9yTWFuYWdlciBzbW07Ci0JCi0JcHJvdGVjdGVkIFRhYmxlIG1vbml0b3JUYWJsZTsKLQlwcm90ZWN0ZWQgVGFibGVWaWV3ZXIgbW9uaXRvclRhYmxlVmlld2VyOwotCQotCXB1YmxpYyBpbnRlcmZhY2UgUG9ydFNlbGVjdGlvbkxpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgcG9ydFNlbGVjdGVkKFNlcnZlclBvcnQgcG9ydCk7Ci0JfQotCQotCXB1YmxpYyBNb25pdG9yQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSwgUG9ydFNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyMiwgSVNlcnZlciBzZXJ2ZXIpIHsKLQkJc3VwZXIocGFyZW50LCBzdHlsZSk7Ci0JCXRoaXMubGlzdGVuZXIgPSBsaXN0ZW5lcjI7Ci0JCXRoaXMuc2VydmVyID0gc2VydmVyOwotCQkKLQkJc21tID0gU2VydmVyTW9uaXRvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKTsKLQkJCi0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlzZXRMYXlvdXREYXRhKGRhdGEpOwotCQkKLQkJbW9uaXRvclRhYmxlID0gbmV3IFRhYmxlKHRoaXMsIFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuTVVMVEkgfCBTV1QuRlVMTF9TRUxFQ1RJT04pOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkZJTExfVkVSVElDQUwpOwotCQkvL2RhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlkYXRhLmhlaWdodEhpbnQgPSAxNTA7Ci0JCS8vZGF0YS53aWR0aEhpbnQgPSAzNDA7Ci0JCW1vbml0b3JUYWJsZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQltb25pdG9yVGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCQltb25pdG9yVGFibGVWaWV3ZXIgPSBuZXcgVGFibGVWaWV3ZXIobW9uaXRvclRhYmxlKTsKLQkJCi0JCVRhYmxlTGF5b3V0IHRhYmxlTGF5b3V0ID0gbmV3IFRhYmxlTGF5b3V0KCk7Ci0JCW1vbml0b3JUYWJsZS5zZXRMYXlvdXQodGFibGVMYXlvdXQpOwotCQltb25pdG9yVGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQkJCi0JCXRhYmxlTGF5b3V0LmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEoOCwgODAsIHRydWUpKTsKLQkJVGFibGVDb2x1bW4gY29sID0gbmV3IFRhYmxlQ29sdW1uKG1vbml0b3JUYWJsZSwgU1dULk5PTkUpOwotCQljb2wuc2V0VGV4dChNZXNzYWdlcy5kaWFsb2dNb25pdG9yQ29sdW1uU3RhdHVzKTsKLQkJCi0JCXRhYmxlTGF5b3V0LmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEoMTIsIDEyMCwgdHJ1ZSkpOwotCQljb2wgPSBuZXcgVGFibGVDb2x1bW4obW9uaXRvclRhYmxlLCBTV1QuTk9ORSk7Ci0JCWNvbC5zZXRUZXh0KE1lc3NhZ2VzLmRpYWxvZ01vbml0b3JDb2x1bW5UeXBlKTsKLQkJCi0JCXRhYmxlTGF5b3V0LmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEoOCwgODAsIHRydWUpKTsKLQkJY29sID0gbmV3IFRhYmxlQ29sdW1uKG1vbml0b3JUYWJsZSwgU1dULk5PTkUpOwotCQljb2wuc2V0VGV4dChNZXNzYWdlcy5kaWFsb2dNb25pdG9yQ29sdW1uUG9ydCk7Ci0JCQotCQl0YWJsZUxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKDgsIDgwLCB0cnVlKSk7Ci0JCWNvbCA9IG5ldyBUYWJsZUNvbHVtbihtb25pdG9yVGFibGUsIFNXVC5OT05FKTsKLQkJY29sLnNldFRleHQoTWVzc2FnZXMuZGlhbG9nTW9uaXRvckNvbHVtbk1vbml0b3JQb3J0KTsKLQkJCi0JCXRhYmxlTGF5b3V0LmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEoOCwgODAsIHRydWUpKTsKLQkJY29sID0gbmV3IFRhYmxlQ29sdW1uKG1vbml0b3JUYWJsZSwgU1dULk5PTkUpOwotCQljb2wuc2V0VGV4dChNZXNzYWdlcy5kaWFsb2dNb25pdG9yQ29sdW1uQ29udGVudFR5cGUpOwotCQkKLQkJbW9uaXRvclRhYmxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgTW9uaXRvckNvbnRlbnRQcm92aWRlcihzZXJ2ZXIpKTsKLQkJbW9uaXRvclRhYmxlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IE1vbml0b3JMYWJlbFByb3ZpZGVyKHNlcnZlcikpOwotCQltb25pdG9yVGFibGVWaWV3ZXIuc2V0SW5wdXQoQWJzdHJhY3RUcmVlQ29udGVudFByb3ZpZGVyLlJPT1QpOwotCQkKLQkJbW9uaXRvclRhYmxlVmlld2VyLnNldFNvcnRlcihuZXcgVmlld2VyU29ydGVyKCkgewotCQkJcHVibGljIGludCBjb21wYXJlKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBlMSwgT2JqZWN0IGUyKSB7Ci0JCQkJSU1vbml0b3JlZFNlcnZlclBvcnQgcG9ydDEgPSAoSU1vbml0b3JlZFNlcnZlclBvcnQpIGUxOwotCQkJCUlNb25pdG9yZWRTZXJ2ZXJQb3J0IHBvcnQyID0gKElNb25pdG9yZWRTZXJ2ZXJQb3J0KSBlMjsKLQkJCQlpZiAocG9ydDEuZ2V0U2VydmVyUG9ydCgpLmdldFBvcnQoKSA9PSBwb3J0Mi5nZXRTZXJ2ZXJQb3J0KCkuZ2V0UG9ydCgpKSB7Ci0JCQkJCWlmIChwb3J0MS5nZXRNb25pdG9yUG9ydCgpID09IHBvcnQyLmdldE1vbml0b3JQb3J0KCkpIHsKLQkJCQkJCXJldHVybiAwOwotCQkJCQl9IGVsc2UgaWYgKHBvcnQxLmdldE1vbml0b3JQb3J0KCkgPiBwb3J0Mi5nZXRNb25pdG9yUG9ydCgpKQotCQkJCQkJcmV0dXJuIDE7Ci0JCQkJCWVsc2UKLQkJCQkJCXJldHVybiAtMTsKLQkJCQl9IGVsc2UgaWYgKHBvcnQxLmdldFNlcnZlclBvcnQoKS5nZXRQb3J0KCkgPiBwb3J0Mi5nZXRTZXJ2ZXJQb3J0KCkuZ2V0UG9ydCgpKQotCQkJCQlyZXR1cm4gMTsKLQkJCQllbHNlCi0JCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlDb21wb3NpdGUgYnV0dG9uQ29tcCA9IG5ldyBDb21wb3NpdGUodGhpcywgU1dULk5PTkUpOwotCQlidXR0b25Db21wLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORykpOwotCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJYnV0dG9uQ29tcC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCi0JCWZpbmFsIElTZXJ2ZXIgc2VydmVyMiA9IHNlcnZlcjsKLQkJQnV0dG9uIGFkZCA9IFNXVFV0aWwuY3JlYXRlQnV0dG9uKGJ1dHRvbkNvbXAsIE1lc3NhZ2VzLmFkZCk7Ci0JCWFkZC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlNb25pdG9yRGlhbG9nIGRpYWxvZyA9IG5ldyBNb25pdG9yRGlhbG9nKGdldFNoZWxsKCksIHNlcnZlcjIpOwotCQkJCWlmIChkaWFsb2cub3BlbigpICE9IFdpbmRvdy5DQU5DRUwpIHsKLQkJCQkJU2VydmVyUG9ydCBwb3J0ID0gZGlhbG9nLmdldFNlcnZlclBvcnQoKTsKLQkJCQkJSU1vbml0b3JlZFNlcnZlclBvcnQgc3AgPSBzbW0uY3JlYXRlTW9uaXRvcihzZXJ2ZXIyLCBwb3J0LCBkaWFsb2cuZ2V0TW9uaXRvclBvcnQoKSwgZGlhbG9nLmdldENvbnRlbnRUeXBlcygpKTsKLQkJCQkJaWYgKHNwICE9IG51bGwpCi0JCQkJCQltb25pdG9yVGFibGVWaWV3ZXIuYWRkKHNwKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQkKLQkJZmluYWwgQnV0dG9uIGVkaXQgPSBTV1RVdGlsLmNyZWF0ZUJ1dHRvbihidXR0b25Db21wLCBNZXNzYWdlcy5lZGl0KTsKLQkJZWRpdC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIG1vbml0b3JUYWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkJCQlJTW9uaXRvcmVkU2VydmVyUG9ydCBwb3J0ID0gKElNb25pdG9yZWRTZXJ2ZXJQb3J0KSBzZWwuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJTW9uaXRvckRpYWxvZyBkaWFsb2cgPSBuZXcgTW9uaXRvckRpYWxvZyhnZXRTaGVsbCgpLCBzZXJ2ZXIyLCBwb3J0LmdldFNlcnZlclBvcnQoKSwgcG9ydC5nZXRNb25pdG9yUG9ydCgpLCBwb3J0LmdldENvbnRlbnRUeXBlcygpKTsKLQkJCQlpZiAoZGlhbG9nLm9wZW4oKSAhPSBXaW5kb3cuQ0FOQ0VMKSB7Ci0JCQkJCXNtbS5yZW1vdmVNb25pdG9yKHBvcnQpOwotCQkJCQltb25pdG9yVGFibGVWaWV3ZXIucmVtb3ZlKHBvcnQpOwotCQkJCQlwb3J0ID0gc21tLmNyZWF0ZU1vbml0b3Ioc2VydmVyMiwgZGlhbG9nLmdldFNlcnZlclBvcnQoKSwgZGlhbG9nLmdldE1vbml0b3JQb3J0KCksIGRpYWxvZy5nZXRDb250ZW50VHlwZXMoKSk7Ci0JCQkJCWlmIChwb3J0ICE9IG51bGwpIHsKLQkJCQkJCW1vbml0b3JUYWJsZVZpZXdlci5hZGQocG9ydCk7Ci0JCQkJCQltb25pdG9yVGFibGVWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHBvcnQpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCWVkaXQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQotCQlmaW5hbCBCdXR0b24gcmVtb3ZlID0gU1dUVXRpbC5jcmVhdGVCdXR0b24oYnV0dG9uQ29tcCwgTWVzc2FnZXMucmVtb3ZlKTsKLQkJcmVtb3ZlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUlNb25pdG9yZWRTZXJ2ZXJQb3J0IG1zcCA9IChJTW9uaXRvcmVkU2VydmVyUG9ydCkgZ2V0U2VsZWN0aW9uKG1vbml0b3JUYWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJaWYgKG1zcC5pc1N0YXJ0ZWQoKSkKLQkJCQkJc21tLnN0b3BNb25pdG9yKG1zcCk7Ci0JCQkJc21tLnJlbW92ZU1vbml0b3IobXNwKTsKLQkJCQltb25pdG9yVGFibGVWaWV3ZXIucmVtb3ZlKG1zcCk7Ci0JCQl9Ci0JCX0pOwotCQlyZW1vdmUuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQotCQlmaW5hbCBCdXR0b24gc3RhcnQgPSBTV1RVdGlsLmNyZWF0ZUJ1dHRvbihidXR0b25Db21wLCBNZXNzYWdlcy5zdGFydCk7Ci0JCXN0YXJ0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgbW9uaXRvclRhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpOwotCQkJCUlNb25pdG9yZWRTZXJ2ZXJQb3J0IG1zcCA9IChJTW9uaXRvcmVkU2VydmVyUG9ydCkgc2VsLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCXRyeSB7Ci0JCQkJCXNtbS5zdGFydE1vbml0b3IobXNwKTsKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkJCUVjbGlwc2VVdGlsLm9wZW5FcnJvcihnZXRTaGVsbCgpLCBjZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotCQkJCX0KLQkJCQltb25pdG9yVGFibGVWaWV3ZXIucmVmcmVzaChtc3ApOwotCQkJCW1vbml0b3JUYWJsZVZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obXNwKSk7Ci0JCQl9Ci0JCX0pOwotCQlzdGFydC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCi0JCWZpbmFsIEJ1dHRvbiBzdG9wID0gU1dUVXRpbC5jcmVhdGVCdXR0b24oYnV0dG9uQ29tcCwgTWVzc2FnZXMuc3RvcCk7Ci0JCXN0b3AuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBtb25pdG9yVGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJSU1vbml0b3JlZFNlcnZlclBvcnQgbXNwID0gKElNb25pdG9yZWRTZXJ2ZXJQb3J0KSBzZWwuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJc21tLnN0b3BNb25pdG9yKG1zcCk7Ci0JCQkJbW9uaXRvclRhYmxlVmlld2VyLnJlZnJlc2gobXNwKTsKLQkJCQltb25pdG9yVGFibGVWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG1zcCkpOwotCQkJfQotCQl9KTsKLQkJc3RvcC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCi0JCW1vbml0b3JUYWJsZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCUlNb25pdG9yZWRTZXJ2ZXJQb3J0IHBvcnQgPSAoSU1vbml0b3JlZFNlcnZlclBvcnQpIGdldFNlbGVjdGlvbihtb25pdG9yVGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCWlmIChwb3J0ICE9IG51bGwpIHsKLQkJCQkJZWRpdC5zZXRFbmFibGVkKCFwb3J0LmlzU3RhcnRlZCgpKTsKLQkJCQkJcmVtb3ZlLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCXN0YXJ0LnNldEVuYWJsZWQoIXBvcnQuaXNTdGFydGVkKCkpOwotCQkJCQlzdG9wLnNldEVuYWJsZWQocG9ydC5pc1N0YXJ0ZWQoKSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZWRpdC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJcmVtb3ZlLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQlzdGFydC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJc3RvcC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQkKLQkJSU1vbml0b3JlZFNlcnZlclBvcnRbXSBtc3BzID0gU2VydmVyTW9uaXRvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRNb25pdG9yZWRQb3J0cyhzZXJ2ZXIpOyAKLQkJaWYgKG1zcHMgIT0gbnVsbCAmJiBtc3BzLmxlbmd0aCA+IDApCi0JCQltb25pdG9yVGFibGVWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG1zcHNbMF0pKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRTZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWwyKSB7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsMjsKLQkJcmV0dXJuIHNlbC5nZXRGaXJzdEVsZW1lbnQoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9Nb25pdG9yQ29udGVudFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL01vbml0b3JDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDY2NjE5Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL01vbml0b3JDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5TZXJ2ZXJNb25pdG9yTWFuYWdlcjsKLS8qKgotICogTW9uaXRvciBwb3J0IGNvbnRlbnQgcHJvdmlkZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBNb25pdG9yQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgewotCXByb3RlY3RlZCBJU2VydmVyIHNlcnZlcjsKLQotCXB1YmxpYyBNb25pdG9yQ29udGVudFByb3ZpZGVyKElTZXJ2ZXIgc2VydmVyKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuc2VydmVyID0gc2VydmVyOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQlyZXR1cm4gU2VydmVyTW9uaXRvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRNb25pdG9yZWRQb3J0cyhzZXJ2ZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvTW9uaXRvckRpYWxvZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9Nb25pdG9yRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmNTY0YjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9Nb25pdG9yRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXdlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJQb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci0vKioKLSAqIERpYWxvZyB0aGF0IHByb21wdHMgYSB1c2VyIHRvIGFkZCBvciBlZGl0IGEgc2VydmVyIG1vbml0b3IuCi0gKi8KLXB1YmxpYyBjbGFzcyBNb25pdG9yRGlhbG9nIGV4dGVuZHMgRGlhbG9nIHsKLQlwcm90ZWN0ZWQgSVNlcnZlciBzZXJ2ZXI7Ci0JcHJvdGVjdGVkIFNlcnZlclBvcnQgcG9ydDsKLQlwcm90ZWN0ZWQgaW50IG1vbml0b3JQb3J0ID0gLTE7Ci0JcHJvdGVjdGVkIFN0cmluZ1tdIHBvcnRDb250ZW50VHlwZXM7Ci0JcHJvdGVjdGVkIFN0cmluZ1tdIGNvbnRlbnRUeXBlczsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VkaXQgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBwb3J0Q2hhbmdlZCA9IGZhbHNlOwotCQotCXByb3RlY3RlZCBCdXR0b24gb2s7Ci0JCi0JcHJvdGVjdGVkIFRhYmxlIHRhYmxlOwotCXByb3RlY3RlZCBUYWJsZVZpZXdlciB0YWJsZVZpZXdlcjsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpbml0OwotCi0JLyoqCi0JICogTW9uaXRvckRpYWxvZyBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnRTaGVsbCB0aGUgc2hlbGwKLQkgKiBAcGFyYW0gc2VydmVyIHRoZSBzZXJ2ZXIKLQkgKi8KLQlwdWJsaWMgTW9uaXRvckRpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgSVNlcnZlciBzZXJ2ZXIpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwpOwotCi0JCXRoaXMuc2VydmVyID0gc2VydmVyOwotCX0KLQkKLQlwdWJsaWMgTW9uaXRvckRpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgSVNlcnZlciBzZXJ2ZXIsIFNlcnZlclBvcnQgcG9ydCwgaW50IG1vbml0b3JQb3J0LCBTdHJpbmdbXSBjb250ZW50VHlwZXMpIHsKLQkJdGhpcyhwYXJlbnRTaGVsbCwgc2VydmVyKTsKLQkJdGhpcy5tb25pdG9yUG9ydCA9IG1vbml0b3JQb3J0OwotCQl0aGlzLmNvbnRlbnRUeXBlcyA9IGNvbnRlbnRUeXBlczsKLQkJdGhpcy5wb3J0ID0gcG9ydDsKLQkJaXNFZGl0ID0gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIG5ld1NoZWxsKSB7Ci0JCXN1cGVyLmNvbmZpZ3VyZVNoZWxsKG5ld1NoZWxsKTsKLQkJbmV3U2hlbGwuc2V0VGV4dChNZXNzYWdlcy5kaWFsb2dNb25pdG9yVGl0bGUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJb2sgPSBjcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLk9LX0lELCBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLCB0cnVlKTsKLQkJY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vIGNyZWF0ZSBhIGNvbXBvc2l0ZSB3aXRoIHN0YW5kYXJkIG1hcmdpbnMgYW5kIHNwYWNpbmcKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IGNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLlZFUlRJQ0FMX01BUkdJTik7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuSE9SSVpPTlRBTF9NQVJHSU4pOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuVkVSVElDQUxfU1BBQ0lORyk7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuSE9SSVpPTlRBTF9TUEFDSU5HKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJY29tcG9zaXRlLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0JCS8vV29ya2JlbmNoSGVscC5zZXRIZWxwKGNvbXBvc2l0ZSwgQ29udGV4dElkcy5URVJNSU5BVEVfU0VSVkVSX0RJQUxPRyk7Ci0JCQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5XUkFQKTsKLQkJbGFiZWwuc2V0VGV4dChOTFMuYmluZChNZXNzYWdlcy5kaWFsb2dNb25pdG9yQWRkRGVzY3JpcHRpb24sIG5ldyBTdHJpbmdbXSB7IHNlcnZlci5nZXROYW1lKCkgfSApKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJZGF0YS53aWR0aEhpbnQgPSAyNzU7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQl0YWJsZSA9IG5ldyBUYWJsZShjb21wb3NpdGUsIFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuU0lOR0xFIHwgU1dULkZVTExfU0VMRUNUSU9OKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5GSUxMX1ZFUlRJQ0FMKTsKLQkJZGF0YS5oZWlnaHRIaW50ID0gMTAwOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJdGFibGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJdGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCQl0YWJsZVZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcih0YWJsZSk7Ci0JCQotCQlUYWJsZUxheW91dCB0YWJsZUxheW91dCA9IG5ldyBUYWJsZUxheW91dCgpOwotCQl0YWJsZS5zZXRMYXlvdXQodGFibGVMYXlvdXQpOwotCQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCQkKLQkJdGFibGVMYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uV2VpZ2h0RGF0YSgxMiwgMTIwLCB0cnVlKSk7Ci0JCVRhYmxlQ29sdW1uIGNvbCA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQljb2wuc2V0VGV4dChNZXNzYWdlcy5kaWFsb2dNb25pdG9yQ29sdW1uVHlwZSk7Ci0JCQotCQl0YWJsZUxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKDQsIDQwLCB0cnVlKSk7Ci0JCWNvbCA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQljb2wuc2V0VGV4dChNZXNzYWdlcy5kaWFsb2dNb25pdG9yQ29sdW1uUG9ydCk7Ci0JCQotCQl0YWJsZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IFBvcnRDb250ZW50UHJvdmlkZXIoc2VydmVyKSk7Ci0JCXRhYmxlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IFBvcnRMYWJlbFByb3ZpZGVyKHNlcnZlcikpOwotCQl0YWJsZVZpZXdlci5zZXRJbnB1dChBYnN0cmFjdFRyZWVDb250ZW50UHJvdmlkZXIuUk9PVCk7Ci0JCQotCQl0YWJsZVZpZXdlci5zZXRTb3J0ZXIobmV3IFZpZXdlclNvcnRlcigpIHsKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShWaWV3ZXIgdmlld2VyLCBPYmplY3QgZTEsIE9iamVjdCBlMikgewotCQkJCVNlcnZlclBvcnQgcG9ydDEgPSAoU2VydmVyUG9ydCkgZTE7Ci0JCQkJU2VydmVyUG9ydCBwb3J0MiA9IChTZXJ2ZXJQb3J0KSBlMjsKLQkJCQlpZiAocG9ydDEuZ2V0UG9ydCgpID09IHBvcnQyLmdldFBvcnQoKSkKLQkJCQkJcmV0dXJuIDA7Ci0JCQkJZWxzZSBpZiAocG9ydDEuZ2V0UG9ydCgpID4gcG9ydDIuZ2V0UG9ydCgpKQotCQkJCQlyZXR1cm4gMTsKLQkJCQllbHNlCi0JCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChNZXNzYWdlcy5kaWFsb2dNb25pdG9yTW9uaXRvclBvcnQpOwotCQkKLQkJZmluYWwgVGV4dCBwb3J0VGV4dCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS53aWR0aEhpbnQgPSAxNTA7Ci0JCXBvcnRUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0JCWlmIChtb25pdG9yUG9ydCA+PSAwKQotCQkJcG9ydFRleHQuc2V0VGV4dChtb25pdG9yUG9ydCArICIiKTsKLQotCQlwb3J0VGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQl0cnkgewotCQkJCQltb25pdG9yUG9ydCA9IEludGVnZXIucGFyc2VJbnQocG9ydFRleHQuZ2V0VGV4dCgpKTsKLQkJCQkJaWYgKG9rICE9IG51bGwpCi0JCQkJCQlvay5zZXRFbmFibGVkKHRydWUpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCQltb25pdG9yUG9ydCA9IC0xOwotCQkJCQlpZiAob2sgIT0gbnVsbCkKLQkJCQkJCW9rLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCX0KLQkJCQlwb3J0Q2hhbmdlZCA9IHRydWU7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoTWVzc2FnZXMuZGlhbG9nTW9uaXRvckNvbnRlbnRUeXBlKTsKLQkJCi0JCWZpbmFsIENvbWJvIGNvbWJvID0gbmV3IENvbWJvKGNvbXBvc2l0ZSwgU1dULlJFQURfT05MWSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS53aWR0aEhpbnQgPSAxNTA7Ci0JCWNvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0JCWNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWludCBzaXplID0gY29tYm8uZ2V0SXRlbUNvdW50KCk7Ci0JCQkJaW50IHNlbCA9IGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCQkJaWYgKHNlbCA9PSBzaXplIC0gMSkKLQkJCQkJY29udGVudFR5cGVzID0gcG9ydENvbnRlbnRUeXBlczsKLQkJCQllbHNlCi0JCQkJCWNvbnRlbnRUeXBlcyA9IG5ldyBTdHJpbmdbXSB7IHBvcnRDb250ZW50VHlwZXNbc2VsXSB9OwotCQkJfQotCQl9KTsKLQkJCi0JCXRhYmxlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJcG9ydCA9IChTZXJ2ZXJQb3J0KSBnZXRTZWxlY3Rpb24odGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCWlmIChwb3J0ID09IG51bGwpCi0JCQkJCXJldHVybjsKLQkJCQlpZiAoIXBvcnRDaGFuZ2VkKSB7Ci0JCQkJCXBvcnRUZXh0LnNldFRleHQoKHBvcnQuZ2V0UG9ydCgpICsgMSkgKyAiIik7Ci0JCQkJCXBvcnRDaGFuZ2VkID0gZmFsc2U7Ci0JCQkJfQotCQkJCXBvcnRDb250ZW50VHlwZXMgPSBwb3J0LmdldENvbnRlbnRUeXBlcygpOwotCQkJCVN0cmluZ1tdIHMgPSBudWxsOwotCQkJCVN0cmluZyBhbGwgPSBNZXNzYWdlcy5kaWFsb2dNb25pdG9yQ29udGVudFR5cGVBbGw7Ci0JCQkJaWYgKHBvcnRDb250ZW50VHlwZXMgPT0gbnVsbCB8fCBwb3J0Q29udGVudFR5cGVzLmxlbmd0aCA9PSAxKSB7Ci0JCQkJCXMgPSBuZXcgU3RyaW5nW10geyBhbGwgfTsKLQkJCQl9IGVsc2UgewotCQkJCQlpbnQgc2l6ZSA9IHBvcnRDb250ZW50VHlwZXMubGVuZ3RoOwotCQkJCQlzID0gbmV3IFN0cmluZ1tzaXplKzFdOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCQkJc1tpXSA9IE1vbml0b3JMYWJlbFByb3ZpZGVyLmdldENvbnRlbnRUeXBlU3RyaW5nKHBvcnRDb250ZW50VHlwZXNbaV0pOwotCQkJCQl9Ci0JCQkJCXNbc2l6ZV0gPSBhbGw7Ci0JCQkJfQotCQkJCWNvbWJvLnNldEl0ZW1zKHMpOwotCQkJCWNvbWJvLnNldFRleHQoYWxsKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KGNvbXBvc2l0ZSk7Ci0JCQotCQlpZiAocG9ydCAhPSBudWxsKSB7Ci0JCQlwb3J0Q2hhbmdlZCA9IHRydWU7Ci0JCQlTdHJpbmdbXSBjdCA9IGNvbnRlbnRUeXBlczsKLQkJCXRhYmxlVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihwb3J0KSk7Ci0JCQlpZiAoY3QgIT0gbnVsbCAmJiBjdC5sZW5ndGggPiAwKQotCQkJCWNvbWJvLnNldFRleHQoTW9uaXRvckxhYmVsUHJvdmlkZXIuZ2V0Q29udGVudFR5cGVTdHJpbmcoY3RbMF0pKTsKLQkJfSBlbHNlIGlmICh0YWJsZVZpZXdlciAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCU9iamVjdCBvYmogPSB0YWJsZVZpZXdlci5nZXRFbGVtZW50QXQoMCk7Ci0JCQkJaWYgKG9iaiAhPSBudWxsKQotCQkJCXRhYmxlVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihvYmopKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCX0KLQkJCi0JCXBvcnRDaGFuZ2VkID0gZmFsc2U7Ci0JCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCQotCXByb3RlY3RlZCBPYmplY3QgZ2V0U2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsMikgewotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbDI7Ci0JCXJldHVybiBzZWwuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JfQotCQotCXB1YmxpYyBpbnQgZ2V0TW9uaXRvclBvcnQoKSB7Ci0JCXJldHVybiBtb25pdG9yUG9ydDsKLQl9Ci0KLQlwdWJsaWMgU2VydmVyUG9ydCBnZXRTZXJ2ZXJQb3J0KCkgewotCQlyZXR1cm4gcG9ydDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0Q29udGVudFR5cGVzKCkgewotCQlyZXR1cm4gY29udGVudFR5cGVzOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL01vbml0b3JMYWJlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL01vbml0b3JMYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkMmE3ODQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9Nb25pdG9yTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXdlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLklNb25pdG9yZWRTZXJ2ZXJQb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuSW1hZ2VSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLk1lc3NhZ2VzOwotLyoqCi0gKiBNb25pdG9yIHBvcnQgbGFiZWwgcHJvdmlkZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBNb25pdG9yTGFiZWxQcm92aWRlciBleHRlbmRzIEJhc2VMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlciB7Ci0JcHJvdGVjdGVkIElTZXJ2ZXIgc2VydmVyOwotCi0JcHVibGljIE1vbml0b3JMYWJlbFByb3ZpZGVyKElTZXJ2ZXIgc2VydmVyKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuc2VydmVyID0gc2VydmVyOwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCUlNb25pdG9yZWRTZXJ2ZXJQb3J0IHBvcnQgPSAoSU1vbml0b3JlZFNlcnZlclBvcnQpIGVsZW1lbnQ7Ci0JCWlmIChjb2x1bW5JbmRleCA9PSAwKSB7Ci0JCQlpZiAocG9ydC5pc1N0YXJ0ZWQoKSkKLQkJCQlyZXR1cm4gSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZShJbWFnZVJlc291cmNlLklNR19NT05JVE9SX09OKTsKLQkJCXJldHVybiBJbWFnZVJlc291cmNlLmdldEltYWdlKEltYWdlUmVzb3VyY2UuSU1HX01PTklUT1JfT0ZGKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQlJTW9uaXRvcmVkU2VydmVyUG9ydCBwb3J0ID0gKElNb25pdG9yZWRTZXJ2ZXJQb3J0KSBlbGVtZW50OwotCQlpZiAoY29sdW1uSW5kZXggPT0gMCkgewotCQkJaWYgKHBvcnQuaXNTdGFydGVkKCkpCi0JCQkJcmV0dXJuIE1lc3NhZ2VzLnN0YXJ0ZWQ7Ci0JCQlyZXR1cm4gTWVzc2FnZXMuc3RvcHBlZDsKLQkJfSBlbHNlIGlmIChjb2x1bW5JbmRleCA9PSAxKQotCQkJcmV0dXJuIG5vdE51bGwocG9ydC5nZXRTZXJ2ZXJQb3J0KCkuZ2V0TmFtZSgpKTsKLQkJZWxzZSBpZiAoY29sdW1uSW5kZXggPT0gMikKLQkJCXJldHVybiBwb3J0LmdldFNlcnZlclBvcnQoKS5nZXRQb3J0KCkgKyAiIjsKLQkJZWxzZSBpZiAoY29sdW1uSW5kZXggPT0gMykKLQkJCXJldHVybiBwb3J0LmdldE1vbml0b3JQb3J0KCkgKyAiIjsKLQkJZWxzZSB7Ci0JCQlTdHJpbmdbXSBjb250ZW50ID0gcG9ydC5nZXRDb250ZW50VHlwZXMoKTsKLQkJCWlmIChjb250ZW50ID09IG51bGwgfHwgY29udGVudC5sZW5ndGggPT0gMCkKLQkJCQlyZXR1cm4gTWVzc2FnZXMuZGlhbG9nTW9uaXRvckNvbnRlbnRUeXBlQWxsOwotCQkJCi0JCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlpbnQgc2l6ZSA9IGNvbnRlbnQubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlpZiAoaSA+IDApCi0JCQkJCXNiLmFwcGVuZCgiLCIpOwotCQkJCXNiLmFwcGVuZChnZXRDb250ZW50VHlwZVN0cmluZyhjb250ZW50W2ldKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBnZXRDb250ZW50VHlwZVN0cmluZyhTdHJpbmcgcykgewotCQlpZiAoIndlYiIuZXF1YWxzKHMpKQotCQkJcmV0dXJuIE1lc3NhZ2VzLmRpYWxvZ01vbml0b3JDb250ZW50VHlwZVdlYjsKLQkJZWxzZSBpZiAoIndlYnNlcnZpY2VzIi5lcXVhbHMocykpCi0JCQlyZXR1cm4gTWVzc2FnZXMuZGlhbG9nTW9uaXRvckNvbnRlbnRUeXBlV2ViU2VydmljZXM7Ci0JCWVsc2UKLQkJCXJldHVybiBzOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL1BvcnRDb250ZW50UHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvUG9ydENvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzk1NDczLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvUG9ydENvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXdlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci0vKioKLSAqIE1vbml0b3IgcG9ydCBjb250ZW50IHByb3ZpZGVyLgotICovCi1wdWJsaWMgY2xhc3MgUG9ydENvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIHsKLQlwcm90ZWN0ZWQgSVNlcnZlciBzZXJ2ZXI7Ci0KLQlwdWJsaWMgUG9ydENvbnRlbnRQcm92aWRlcihJU2VydmVyIHNlcnZlcikgewotCQlzdXBlcigpOwotCQl0aGlzLnNlcnZlciA9IHNlcnZlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJcmV0dXJuIHNlcnZlci5nZXRTZXJ2ZXJQb3J0cyhudWxsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL1BvcnRMYWJlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL1BvcnRMYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjNjc0ZjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9Qb3J0TGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXdlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclBvcnQ7Ci0vKioKLSAqIFNlcnZlciBwb3J0IGxhYmVsIHByb3ZpZGVyLgotICovCi1wdWJsaWMgY2xhc3MgUG9ydExhYmVsUHJvdmlkZXIgZXh0ZW5kcyBCYXNlTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIgewotCXByb3RlY3RlZCBJU2VydmVyIHNlcnZlcjsKLQotCXB1YmxpYyBQb3J0TGFiZWxQcm92aWRlcihJU2VydmVyIHNlcnZlcikgewotCQlzdXBlcigpOwotCQl0aGlzLnNlcnZlciA9IHNlcnZlcjsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQlTZXJ2ZXJQb3J0IHBvcnQgPSAoU2VydmVyUG9ydCkgZWxlbWVudDsKLQkJaWYgKGNvbHVtbkluZGV4ID09IDApCi0JCQlyZXR1cm4gbm90TnVsbChwb3J0LmdldE5hbWUoKSk7Ci0JCWVsc2UgaWYgKGNvbHVtbkluZGV4ID09IDEpCi0JCQlyZXR1cm4gcG9ydC5nZXRQb3J0KCkgKyAiIjsKLQkJZWxzZQotCQkJcmV0dXJuICIiOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL1J1bnRpbWVDb21wb3NpdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvUnVudGltZUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTE3OTlmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvUnVudGltZUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja1N0YXRlQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hUYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtbldlaWdodERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2hlY2tTdGF0ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyU29ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZVdvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5SZXNvdXJjZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlRyYWNlOwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFJ1bnRpbWVDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdFRhYmxlQ29tcG9zaXRlIHsKLQlwcm90ZWN0ZWQgSVJ1bnRpbWUgc2VsZWN0aW9uOwotCXByb3RlY3RlZCBJUnVudGltZSBkZWZhdWx0UnVudGltZTsKLQlwcm90ZWN0ZWQgUnVudGltZVNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyOwotCQotCXB1YmxpYyBpbnRlcmZhY2UgUnVudGltZVNlbGVjdGlvbkxpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgcnVudGltZVNlbGVjdGVkKElSdW50aW1lIHJ1bnRpbWUpOwotCX0KLQkKLQljbGFzcyBSdW50aW1lVmlld2VyU29ydGVyIGV4dGVuZHMgVmlld2VyU29ydGVyIHsKLQkJYm9vbGVhbiBzb3J0QnlOYW1lOwotCQlwdWJsaWMgUnVudGltZVZpZXdlclNvcnRlcihib29sZWFuIHNvcnRCeU5hbWUpIHsKLQkJCXRoaXMuc29ydEJ5TmFtZSA9IHNvcnRCeU5hbWU7Ci0JCX0KLQkJCi0JCXB1YmxpYyBpbnQgY29tcGFyZShWaWV3ZXIgdmlld2VyLCBPYmplY3QgZTEsIE9iamVjdCBlMikgewotCQkJSVJ1bnRpbWUgcjEgPSAoSVJ1bnRpbWUpIGUxOwotCQkJSVJ1bnRpbWUgcjIgPSAoSVJ1bnRpbWUpIGUyOwotCQkJaWYgKHNvcnRCeU5hbWUpCi0JCQkJcmV0dXJuIGNvbGxhdG9yLmNvbXBhcmUobm90TnVsbChyMS5nZXROYW1lKCkpLCBub3ROdWxsKHIyLmdldE5hbWUoKSkpOwotCQkJCi0JCQlpZiAocjEuZ2V0UnVudGltZVR5cGUoKSA9PSBudWxsKQotCQkJCXJldHVybiAtMTsKLQkJCWlmIChyMi5nZXRSdW50aW1lVHlwZSgpID09IG51bGwpCi0JCQkJcmV0dXJuIDE7Ci0JCQlyZXR1cm4gY29sbGF0b3IuY29tcGFyZShub3ROdWxsKHIxLmdldFJ1bnRpbWVUeXBlKCkuZ2V0TmFtZSgpKSwgbm90TnVsbChyMi5nZXRSdW50aW1lVHlwZSgpLmdldE5hbWUoKSkpOwotCQl9Ci0JCQotCQlwcm90ZWN0ZWQgU3RyaW5nIG5vdE51bGwoU3RyaW5nIHMpIHsKLQkJCWlmIChzID09IG51bGwpCi0JCQkJcmV0dXJuICIiOwotCQkJcmV0dXJuIHM7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIFJ1bnRpbWVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlLCBSdW50aW1lU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIyKSB7Ci0JCXN1cGVyKHBhcmVudCwgc3R5bGUpOwotCQl0aGlzLmxpc3RlbmVyID0gbGlzdGVuZXIyOwotCQkKLQkJVGFibGVMYXlvdXQgdGFibGVMYXlvdXQgPSBuZXcgVGFibGVMYXlvdXQoKTsKLQkJdGFibGUuc2V0TGF5b3V0KHRhYmxlTGF5b3V0KTsKLQkJdGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQotCQl0YWJsZUxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKDYwLCAxNjAsIHRydWUpKTsKLQkJVGFibGVDb2x1bW4gY29sID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWNvbC5zZXRUZXh0KE1lc3NhZ2VzLmNvbHVtbk5hbWUpOwotCQljb2wuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXRhYmxlVmlld2VyLnNldFNvcnRlcihuZXcgUnVudGltZVZpZXdlclNvcnRlcih0cnVlKSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJd2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCQl9Ci0JCX0pOwotCi0JCXRhYmxlTGF5b3V0LmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEoNDUsIDEyNSwgdHJ1ZSkpOwotCQljb2wgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQkJY29sLnNldFRleHQoTWVzc2FnZXMuY29sdW1uVHlwZSk7Ci0JCWNvbC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJdGFibGVWaWV3ZXIuc2V0U29ydGVyKG5ldyBSdW50aW1lVmlld2VyU29ydGVyKGZhbHNlKSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJd2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJdGFibGVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBSdW50aW1lQ29udGVudFByb3ZpZGVyKCkpOwotCQl0YWJsZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBSdW50aW1lVGFibGVMYWJlbFByb3ZpZGVyKCkpOwotCQl0YWJsZVZpZXdlci5zZXRJbnB1dChBYnN0cmFjdFRyZWVDb250ZW50UHJvdmlkZXIuUk9PVCk7Ci0JCXRhYmxlVmlld2VyLnNldENvbHVtblByb3BlcnRpZXMobmV3IFN0cmluZ1tdIHsibmFtZSIsICJ0eXBlIn0pOwotCQl0YWJsZVZpZXdlci5zZXRTb3J0ZXIobmV3IFJ1bnRpbWVWaWV3ZXJTb3J0ZXIodHJ1ZSkpOwotCi0JCXRhYmxlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGdldFNlbGVjdGlvbihldmVudC5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElSdW50aW1lKQotCQkJCQlzZWxlY3Rpb24gPSAoSVJ1bnRpbWUpIG9iajsKLQkJCQllbHNlCi0JCQkJCXNlbGVjdGlvbiA9IG51bGw7Ci0JCQkJbGlzdGVuZXIucnVudGltZVNlbGVjdGVkKHNlbGVjdGlvbik7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJdGFibGUuYWRkS2V5TGlzdGVuZXIobmV3IEtleUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBlKSB7Ci0JCQkJaWYgKGUuY2hhcmFjdGVyID09ICdsJykgewotCQkJCQl0cnkgewotCQkJCQkJSVJ1bnRpbWUgcnVudGltZSA9IGdldFNlbGVjdGVkUnVudGltZSgpOwotCQkJCQkJSVJ1bnRpbWVXb3JraW5nQ29weSB3YyA9IHJ1bnRpbWUuY3JlYXRlV29ya2luZ0NvcHkoKTsKLQkJCQkJCXdjLnNldFJlYWRPbmx5KCFydW50aW1lLmlzUmVhZE9ubHkoKSk7Ci0JCQkJCQl3Yy5zYXZlKGZhbHNlLCBudWxsKTsKLQkJCQkJCXJlZnJlc2gocnVudGltZSk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCQkJLy8gaWdub3JlCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGtleVJlbGVhc2VkKEtleUV2ZW50IGUpIHsKLQkJCQkvLyBkbyBub3RoaW5nCi0JCQl9Ci0JCX0pOwotCQkKLQkJZmluYWwgUmVzb3VyY2VNYW5hZ2VyIHJtID0gUmVzb3VyY2VNYW5hZ2VyLmdldEluc3RhbmNlKCk7Ci0JCWRlZmF1bHRSdW50aW1lID0gcm0uZ2V0RGVmYXVsdFJ1bnRpbWUoKTsKLQkJaWYgKGRlZmF1bHRSdW50aW1lICE9IG51bGwpCi0JCQkoKENoZWNrYm94VGFibGVWaWV3ZXIpdGFibGVWaWV3ZXIpLnNldENoZWNrZWQoZGVmYXVsdFJ1bnRpbWUsIHRydWUpOwotCi0JCSgoQ2hlY2tib3hUYWJsZVZpZXdlcil0YWJsZVZpZXdlcikuYWRkQ2hlY2tTdGF0ZUxpc3RlbmVyKG5ldyBJQ2hlY2tTdGF0ZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY2hlY2tTdGF0ZUNoYW5nZWQoQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCXRyeSB7Ci0JCQkJCUlSdW50aW1lIHJ1bnRpbWUgPSAoSVJ1bnRpbWUpIGV2ZW50LmdldEVsZW1lbnQoKTsKLQkJCQkJaWYgKGV2ZW50LmdldENoZWNrZWQoKSkgewotCQkJCQkJaWYgKGRlZmF1bHRSdW50aW1lICE9IG51bGwgJiYgIXJ1bnRpbWUuZXF1YWxzKGRlZmF1bHRSdW50aW1lKSkKLQkJCQkJCQkoKENoZWNrYm94VGFibGVWaWV3ZXIpdGFibGVWaWV3ZXIpLnNldENoZWNrZWQoZGVmYXVsdFJ1bnRpbWUsIGZhbHNlKTsKLQkJCQkJCXJtLnNldERlZmF1bHRSdW50aW1lKHJ1bnRpbWUpOwotCQkJCQkJZGVmYXVsdFJ1bnRpbWUgPSBydW50aW1lOwotCQkJCQl9IGVsc2UKLQkJCQkJCXJtLnNldERlZmF1bHRSdW50aW1lKG51bGwpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIHNldHRpbmcgZGVmYXVsdCBydW50aW1lIiwgZSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVUYWJsZSgpIHsKLQkJdGFibGUgPSBuZXcgVGFibGUodGhpcywgU1dULkJPUkRFUiB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5TSU5HTEUgfCBTV1QuQ0hFQ0spOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVRhYmxlVmlld2VyKCkgewotCQl0YWJsZVZpZXdlciA9IG5ldyBMb2NrZWRDaGVja2JveFRhYmxlVmlld2VyKHRhYmxlKTsKLQl9Ci0KLQlwdWJsaWMgSVJ1bnRpbWUgZ2V0U2VsZWN0ZWRSdW50aW1lKCkgewotCQlyZXR1cm4gc2VsZWN0aW9uOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL1J1bnRpbWVDb250ZW50UHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvUnVudGltZUNvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjdmMDllLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvUnVudGltZUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXdlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuUnVudGltZTsKLS8qKgotICogUnVudGltZSBjb250ZW50IHByb3ZpZGVyLgotICovCi1wdWJsaWMgY2xhc3MgUnVudGltZUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIHsKLQkvKioKLQkgKiBSdW50aW1lQ29udGVudFByb3ZpZGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFJ1bnRpbWVDb250ZW50UHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIjZ2V0RWxlbWVudHMoT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSVJ1bnRpbWVbXSBydW50aW1lcyA9IFNlcnZlckNvcmUuZ2V0UnVudGltZXMoKTsKLQkJaWYgKHJ1bnRpbWVzICE9IG51bGwpIHsKLQkJCWludCBzaXplID0gcnVudGltZXMubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlpZiAoISgoUnVudGltZSlydW50aW1lc1tpXSkuaXNQcml2YXRlKCkpCi0JCQkJCWxpc3QuYWRkKHJ1bnRpbWVzW2ldKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbGlzdC50b0FycmF5KCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXIjaW5wdXRDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyLCBPYmplY3QsIE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL1J1bnRpbWVUYWJsZUxhYmVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvUnVudGltZVRhYmxlTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWU3MTFmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvUnVudGltZVRhYmxlTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXdlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5JbWFnZVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLS8qKgotICogUnVudGltZSB0YWJsZSBsYWJlbCBwcm92aWRlci4KLSAqLwotcHVibGljIGNsYXNzIFJ1bnRpbWVUYWJsZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBCYXNlTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIsIElMb2NrZWRMYWJlbFByb3ZpZGVyIHsKLQkvKioKLQkgKiBSdW50aW1lVGFibGVMYWJlbFByb3ZpZGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFJ1bnRpbWVUYWJsZUxhYmVsUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJVGFibGVMYWJlbFByb3ZpZGVyI2dldENvbHVtbkltYWdlKE9iamVjdCwgaW50KQotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCWlmIChjb2x1bW5JbmRleCA9PSAwKSB7Ci0JCQlJUnVudGltZSBydW50aW1lID0gKElSdW50aW1lKSBlbGVtZW50OwotCQkJSVJ1bnRpbWVUeXBlIHJ1bnRpbWVUeXBlID0gcnVudGltZS5nZXRSdW50aW1lVHlwZSgpOwotCQkJaWYgKHJ1bnRpbWVUeXBlICE9IG51bGwpCi0JCQkJcmV0dXJuIEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2UocnVudGltZVR5cGUuZ2V0SWQoKSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJVGFibGVMYWJlbFByb3ZpZGVyI2dldENvbHVtblRleHQoT2JqZWN0LCBpbnQpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJSVJ1bnRpbWUgcnVudGltZSA9IChJUnVudGltZSkgZWxlbWVudDsKLQkJaWYgKGNvbHVtbkluZGV4ID09IDApCi0JCQlyZXR1cm4gbm90TnVsbChydW50aW1lLmdldE5hbWUoKSk7Ci0JCS8qZWxzZSBpZiAoY29sdW1uSW5kZXggPT0gMSkgewotCQkJSVBhdGggbG9jYXRpb24gPSBydW50aW1lLmdldExvY2F0aW9uKCk7Ci0JCQlpZiAobG9jYXRpb24gPT0gbnVsbCkKLQkJCQlyZXR1cm4gIiI7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIG5vdE51bGwobG9jYXRpb24udG9PU1N0cmluZygpKTsKLQkJfSovCi0JCWVsc2UgaWYgKGNvbHVtbkluZGV4ID09IDEpIHsKLQkJCUlSdW50aW1lVHlwZSBydW50aW1lVHlwZSA9IHJ1bnRpbWUuZ2V0UnVudGltZVR5cGUoKTsKLQkJCWlmIChydW50aW1lVHlwZSAhPSBudWxsKQotCQkJCXJldHVybiBub3ROdWxsKHJ1bnRpbWVUeXBlLmdldE5hbWUoKSk7Ci0JCQlyZXR1cm4gIiI7Ci0JCX0gZWxzZQotCQkJcmV0dXJuICJYIjsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNMb2NrZWQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJSVJ1bnRpbWUgcnVudGltZSA9IChJUnVudGltZSkgZWxlbWVudDsKLQkJcmV0dXJuIHJ1bnRpbWUuaXNSZWFkT25seSgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL1J1bnRpbWVUcmVlQ29udGVudFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL1J1bnRpbWVUcmVlQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1YTg5NTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9SdW50aW1lVHJlZUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXdlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlckNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5UcmFjZTsKLS8qKgotICogUnVudGltZSBjb250ZW50IHByb3ZpZGVyLgotICovCi1wdWJsaWMgY2xhc3MgUnVudGltZVRyZWVDb250ZW50UHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdFRyZWVDb250ZW50UHJvdmlkZXIgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBTVFlMRV9WRU5ET1IgPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBTVFlMRV9WRVJTSU9OID0gMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgU1RZTEVfVFlQRSA9IDM7Ci0KLQkvKioKLQkgKiBSdW50aW1lVHJlZUNvbnRlbnRQcm92aWRlciBjb25zdHJ1Y3Rvci4KLQkgKiAKLQkgKiBAcGFyYW0gc3R5bGUgYSBzdHlsZQotCSAqLwotCXB1YmxpYyBSdW50aW1lVHJlZUNvbnRlbnRQcm92aWRlcihieXRlIHN0eWxlKSB7Ci0JCXN1cGVyKHN0eWxlKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZmlsbFRyZWUoKSB7Ci0JCWNsZWFuKCk7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKHN0eWxlICE9IFNUWUxFX0ZMQVQpIHsKLQkJCUlSdW50aW1lW10gcnVudGltZXMgPSBTZXJ2ZXJDb3JlLmdldFJ1bnRpbWVzKCk7Ci0JCQlpZiAocnVudGltZXMgIT0gbnVsbCkgewotCQkJCWludCBzaXplID0gcnVudGltZXMubGVuZ3RoOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJCUlSdW50aW1lVHlwZSBydW50aW1lVHlwZSA9IHJ1bnRpbWVzW2ldLmdldFJ1bnRpbWVUeXBlKCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlUcmVlRWxlbWVudCBlbGUgPSBudWxsOwotCQkJCQkJaWYgKHN0eWxlID09IFNUWUxFX1ZFTkRPUikKLQkJCQkJCQllbGUgPSBnZXRPckNyZWF0ZShsaXN0LCBydW50aW1lVHlwZS5nZXRWZW5kb3IoKSk7Ci0JCQkJCQllbHNlIGlmIChzdHlsZSA9PSBTVFlMRV9WRVJTSU9OKQotCQkJCQkJCWVsZSA9IGdldE9yQ3JlYXRlKGxpc3QsIHJ1bnRpbWVUeXBlLmdldFZlcnNpb24oKSk7Ci0JCQkJCQllbHNlIGlmIChzdHlsZSA9PSBTVFlMRV9UWVBFKQotCQkJCQkJCWVsZSA9IGdldE9yQ3JlYXRlKGxpc3QsIHJ1bnRpbWVUeXBlLmdldE5hbWUoKSk7Ci0JCQkJCQllbGUuY29udGVudHMuYWRkKHJ1bnRpbWVzW2ldKTsKLQkJCQkJCWVsZW1lbnRUb1BhcmVudE1hcC5wdXQocnVudGltZXNbaV0sIGVsZSk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiRXJyb3IgaW4gcnVudGltZSBjb250ZW50IHByb3ZpZGVyIiwgZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlJUnVudGltZVtdIHJ1bnRpbWVzID0gU2VydmVyQ29yZS5nZXRSdW50aW1lcygpOwotCQkJaWYgKHJ1bnRpbWVzICE9IG51bGwpIHsKLQkJCQlpbnQgc2l6ZSA9IHJ1bnRpbWVzLmxlbmd0aDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLQkJCQkJbGlzdC5hZGQocnVudGltZXNbaV0pOwotCQkJfQotCQl9Ci0JCWVsZW1lbnRzID0gbGlzdC50b0FycmF5KCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvUnVudGltZVRyZWVMYWJlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL1J1bnRpbWVUcmVlTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2YzNmRlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvUnVudGltZVRyZWVMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlld2VyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5JbWFnZVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU2hhcmVkSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0vKioKLSAqIFJ1bnRpbWUgbGFiZWwgcHJvdmlkZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBSdW50aW1lVHJlZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdFRyZWVMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlciB7Ci0JLyoqCi0JICogUnVudGltZVRyZWVMYWJlbFByb3ZpZGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFJ1bnRpbWVUcmVlTGFiZWxQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0SW1hZ2VJbXBsKE9iamVjdCBlbGVtZW50KSB7Ci0JCUlSdW50aW1lIHJ1bnRpbWUgPSAoSVJ1bnRpbWUpIGVsZW1lbnQ7Ci0JCWlmIChydW50aW1lLmdldFJ1bnRpbWVUeXBlKCkgIT0gbnVsbCkKLQkJCXJldHVybiBJbWFnZVJlc291cmNlLmdldEltYWdlKHJ1bnRpbWUuZ2V0UnVudGltZVR5cGUoKS5nZXRJZCgpKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUZXh0SW1wbChPYmplY3QgZWxlbWVudCkgewotCQlJUnVudGltZSBydW50aW1lID0gKElSdW50aW1lKSBlbGVtZW50OwotCQlyZXR1cm4gbm90TnVsbChydW50aW1lLmdldE5hbWUoKSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyI2dldENvbHVtbkltYWdlKGphdmEubGFuZy5PYmplY3QsIGludCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQlpZiAoY29sdW1uSW5kZXggPT0gMCkgewotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBTZXJ2ZXJUcmVlQ29udGVudFByb3ZpZGVyLlRyZWVFbGVtZW50KSB7Ci0JCQkJSVNoYXJlZEltYWdlcyBzaGFyZWRJbWFnZXMgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFNoYXJlZEltYWdlcygpOwotCQkJCXJldHVybiBzaGFyZWRJbWFnZXMuZ2V0SW1hZ2UoSVNoYXJlZEltYWdlcy5JTUdfT0JKX0ZPTERFUik7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0SW1hZ2VJbXBsKGVsZW1lbnQpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlciNnZXRDb2x1bW5UZXh0KGphdmEubGFuZy5PYmplY3QsIGludCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFNlcnZlclRyZWVDb250ZW50UHJvdmlkZXIuVHJlZUVsZW1lbnQpIHsKLQkJCWlmIChjb2x1bW5JbmRleCA9PSAwKQotCQkJCXJldHVybiAoKFNlcnZlclRyZWVDb250ZW50UHJvdmlkZXIuVHJlZUVsZW1lbnQpIGVsZW1lbnQpLnRleHQ7Ci0JCQlyZXR1cm4gIiI7Ci0JCX0KLQkJSVJ1bnRpbWUgcnVudGltZSA9IChJUnVudGltZSkgZWxlbWVudDsKLQkJaWYgKGNvbHVtbkluZGV4ID09IDApCi0JCQlyZXR1cm4gcnVudGltZS5nZXROYW1lKCk7Ci0JCWVsc2UgaWYgKGNvbHVtbkluZGV4ID09IDEpIHsKLQkJCWlmIChydW50aW1lLmdldFJ1bnRpbWVUeXBlKCkgIT0gbnVsbCkKLQkJCQlyZXR1cm4gbm90TnVsbChydW50aW1lLmdldFJ1bnRpbWVUeXBlKCkuZ2V0TmFtZSgpKTsKLQkJCXJldHVybiAiIjsKLQkJfQotCQlyZXR1cm4gIlgiOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL1J1bnRpbWVUeXBlQ29tcG9zaXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL1J1bnRpbWVUeXBlQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiYWZhMTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9SdW50aW1lVHlwZUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5TZXJ2ZXJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZC5OZXdJbnN0YWxsYWJsZVNlcnZlcldpemFyZDsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBSdW50aW1lVHlwZUNvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0VHJlZUNvbXBvc2l0ZSB7Ci0JcHJvdGVjdGVkIElSdW50aW1lVHlwZSBzZWxlY3Rpb247Ci0JcHJvdGVjdGVkIFJ1bnRpbWVUeXBlU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXI7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gY3JlYXRpb247Ci0JcHJvdGVjdGVkIFN0cmluZyB0eXBlOwotCXByb3RlY3RlZCBTdHJpbmcgdmVyc2lvbjsKLQlwcm90ZWN0ZWQgU3RyaW5nIHJ1bnRpbWVUeXBlSWQ7Ci0JCi0JcHJvdGVjdGVkIFJ1bnRpbWVUeXBlVHJlZUNvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXI7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaW5pdGlhbFNlbGVjdGlvbiA9IHRydWU7Ci0JCi0JcHVibGljIGludGVyZmFjZSBSdW50aW1lVHlwZVNlbGVjdGlvbkxpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgcnVudGltZVR5cGVTZWxlY3RlZChJUnVudGltZVR5cGUgcnVudGltZVR5cGUpOwotCX0KLQkKLQlwdWJsaWMgUnVudGltZVR5cGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlLCBib29sZWFuIGNyZWF0aW9uLCBSdW50aW1lVHlwZVNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyMiwgU3RyaW5nIHR5cGUsIFN0cmluZyB2ZXJzaW9uLCBTdHJpbmcgcnVudGltZVR5cGVJZCkgewotCQlzdXBlcihwYXJlbnQsIHN0eWxlKTsKLQkJdGhpcy5saXN0ZW5lciA9IGxpc3RlbmVyMjsKLQkJdGhpcy5jcmVhdGlvbiA9IGNyZWF0aW9uOwotCQl0aGlzLnR5cGUgPSB0eXBlOwotCQl0aGlzLnZlcnNpb24gPSB2ZXJzaW9uOwotCQl0aGlzLnJ1bnRpbWVUeXBlSWQgPSBydW50aW1lVHlwZUlkOwotCQotCQljb250ZW50UHJvdmlkZXIgPSBuZXcgUnVudGltZVR5cGVUcmVlQ29udGVudFByb3ZpZGVyKFJ1bnRpbWVUeXBlVHJlZUNvbnRlbnRQcm92aWRlci5TVFlMRV9WRU5ET1IsIGNyZWF0aW9uLCB0eXBlLCB2ZXJzaW9uLCBydW50aW1lVHlwZUlkKTsKLQkJdHJlZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsKLQkJdHJlZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBSdW50aW1lVHlwZVRyZWVMYWJlbFByb3ZpZGVyKCkpOwotCQl0cmVlVmlld2VyLnNldElucHV0KEFic3RyYWN0VHJlZUNvbnRlbnRQcm92aWRlci5ST09UKTsKLQotCQl0cmVlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGdldFNlbGVjdGlvbihldmVudC5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElSdW50aW1lVHlwZSkgewotCQkJCQlzZWxlY3Rpb24gPSAoSVJ1bnRpbWVUeXBlKSBvYmo7Ci0JCQkJCXNldERlc2NyaXB0aW9uKHNlbGVjdGlvbi5nZXREZXNjcmlwdGlvbigpKTsKLQkJCQl9IGVsc2UgewotCQkJCQlzZWxlY3Rpb24gPSBudWxsOwotCQkJCQlzZXREZXNjcmlwdGlvbigiIik7Ci0JCQkJfQotCQkJCWxpc3RlbmVyLnJ1bnRpbWVUeXBlU2VsZWN0ZWQoc2VsZWN0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQl0cmVlVmlld2VyLnNldFNvcnRlcihuZXcgRGVmYXVsdFZpZXdlclNvcnRlcigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgewotCQlzdXBlci5zZXRWaXNpYmxlKHZpc2libGUpOwotCQlpZiAodmlzaWJsZSAmJiBpbml0aWFsU2VsZWN0aW9uKSB7Ci0JCQlpbml0aWFsU2VsZWN0aW9uID0gZmFsc2U7Ci0JCQlpZiAoY29udGVudFByb3ZpZGVyLmdldEluaXRpYWxTZWxlY3Rpb24oKSAhPSBudWxsKQotCQkJCXRyZWVWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGNvbnRlbnRQcm92aWRlci5nZXRJbml0aWFsU2VsZWN0aW9uKCkpLCB0cnVlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGl0bGVMYWJlbCgpIHsKLQkJcmV0dXJuIE1lc3NhZ2VzLnJ1bnRpbWVUeXBlQ29tcFRyZWU7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZXNjcmlwdGlvbkxhYmVsKCkgewotCQlyZXR1cm4gTWVzc2FnZXMucnVudGltZVR5cGVDb21wRGVzY3JpcHRpb247Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldENvbWJvT3B0aW9ucygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7IE1lc3NhZ2VzLm5hbWUsCi0JCQlNZXNzYWdlcy52ZW5kb3IsIE1lc3NhZ2VzLnZlcnNpb24sCi0JCQlNZXNzYWdlcy5tb2R1bGVTdXBwb3J0IH07Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmlld09wdGlvblNlbGVjdGVkKGJ5dGUgb3B0aW9uKSB7Ci0JCUlTZWxlY3Rpb24gc2VsID0gdHJlZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkJdHJlZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IFJ1bnRpbWVUeXBlVHJlZUNvbnRlbnRQcm92aWRlcihvcHRpb24sIGNyZWF0aW9uLCB0eXBlLCB2ZXJzaW9uLCBydW50aW1lVHlwZUlkKSk7Ci0JCXRyZWVWaWV3ZXIuc2V0U2VsZWN0aW9uKHNlbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJSVNlbGVjdGlvbiBzZWwgPSB0cmVlVmlld2VyLmdldFNlbGVjdGlvbigpOwotCQlSdW50aW1lVHlwZVRyZWVDb250ZW50UHJvdmlkZXIgY3AgPSAoUnVudGltZVR5cGVUcmVlQ29udGVudFByb3ZpZGVyKSB0cmVlVmlld2VyLmdldENvbnRlbnRQcm92aWRlcigpOwotCQl0cmVlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgUnVudGltZVR5cGVUcmVlQ29udGVudFByb3ZpZGVyKGNwLnN0eWxlLCBjcmVhdGlvbiwgdHlwZSwgdmVyc2lvbiwgcnVudGltZVR5cGVJZCkpOwotCQl0cmVlVmlld2VyLnNldFNlbGVjdGlvbihzZWwpOwotCX0KLQotCXB1YmxpYyBJUnVudGltZVR5cGUgZ2V0U2VsZWN0ZWRSdW50aW1lVHlwZSgpIHsKLQkJcmV0dXJuIHNlbGVjdGlvbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERldGFpbHNMYWJlbCgpIHsKLQkJaWYgKFNlcnZlclBsdWdpbi5nZXRJbnN0YWxsYWJsZVNlcnZlcnMoKS5sZW5ndGggPiAwKQotCQkJcmV0dXJuIE1lc3NhZ2VzLmluc3RhbGxhYmxlU2VydmVyTGluazsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGV0YWlsc1NlbGVjdGVkKCkgewotCQlOZXdJbnN0YWxsYWJsZVNlcnZlcldpemFyZCB3aXphcmQyID0gbmV3IE5ld0luc3RhbGxhYmxlU2VydmVyV2l6YXJkKCk7Ci0JCVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKGdldFNoZWxsKCksIHdpemFyZDIpOwotCQlpZiAoZGlhbG9nLm9wZW4oKSAhPSBXaW5kb3cuQ0FOQ0VMKQotCQkJcmVmcmVzaCgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL1J1bnRpbWVUeXBlVHJlZUNvbnRlbnRQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9SdW50aW1lVHlwZVRyZWVDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhmNzdjZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL1J1bnRpbWVUeXBlVHJlZUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS4qOwotLyoqCi0gKiBSdW50aW1lIHR5cGUgY29udGVudCBwcm92aWRlci4KLSAqLwotcHVibGljIGNsYXNzIFJ1bnRpbWVUeXBlVHJlZUNvbnRlbnRQcm92aWRlciBleHRlbmRzIEFic3RyYWN0VHJlZUNvbnRlbnRQcm92aWRlciB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIFNUWUxFX1ZFTkRPUiA9IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIFNUWUxFX1ZFUlNJT04gPSAyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBTVFlMRV9NT0RVTEVfVFlQRSA9IDM7Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gY3JlYXRpb247Ci0JcHJvdGVjdGVkIFN0cmluZyB0eXBlOwotCXByb3RlY3RlZCBTdHJpbmcgdmVyc2lvbjsKLQlwcm90ZWN0ZWQgU3RyaW5nIHJ1bnRpbWVUeXBlSWQ7Ci0KLQkvKioKLQkgKiBSdW50aW1lVHlwZUNvbnRlbnRQcm92aWRlciBjb25zdHJ1Y3Rvci4KLQkgKiAKLQkgKiBAcGFyYW0gc3R5bGUgYSBzdHlsZQotCSAqIEBwYXJhbSBjcmVhdGlvbiB0cnVlIHRvIGluY2x1ZGUgcnVudGltZXMgdGhhdCBjYW4gYmUgY3JlYXRlZAotCSAqLwotCXB1YmxpYyBSdW50aW1lVHlwZVRyZWVDb250ZW50UHJvdmlkZXIoYnl0ZSBzdHlsZSwgYm9vbGVhbiBjcmVhdGlvbikgewotCQlzdXBlcihzdHlsZSk7Ci0JCXRoaXMuY3JlYXRpb24gPSBjcmVhdGlvbjsKLQl9Ci0JCi0JcHVibGljIFJ1bnRpbWVUeXBlVHJlZUNvbnRlbnRQcm92aWRlcihieXRlIHN0eWxlLCBib29sZWFuIGNyZWF0aW9uLCBTdHJpbmcgdHlwZSwgU3RyaW5nIHZlcnNpb24sIFN0cmluZyBydW50aW1lVHlwZUlkKSB7Ci0JCXN1cGVyKHN0eWxlLCBmYWxzZSk7Ci0JCXRoaXMudHlwZSA9IHR5cGU7Ci0JCXRoaXMudmVyc2lvbiA9IHZlcnNpb247Ci0JCXRoaXMucnVudGltZVR5cGVJZCA9IHJ1bnRpbWVUeXBlSWQ7Ci0JCXRoaXMuY3JlYXRpb24gPSBjcmVhdGlvbjsKLQkJCi0JCWZpbGxUcmVlKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGZpbGxUcmVlKCkgewotCQljbGVhbigpOwotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmIChzdHlsZSAhPSBTVFlMRV9GTEFUKSB7Ci0JCQlJUnVudGltZVR5cGVbXSBydW50aW1lVHlwZXMgPSBTZXJ2ZXJVdGlsLmdldFJ1bnRpbWVUeXBlcyh0eXBlLCB2ZXJzaW9uLCBydW50aW1lVHlwZUlkKTsKLQkJCWlmIChydW50aW1lVHlwZXMgIT0gbnVsbCkgewotCQkJCWludCBzaXplID0gcnVudGltZVR5cGVzLmxlbmd0aDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCQlJUnVudGltZVR5cGUgcnVudGltZVR5cGUgPSBydW50aW1lVHlwZXNbaV07Ci0JCQkJCWlmICghY3JlYXRpb24gfHwgcnVudGltZVR5cGUuY2FuQ3JlYXRlKCkpIHsKLQkJCQkJCVRyZWVFbGVtZW50IGVsZSA9IG51bGw7Ci0JCQkJCQlpZiAoc3R5bGUgPT0gU1RZTEVfVkVORE9SKSB7Ci0JCQkJCQkJZWxlID0gZ2V0T3JDcmVhdGUobGlzdCwgcnVudGltZVR5cGUuZ2V0VmVuZG9yKCkpOwotCQkJCQkJCWVsZS5jb250ZW50cy5hZGQocnVudGltZVR5cGUpOwotCQkJCQkJCWVsZW1lbnRUb1BhcmVudE1hcC5wdXQocnVudGltZVR5cGUsIGVsZSk7Ci0JCQkJCQl9IGVsc2UgaWYgKHN0eWxlID09IFNUWUxFX1ZFUlNJT04pIHsKLQkJCQkJCQllbGUgPSBnZXRPckNyZWF0ZShsaXN0LCBydW50aW1lVHlwZS5nZXRWZXJzaW9uKCkpOwotCQkJCQkJCWVsZS5jb250ZW50cy5hZGQocnVudGltZVR5cGUpOwotCQkJCQkJCWVsZW1lbnRUb1BhcmVudE1hcC5wdXQocnVudGltZVR5cGUsIGVsZSk7Ci0JCQkJCQl9IGVsc2UgaWYgKHN0eWxlID09IFNUWUxFX01PRFVMRV9UWVBFKSB7Ci0JCQkJCQkJLy8gVE9ETzogZG9lcyBub3QgaGFuZGxlICJqc3QuKiIgZm9ybWF0Ci0JCQkJCQkJSU1vZHVsZVR5cGVbXSBtb2R1bGVUeXBlcyA9IHJ1bnRpbWVUeXBlLmdldE1vZHVsZVR5cGVzKCk7Ci0JCQkJCQkJaWYgKG1vZHVsZVR5cGVzICE9IG51bGwpIHsKLQkJCQkJCQkJaW50IHNpemUyID0gbW9kdWxlVHlwZXMubGVuZ3RoOwotCQkJCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHNpemUyOyBqKyspIHsKLQkJCQkJCQkJCUlNb2R1bGVUeXBlIG1iID0gbW9kdWxlVHlwZXNbal07Ci0JCQkJCQkJCQlpZiAobWIgIT0gbnVsbCkgewotCQkJCQkJCQkJCWVsZSA9IGdldE9yQ3JlYXRlKGxpc3QsIG1iLmdldE5hbWUoKSk7Ci0JCQkJCQkJCQkJVHJlZUVsZW1lbnQgZWxlMiA9IGdldE9yQ3JlYXRlKGVsZS5jb250ZW50cywgbWIuZ2V0TmFtZSgpICsgIi8iICsgbWIuZ2V0VmVyc2lvbigpLCBtYi5nZXRWZXJzaW9uKCkpOwotCQkJCQkJCQkJCWVsZTIuY29udGVudHMuYWRkKHJ1bnRpbWVUeXBlKTsKLQkJCQkJCQkJCQllbGVtZW50VG9QYXJlbnRNYXAucHV0KHJ1bnRpbWVUeXBlLCBlbGUyKTsKLQkJCQkJCQkJCQllbGVtZW50VG9QYXJlbnRNYXAucHV0KGVsZTIsIGVsZSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlJUnVudGltZVR5cGVbXSBydW50aW1lVHlwZXMgPSBTZXJ2ZXJVdGlsLmdldFJ1bnRpbWVUeXBlcyh0eXBlLCB2ZXJzaW9uLCBydW50aW1lVHlwZUlkKTsKLQkJCWlmIChydW50aW1lVHlwZXMgIT0gbnVsbCkgewotCQkJCWludCBzaXplID0gcnVudGltZVR5cGVzLmxlbmd0aDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCQlJUnVudGltZVR5cGUgcnVudGltZVR5cGUgPSBydW50aW1lVHlwZXNbaV07Ci0JCQkJCWlmICghY3JlYXRpb24gfHwgcnVudGltZVR5cGUuY2FuQ3JlYXRlKCkpCi0JCQkJCQlsaXN0LmFkZChydW50aW1lVHlwZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsZW1lbnRzID0gbGlzdC50b0FycmF5KCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvUnVudGltZVR5cGVUcmVlTGFiZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9SdW50aW1lVHlwZVRyZWVMYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNjVkYWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9SdW50aW1lVHlwZVRyZWVMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlld2VyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5JbWFnZVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLS8qKgotICogUnVudGltZSB0eXBlIGxhYmVsIHByb3ZpZGVyLgotICovCi1wdWJsaWMgY2xhc3MgUnVudGltZVR5cGVUcmVlTGFiZWxQcm92aWRlciBleHRlbmRzIEFic3RyYWN0VHJlZUxhYmVsUHJvdmlkZXIgewotCS8qKgotCSAqIFJ1bnRpbWVUeXBlVHJlZUxhYmVsUHJvdmlkZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgUnVudGltZVR5cGVUcmVlTGFiZWxQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0SW1hZ2VJbXBsKE9iamVjdCBlbGVtZW50KSB7Ci0JCUlSdW50aW1lVHlwZSBydW50aW1lVHlwZSA9IChJUnVudGltZVR5cGUpIGVsZW1lbnQ7Ci0JCXJldHVybiBJbWFnZVJlc291cmNlLmdldEltYWdlKHJ1bnRpbWVUeXBlLmdldElkKCkpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGV4dEltcGwoT2JqZWN0IGVsZW1lbnQpIHsKLQkJSVJ1bnRpbWVUeXBlIHJ1bnRpbWVUeXBlID0gKElSdW50aW1lVHlwZSkgZWxlbWVudDsKLQkJcmV0dXJuIG5vdE51bGwocnVudGltZVR5cGUuZ2V0TmFtZSgpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9TVmlldy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9TVmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjM4MDkxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvU1ZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlld2VyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQUNDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVDb250cm9sQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlQ29udHJvbEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZVRyYWNrTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5QYWludEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuUGFpbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ3Vyc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNhbnZhczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHlwZWRMaXN0ZW5lcjsKLS8qKgotICogU2ltcGxlIFNXVCB3aWRnZXQgd2l0aCBhbiBpbWFnZSBiYW5uZXIgYW5kIGEgbGFiZWwuCi0gKi8KLXB1YmxpYyBjbGFzcyBTVmlldyBleHRlbmRzIENhbnZhcyB7Ci0JcHJvdGVjdGVkIENvbG9yIGZvY3VzQ29sb3I7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gbW91c2VPdmVyID0gZmFsc2U7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzRm9jdXMgPSBmYWxzZTsKLQkvL3Byb3RlY3RlZCBib29sZWFuIGlzT3BlbiA9IHRydWU7Ci0JCi0JLy9wcm90ZWN0ZWQgU3RyaW5nIG5hbWU7Ci0JLy9wcm90ZWN0ZWQgU3RyaW5nIGRlc2NyaXB0aW9uOwotCQotCXByb3RlY3RlZCBDb2xvciBvbmU7Ci0JcHJvdGVjdGVkIENvbG9yIHR3bzsKLQlwcm90ZWN0ZWQgQ29sb3IgdGhyZWU7Ci0JCi0JcHJvdGVjdGVkIENvbG9yIGdyb25lOwotCXByb3RlY3RlZCBDb2xvciBncnR3bzsKLQlwcm90ZWN0ZWQgQ29sb3IgZ3J0aHJlZTsKLQkKLQlwcml2YXRlIEN1cnNvciBjdXJzb3I7Ci0KLQlwdWJsaWMgU1ZpZXcoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0JCXN1cGVyKHBhcmVudCwgc3R5bGUpOwotCQkKLQkJY3Vyc29yID0gbmV3IEN1cnNvcihwYXJlbnQuZ2V0RGlzcGxheSgpLCBTV1QuQ1VSU09SX0hBTkQpOwotCQlzZXRDdXJzb3IoY3Vyc29yKTsKLQkJCi0JCW9uZSA9IG5ldyBDb2xvcihnZXREaXNwbGF5KCksIDIyNCwgMjQ0LCAyNTIpOwotCQl0d28gPSBuZXcgQ29sb3IoZ2V0RGlzcGxheSgpLCAxNzgsIDIxMiwgMjQ3KTsKLQkJdGhyZWUgPSBuZXcgQ29sb3IoZ2V0RGlzcGxheSgpLCAxMzgsIDE4NSwgMjQyKTsKLQkJCi0JCWdyb25lID0gbmV3IENvbG9yKGdldERpc3BsYXkoKSwgMjI5LCAyNTUsIDE5Myk7Ci0JCWdydHdvID0gbmV3IENvbG9yKGdldERpc3BsYXkoKSwgNjMsIDIxNCwgMTYpOwotCQlncnRocmVlID0gbmV3IENvbG9yKGdldERpc3BsYXkoKSwgMjEsIDE1NywgNCk7Ci0KLQkJYWRkUGFpbnRMaXN0ZW5lcihuZXcgUGFpbnRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChQYWludEV2ZW50IGUpIHsKLQkJCQlTVmlldy50aGlzLnBhaW50Q29udHJvbChlKTsKLQkJCX0KLQkJfSk7Ci0JCWFkZE1vdXNlTGlzdGVuZXIobmV3IE1vdXNlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBlKSB7Ci0JCQkJLy9jaGFuZ2VUd2lzdGllKCFpc09wZW4pOwotCQkJfQotCQkJcHVibGljIHZvaWQgbW91c2VVcChNb3VzZUV2ZW50IGUpIHsKLQkJCQkvLyBkbyBub3RoaW5nCi0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBtb3VzZURvdWJsZUNsaWNrKE1vdXNlRXZlbnQgZSkgewotCQkJCS8vIGRvIG5vdGhpbmcKLQkJCX0KLQkJfSk7Ci0JCWFkZE1vdXNlVHJhY2tMaXN0ZW5lcihuZXcgTW91c2VUcmFja0xpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW91c2VFbnRlcihNb3VzZUV2ZW50IGUpIHsKLQkJCQltb3VzZU92ZXIgPSB0cnVlOwotCQkJCVNWaWV3LnRoaXMucmVkcmF3KCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBtb3VzZUV4aXQoTW91c2VFdmVudCBlKSB7Ci0JCQkJbW91c2VPdmVyID0gZmFsc2U7Ci0JCQkJU1ZpZXcudGhpcy5yZWRyYXcoKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIG1vdXNlSG92ZXIoTW91c2VFdmVudCBlKSB7Ci0JCQkJLy8gZG8gbm90aGluZwotCQkJfQotCQl9KTsKLQkJYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJLy9jaGFuZ2VUd2lzdGllKCFpc09wZW4pOwotCQkJCXJlZHJhdygpOwotCQkJfQotCQl9KTsKLQkJYWRkTGlzdGVuZXIoU1dULlRyYXZlcnNlLCBuZXcgTGlzdGVuZXIgKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCWlmIChlLmRldGFpbCAhPSBTV1QuVFJBVkVSU0VfUkVUVVJOKQotCQkJCQllLmRvaXQgPSB0cnVlOwotCQkJfQotCQl9KTsKLQkJYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgewotCQkJCWhhc0ZvY3VzID0gdHJ1ZTsKLQkJCQlyZWRyYXcoKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpIHsKLQkJCQloYXNGb2N1cyA9IGZhbHNlOwotCQkJCXJlZHJhdygpOwotCQkJfQotCQl9KTsKLQkJYWRkS2V5TGlzdGVuZXIobmV3IEtleUFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGUpIHsKLQkJCQlpZiAoZS5jaGFyYWN0ZXIgPT0gJ1xyJykgewotCQkJCQkvLyBBY3RpdmF0aW9uCi0JCQkJCW5vdGlmeUxpc3RlbmVycyhTV1QuU2VsZWN0aW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQlhZGREaXNwb3NlTGlzdGVuZXIobmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBlKSB7Ci0JCQkJZGlzcG9zZUltcGwoKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlnZXRBY2Nlc3NpYmxlKCkuYWRkQWNjZXNzaWJsZUxpc3RlbmVyKG5ldyBBY2Nlc3NpYmxlQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGdldE5hbWUoQWNjZXNzaWJsZUV2ZW50IGUpIHsKLQkJCQkvL2UucmVzdWx0ID0gbmFtZTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgZ2V0RGVzY3JpcHRpb24oQWNjZXNzaWJsZUV2ZW50IGUpIHsKLQkJCQkvL2UucmVzdWx0ID0gZGVzY3JpcHRpb247Ci0JCQl9Ci0JCX0pOwotCi0JCWdldEFjY2Vzc2libGUoKS5hZGRBY2Nlc3NpYmxlQ29udHJvbExpc3RlbmVyKG5ldyBBY2Nlc3NpYmxlQ29udHJvbEFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBnZXRMb2NhdGlvbihBY2Nlc3NpYmxlQ29udHJvbEV2ZW50IGUpIHsKLQkJCQlSZWN0YW5nbGUgbG9jYXRpb24gPSBnZXRCb3VuZHMoKTsKLQkJCQlQb2ludCBwdCA9IHRvRGlzcGxheShuZXcgUG9pbnQobG9jYXRpb24ueCwgbG9jYXRpb24ueSkpOwotCQkJCWUueCA9IHB0Lng7Ci0JCQkJZS55ID0gcHQueTsKLQkJCQllLndpZHRoID0gbG9jYXRpb24ud2lkdGg7Ci0JCQkJZS5oZWlnaHQgPSBsb2NhdGlvbi5oZWlnaHQ7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGdldENoaWxkQ291bnQoQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBlKSB7Ci0JCQkJZS5kZXRhaWwgPSAwOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBnZXRSb2xlKEFjY2Vzc2libGVDb250cm9sRXZlbnQgZSkgewotCQkJCWUuZGV0YWlsID0gQUNDLlJPTEVfVFJFRTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgZ2V0U3RhdGUoQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBlKSB7Ci0JCQkJLy9lLmRldGFpbCA9IGlzT3BlbiA/IEFDQy5TVEFURV9FWFBBTkRFRCA6IEFDQy5TVEFURV9DT0xMQVBTRUQ7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBkaXNwb3NlSW1wbCgpIHsKLQkJaWYgKGN1cnNvciAhPSBudWxsKSB7Ci0JCQljdXJzb3IuZGlzcG9zZSgpOwotCQkJY3Vyc29yID0gbnVsbDsKLQkJCW9uZS5kaXNwb3NlKCk7Ci0JCQl0d28uZGlzcG9zZSgpOwotCQkJdGhyZWUuZGlzcG9zZSgpOwotCQkJCi0JCQlncm9uZS5kaXNwb3NlKCk7Ci0JCQlncnR3by5kaXNwb3NlKCk7Ci0JCQlncnRocmVlLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFNlbGVjdGlvbkxpc3RlbmVyKFNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWNoZWNrV2lkZ2V0ICgpOwotCQlpZiAobGlzdGVuZXIgPT0gbnVsbCkgcmV0dXJuOwotCQlUeXBlZExpc3RlbmVyIHR5cGVkTGlzdGVuZXIgPSBuZXcgVHlwZWRMaXN0ZW5lciAobGlzdGVuZXIpOwotCQlhZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbix0eXBlZExpc3RlbmVyKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIoU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJY2hlY2tXaWRnZXQgKCk7Ci0JCWlmIChsaXN0ZW5lciA9PSBudWxsKSByZXR1cm47Ci0JCXJlbW92ZUxpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBsaXN0ZW5lcik7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIG5vdGlmeUxpc3RlbmVycyhpbnQgZXZlbnRUeXBlKSB7Ci0JCUV2ZW50IGV2ZW50ID0gbmV3IEV2ZW50KCk7Ci0JCWV2ZW50LnR5cGUgPSBldmVudFR5cGU7Ci0JCWV2ZW50LndpZGdldCA9IHRoaXM7Ci0JCW5vdGlmeUxpc3RlbmVycyhldmVudFR5cGUsIGV2ZW50KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcGFpbnRSZWN0KEdDIGdjLCBpbnQgeCwgaW50IHksIENvbG9yIGEsIENvbG9yIGIsIENvbG9yIGMpIHsKLQkJaW50W10gcCA9IG5ldyBpbnRbXSB7IDAsIDIsIDIsIDAsIDMwLCAwLCAzMiwgMiwgMzIsIDMwLCAzMCwgMzIsIDIsIDMyLCAwLCAzMH07Ci0JCQotCQlpbnRbXSBxID0gbmV3IGludFtwLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcC5sZW5ndGggLyAyOyBpKyspIHsKLQkJCXFbaSoyXSA9IHBbaSoyXSArIHg7Ci0JCQlxW2kqMisxXSA9IHBbaSoyKzFdICsgeTsKLQkJfQotCQkKLQkJUmVnaW9uIHJlZ2lvbiA9IG5ldyBSZWdpb24oZ2V0RGlzcGxheSgpKTsKLQkJcmVnaW9uLmFkZChxKTsKLQkJCi0JCWdjLnNldENsaXBwaW5nKHJlZ2lvbik7Ci0JCQotCQlnYy5zZXRCYWNrZ3JvdW5kKGEpOwotCQlnYy5zZXRGb3JlZ3JvdW5kKGIpOwotCQlnYy5maWxsR3JhZGllbnRSZWN0YW5nbGUoeCwgeSwgMzIsIDMyLCB0cnVlKTsKLQkJZ2Muc2V0Q2xpcHBpbmcoKFJlZ2lvbiludWxsKTsKLQkJZ2Muc2V0Rm9yZWdyb3VuZChjKTsKLQkJZ2MuZHJhd1BvbHlnb24ocSk7Ci0JCQotCQlnYy5zZXRGb3JlZ3JvdW5kKGdldEZvcmVncm91bmQoKSk7Ci0JCWdjLnNldEJhY2tncm91bmQoZ2V0QmFja2dyb3VuZCgpKTsKLQkJU3RyaW5nIHN0ID0gIlRvbWNhdCBUZXN0IEVudmlyb25tZW50IjsKLQkJUG9pbnQgc3RwID0gZ2Muc3RyaW5nRXh0ZW50KHN0KTsKLQkJZ2MuZHJhd1N0cmluZyhzdCwgeCsxNiAtIHN0cC54IC8gMiwgeSArIDMyICsgMik7Ci0JfQotCi0Jdm9pZCBwYWludENvbnRyb2woUGFpbnRFdmVudCBlKSB7Ci0JCUdDIGdjID0gZS5nYzsKLQkJCi0JCVBvaW50IHMgPSBnZXRTaXplKCk7Ci0KLQkJZ2Muc2V0QmFja2dyb3VuZChnZXRCYWNrZ3JvdW5kKCkpOwotCQlnYy5maWxsUmVjdGFuZ2xlKDAsIDAsIHMueCwgcy55KTsKLQotCQkvKmlmIChtb3VzZU92ZXIpCi0JCQlnYy5zZXRCYWNrZ3JvdW5kKGdldEZvY3VzQ29sb3IoKSk7Ci0JCWVsc2UKLQkJCWdjLnNldEJhY2tncm91bmQoZ2V0Rm9yZWdyb3VuZCgpKTsqLwotCQkKLQkJLy8gb25lCi0JCXBhaW50UmVjdChnYywgNjAsIDAsIG9uZSwgdHdvLCB0aHJlZSk7Ci0JCQotCQlwYWludFJlY3QoZ2MsIDE0MCwgMCwgZ3JvbmUsIGdydHdvLCBncnRocmVlKTsKLQkJCi0JCS8qaWYgKGhhc0ZvY3VzKSB7Ci0JCQlnYy5zZXRCYWNrZ3JvdW5kKGdldEJhY2tncm91bmQoKSk7Ci0JICAgCQlnYy5zZXRGb3JlZ3JvdW5kKGdldEZvY3VzQ29sb3IoKSk7Ci0JICAgCQlnYy5kcmF3Rm9jdXMoMCwgMCwgMTAsIDExKTsKLQkJfSovCi0JfQotCi0JLypwdWJsaWMgQ29sb3IgZ2V0Rm9jdXNDb2xvcigpIHsKLQkJcmV0dXJuIGZvY3VzQ29sb3I7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Rm9jdXNDb2xvcihDb2xvciBjb2xvcikgewotCQlmb2N1c0NvbG9yID0gY29sb3I7Ci0JfSovCi0KLQlwdWJsaWMgUG9pbnQgY29tcHV0ZVNpemUoaW50IHdIaW50LCBpbnQgaEhpbnQsIGJvb2xlYW4gY2hhbmdlZCkgewotCQlyZXR1cm4gbmV3IFBvaW50KDIwMCwgNjApOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL1NlcnZlckNvbXBvc2l0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9TZXJ2ZXJDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZkYjViZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL1NlcnZlckNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdFRyZWVDb21wb3NpdGUgewotCXByb3RlY3RlZCBJU2VydmVyIHNlbGVjdGlvbjsKLQlwcm90ZWN0ZWQgU2VydmVyU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXI7Ci0JcHJvdGVjdGVkIFNlcnZlclRyZWVDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyOwotCXByb3RlY3RlZCBib29sZWFuIGluaXRpYWxTZWxlY3Rpb24gPSB0cnVlOwotCXByb3RlY3RlZCBieXRlIHZpZXdPcHRpb247Ci0JCi0JcHJvdGVjdGVkIElNb2R1bGUgbW9kdWxlOwotCXByb3RlY3RlZCBTdHJpbmcgbGF1bmNoTW9kZTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpbmNsdWRlSW5jb21wYXRpYmxlVmVyc2lvbnM7Ci0JCi0JcHVibGljIGludGVyZmFjZSBTZXJ2ZXJTZWxlY3Rpb25MaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIHNlcnZlclNlbGVjdGVkKElTZXJ2ZXIgc2VydmVyKTsKLQl9Ci0JCi0JcHVibGljIFNlcnZlckNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUsIFNlcnZlclNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyMiwgSU1vZHVsZSBtb2R1bGUsIFN0cmluZyBsYXVuY2hNb2RlKSB7Ci0JCXN1cGVyKHBhcmVudCwgc3R5bGUpOwotCQl0aGlzLm1vZHVsZSA9IG1vZHVsZTsKLQkJdGhpcy5sYXVuY2hNb2RlID0gbGF1bmNoTW9kZTsKLQkJCi0JCXRoaXMubGlzdGVuZXIgPSBsaXN0ZW5lcjI7Ci0JCQotCQljb250ZW50UHJvdmlkZXIgPSBuZXcgU2VydmVyVHJlZUNvbnRlbnRQcm92aWRlcihTZXJ2ZXJUcmVlQ29udGVudFByb3ZpZGVyLlNUWUxFX0hPU1QsIG1vZHVsZSwgbGF1bmNoTW9kZSk7Ci0JCXZpZXdPcHRpb24gPSBTZXJ2ZXJUcmVlQ29udGVudFByb3ZpZGVyLlNUWUxFX0hPU1Q7Ci0JCXRyZWVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7Ci0JCXRyZWVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgU2VydmVyVHJlZUxhYmVsUHJvdmlkZXIoKSk7Ci0JCXRyZWVWaWV3ZXIuc2V0SW5wdXQoQWJzdHJhY3RUcmVlQ29udGVudFByb3ZpZGVyLlJPT1QpOwotCQl0cmVlVmlld2VyLmV4cGFuZFRvTGV2ZWwoMSk7Ci0KLQkJdHJlZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCU9iamVjdCBvYmogPSBnZXRTZWxlY3Rpb24oZXZlbnQuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBJU2VydmVyKSB7Ci0JCQkJCXNlbGVjdGlvbiA9IChJU2VydmVyKSBvYmo7Ci0JCQkJCXNldERlc2NyaXB0aW9uKHNlbGVjdGlvbi5nZXRTZXJ2ZXJUeXBlKCkuZ2V0UnVudGltZVR5cGUoKS5nZXREZXNjcmlwdGlvbigpKTsKLQkJCQl9IGVsc2UgewotCQkJCQlzZWxlY3Rpb24gPSBudWxsOwotCQkJCQlzZXREZXNjcmlwdGlvbigiIik7Ci0JCQkJfQotCQkJCWxpc3RlbmVyLnNlcnZlclNlbGVjdGVkKHNlbGVjdGlvbik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyBTZXJ2ZXJDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlLCBTZXJ2ZXJTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcjIpIHsKLQkJdGhpcyhwYXJlbnQsIHN0eWxlLCBsaXN0ZW5lcjIsIG51bGwsIG51bGwpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRJbmNsdWRlSW5jb21wYXRpYmxlVmVyc2lvbnMoYm9vbGVhbiBiKSB7Ci0JCWluY2x1ZGVJbmNvbXBhdGlibGVWZXJzaW9ucyA9IGI7Ci0JCUlTZWxlY3Rpb24gc2VsID0gdHJlZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkJY29udGVudFByb3ZpZGVyLnNldEluY2x1ZGVJbmNvbXBhdGlibGVWZXJzaW9ucyhiKTsKLQkJdHJlZVZpZXdlci5yZWZyZXNoKCk7Ci0JCXRyZWVWaWV3ZXIuc2V0U2VsZWN0aW9uKHNlbCwgdHJ1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKLQkJc3VwZXIuc2V0VmlzaWJsZSh2aXNpYmxlKTsKLQkJaWYgKHZpc2libGUgJiYgaW5pdGlhbFNlbGVjdGlvbikgewotCQkJaW5pdGlhbFNlbGVjdGlvbiA9IGZhbHNlOwotCQkJaWYgKGNvbnRlbnRQcm92aWRlci5nZXRJbml0aWFsU2VsZWN0aW9uKCkgIT0gbnVsbCkKLQkJCQl0cmVlVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihjb250ZW50UHJvdmlkZXIuZ2V0SW5pdGlhbFNlbGVjdGlvbigpKSwgdHJ1ZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWZyZXNoQWxsKCkgewotCQlJU2VsZWN0aW9uIHNlbCA9IHRyZWVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCWNvbnRlbnRQcm92aWRlciA9IG5ldyBTZXJ2ZXJUcmVlQ29udGVudFByb3ZpZGVyKHZpZXdPcHRpb24sIG1vZHVsZSwgbGF1bmNoTW9kZSk7Ci0JCWNvbnRlbnRQcm92aWRlci5zZXRJbmNsdWRlSW5jb21wYXRpYmxlVmVyc2lvbnMoaW5jbHVkZUluY29tcGF0aWJsZVZlcnNpb25zKTsKLQkJdHJlZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsKLQkJdHJlZVZpZXdlci5zZXRTZWxlY3Rpb24oc2VsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlc2NyaXB0aW9uTGFiZWwoKSB7Ci0JCXJldHVybiBudWxsOyAvL01lc3NhZ2VzLnNlcnZlclR5cGVDb21wRGVzY3JpcHRpb24iKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUaXRsZUxhYmVsKCkgewotCQlyZXR1cm4gTWVzc2FnZXMud2l6TmV3U2VydmVyU2VsZWN0RXhpc3Rpbmc7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldENvbWJvT3B0aW9ucygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7IE1lc3NhZ2VzLm5hbWUsIE1lc3NhZ2VzLmhvc3QsIAotCQkJTWVzc2FnZXMudmVuZG9yLCBNZXNzYWdlcy52ZXJzaW9uIH07Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmlld09wdGlvblNlbGVjdGVkKGJ5dGUgb3B0aW9uKSB7Ci0JCUlTZWxlY3Rpb24gc2VsID0gdHJlZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkJdmlld09wdGlvbiA9IG9wdGlvbjsKLQkJY29udGVudFByb3ZpZGVyID0gbmV3IFNlcnZlclRyZWVDb250ZW50UHJvdmlkZXIob3B0aW9uLCBtb2R1bGUsIGxhdW5jaE1vZGUpOwotCQljb250ZW50UHJvdmlkZXIuc2V0SW5jbHVkZUluY29tcGF0aWJsZVZlcnNpb25zKGluY2x1ZGVJbmNvbXBhdGlibGVWZXJzaW9ucyk7Ci0JCXRyZWVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7Ci0JCXRyZWVWaWV3ZXIuc2V0U2VsZWN0aW9uKHNlbCk7Ci0JfQotCQotCXB1YmxpYyBJU2VydmVyIGdldFNlbGVjdGVkU2VydmVyKCkgewotCQlyZXR1cm4gc2VsZWN0aW9uOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oSVNlcnZlciBzZXJ2ZXIpIHsKLQkJdHJlZVZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oc2VydmVyKSwgdHJ1ZSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvU2VydmVyVHJlZUNvbnRlbnRQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9TZXJ2ZXJUcmVlQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxM2EzOGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9TZXJ2ZXJUcmVlQ29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXdlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5TZXJ2ZXJVSVBsdWdpbjsKLS8qKgotICogUnVudGltZSB0eXBlIGNvbnRlbnQgcHJvdmlkZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJUcmVlQ29udGVudFByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RUcmVlQ29udGVudFByb3ZpZGVyIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgU1RZTEVfSE9TVCA9IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIFNUWUxFX1ZFTkRPUiA9IDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIFNUWUxFX1ZFUlNJT04gPSAzOwotCQotCXByb3RlY3RlZCBJTW9kdWxlIG1vZHVsZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIGxhdW5jaE1vZGU7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaW5jbHVkZUluY29tcGF0aWJsZVZlcnNpb25zOwotCi0JLyoqCi0JICogU2VydmVyVHJlZUNvbnRlbnRQcm92aWRlciBjb25zdHJ1Y3Rvci4KLQkgKiAKLQkgKiBAcGFyYW0gc3R5bGUgYSBzdHlsZQotCSAqLwotCXB1YmxpYyBTZXJ2ZXJUcmVlQ29udGVudFByb3ZpZGVyKGJ5dGUgc3R5bGUpIHsKLQkJc3VwZXIoc3R5bGUpOwotCX0KLQkKLQlwdWJsaWMgU2VydmVyVHJlZUNvbnRlbnRQcm92aWRlcihieXRlIHN0eWxlLCBJTW9kdWxlIG1vZHVsZSwgU3RyaW5nIGxhdW5jaE1vZGUpIHsKLQkJc3VwZXIoc3R5bGUsIGZhbHNlKTsKLQkJdGhpcy5tb2R1bGUgPSBtb2R1bGU7Ci0JCXRoaXMubGF1bmNoTW9kZSA9IGxhdW5jaE1vZGU7Ci0JCQotCQlmaWxsVHJlZSgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRJbmNsdWRlSW5jb21wYXRpYmxlVmVyc2lvbnMoYm9vbGVhbiBiKSB7Ci0JCWluY2x1ZGVJbmNvbXBhdGlibGVWZXJzaW9ucyA9IGI7Ci0JCWZpbGxUcmVlKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGZpbGxUcmVlKCkgewotCQljbGVhbigpOwotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmIChzdHlsZSAhPSBTVFlMRV9GTEFUKSB7Ci0JCQlJU2VydmVyW10gc2VydmVycyA9IFNlcnZlckNvcmUuZ2V0U2VydmVycygpOwotCQkJaWYgKHNlcnZlcnMgIT0gbnVsbCkgewotCQkJCWludCBzaXplID0gc2VydmVycy5sZW5ndGg7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQkJaWYgKGFjY2VwdFNlcnZlcihzZXJ2ZXJzW2ldKSkgewotCQkJCQkJSVNlcnZlclR5cGUgc2VydmVyVHlwZSA9IHNlcnZlcnNbaV0uZ2V0U2VydmVyVHlwZSgpOwotCQkJCQkJSVJ1bnRpbWVUeXBlIHJ1bnRpbWVUeXBlID0gc2VydmVyVHlwZS5nZXRSdW50aW1lVHlwZSgpOwotCQkJCQkJVHJlZUVsZW1lbnQgdGUgPSBudWxsOwotCQkJCQkJaWYgKHN0eWxlID09IFNUWUxFX0hPU1QpIHsKLQkJCQkJCQl0ZSA9IGdldE9yQ3JlYXRlKGxpc3QsIHNlcnZlcnNbaV0uZ2V0SG9zdCgpKTsKLQkJCQkJCX0gZWxzZSBpZiAoc3R5bGUgPT0gU1RZTEVfVkVSU0lPTikgewotCQkJCQkJCVN0cmluZyB2ZXJzaW9uID0gTWVzc2FnZXMuZWxlbWVudFVua25vd25OYW1lOwotCQkJCQkJCWlmIChydW50aW1lVHlwZSAhPSBudWxsKQotCQkJCQkJCQl2ZXJzaW9uID0gcnVudGltZVR5cGUuZ2V0VmVyc2lvbigpOwotCQkJCQkJCXRlID0gZ2V0T3JDcmVhdGUobGlzdCwgdmVyc2lvbik7Ci0JCQkJCQl9IGVsc2UgaWYgKHN0eWxlID09IFNUWUxFX1ZFTkRPUikgewotCQkJCQkJCVN0cmluZyB2ZW5kb3IgPSBNZXNzYWdlcy5lbGVtZW50VW5rbm93bk5hbWU7Ci0JCQkJCQkJaWYgKHJ1bnRpbWVUeXBlICE9IG51bGwpCi0JCQkJCQkJCXZlbmRvciA9IHJ1bnRpbWVUeXBlLmdldFZlbmRvcigpOwotCQkJCQkJCXRlID0gZ2V0T3JDcmVhdGUobGlzdCwgdmVuZG9yKTsKLQkJCQkJCX0KLQkJCQkJCXRlLmNvbnRlbnRzLmFkZChzZXJ2ZXJzW2ldKTsKLQkJCQkJCWVsZW1lbnRUb1BhcmVudE1hcC5wdXQoc2VydmVyc1tpXSwgdGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJSVNlcnZlcltdIHNlcnZlcnMgPSBTZXJ2ZXJDb3JlLmdldFNlcnZlcnMoKTsKLQkJCWlmIChzZXJ2ZXJzICE9IG51bGwpIHsKLQkJCQlpbnQgc2l6ZSA9IHNlcnZlcnMubGVuZ3RoOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJCWlmIChhY2NlcHRTZXJ2ZXIoc2VydmVyc1tpXSkpCi0JCQkJCQlsaXN0LmFkZChzZXJ2ZXJzW2ldKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxlbWVudHMgPSBsaXN0LnRvQXJyYXkoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHRTZXJ2ZXIoSVNlcnZlciBzZXJ2ZXIpIHsKLQkJaWYgKG1vZHVsZSA9PSBudWxsIHx8IGxhdW5jaE1vZGUgPT0gbnVsbCkKLQkJCXJldHVybiB0cnVlOwotCQlpZiAoIVNlcnZlclVJUGx1Z2luLmlzQ29tcGF0aWJsZVdpdGhMYXVuY2hNb2RlKHNlcnZlciwgbGF1bmNoTW9kZSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQlJTW9kdWxlVHlwZSBtdCA9IG1vZHVsZS5nZXRNb2R1bGVUeXBlKCk7Ci0JCWlmIChpbmNsdWRlSW5jb21wYXRpYmxlVmVyc2lvbnMpIHsKLQkJCWlmICghU2VydmVyVXRpbC5pc1N1cHBvcnRlZE1vZHVsZShzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpLmdldFJ1bnRpbWVUeXBlKCkuZ2V0TW9kdWxlVHlwZXMoKSwgbXQuZ2V0SWQoKSwgbnVsbCkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9IGVsc2UgewotCQkJaWYgKCFTZXJ2ZXJVdGlsLmlzU3VwcG9ydGVkTW9kdWxlKHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkuZ2V0UnVudGltZVR5cGUoKS5nZXRNb2R1bGVUeXBlcygpLCBtdC5nZXRJZCgpLCBtdC5nZXRWZXJzaW9uKCkpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9TZXJ2ZXJUcmVlTGFiZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9TZXJ2ZXJUcmVlTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTY5NDRjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvU2VydmVyVHJlZUxhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5JbWFnZVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLS8qKgotICogU2VydmVyIHRyZWUgbGFiZWwgcHJvdmlkZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJUcmVlTGFiZWxQcm92aWRlciBleHRlbmRzIEFic3RyYWN0VHJlZUxhYmVsUHJvdmlkZXIgewotCS8qKgotCSAqIFNlcnZlclRyZWVMYWJlbFByb3ZpZGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFNlcnZlclRyZWVMYWJlbFByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQWJzdHJhY3RUcmVlTGFiZWxQcm92aWRlciNnZXRJbWFnZUltcGwoT2JqZWN0KQotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZUltcGwoT2JqZWN0IGVsZW1lbnQpIHsKLQkJSVNlcnZlciBzZXJ2ZXIgPSAoSVNlcnZlcikgZWxlbWVudDsKLQkJcmV0dXJuIEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2Uoc2VydmVyLmdldFNlcnZlclR5cGUoKS5nZXRJZCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEFic3RyYWN0VHJlZUxhYmVsUHJvdmlkZXIjZ2V0VGV4dEltcGwoT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dEltcGwoT2JqZWN0IGVsZW1lbnQpIHsKLQkJSVNlcnZlciBzZXJ2ZXIgPSAoSVNlcnZlcikgZWxlbWVudDsKLQkJcmV0dXJuIHNlcnZlci5nZXROYW1lKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvU2VydmVyVHlwZUNvbXBvc2l0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9TZXJ2ZXJUeXBlQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiMDU3MzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9TZXJ2ZXJUeXBlQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXdlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuU2VydmVyUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQuTmV3SW5zdGFsbGFibGVTZXJ2ZXJXaXphcmQ7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgU2VydmVyVHlwZUNvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0VHJlZUNvbXBvc2l0ZSB7Ci0JcHJvdGVjdGVkIElTZXJ2ZXJUeXBlIHNlbGVjdGlvbjsKLQlwcm90ZWN0ZWQgU2VydmVyVHlwZVNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyOwotCXByb3RlY3RlZCBTZXJ2ZXJUeXBlVHJlZUNvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXI7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaW5pdGlhbFNlbGVjdGlvbiA9IHRydWU7Ci0JCi0JcHJvdGVjdGVkIElNb2R1bGVUeXBlIG1vZHVsZVR5cGU7Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNMb2NhbGhvc3Q7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaW5jbHVkZUluY29tcGF0aWJsZVZlcnNpb25zOwotCQotCXB1YmxpYyBpbnRlcmZhY2UgU2VydmVyVHlwZVNlbGVjdGlvbkxpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgc2VydmVyVHlwZVNlbGVjdGVkKElTZXJ2ZXJUeXBlIHR5cGUpOwotCX0KLQkKLQlwdWJsaWMgU2VydmVyVHlwZUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUsIElNb2R1bGVUeXBlIG1vZHVsZVR5cGUsIFNlcnZlclR5cGVTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcjIpIHsKLQkJc3VwZXIocGFyZW50LCBzdHlsZSk7Ci0JCXRoaXMubGlzdGVuZXIgPSBsaXN0ZW5lcjI7Ci0JCQotCQl0aGlzLm1vZHVsZVR5cGUgPSBtb2R1bGVUeXBlOwotCQotCQljb250ZW50UHJvdmlkZXIgPSBuZXcgU2VydmVyVHlwZVRyZWVDb250ZW50UHJvdmlkZXIoU2VydmVyVHlwZVRyZWVDb250ZW50UHJvdmlkZXIuU1RZTEVfVkVORE9SLCBtb2R1bGVUeXBlKTsKLQkJdHJlZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsKLQkJdHJlZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBTZXJ2ZXJUeXBlVHJlZUxhYmVsUHJvdmlkZXIoKSk7Ci0JCXRyZWVWaWV3ZXIuc2V0SW5wdXQoQWJzdHJhY3RUcmVlQ29udGVudFByb3ZpZGVyLlJPT1QpOwotCi0JCXRyZWVWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlPYmplY3Qgb2JqID0gZ2V0U2VsZWN0aW9uKGV2ZW50LmdldFNlbGVjdGlvbigpKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgSVNlcnZlclR5cGUpIHsKLQkJCQkJc2VsZWN0aW9uID0gKElTZXJ2ZXJUeXBlKSBvYmo7Ci0JCQkJCXNldERlc2NyaXB0aW9uKHNlbGVjdGlvbi5nZXREZXNjcmlwdGlvbigpKTsKLQkJCQl9IGVsc2UgewotCQkJCQlzZWxlY3Rpb24gPSBudWxsOwotCQkJCQlzZXREZXNjcmlwdGlvbigiIik7Ci0JCQkJfQotCQkJCWxpc3RlbmVyLnNlcnZlclR5cGVTZWxlY3RlZChzZWxlY3Rpb24pOwotCQkJfQotCQl9KTsKLQkJCi0JCXRyZWVWaWV3ZXIuc2V0U29ydGVyKG5ldyBEZWZhdWx0Vmlld2VyU29ydGVyKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7Ci0JCXN1cGVyLnNldFZpc2libGUodmlzaWJsZSk7Ci0JCWlmICh2aXNpYmxlICYmIGluaXRpYWxTZWxlY3Rpb24pIHsKLQkJCWluaXRpYWxTZWxlY3Rpb24gPSBmYWxzZTsKLQkJCWlmIChjb250ZW50UHJvdmlkZXIuZ2V0SW5pdGlhbFNlbGVjdGlvbigpICE9IG51bGwpCi0JCQkJdHJlZVZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oY29udGVudFByb3ZpZGVyLmdldEluaXRpYWxTZWxlY3Rpb24oKSksIHRydWUpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SG9zdChib29sZWFuIG5ld0hvc3QpIHsKLQkJaWYgKGlzTG9jYWxob3N0ID09IG5ld0hvc3QpCi0JCQlyZXR1cm47Ci0JCQotCQlpc0xvY2FsaG9zdCA9IG5ld0hvc3Q7Ci0JCUlTZWxlY3Rpb24gc2VsID0gdHJlZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkJY29udGVudFByb3ZpZGVyLnNldExvY2FsaG9zdChpc0xvY2FsaG9zdCk7Ci0JCXRyZWVWaWV3ZXIucmVmcmVzaCgpOwotCQkvL3RyZWVWaWV3ZXIuZXhwYW5kVG9MZXZlbCgyKTsKLQkJdHJlZVZpZXdlci5zZXRTZWxlY3Rpb24oc2VsLCB0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJbmNsdWRlSW5jb21wYXRpYmxlVmVyc2lvbnMoYm9vbGVhbiBiKSB7Ci0JCWluY2x1ZGVJbmNvbXBhdGlibGVWZXJzaW9ucyA9IGI7Ci0JCUlTZWxlY3Rpb24gc2VsID0gdHJlZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkJY29udGVudFByb3ZpZGVyLnNldEluY2x1ZGVJbmNvbXBhdGlibGVWZXJzaW9ucyhiKTsKLQkJdHJlZVZpZXdlci5yZWZyZXNoKCk7Ci0JCXRyZWVWaWV3ZXIuc2V0U2VsZWN0aW9uKHNlbCwgdHJ1ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZXNjcmlwdGlvbkxhYmVsKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRpdGxlTGFiZWwoKSB7Ci0JCXJldHVybiBNZXNzYWdlcy5zZXJ2ZXJUeXBlQ29tcExhYmVsOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRDb21ib09wdGlvbnMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10geyBNZXNzYWdlcy5uYW1lLAotCQkJTWVzc2FnZXMudmVuZG9yLCBNZXNzYWdlcy52ZXJzaW9uLAotCQkJTWVzc2FnZXMubW9kdWxlU3VwcG9ydCB9OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZpZXdPcHRpb25TZWxlY3RlZChieXRlIG9wdGlvbikgewotCQlJU2VsZWN0aW9uIHNlbCA9IHRyZWVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCWNvbnRlbnRQcm92aWRlciA9IG5ldyBTZXJ2ZXJUeXBlVHJlZUNvbnRlbnRQcm92aWRlcihvcHRpb24sIG1vZHVsZVR5cGUpOwotCQljb250ZW50UHJvdmlkZXIuc2V0TG9jYWxob3N0KGlzTG9jYWxob3N0KTsKLQkJY29udGVudFByb3ZpZGVyLnNldEluY2x1ZGVJbmNvbXBhdGlibGVWZXJzaW9ucyhpbmNsdWRlSW5jb21wYXRpYmxlVmVyc2lvbnMpOwotCQl0cmVlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXIpOwotCQl0cmVlVmlld2VyLnNldFNlbGVjdGlvbihzZWwpOwotCX0KLQotCXB1YmxpYyBJU2VydmVyVHlwZSBnZXRTZWxlY3RlZFNlcnZlclR5cGUoKSB7Ci0JCXJldHVybiBzZWxlY3Rpb247Ci0JfQotCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJSVNlbGVjdGlvbiBzZWwgPSB0cmVlVmlld2VyLmdldFNlbGVjdGlvbigpOwotCQlTZXJ2ZXJUeXBlVHJlZUNvbnRlbnRQcm92aWRlciBjcCA9IChTZXJ2ZXJUeXBlVHJlZUNvbnRlbnRQcm92aWRlcikgdHJlZVZpZXdlci5nZXRDb250ZW50UHJvdmlkZXIoKTsKLQkJdHJlZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IFNlcnZlclR5cGVUcmVlQ29udGVudFByb3ZpZGVyKGNwLnN0eWxlLCBtb2R1bGVUeXBlKSk7Ci0JCXRyZWVWaWV3ZXIuc2V0U2VsZWN0aW9uKHNlbCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZXRhaWxzTGFiZWwoKSB7Ci0JCWlmIChTZXJ2ZXJQbHVnaW4uZ2V0SW5zdGFsbGFibGVTZXJ2ZXJzKCkubGVuZ3RoID4gMCkKLQkJCXJldHVybiBNZXNzYWdlcy5pbnN0YWxsYWJsZVNlcnZlckxpbms7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRldGFpbHNTZWxlY3RlZCgpIHsKLQkJTmV3SW5zdGFsbGFibGVTZXJ2ZXJXaXphcmQgd2l6YXJkMiA9IG5ldyBOZXdJbnN0YWxsYWJsZVNlcnZlcldpemFyZCgpOwotCQlXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhnZXRTaGVsbCgpLCB3aXphcmQyKTsKLQkJaWYgKGRpYWxvZy5vcGVuKCkgIT0gV2luZG93LkNBTkNFTCkKLQkJCXJlZnJlc2goKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9TZXJ2ZXJUeXBlVHJlZUNvbnRlbnRQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9TZXJ2ZXJUeXBlVHJlZUNvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzkxZTQxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3ZpZXdlcnMvU2VydmVyVHlwZVRyZWVDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlld2VyczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlNlcnZlclVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuVHJhY2U7Ci0vKioKLSAqIFNlcnZlciB0eXBlIGNvbnRlbnQgcHJvdmlkZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJUeXBlVHJlZUNvbnRlbnRQcm92aWRlciBleHRlbmRzIEFic3RyYWN0VHJlZUNvbnRlbnRQcm92aWRlciB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIFNUWUxFX1ZFTkRPUiA9IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIFNUWUxFX1ZFUlNJT04gPSAyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBTVFlMRV9NT0RVTEVfVFlQRSA9IDM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIFNUWUxFX1RZUEUgPSA0OyAvLyBub3QgdXNlZCB5ZXQKLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBsb2NhbGhvc3Q7Ci0JCi0JcHJvdGVjdGVkIElNb2R1bGVUeXBlIG1vZHVsZVR5cGU7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaW5jbHVkZUluY29tcGF0aWJsZVZlcnNpb25zOwotCi0JLyoqCi0JICogU2VydmVyVHlwZVRyZWVDb250ZW50UHJvdmlkZXIgY29uc3RydWN0b3IuCi0JICogCi0JICogQHBhcmFtIHN0eWxlIGEgc3R5bGUKLQkgKiBAcGFyYW0gbW9kdWxlVHlwZSBhIG1vZHVsZSB0eXBlCi0JICovCi0JcHVibGljIFNlcnZlclR5cGVUcmVlQ29udGVudFByb3ZpZGVyKGJ5dGUgc3R5bGUsIElNb2R1bGVUeXBlIG1vZHVsZVR5cGUpIHsKLQkJc3VwZXIoc3R5bGUsIGZhbHNlKTsKLQkJbG9jYWxob3N0ID0gdHJ1ZTsKLQkJCi0JCXRoaXMubW9kdWxlVHlwZSA9IG1vZHVsZVR5cGU7Ci0JCQotCQlmaWxsVHJlZSgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBmaWxsVHJlZSgpIHsKLQkJY2xlYW4oKTsKLQotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlTZXJ2ZXJUeXBlW10gc2VydmVyVHlwZXMgPSBTZXJ2ZXJDb3JlLmdldFNlcnZlclR5cGVzKCk7Ci0JCWlmIChzZXJ2ZXJUeXBlcyAhPSBudWxsKSB7Ci0JCQlpbnQgc2l6ZSA9IHNlcnZlclR5cGVzLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJSVNlcnZlclR5cGUgc2VydmVyVHlwZSA9IHNlcnZlclR5cGVzW2ldOwotCQkJCWlmIChpbmNsdWRlKHNlcnZlclR5cGUpKSB7Ci0JCQkJCWlmIChzdHlsZSA9PSBTVFlMRV9GTEFUKSB7Ci0JCQkJCQlsaXN0LmFkZChzZXJ2ZXJUeXBlKTsKLQkJCQkJfSBlbHNlIGlmIChzdHlsZSAhPSBTVFlMRV9NT0RVTEVfVFlQRSkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlJUnVudGltZVR5cGUgcnVudGltZVR5cGUgPSBzZXJ2ZXJUeXBlLmdldFJ1bnRpbWVUeXBlKCk7Ci0JCQkJCQkJVHJlZUVsZW1lbnQgZWxlID0gbnVsbDsKLQkJCQkJCQlpZiAoc3R5bGUgPT0gU1RZTEVfVkVORE9SKQotCQkJCQkJCQllbGUgPSBnZXRPckNyZWF0ZShsaXN0LCBydW50aW1lVHlwZS5nZXRWZW5kb3IoKSk7Ci0JCQkJCQkJZWxzZSBpZiAoc3R5bGUgPT0gU1RZTEVfVkVSU0lPTikKLQkJCQkJCQkJZWxlID0gZ2V0T3JDcmVhdGUobGlzdCwgcnVudGltZVR5cGUuZ2V0VmVyc2lvbigpKTsKLQkJCQkJCQllbHNlIGlmIChzdHlsZSA9PSBTVFlMRV9UWVBFKQotCQkJCQkJCQllbGUgPSBnZXRPckNyZWF0ZShsaXN0LCBydW50aW1lVHlwZS5nZXROYW1lKCkpOwotCQkJCQkJCWVsZS5jb250ZW50cy5hZGQoc2VydmVyVHlwZSk7Ci0JCQkJCQkJZWxlbWVudFRvUGFyZW50TWFwLnB1dChzZXJ2ZXJUeXBlLCBlbGUpOwotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiRXJyb3IgaW4gc2VydmVyIGNvbmZpZ3VyYXRpb24gY29udGVudCBwcm92aWRlciIsIGUpOwotCQkJCQkJfQotCQkJCQl9IGVsc2UgeyAvLyBzdHlsZSA9IE1PRFVMRV9UWVBFCi0JCQkJCQlJUnVudGltZVR5cGUgcnVudGltZVR5cGUgPSBzZXJ2ZXJUeXBlLmdldFJ1bnRpbWVUeXBlKCk7Ci0JCQkJCQlJTW9kdWxlVHlwZVtdIG1vZHVsZVR5cGVzID0gcnVudGltZVR5cGUuZ2V0TW9kdWxlVHlwZXMoKTsKLQkJCQkJCWlmIChtb2R1bGVUeXBlcyAhPSBudWxsKSB7Ci0JCQkJCQkJaW50IHNpemUyID0gbW9kdWxlVHlwZXMubGVuZ3RoOwotCQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgc2l6ZTI7IGorKykgewotCQkJCQkJCQlJTW9kdWxlVHlwZSBtYiA9IG1vZHVsZVR5cGVzW2pdOwotCQkJCQkJCQlpZiAobWIgIT0gbnVsbCkgewotCQkJCQkJCQkJVHJlZUVsZW1lbnQgZWxlID0gZ2V0T3JDcmVhdGUobGlzdCwgbWIuZ2V0TmFtZSgpKTsKLQkJCQkJCQkJCVRyZWVFbGVtZW50IGVsZTIgPSBnZXRPckNyZWF0ZShlbGUuY29udGVudHMsIG1iLmdldE5hbWUoKSArICIvIiArIG1iLmdldFZlcnNpb24oKSwgbWIuZ2V0VmVyc2lvbigpKTsKLQkJCQkJCQkJCWVsZTIuY29udGVudHMuYWRkKHNlcnZlclR5cGUpOwotCQkJCQkJCQkJZWxlbWVudFRvUGFyZW50TWFwLnB1dChzZXJ2ZXJUeXBlLCBlbGUyKTsKLQkJCQkJCQkJCWVsZW1lbnRUb1BhcmVudE1hcC5wdXQoZWxlMiwgZWxlKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQllbGVtZW50cyA9IGxpc3QudG9BcnJheSgpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGluY2x1ZGUoSVNlcnZlclR5cGUgc2VydmVyVHlwZSkgewotCQlJUnVudGltZVR5cGUgcnVudGltZVR5cGUgPSBzZXJ2ZXJUeXBlLmdldFJ1bnRpbWVUeXBlKCk7Ci0JCWlmIChydW50aW1lVHlwZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJU3RyaW5nIG1vZHVsZVR5cGVJZCA9IG51bGw7Ci0JCWlmIChtb2R1bGVUeXBlICE9IG51bGwpCi0JCQltb2R1bGVUeXBlSWQgPSBtb2R1bGVUeXBlLmdldElkKCk7Ci0JCWlmIChpbmNsdWRlSW5jb21wYXRpYmxlVmVyc2lvbnMpIHsKLQkJCWlmICghU2VydmVyVXRpbC5pc1N1cHBvcnRlZE1vZHVsZShydW50aW1lVHlwZS5nZXRNb2R1bGVUeXBlcygpLCBtb2R1bGVUeXBlSWQsIG51bGwpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfSBlbHNlIHsKLQkJCVN0cmluZyBtb2R1bGVWZXJzaW9uID0gbnVsbDsKLQkJCWlmIChtb2R1bGVUeXBlICE9IG51bGwpCi0JCQkJbW9kdWxlVmVyc2lvbiA9IG1vZHVsZVR5cGUuZ2V0VmVyc2lvbigpOwotCQkJaWYgKCFTZXJ2ZXJVdGlsLmlzU3VwcG9ydGVkTW9kdWxlKHJ1bnRpbWVUeXBlLmdldE1vZHVsZVR5cGVzKCksIG1vZHVsZVR5cGVJZCwgbW9kdWxlVmVyc2lvbikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlpZiAobG9jYWxob3N0IHx8IHNlcnZlclR5cGUuc3VwcG9ydHNSZW1vdGVIb3N0cygpKQotCQkJcmV0dXJuIHRydWU7Ci0JCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2hlY2tGb3JOb25TdHViRW52aXJvbm1lbnRSdW50aW1lKElTZXJ2ZXJUeXBlIHNlcnZlclR5cGUpIHsKLQkJSVJ1bnRpbWVUeXBlIHJ1bnRpbWVUeXBlID0gc2VydmVyVHlwZS5nZXRSdW50aW1lVHlwZSgpOwotCQlJUnVudGltZVtdIHJ1bnRpbWVzID0gU2VydmVyVUlQbHVnaW4uZ2V0UnVudGltZXMocnVudGltZVR5cGUpOwotCQlpZiAocnVudGltZXMgPT0gbnVsbCB8fCBydW50aW1lcy5sZW5ndGggPT0gMCkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCWludCBzaXplID0gcnVudGltZXMubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJaWYgKCFydW50aW1lc1tpXS5pc1N0dWIoKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TG9jYWxob3N0KGJvb2xlYW4gbG9jYWwpIHsKLQkJbG9jYWxob3N0ID0gbG9jYWw7Ci0JCWZpbGxUcmVlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SW5jbHVkZUluY29tcGF0aWJsZVZlcnNpb25zKGJvb2xlYW4gYikgewotCQlpbmNsdWRlSW5jb21wYXRpYmxlVmVyc2lvbnMgPSBiOwotCQlmaWxsVHJlZSgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL1NlcnZlclR5cGVUcmVlTGFiZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvdmlld2Vycy9TZXJ2ZXJUeXBlVHJlZUxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVkZTc1Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC92aWV3ZXJzL1NlcnZlclR5cGVUcmVlTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXdlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlclR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5JbWFnZVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLS8qKgotICogU2VydmVyIHR5cGUgbGFiZWwgcHJvdmlkZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJUeXBlVHJlZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdFRyZWVMYWJlbFByb3ZpZGVyIHsKLQkvKioKLQkgKiBTZXJ2ZXJUeXBlVHJlZUxhYmVsUHJvdmlkZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgU2VydmVyVHlwZVRyZWVMYWJlbFByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRJbWFnZUltcGwoT2JqZWN0IGVsZW1lbnQpIHsKLQkJSVNlcnZlclR5cGUgdHlwZSA9IChJU2VydmVyVHlwZSkgZWxlbWVudDsKLQkJcmV0dXJuIEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2UodHlwZS5nZXRJZCgpKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRleHRJbXBsKE9iamVjdCBlbGVtZW50KSB7Ci0JCUlTZXJ2ZXJUeXBlIHR5cGUgPSAoSVNlcnZlclR5cGUpIGVsZW1lbnQ7Ci0JCXJldHVybiBub3ROdWxsKHR5cGUuZ2V0TmFtZSgpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2ViYnJvd3Nlci9JbnRlcm5ldFByZWZlcmVuY2VQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93ZWJicm93c2VyL0ludGVybmV0UHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDJmMDhkMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93ZWJicm93c2VyL0ludGVybmV0UHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53ZWJicm93c2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLk1lc3NhZ2VzOwotLyoqCi0gKiBBIHByZWZlcmVuY2UgcGFnZSB0aGF0IGhvbGRzIGludGVybmV0IHByZWZlcmVuY2VzLgotICovCi1wdWJsaWMgY2xhc3MgSW50ZXJuZXRQcmVmZXJlbmNlUGFnZSBleHRlbmRzIFByZWZlcmVuY2VQYWdlIGltcGxlbWVudHMgSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlIHsKLQkvKioKLQkgKiBJbnRlcm5ldFByZWZlcmVuY2VQYWdlIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEludGVybmV0UHJlZmVyZW5jZVBhZ2UoKSB7Ci0JCXN1cGVyKCk7Ci0JCW5vRGVmYXVsdEFuZEFwcGx5QnV0dG9uKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBwcmVmZXJlbmNlIG9wdGlvbnMuCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZQotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbAotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJaW5pdGlhbGl6ZURpYWxvZ1VuaXRzKHBhcmVudCk7Ci0JCQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKDQpOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKDQpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJLy9QbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNvbXBvc2l0ZSwgQ29udGV4dElkcy5QUkVGX0JST1dTRVIpOwotCQkKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuV1JBUCk7Ci0JCWxhYmVsLnNldFRleHQoTWVzc2FnZXMucHJlZmVyZW5jZUludGVybmV0RGVzY3JpcHRpb24pOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HKTsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCi0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQoY29tcG9zaXRlKTsKLQkJCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhpcyBwcmVmZXJlbmNlIHBhZ2UgdXNpbmcgdGhlIHBhc3NlZCB3b3JrYmVuY2guCi0JICoKLQkgKiBAcGFyYW0gd29ya2JlbmNoIHRoZSBjdXJyZW50IHdvcmtiZW5jaAotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93ZWJicm93c2VyL09wZW5Ccm93c2VyV29ya2JlbmNoQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93ZWJicm93c2VyL09wZW5Ccm93c2VyV29ya2JlbmNoQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlOWU5MjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2ViYnJvd3Nlci9PcGVuQnJvd3NlcldvcmtiZW5jaEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi2gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53ZWJicm93c2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYnJvd3Nlci5JV2ViQnJvd3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5icm93c2VyLklXb3JrYmVuY2hCcm93c2VyU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlNlcnZlclVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuVHJhY2U7Ci0vKioKLSAqIEFjdGlvbiB0byBvcGVuIHRoZSBXZWIgYnJvc3dlci4KLSAqLwotcHVibGljIGNsYXNzIE9wZW5Ccm93c2VyV29ya2JlbmNoQWN0aW9uIGltcGxlbWVudHMgSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlIHsKLQkvKioKLQkgKiBPcGVuQnJvd3NlcldvcmtiZW5jaEFjdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBPcGVuQnJvd3NlcldvcmtiZW5jaEFjdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwb3NlcyB0aGlzIGFjdGlvbiBkZWxlZ2F0ZS4gIFRoZSBpbXBsZW1lbnRvciBzaG91bGQgdW5ob29rIGFueSByZWZlcmVuY2VzCi0JICogdG8gaXRzZWxmIHNvIHRoYXQgZ2FyYmFnZSBjb2xsZWN0aW9uIGNhbiBvY2N1ci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhpcyBhY3Rpb24gZGVsZWdhdGUgd2l0aCB0aGUgd29ya2JlbmNoIHdpbmRvdyBpdCB3aWxsIHdvcmsgaW4uCi0JICoKLQkgKiBAcGFyYW0gd2luZG93IHRoZSB3aW5kb3cgdGhhdCBwcm92aWRlcyB0aGUgY29udGV4dCBmb3IgdGhpcyBkZWxlZ2F0ZQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHRoaXMgYWN0aW9uLgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBkZWxlZ2F0aW5nIGFjdGlvbiBoYXMgYmVlbiB0cmlnZ2VyZWQuCi0JICogSW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIGRvIHRoZSBhY3R1YWwgd29yay4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcGFyYW0gYWN0aW9uIHRoZSBhY3Rpb24gcHJveHkgdGhhdCBoYW5kbGVzIHRoZSBwcmVzZW50YXRpb24gcG9ydGlvbiBvZiB0aGUKLQkgKiAgIGFjdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQl0cnkgewotCQkJSVdvcmtiZW5jaEJyb3dzZXJTdXBwb3J0IGJyb3dzZXJTdXBwb3J0ID0gU2VydmVyVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRXb3JrYmVuY2goKS5nZXRCcm93c2VyU3VwcG9ydCgpOwotCQkJSVdlYkJyb3dzZXIgYnJvd3NlciA9IGJyb3dzZXJTdXBwb3J0LmNyZWF0ZUJyb3dzZXIoSVdvcmtiZW5jaEJyb3dzZXJTdXBwb3J0LkxPQ0FUSU9OX0JBUiB8IElXb3JrYmVuY2hCcm93c2VyU3VwcG9ydC5OQVZJR0FUSU9OX0JBUiwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0JCQlicm93c2VyLm9wZW5VUkwobnVsbCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBvcGVuaW5nIGJyb3dzZXIiLCBlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE5vdGlmaWVzIHRoaXMgYWN0aW9uIGRlbGVnYXRlIHRoYXQgdGhlIHNlbGVjdGlvbiBpbiB0aGUgd29ya2JlbmNoIGhhcyBjaGFuZ2VkLgotCSAqIDxwPgotCSAqIEltcGxlbWVudGVycyBjYW4gdXNlIHRoaXMgb3Bwb3J0dW5pdHkgdG8gY2hhbmdlIHRoZSBhdmFpbGFiaWxpdHkgb2YgdGhlCi0JICogYWN0aW9uIG9yIHRvIG1vZGlmeSBvdGhlciBwcmVzZW50YXRpb24gcHJvcGVydGllcy4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcGFyYW0gYWN0aW9uIHRoZSBhY3Rpb24gcHJveHkgdGhhdCBoYW5kbGVzIHByZXNlbnRhdGlvbiBwb3J0aW9uIG9mIHRoZSBhY3Rpb24KLQkgKiBAcGFyYW0gc2VsZWN0aW9uIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBpbiB0aGUgd29ya2JlbmNoCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93ZWJicm93c2VyL1N3aXRjaEJyb3dzZXJXb3JrYmVuY2hBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dlYmJyb3dzZXIvU3dpdGNoQnJvd3NlcldvcmtiZW5jaEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGYwZjYyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dlYmJyb3dzZXIvU3dpdGNoQnJvd3NlcldvcmtiZW5jaEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53ZWJicm93c2VyOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTWVudUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5NZW51RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuYnJvd3Nlci5Ccm93c2VyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5icm93c2VyLklCcm93c2VyRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5icm93c2VyLldlYkJyb3dzZXJQcmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmJyb3dzZXIuV2ViQnJvd3NlclV0aWw7Ci0vKioKLSAqIEFjdGlvbiB0byBvcGVuIHRoZSBXZWIgYnJvc3dlci4KLSAqLwotcHVibGljIGNsYXNzIFN3aXRjaEJyb3dzZXJXb3JrYmVuY2hBY3Rpb24gaW1wbGVtZW50cyBJV29ya2JlbmNoV2luZG93UHVsbGRvd25EZWxlZ2F0ZTIgewotCS8qKgotCSAqIFRoZSBtZW51IGNyZWF0ZWQgYnkgdGhpcyBhY3Rpb24KLQkgKi8KLQlwcml2YXRlIE1lbnUgZk1lbnU7Ci0JCQotCXByb3RlY3RlZCBib29sZWFuIHJlY3JlYXRlTWVudSA9IGZhbHNlOwotCi0JLyoqCi0JICogU3dpdGNoQnJvd3NlcldvcmtiZW5jaEFjdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBTd2l0Y2hCcm93c2VyV29ya2JlbmNoQWN0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXNldE1lbnUobnVsbCk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhpcyBhY3Rpb24ncyBkcm9wLWRvd24gbWVudSwgZGlzcG9zaW5nIHRoZSBwcmV2aW91cyBtZW51LgotCSAqIAotCSAqIEBwYXJhbSBtZW51IHRoZSBuZXcgbWVudQotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRNZW51KE1lbnUgbWVudSkgewotCQlpZiAoZk1lbnUgIT0gbnVsbCkgewotCQkJZk1lbnUuZGlzcG9zZSgpOwotCQl9Ci0JCWZNZW51ID0gbWVudTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0JCi0JLyoqCi0JICogQWRkcyB0aGUgZ2l2ZW4gYWN0aW9uIHRvIHRoZSBzcGVjaWZpZWQgbWVudSB3aXRoIGFuIGFjY2VsZXJhdG9yIHNwZWNpZmllZAotCSAqIGJ5IHRoZSBnaXZlbiBudW1iZXIuCi0JICogCi0JICogQHBhcmFtIG1lbnUgdGhlIG1lbnUgdG8gYWRkIHRoZSBhY3Rpb24gdG8KLQkgKiBAcGFyYW0gYWN0aW9uIHRoZSBhY3Rpb24gdG8gYWRkCi0JICogQHBhcmFtIGFjY2VsZXJhdG9yIHRoZSBudW1iZXIgdGhhdCBzaG91bGQgYXBwZWFyIGFzIGFuIGFjY2VsZXJhdG9yCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVG9NZW51KE1lbnUgbWVudSwgSUFjdGlvbiBhY3Rpb24sIGludCBhY2NlbGVyYXRvcikgewotCQlTdHJpbmdCdWZmZXIgbGFiZWw9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaWYgKGFjY2VsZXJhdG9yID49IDAgJiYgYWNjZWxlcmF0b3IgPCAxMCkgewotCQkJLy9hZGQgdGhlIG51bWVyaWNhbCBhY2NlbGVyYXRvcgotCQkJbGFiZWwuYXBwZW5kKCcmJyk7Ci0JCQlsYWJlbC5hcHBlbmQoYWNjZWxlcmF0b3IpOwotCQkJbGFiZWwuYXBwZW5kKCcgJyk7Ci0JCX0KLQkJbGFiZWwuYXBwZW5kKGFjdGlvbi5nZXRUZXh0KCkpOwotCQlhY3Rpb24uc2V0VGV4dChsYWJlbC50b1N0cmluZygpKTsKLQkJQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBpdGVtPSBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCQlpdGVtLmZpbGwobWVudSwgLTEpOwotCX0KLQotCS8qKgotCSAqIEZpbGxzIHRoZSBkcm9wLWRvd24gbWVudSB3aXRoIGZhdm9yaXRlcyBhbmQgbGF1bmNoIGhpc3RvcnksCi0JICogbGF1bmNoIHNob3J0Y3V0cywgYW5kIGFuIGFjdGlvbiB0byBvcGVuIHRoZSBsYXVuY2ggY29uZmlndXJhdGlvbiBkaWFsb2cuCi0JICoKLQkgKiBAcGFyYW0gbWVudSB0aGUgbWVudSB0byBmaWxsCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlsbE1lbnUoTWVudSBtZW51KSB7Ci0JCWludCBpID0gMDsKLQkJaWYgKFdlYkJyb3dzZXJVdGlsLmNhblVzZUludGVybmFsV2ViQnJvd3NlcigpKSB7Ci0JCQlhZGRUb01lbnUobWVudSwgbmV3IFN3aXRjaERlZmF1bHRCcm93c2VyQWN0aW9uKG51bGwsIFdlYkJyb3dzZXJQcmVmZXJlbmNlLmdldEJyb3dzZXJDaG9pY2UoKSA9PSBXZWJCcm93c2VyUHJlZmVyZW5jZS5JTlRFUk5BTCwgbnVsbCksIGkrKyk7Ci0JCX0KLQkJSUJyb3dzZXJEZXNjcmlwdG9yIGN1cnJlbnQgPSBCcm93c2VyTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRXZWJCcm93c2VyKCk7Ci0JCUJyb3dzZXJNYW5hZ2VyIGJyb3dzZXJNYW5hZ2VyID0gQnJvd3Nlck1hbmFnZXIuZ2V0SW5zdGFuY2UoKTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBicm93c2VyTWFuYWdlci5nZXRXZWJCcm93c2VycygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCUlCcm93c2VyRGVzY3JpcHRvciBicm93c2VyID0gKElCcm93c2VyRGVzY3JpcHRvcikgaXRlcmF0b3IubmV4dCgpOwotCQkJYWRkVG9NZW51KG1lbnUsIG5ldyBTd2l0Y2hEZWZhdWx0QnJvd3NlckFjdGlvbihicm93c2VyLCBXZWJCcm93c2VyUHJlZmVyZW5jZS5nZXRCcm93c2VyQ2hvaWNlKCkgIT0gV2ViQnJvd3NlclByZWZlcmVuY2UuSU5URVJOQUwgJiYgYnJvd3Nlci5lcXVhbHMoY3VycmVudCksIGJyb3dzZXJNYW5hZ2VyKSwgaSsrKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIG1lbnUgZm9yIHRoZSBhY3Rpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdE1lbnUoKSB7Ci0JCS8vIEFkZCBsaXN0ZW5lciB0byByZXBvcHVsYXRlIHRoZSBtZW51IGVhY2ggdGltZQotCQkvLyBpdCBpcyBzaG93biBiZWNhdXNlIG9mIGR5bmFtaWMgaGlzdG9yeSBsaXN0Ci0JCWZNZW51LmFkZE1lbnVMaXN0ZW5lcihuZXcgTWVudUFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtZW51U2hvd24oTWVudUV2ZW50IGUpIHsKLQkJCQkvL2lmIChyZWNyZWF0ZU1lbnUpIHsKLQkJCQkJTWVudSBtID0gKE1lbnUpIGUud2lkZ2V0OwotCQkJCQlNZW51SXRlbVtdIGl0ZW1zID0gbS5nZXRJdGVtcygpOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlpdGVtc1tpXS5kaXNwb3NlKCk7Ci0JCQkJCX0KLQkJCQkJZmlsbE1lbnUobSk7Ci0JCQkJCXJlY3JlYXRlTWVudSA9IGZhbHNlOwotCQkJCS8vfQotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCQotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIE1lbnUgZ2V0TWVudShNZW51IHBhcmVudCkgewotCQlzZXRNZW51KG5ldyBNZW51KHBhcmVudCkpOwotCQkvL2ZpbGxNZW51KGZNZW51KTsKLQkJaW5pdE1lbnUoKTsKLQkJcmV0dXJuIGZNZW51OwotCX0KLQotCXB1YmxpYyBNZW51IGdldE1lbnUoQ29udHJvbCBwYXJlbnQpIHsKLQkJc2V0TWVudShuZXcgTWVudShwYXJlbnQpKTsKLQkJLy9maWxsTWVudShmTWVudSk7Ci0JCWluaXRNZW51KCk7Ci0JCXJldHVybiBmTWVudTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2ViYnJvd3Nlci9Td2l0Y2hEZWZhdWx0QnJvd3NlckFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2ViYnJvd3Nlci9Td2l0Y2hEZWZhdWx0QnJvd3NlckFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWY4YTE2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dlYmJyb3dzZXIvU3dpdGNoRGVmYXVsdEJyb3dzZXJBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53ZWJicm93c2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5icm93c2VyLkJyb3dzZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmJyb3dzZXIuSUJyb3dzZXJEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmJyb3dzZXIuV2ViQnJvd3NlclByZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKLS8qKgotICogQWN0aW9uIHRvIG9wZW4gdGhlIFdlYiBicm93c2VyLgotICovCi1wdWJsaWMgY2xhc3MgU3dpdGNoRGVmYXVsdEJyb3dzZXJBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotCXByb3RlY3RlZCBJQnJvd3NlckRlc2NyaXB0b3Igd2ViYnJvd3NlcjsKLQlwcm90ZWN0ZWQgQnJvd3Nlck1hbmFnZXIgYnJvd3Nlck1hbmFnZXI7Ci0KLQkvKioKLQkgKiBTd2l0Y2hEZWZhdWx0QnJvd3NlckFjdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSB3ZWJicm93c2VyIGEgYnJvd3NlcgotCSAqIEBwYXJhbSBjdXJyZW50IHRydWUgaWYgdGhpcyBpcyB0aGUgY3VycmVudCBicm93c2VyCi0JICogQHBhcmFtIG1hbmFnZXIgdGhlIGJyb3dzZXIgbWFuYWdlcgotCSAqLwotCXB1YmxpYyBTd2l0Y2hEZWZhdWx0QnJvd3NlckFjdGlvbihJQnJvd3NlckRlc2NyaXB0b3Igd2ViYnJvd3NlciwgYm9vbGVhbiBjdXJyZW50LCBCcm93c2VyTWFuYWdlciBtYW5hZ2VyKSB7Ci0JCXN1cGVyKCk7Ci0JCQotCQl0aGlzLndlYmJyb3dzZXIgPSB3ZWJicm93c2VyOwotCQl0aGlzLmJyb3dzZXJNYW5hZ2VyID0gbWFuYWdlcjsKLQkJaWYgKHdlYmJyb3dzZXIgPT0gbnVsbCkKLQkJCXNldFRleHQoTWVzc2FnZXMuaW50ZXJuYWxXZWJCcm93c2VyTmFtZSk7Ci0JCWVsc2UKLQkJCXNldFRleHQod2ViYnJvd3Nlci5nZXROYW1lKCkpOwotCQkKLQkJaWYgKGN1cnJlbnQpCi0JCQlzZXRDaGVja2VkKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEltcGxlbWVudGF0aW9uIG9mIG1ldGhvZCBkZWZpbmVkIG9uIDxjb2RlPklBY3Rpb248L2NvZGU+LgotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJaWYgKHdlYmJyb3dzZXIgPT0gbnVsbCkKLQkJCVdlYkJyb3dzZXJQcmVmZXJlbmNlLnNldEJyb3dzZXJDaG9pY2UoV2ViQnJvd3NlclByZWZlcmVuY2UuSU5URVJOQUwpOwotCQllbHNlIHsKLQkJCVdlYkJyb3dzZXJQcmVmZXJlbmNlLnNldEJyb3dzZXJDaG9pY2UoV2ViQnJvd3NlclByZWZlcmVuY2UuRVhURVJOQUwpOwotCQkJYnJvd3Nlck1hbmFnZXIuc2V0Q3VycmVudFdlYkJyb3dzZXIod2ViYnJvd3Nlcik7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL0Fic3RyYWN0V2l6YXJkLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvQWJzdHJhY3RXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjVmODIyZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvQWJzdHJhY3RXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLS8qKgotICogQW4gYWJzdHJhY3QgV2l6YXJkIHRoYXQgY29udGFpbnMgaGVscGVyIG1ldGhvZHMuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFdpemFyZCBleHRlbmRzIFdpemFyZCB7Ci0JcHJvdGVjdGVkIElXb3JrYmVuY2ggd29ya2JlbmNoOwotCXByb3RlY3RlZCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb247Ci0KLQkvKioKLQkgKiBBYnN0cmFjdFdpemFyZCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBBYnN0cmFjdFdpemFyZCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGN1cnJlbnQgd29ya2JlbmNoLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHdvcmtiZW5jaAotCSAqLwotCXB1YmxpYyBJV29ya2JlbmNoIGdldFdvcmtiZW5jaCgpIHsKLQkJcmV0dXJuIHdvcmtiZW5jaDsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplIHRoZSB3b3JrYmVuY2ggYW5kIGN1cnJlbnQgc2VsZWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBuZXdXb3JrYmVuY2gKLQkgKiBAcGFyYW0gbmV3U2VsZWN0aW9uCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIG5ld1dvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gbmV3U2VsZWN0aW9uKSB7Ci0JCXdvcmtiZW5jaCA9IG5ld1dvcmtiZW5jaDsKLQkJc2VsZWN0aW9uID0gbmV3U2VsZWN0aW9uOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvQ2xvc2FibGVXaXphcmREaWFsb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9DbG9zYWJsZVdpemFyZERpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTc1NzUwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9DbG9zYWJsZVdpemFyZERpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0vKioKLSAqIEEgY2xvc2FibGUgd2l6YXJkIGRpYWxvZy4KLSAqLwotcHVibGljIGNsYXNzIENsb3NhYmxlV2l6YXJkRGlhbG9nIGV4dGVuZHMgV2l6YXJkRGlhbG9nIHsKLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQ2xvc2FibGVXaXphcmREaWFsb2cuCi0JICogQHBhcmFtIHNoZWxsCi0JICogQHBhcmFtIHdpemFyZAotCSAqLwotCXB1YmxpYyBDbG9zYWJsZVdpemFyZERpYWxvZyhTaGVsbCBzaGVsbCwgSVdpemFyZCB3aXphcmQpIHsKLQkJc3VwZXIoc2hlbGwsIHdpemFyZCk7Ci0JfQotCQotCS8qKgotCSAqIFRoZSBGaW5pc2ggYnV0dG9uIGhhcyBiZWVuIHByZXNzZWQuCi0JICovCi0JcHVibGljIHZvaWQgZmluaXNoUHJlc3NlZCgpIHsKLQkJc3VwZXIuZmluaXNoUHJlc3NlZCgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvTW9kaWZ5TW9kdWxlc1dpemFyZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL01vZGlmeU1vZHVsZXNXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhiOTMwZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvTW9kaWZ5TW9kdWxlc1dpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlB1Ymxpc2hTZXJ2ZXJKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZC5mcmFnbWVudC5Nb2RpZnlNb2R1bGVzV2l6YXJkRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuV2l6YXJkRnJhZ21lbnQ7Ci0vKioKLSAqIEEgd2l6YXJkIHVzZWQgdG8gYWRkIGFuZCByZW1vdmUgbW9kdWxlcy4KLSAqLwotcHVibGljIGNsYXNzIE1vZGlmeU1vZHVsZXNXaXphcmQgZXh0ZW5kcyBUYXNrV2l6YXJkIHsKLQlzdGF0aWMgY2xhc3MgTW9kaWZ5TW9kdWxlc1dpemFyZDIgZXh0ZW5kcyBXaXphcmRGcmFnbWVudCB7Ci0JCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNoaWxkRnJhZ21lbnRzKExpc3QgbGlzdCkgewotCQkJbGlzdC5hZGQobmV3IE1vZGlmeU1vZHVsZXNXaXphcmRGcmFnbWVudCgpKTsKLQkJCWxpc3QuYWRkKG5ldyBXaXphcmRGcmFnbWVudCgpIHsKLQkJCQlwdWJsaWMgdm9pZCBwZXJmb3JtRmluaXNoKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCQlXaXphcmRUYXNrVXRpbC5zYXZlU2VydmVyKGdldFRhc2tNb2RlbCgpLCBtb25pdG9yKTsKLQkJCQkJCi0JCQkJCUlTZXJ2ZXJBdHRyaWJ1dGVzIHN2ciA9IChJU2VydmVyQXR0cmlidXRlcykgZ2V0VGFza01vZGVsKCkuZ2V0T2JqZWN0KFRhc2tNb2RlbC5UQVNLX1NFUlZFUik7Ci0JCQkJCWlmIChzdnIgaW5zdGFuY2VvZiBJU2VydmVyKSB7Ci0JCQkJCQlJU2VydmVyIHNlcnZlciA9IChJU2VydmVyKSBzdnI7Ci0JCQkJCQlpZiAoc2VydmVyLmdldFNlcnZlclN0YXRlKCkgIT0gSVNlcnZlci5TVEFURV9TVE9QUEVEKSB7Ci0JCQkJCQkJUHVibGlzaFNlcnZlckpvYiBwdWJsaXNoSm9iID0gbmV3IFB1Ymxpc2hTZXJ2ZXJKb2Ioc2VydmVyKTsKLQkJCQkJCQlwdWJsaXNoSm9iLnNjaGVkdWxlKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE1vZGlmeU1vZHVsZXNXaXphcmQgY29uc3RydWN0b3IuCi0JICogCi0JICogQHBhcmFtIHNlcnZlciBhIHNlcnZlcgotCSAqLwotCXB1YmxpYyBNb2RpZnlNb2R1bGVzV2l6YXJkKElTZXJ2ZXIgc2VydmVyKSB7Ci0JCXN1cGVyKE1lc3NhZ2VzLndpek1vZHVsZVdpemFyZFRpdGxlLCBuZXcgTW9kaWZ5TW9kdWxlc1dpemFyZDIoKSk7Ci0JCQotCQlpZiAoc2VydmVyICE9IG51bGwpCi0JCQlnZXRUYXNrTW9kZWwoKS5wdXRPYmplY3QoVGFza01vZGVsLlRBU0tfU0VSVkVSLCBzZXJ2ZXIuY3JlYXRlV29ya2luZ0NvcHkoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9OZXdJbnN0YWxsYWJsZVNlcnZlcldpemFyZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL05ld0luc3RhbGxhYmxlU2VydmVyV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyMTBjZjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL05ld0luc3RhbGxhYmxlU2VydmVyV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLklJbnN0YWxsYWJsZVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLmZyYWdtZW50Lk5ld0luc3RhbGxhYmxlU2VydmVyV2l6YXJkRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuV2l6YXJkRnJhZ21lbnQ7Ci0vKioKLSAqIEEgd2l6YXJkIHRvIGNyZWF0ZSBhIG5ldyBpbnN0YWxsYWJsZSBzZXJ2ZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdJbnN0YWxsYWJsZVNlcnZlcldpemFyZCBleHRlbmRzIFRhc2tXaXphcmQgewotCS8qKgotCSAqIE5ld0luc3RhbGxhYmxlU2VydmVyV2l6YXJkIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIE5ld0luc3RhbGxhYmxlU2VydmVyV2l6YXJkKCkgewotCQlzdXBlcihNZXNzYWdlcy53aXpOZXdTZXJ2ZXJXaXphcmRUaXRsZSwgbmV3IFdpemFyZEZyYWdtZW50KCkgewotCQkJcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ2hpbGRGcmFnbWVudHMoTGlzdCBsaXN0KSB7Ci0JCQkJbGlzdC5hZGQobmV3IE5ld0luc3RhbGxhYmxlU2VydmVyV2l6YXJkRnJhZ21lbnQoKSk7Ci0JCQkJbGlzdC5hZGQobmV3IFdpemFyZEZyYWdtZW50KCkgewotCQkJCQlwdWJsaWMgdm9pZCBwZXJmb3JtRmluaXNoKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCQkJSUluc3RhbGxhYmxlU2VydmVyIGlzID0gKElJbnN0YWxsYWJsZVNlcnZlcikgZ2V0VGFza01vZGVsKCkuZ2V0T2JqZWN0KCJpbnN0YWxsYWJsZVNlcnZlciIpOwotCQkJCQkJaWYgKGlzICE9IG51bGwpIHsKLQkJCQkJCQlpcy5pbnN0YWxsKG1vbml0b3IpOwotCQkJCQkJCXByb21wdFJlc3RhcnQoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBQcm9tcHQgdGhlIHVzZXIgdG8gcmVzdGFydC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcHJvbXB0UmVzdGFydCgpIHsKLQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXREZWZhdWx0KCk7Ci0JCWRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlib29sZWFuIHJlc3RhcnQgPSBNZXNzYWdlRGlhbG9nLm9wZW5RdWVzdGlvbihkaXNwbGF5LmdldEFjdGl2ZVNoZWxsKCksCi0JCQkJCU1lc3NhZ2VzLmRlZmF1bHREaWFsb2dUaXRsZSwgTWVzc2FnZXMud2l6TmV3SW5zdGFsbGFibGVTZXJ2ZXJSZXN0YXJ0Ci0JCQkJKTsKLQkJCQlpZiAocmVzdGFydCkgewotCQkJCQlUaHJlYWQgdCA9IG5ldyBUaHJlYWQoIlJlc3RhcnQgdGhyZWFkIikgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCXNsZWVwKDEwMDApOwotCQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCS8vIGlnbm9yZQotCQkJCQkJCX0KLQkJCQkJCQlkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkucmVzdGFydCgpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfSk7Ci0JCQkJCQl9Ci0JCQkJCX07Ci0JCQkJCXQuc2V0RGFlbW9uKHRydWUpOwotCQkJCQl0LnN0YXJ0KCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL05ld1J1bnRpbWVXaXphcmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9OZXdSdW50aW1lV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0YTIyNDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL05ld1J1bnRpbWVXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZC5mcmFnbWVudC5OZXdSdW50aW1lV2l6YXJkRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuV2l6YXJkRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU5ld1dpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotLyoqCi0gKiBBIHdpemFyZCB0byBjcmVhdGUgYSBuZXcgcnVudGltZS4KLSAqLwotcHVibGljIGNsYXNzIE5ld1J1bnRpbWVXaXphcmQgZXh0ZW5kcyBUYXNrV2l6YXJkIGltcGxlbWVudHMgSU5ld1dpemFyZCB7Ci0JLyoqCi0JICogTmV3UnVudGltZVdpemFyZCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBOZXdSdW50aW1lV2l6YXJkKCkgewotCQlzdXBlcihNZXNzYWdlcy53aXpOZXdSdW50aW1lV2l6YXJkVGl0bGUsIG5ldyBXaXphcmRGcmFnbWVudCgpIHsKLQkJCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNoaWxkRnJhZ21lbnRzKExpc3QgbGlzdCkgewotCQkJCWxpc3QuYWRkKG5ldyBOZXdSdW50aW1lV2l6YXJkRnJhZ21lbnQoKSk7Ci0JCQkJbGlzdC5hZGQobmV3IFdpemFyZEZyYWdtZW50KCkgewotCQkJCQlwdWJsaWMgdm9pZCBwZXJmb3JtRmluaXNoKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCQkJV2l6YXJkVGFza1V0aWwuc2F2ZVJ1bnRpbWUoZ2V0VGFza01vZGVsKCksIG1vbml0b3IpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX0pOwotCi0JCXNldEZvcmNlUHJldmlvdXNBbmROZXh0QnV0dG9ucyh0cnVlKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIG5ld1dvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gbmV3U2VsZWN0aW9uKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL05ld1NlcnZlcldpemFyZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL05ld1NlcnZlcldpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZThiZTQ0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9OZXdTZXJ2ZXJXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlckF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlRhc2tNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuU2VydmVyVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQuZnJhZ21lbnQuTW9kaWZ5TW9kdWxlc1dpemFyZEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLmZyYWdtZW50Lk5ld1NlcnZlcldpemFyZEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLmZyYWdtZW50LlRhc2tzV2l6YXJkRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuV2l6YXJkRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU5ld1dpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotLyoqCi0gKiBBIHdpemFyZCB0byBjcmVhdGUgYSBuZXcgc2VydmVyIGFuZCBzZXJ2ZXIgY29uZmlndXJhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIE5ld1NlcnZlcldpemFyZCBleHRlbmRzIFRhc2tXaXphcmQgaW1wbGVtZW50cyBJTmV3V2l6YXJkIHsKLQkvKioKLQkgKiBOZXdTZXJ2ZXJXaXphcmQgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgTmV3U2VydmVyV2l6YXJkKCkgewotCQl0aGlzKG51bGwsIG51bGwpOwotCX0KLQotCXB1YmxpYyBOZXdTZXJ2ZXJXaXphcmQoZmluYWwgU3RyaW5nW10gaWRzLCBmaW5hbCBTdHJpbmdbXSB2YWx1ZXMpIHsKLQkJc3VwZXIoTWVzc2FnZXMud2l6TmV3U2VydmVyV2l6YXJkVGl0bGUsIG5ldyBXaXphcmRGcmFnbWVudCgpIHsKLQkJCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNoaWxkRnJhZ21lbnRzKExpc3QgbGlzdCkgewotCQkJCWxpc3QuYWRkKG5ldyBOZXdTZXJ2ZXJXaXphcmRGcmFnbWVudCgpKTsKLQkJCQlsaXN0LmFkZChuZXcgV2l6YXJkRnJhZ21lbnQoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHBlcmZvcm1GaW5pc2goSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkJCQlXaXphcmRUYXNrVXRpbC50ZW1wU2F2ZVJ1bnRpbWUoZ2V0VGFza01vZGVsKCksIG1vbml0b3IpOwotCQkJCQkJV2l6YXJkVGFza1V0aWwudGVtcFNhdmVTZXJ2ZXIoZ2V0VGFza01vZGVsKCksIG1vbml0b3IpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQkJbGlzdC5hZGQobmV3IE1vZGlmeU1vZHVsZXNXaXphcmRGcmFnbWVudCgpKTsKLQkJCQlsaXN0LmFkZChuZXcgVGFza3NXaXphcmRGcmFnbWVudCgpKTsKLQkJCQlsaXN0LmFkZChuZXcgV2l6YXJkRnJhZ21lbnQoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHBlcmZvcm1GaW5pc2goSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkJCQlXaXphcmRUYXNrVXRpbC5zYXZlUnVudGltZShnZXRUYXNrTW9kZWwoKSwgbW9uaXRvcik7Ci0JCQkJCQlXaXphcmRUYXNrVXRpbC5zYXZlU2VydmVyKGdldFRhc2tNb2RlbCgpLCBtb25pdG9yKTsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJSVNlcnZlckF0dHJpYnV0ZXMgc2VydmVyID0gKElTZXJ2ZXJBdHRyaWJ1dGVzKSBnZXRUYXNrTW9kZWwoKS5nZXRPYmplY3QoVGFza01vZGVsLlRBU0tfU0VSVkVSKTsKLQkJCQkJCQlTZXJ2ZXJVSVBsdWdpbi5nZXRQcmVmZXJlbmNlcygpLmFkZEhvc3RuYW1lKHNlcnZlci5nZXRIb3N0KCkpOwotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkvLyBpZ25vcmUKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQl9KTsKLQkJCi0JCWlmIChpZHMgIT0gbnVsbCkgewotCQkJVGFza01vZGVsIHRhc2tNb2RlbDIgPSBnZXRUYXNrTW9kZWwoKTsKLQkJCWludCBzaXplID0gaWRzLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJdGFza01vZGVsMi5wdXRPYmplY3QoaWRzW2ldLCB2YWx1ZXNbaV0pOwotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCBuZXdXb3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIG5ld1NlbGVjdGlvbikgewotCQkvLyBkbyBub3RoaW5nCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9SdW5PblNlcnZlcldpemFyZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL1J1bk9uU2VydmVyV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyMTE0NmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL1J1bk9uU2VydmVyV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyQXR0cmlidXRlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuVGFza01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5TZXJ2ZXJVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZC5mcmFnbWVudC5Nb2RpZnlNb2R1bGVzV2l6YXJkRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQuZnJhZ21lbnQuTmV3U2VydmVyV2l6YXJkRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQuZnJhZ21lbnQuVGFza3NXaXphcmRGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLndpemFyZC5XaXphcmRGcmFnbWVudDsKLS8qKgotICogQSB3aXphcmQgdXNlZCB0byBzZWxlY3QgYSBzZXJ2ZXIgZnJvbSB2YXJpb3VzIGxpc3RzLgotICovCi1wdWJsaWMgY2xhc3MgUnVuT25TZXJ2ZXJXaXphcmQgZXh0ZW5kcyBUYXNrV2l6YXJkIHsKLQlwcm90ZWN0ZWQgc3RhdGljIE5ld1NlcnZlcldpemFyZEZyYWdtZW50IHRhc2s7Ci0KLQkvKioKLQkgKiBSdW5PblNlcnZlcldpemFyZCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBtb2R1bGUgYSBtb2R1bGUKLQkgKiBAcGFyYW0gbGF1bmNoTW9kZSBhIGxhdW5jaCBtb2RlCi0JICovCi0JcHVibGljIFJ1bk9uU2VydmVyV2l6YXJkKGZpbmFsIElNb2R1bGUgbW9kdWxlLCBmaW5hbCBTdHJpbmcgbGF1bmNoTW9kZSkgewotCQlzdXBlcihNZXNzYWdlcy53aXpSdW5PblNlcnZlclRpdGxlLCBuZXcgV2l6YXJkRnJhZ21lbnQoKSB7Ci0JCQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDaGlsZEZyYWdtZW50cyhMaXN0IGxpc3QpIHsKLQkJCQl0YXNrID0gbmV3IE5ld1NlcnZlcldpemFyZEZyYWdtZW50KG1vZHVsZSwgbGF1bmNoTW9kZSk7Ci0JCQkJbGlzdC5hZGQodGFzayk7Ci0JCQkJbGlzdC5hZGQobmV3IFdpemFyZEZyYWdtZW50KCkgewotCQkJCQlwdWJsaWMgdm9pZCBwZXJmb3JtRmluaXNoKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCQkJV2l6YXJkVGFza1V0aWwudGVtcFNhdmVSdW50aW1lKGdldFRhc2tNb2RlbCgpLCBtb25pdG9yKTsKLQkJCQkJCVdpemFyZFRhc2tVdGlsLnRlbXBTYXZlU2VydmVyKGdldFRhc2tNb2RlbCgpLCBtb25pdG9yKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJCWxpc3QuYWRkKG5ldyBNb2RpZnlNb2R1bGVzV2l6YXJkRnJhZ21lbnQobW9kdWxlKSk7Ci0JCQkJbGlzdC5hZGQobmV3IFRhc2tzV2l6YXJkRnJhZ21lbnQoKSk7Ci0JCQkJbGlzdC5hZGQobmV3IFdpemFyZEZyYWdtZW50KCkgewotCQkJCQlwdWJsaWMgdm9pZCBwZXJmb3JtRmluaXNoKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCQkJV2l6YXJkVGFza1V0aWwuc2F2ZVJ1bnRpbWUoZ2V0VGFza01vZGVsKCksIG1vbml0b3IpOwotCQkJCQkJV2l6YXJkVGFza1V0aWwuc2F2ZVNlcnZlcihnZXRUYXNrTW9kZWwoKSwgbW9uaXRvcik7Ci0JCQkJCQl0cnkgewotCQkJCQkJCUlTZXJ2ZXJBdHRyaWJ1dGVzIHNlcnZlciA9IChJU2VydmVyQXR0cmlidXRlcykgZ2V0VGFza01vZGVsKCkuZ2V0T2JqZWN0KFRhc2tNb2RlbC5UQVNLX1NFUlZFUik7Ci0JCQkJCQkJU2VydmVyVUlQbHVnaW4uZ2V0UHJlZmVyZW5jZXMoKS5hZGRIb3N0bmFtZShzZXJ2ZXIuZ2V0SG9zdCgpKTsKLQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJLy8gaWdub3JlCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQkJfSk7Ci0JCi0JCXNldE5lZWRzUHJvZ3Jlc3NNb25pdG9yKHRydWUpOwotCQlpZiAoSUxhdW5jaE1hbmFnZXIuREVCVUdfTU9ERS5lcXVhbHMobGF1bmNoTW9kZSkpCi0JCQlzZXRXaW5kb3dUaXRsZShNZXNzYWdlcy53aXpEZWJ1Z09uU2VydmVyVGl0bGUpOwotCQllbHNlIGlmIChJTGF1bmNoTWFuYWdlci5QUk9GSUxFX01PREUuZXF1YWxzKGxhdW5jaE1vZGUpKQotCQkJc2V0V2luZG93VGl0bGUoTWVzc2FnZXMud2l6UHJvZmlsZU9uU2VydmVyVGl0bGUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2VydmVyLgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXIKLQkgKi8KLQlwdWJsaWMgSVNlcnZlciBnZXRTZXJ2ZXIoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gKElTZXJ2ZXIpIGdldFJvb3RGcmFnbWVudCgpLmdldFRhc2tNb2RlbCgpLmdldE9iamVjdChUYXNrTW9kZWwuVEFTS19TRVJWRVIpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNQcmVmZXJyZWRTZXJ2ZXIoKSB7Ci0JCWlmICh0YXNrID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0YXNrLmlzUHJlZmVycmVkU2VydmVyKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9TZWxlY3RDbGllbnRXaXphcmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9TZWxlY3RDbGllbnRXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NiMmEwNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvU2VsZWN0Q2xpZW50V2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLaAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLklDbGllbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZC5wYWdlLlNlbGVjdENsaWVudENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLndpemFyZC5JV2l6YXJkSGFuZGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkud2l6YXJkLldpemFyZEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLS8qKgotICogQSB3aXphcmQgdXNlZCB0byBzZWxlY3QgYSBzZXJ2ZXIgY2xpZW50IGZyb20gYSBsaXN0LgotICovCi1wdWJsaWMgY2xhc3MgU2VsZWN0Q2xpZW50V2l6YXJkIGV4dGVuZHMgVGFza1dpemFyZCB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBTZWxlY3RDbGllbnRDb21wb3NpdGUgY29tcDsKLQotCS8qKgotCSAqIFNlbGVjdENsaWVudFdpemFyZCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBjbGllbnRzIGFuIGFycmF5IG9mIGNsaWVudHMKLQkgKi8KLQlwdWJsaWMgU2VsZWN0Q2xpZW50V2l6YXJkKGZpbmFsIElDbGllbnRbXSBjbGllbnRzKSB7Ci0JCXN1cGVyKE1lc3NhZ2VzLndpelNlbGVjdENsaWVudFdpemFyZFRpdGxlLAotCQkJbmV3IFdpemFyZEZyYWdtZW50KCkgewkJCQkJCQotCQkJCXB1YmxpYyBib29sZWFuIGhhc0NvbXBvc2l0ZSgpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCi0JCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC50YXNrLldpemFyZFRhc2sjZ2V0V2l6YXJkUGFnZSgpCi0JCQkJICovCi0JCQkJcHVibGljIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgSVdpemFyZEhhbmRsZSB3aXphcmQpIHsKLQkJCQkJY29tcCA9IG5ldyBTZWxlY3RDbGllbnRDb21wb3NpdGUocGFyZW50LCB3aXphcmQsIGNsaWVudHMpOwotCQkJCQlyZXR1cm4gY29tcDsKLQkJCQl9Ci0JCQl9Ci0JCSk7Ci0KLQkJc2V0Rm9yY2VQcmV2aW91c0FuZE5leHRCdXR0b25zKHRydWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2VsZWN0ZWQgY2xpZW50LgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklDbGllbnQKLQkgKi8KLQlwdWJsaWMgSUNsaWVudCBnZXRTZWxlY3RlZENsaWVudCgpIHsKLQkJcmV0dXJuIGNvbXAuZ2V0U2VsZWN0ZWRDbGllbnQoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL1NlbGVjdFRhc2tzV2l6YXJkLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvU2VsZWN0VGFza3NXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZlYjdmNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvU2VsZWN0VGFza3NXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5UYXNrTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZC5mcmFnbWVudC5UYXNrc1dpemFyZEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkud2l6YXJkLldpemFyZEZyYWdtZW50OwotLyoqCi0gKiBBIHdpemFyZCB1c2VkIHRvIHNlbGVjdCBzZXJ2ZXIgYW5kIG1vZHVsZSB0YXNrcy4KLSAqLwotcHVibGljIGNsYXNzIFNlbGVjdFRhc2tzV2l6YXJkIGV4dGVuZHMgVGFza1dpemFyZCB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBUYXNrc1dpemFyZEZyYWdtZW50IGZyYWdtZW50OwotCi0JLyoqCi0JICogU2VsZWN0VGFza3NXaXphcmQgY29uc3RydWN0b3IuCi0JICogCi0JICogQHBhcmFtIHNlcnZlciBhIHNlcnZlcgotCSAqLwotCXB1YmxpYyBTZWxlY3RUYXNrc1dpemFyZChmaW5hbCBJU2VydmVyIHNlcnZlcikgewotCQlzdXBlcihNZXNzYWdlcy53aXpUYXNrV2l6YXJkVGl0bGUsIG5ldyBXaXphcmRGcmFnbWVudCgpIHsKLQkJCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNoaWxkRnJhZ21lbnRzKExpc3QgbGlzdCkgewotCQkJCWZyYWdtZW50ID0gbmV3IFRhc2tzV2l6YXJkRnJhZ21lbnQoKTsKLQkJCQlsaXN0LmFkZChmcmFnbWVudCk7Ci0JCQkJbGlzdC5hZGQobmV3IFdpemFyZEZyYWdtZW50KCkgewotCQkJCQlwdWJsaWMgdm9pZCBwZXJmb3JtRmluaXNoKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCQkJV2l6YXJkVGFza1V0aWwuc2F2ZVNlcnZlcihnZXRUYXNrTW9kZWwoKSwgbW9uaXRvcik7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQkJfSk7Ci0JCWdldFRhc2tNb2RlbCgpLnB1dE9iamVjdChUYXNrTW9kZWwuVEFTS19TRVJWRVIsIHNlcnZlcik7Ci0JCWFkZFBhZ2VzKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgd2l6YXJkIGhhcyB0YXNrcy4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgd2l6YXJkIGhhcyB0YXNrcywgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqICAgIG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc1Rhc2tzKCkgewotCQlyZXR1cm4gZnJhZ21lbnQuaGFzVGFza3MoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyB3aXphcmQgaGFzIG9wdGlvbmFsIHRhc2tzLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyB3aXphcmQgaGFzIG9wdGlvbmFsIHRhc2tzLCBhbmQKLQkgKiAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzT3B0aW9uYWxUYXNrcygpIHsKLQkJcmV0dXJuIGZyYWdtZW50Lmhhc09wdGlvbmFsVGFza3MoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL1Rhc2tXaXphcmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9UYXNrV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjMjljYTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL1Rhc2tXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5UYXNrTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5FY2xpcHNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlNlcnZlclVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuVHJhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQucGFnZS5Xb3Jrc3BhY2VSdW5uYWJsZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuV2l6YXJkRnJhZ21lbnQ7Ci0vKioKLSAqIEEgd2l6YXJkIHVzZWQgdG8gZXhlY3V0ZSB0YXNrcy4KLSAqLwotcHVibGljIGNsYXNzIFRhc2tXaXphcmQgaW1wbGVtZW50cyBJV2l6YXJkIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIEZJTklTSCA9IDI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBDQU5DRUwgPSAzOwotCi0JcHJpdmF0ZSBMaXN0IHBhZ2VzOwotCXByaXZhdGUgYm9vbGVhbiBhZGRpbmdQYWdlczsKLQlwcml2YXRlIE1hcCBmcmFnbWVudERhdGEgPSBuZXcgSGFzaE1hcCgpOwotCXByb3RlY3RlZCBUYXNrTW9kZWwgdGFza01vZGVsOwotCQotCXByaXZhdGUgSVdpemFyZENvbnRhaW5lciBjb250YWluZXIgPSBudWxsOwotCQotCXByaXZhdGUgYm9vbGVhbiBuZWVkc1Byb2dyZXNzTW9uaXRvciA9IGZhbHNlOwotCQotCXByaXZhdGUgYm9vbGVhbiBmb3JjZVByZXZpb3VzQW5kTmV4dEJ1dHRvbnMgPSBmYWxzZTsKLQotCXByaXZhdGUgYm9vbGVhbiBpc0hlbHBBdmFpbGFibGUgPSBmYWxzZTsKLQkKLQlwcml2YXRlIEltYWdlIGRlZmF1bHRJbWFnZSA9IG51bGw7Ci0JCi0JcHJpdmF0ZSBSR0IgdGl0bGVCYXJDb2xvciA9IG51bGw7Ci0KLQlwcml2YXRlIFN0cmluZyB3aW5kb3dUaXRsZSA9IG51bGw7Ci0JCi0JcHJpdmF0ZSBJRGlhbG9nU2V0dGluZ3MgZGlhbG9nU2V0dGluZ3MgPSBudWxsOwotCQotCXByaXZhdGUgV2l6YXJkRnJhZ21lbnQgcm9vdEZyYWdtZW50OwotCXByaXZhdGUgV2l6YXJkRnJhZ21lbnQgY3VycmVudEZyYWdtZW50OwotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IFRhc2tXaXphcmQgd2l0aCB0aGUgZ2l2ZW4gdGl0bGUgYW5kIHJvb3QgZnJhZ21lbnQuCi0JICogCi0JICogQHBhcmFtIHRpdGxlIGEgdGl0bGUKLQkgKiBAcGFyYW0gcm9vdEZyYWdtZW50IGEgcm9vdCBmcmFnbWVudAotCSAqLwotCXB1YmxpYyBUYXNrV2l6YXJkKFN0cmluZyB0aXRsZSwgV2l6YXJkRnJhZ21lbnQgcm9vdEZyYWdtZW50KSB7Ci0JCXRoaXModGl0bGUsIHJvb3RGcmFnbWVudCwgbnVsbCk7Ci0JCXNldFdpbmRvd1RpdGxlKHRpdGxlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgVGFza1dpemFyZCB3aXRoIHRoZSBnaXZlbiB0aXRsZSwgcm9vdCBmcmFnbWVudCwgYW5kIHRhc2sgbW9kZWwuCi0JICogCi0JICogQHBhcmFtIHRpdGxlIGEgdGl0bGUKLQkgKiBAcGFyYW0gcm9vdEZyYWdtZW50IGEgcm9vdCBmcmFnbWVudAotCSAqIEBwYXJhbSB0YXNrTW9kZWwgYSB0YXNrIG1vZGVsCi0JICovCi0JcHVibGljIFRhc2tXaXphcmQoU3RyaW5nIHRpdGxlLCBXaXphcmRGcmFnbWVudCByb290RnJhZ21lbnQsIFRhc2tNb2RlbCB0YXNrTW9kZWwpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKHRpdGxlICE9IG51bGwpCi0JCQlzZXRXaW5kb3dUaXRsZSh0aXRsZSk7Ci0JCXRoaXMucm9vdEZyYWdtZW50ID0gcm9vdEZyYWdtZW50OwotCQl0aGlzLnRhc2tNb2RlbCA9IHRhc2tNb2RlbDsKLQkJaWYgKHRhc2tNb2RlbCA9PSBudWxsKQotCQkJdGhpcy50YXNrTW9kZWwgPSBuZXcgVGFza01vZGVsKCk7Ci0JCQotCQlzZXROZWVkc1Byb2dyZXNzTW9uaXRvcih0cnVlKTsKLQkJc2V0Rm9yY2VQcmV2aW91c0FuZE5leHRCdXR0b25zKHRydWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRhc2tNb2RlbChUYXNrTW9kZWwgdGFza01vZGVsKSB7Ci0JCXRoaXMudGFza01vZGVsID0gdGFza01vZGVsOwotCX0KLQkKLQlwdWJsaWMgVGFza01vZGVsIGdldFRhc2tNb2RlbCgpIHsKLQkJcmV0dXJuIHRhc2tNb2RlbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSb290RnJhZ21lbnQoV2l6YXJkRnJhZ21lbnQgcm9vdEZyYWdtZW50KSB7Ci0JCXRoaXMucm9vdEZyYWdtZW50ID0gcm9vdEZyYWdtZW50OwotCX0KLQkKLQlwdWJsaWMgV2l6YXJkRnJhZ21lbnQgZ2V0Um9vdEZyYWdtZW50KCkgewotCQlyZXR1cm4gcm9vdEZyYWdtZW50OwotCX0KLQotCS8qKgotCSAqIENhbmNlbCB0aGUgY2xpZW50IHNlbGVjdGlvbi4KLQkgKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1DYW5jZWwoKSB7Ci0JCWZpbmFsIExpc3QgbGlzdCA9IGdldEFsbFdpemFyZEZyYWdtZW50cygpOwotCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQkJCXRyeSB7Ci0JCQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOwotCQkJCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotCQkJCQkJZXhlY3V0ZVRhc2soKFdpemFyZEZyYWdtZW50KSBpdGVyYXRvci5uZXh0KCksIENBTkNFTCwgbW9uaXRvcik7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJCQl0aHJvdyBuZXcgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbihjZSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCQkKLQkJVGhyb3dhYmxlIHQgPSBudWxsOwotCQl0cnkgewotCQkJaWYgKGdldENvbnRhaW5lcigpICE9IG51bGwpCi0JCQkJZ2V0Q29udGFpbmVyKCkucnVuKHRydWUsIHRydWUsIHJ1bm5hYmxlKTsKLQkJCWVsc2UKLQkJCQlydW5uYWJsZS5ydW4obmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB0ZSkgewotCQkJdCA9IHRlLmdldENhdXNlKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl0ID0gZTsKLQkJfQotCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBjYW5jZWxsaW5nIHRhc2sgd2l6YXJkIiwgdCk7Ci0JCQotCQlpZiAodCBpbnN0YW5jZW9mIENvcmVFeGNlcHRpb24pIHsKLQkJCUVjbGlwc2VVdGlsLm9wZW5FcnJvcih0LmdldExvY2FsaXplZE1lc3NhZ2UoKSwgKChDb3JlRXhjZXB0aW9uKXQpLmdldFN0YXR1cygpKTsKLQkJfSBlbHNlCi0JCQlFY2xpcHNlVXRpbC5vcGVuRXJyb3IodC5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotCQkKLQkJcmV0dXJuIGZhbHNlOwotCQkKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgewotCQlpZiAoY3VycmVudEZyYWdtZW50ICE9IG51bGwpCi0JCQljdXJyZW50RnJhZ21lbnQuZXhpdCgpOwotCQkKLQkJZmluYWwgV2l6YXJkRnJhZ21lbnQgY0ZyYWdtZW50ID0gY3VycmVudEZyYWdtZW50OwotCi0JCWZpbmFsIExpc3QgbGlzdCA9IGdldEFsbFdpemFyZEZyYWdtZW50cygpOwotCQlJV29ya3NwYWNlUnVubmFibGUgcnVubmFibGUgPSBuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCS8vIGVudGVyICYgZXhpdCB0aGUgcmVtYWluaW5nIHBhZ2VzCi0JCQkJaW50IGluZGV4ID0gbGlzdC5pbmRleE9mKGNGcmFnbWVudCk7Ci0JCQkJd2hpbGUgKGluZGV4ID4gMCAmJiBpbmRleCA8IGxpc3Quc2l6ZSgpIC0gMSkgewotCQkJCQlmaW5hbCBXaXphcmRGcmFnbWVudCBmcmFnbWVudCA9IChXaXphcmRGcmFnbWVudCkgbGlzdC5nZXQoKytpbmRleCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQlmcmFnbWVudC5lbnRlcigpOwotCQkJCQkJCQlmcmFnbWVudC5leGl0KCk7Ci0JCQkJCQkJfQotCQkJCQkJfSk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiQ291bGQgbm90IGVudGVyL2V4aXQgcGFnZSIsIGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCWlmICh1c2VKb2IoKSkgewotCQkJCQljbGFzcyBGaW5pc2hXaXphcmRKb2IgZXh0ZW5kcyBKb2IgewotCQkJCQkJcHVibGljIEZpbmlzaFdpemFyZEpvYigpIHsKLQkJCQkJCQlzdXBlcihnZXRKb2JUaXRsZSgpKTsKLQkJCQkJCX0KLQkJCQkJCQotCQkJCQkJcHVibGljIGJvb2xlYW4gYmVsb25nc1RvKE9iamVjdCBmYW1pbHkpIHsKLQkJCQkJCQlyZXR1cm4gIm9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuZmFtaWx5Ii5lcXVhbHMoZmFtaWx5KTsKLQkJCQkJCX0KLQotCQkJCQkJcHVibGljIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcjIpIHsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsKLQkJCQkJCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLQkJCQkJCQkJCWV4ZWN1dGVUYXNrKChXaXphcmRGcmFnbWVudCkgaXRlcmF0b3IubmV4dCgpLCBGSU5JU0gsIG1vbml0b3IyKTsKLQkJCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGZpbmlzaGluZyB3aXphcmQgam9iIiwgY2UpOwotCQkJCQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJVSVBsdWdpbi5QTFVHSU5fSUQsIDAsIGNlLmdldExvY2FsaXplZE1lc3NhZ2UoKSwgbnVsbCk7Ci0JCQkJCQkJfQotCQkJCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCQotCQkJCQlGaW5pc2hXaXphcmRKb2Igam9iID0gbmV3IEZpbmlzaFdpemFyZEpvYigpOwotCQkJCQlqb2Iuc2V0VXNlcih0cnVlKTsKLQkJCQkJam9iLnNjaGVkdWxlKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7Ci0JCQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0JCQkJCQlleGVjdXRlVGFzaygoV2l6YXJkRnJhZ21lbnQpIGl0ZXJhdG9yLm5leHQoKSwgRklOSVNILCBtb25pdG9yKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCQotCQlUaHJvd2FibGUgdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpZiAoZ2V0Q29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQlnZXRDb250YWluZXIoKS5ydW4odHJ1ZSwgdHJ1ZSwgbmV3IFdvcmtzcGFjZVJ1bm5hYmxlQWRhcHRlcihydW5uYWJsZSkpOwotCQkJZWxzZQotCQkJCXJ1bm5hYmxlLnJ1bihuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCXJldHVybiB0cnVlOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHRlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBmaW5pc2hpbmcgdGFzayB3aXphcmQiLCB0ZSk7Ci0JCQl0ID0gdGUuZ2V0Q2F1c2UoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGZpbmlzaGluZyB0YXNrIHdpemFyZCAyIiwgZSk7Ci0JCQl0ID0gZTsKLQkJfQotCQkKLQkJLy8gVE9ETzogc2hvdyBiZXR0ZXIgZXJyb3IgZGlhbG9nLCBlLmcuIHdoZW4gVG9tY2F0IGNvbmZpZyBpcyBjb3JydXB0IHdoaWxlIGRvaW5nIEFkZC9SZW1vdmUKLQkJLy8gaXQgY3VycmVudGx5IGRpc3BsYXlzIHRoZSBlcnJvciBtZXNzYWdlIHR3aWNlCi0JCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJFcnJvciBjb21wbGV0aW5nIHdpemFyZCIsIHQpOwotCQlpZiAodCBpbnN0YW5jZW9mIENvcmVFeGNlcHRpb24pIHsKLQkJCUVjbGlwc2VVdGlsLm9wZW5FcnJvcih0LmdldExvY2FsaXplZE1lc3NhZ2UoKSwgKChDb3JlRXhjZXB0aW9uKXQpLmdldFN0YXR1cygpKTsKLQkJfSBlbHNlIGlmICh0IGluc3RhbmNlb2YgTnVsbFBvaW50ZXJFeGNlcHRpb24pCi0JCQlFY2xpcHNlVXRpbC5vcGVuRXJyb3IoIk51bGxQb2ludGVyRXhjZXB0aW9uIik7Ci0JCWVsc2UKLQkJCUVjbGlwc2VVdGlsLm9wZW5FcnJvcih0LmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZFBhZ2UoSVdpemFyZFBhZ2UgcGFnZSkgewotCQlwYWdlcy5hZGQocGFnZSk7Ci0JCXBhZ2Uuc2V0V2l6YXJkKHRoaXMpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBleGVjdXRlVGFzayhXaXphcmRGcmFnbWVudCBmcmFnbWVudCwgYnl0ZSB0eXBlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGZyYWdtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQlpZiAodHlwZSA9PSBGSU5JU0gpCi0JCQlmcmFnbWVudC5wZXJmb3JtRmluaXNoKG1vbml0b3IpOwotCQllbHNlIGlmICh0eXBlID09IENBTkNFTCkKLQkJCWZyYWdtZW50LnBlcmZvcm1DYW5jZWwobW9uaXRvcik7Ci0JfQotCQotCXByb3RlY3RlZCBXaXphcmRGcmFnbWVudCBnZXRDdXJyZW50V2l6YXJkRnJhZ21lbnQoKSB7Ci0JCXJldHVybiBjdXJyZW50RnJhZ21lbnQ7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHN3aXRjaFdpemFyZEZyYWdtZW50KFdpemFyZEZyYWdtZW50IG5ld0ZyYWdtZW50KSB7Ci0JCUxpc3QgbGlzdCA9IGdldEFsbFdpemFyZEZyYWdtZW50cygpOwotCQlpbnQgb2xkSW5kZXggPSBsaXN0LmluZGV4T2YoY3VycmVudEZyYWdtZW50KTsKLQkJaW50IG5ld0luZGV4ID0gbGlzdC5pbmRleE9mKG5ld0ZyYWdtZW50KTsKLQkJaWYgKG9sZEluZGV4ID09IG5ld0luZGV4KQotCQkJcmV0dXJuOwotCQkKLQkJLy9zYWZlRXhlY3V0ZVRhc2soY3VycmVudEZyYWdtZW50LCBERVBBUlRVUkUpOwotCQlpZiAoY3VycmVudEZyYWdtZW50ICE9IG51bGwpCi0JCQljdXJyZW50RnJhZ21lbnQuZXhpdCgpOwotCQkKLQkJaWYgKG9sZEluZGV4IDwgbmV3SW5kZXgpCi0JCQlvbGRJbmRleCArKzsKLQkJZWxzZQotCQkJb2xkSW5kZXggLS07Ci0JCQotCQl3aGlsZSAob2xkSW5kZXggIT0gbmV3SW5kZXgpIHsKLQkJCVdpemFyZEZyYWdtZW50IGZyYWdtZW50ID0gKFdpemFyZEZyYWdtZW50KSBsaXN0LmdldChvbGRJbmRleCk7Ci0JCQkvL3NhZmVFeGVjdXRlVGFzayhmcmFnbWVudCwgQVJSSVZBTCk7Ci0JCQkvL3NhZmVFeGVjdXRlVGFzayhmcmFnbWVudCwgREVQQVJUVVJFKTsKLQkJCWZyYWdtZW50LmVudGVyKCk7Ci0JCQlmcmFnbWVudC5leGl0KCk7Ci0JCQlpZiAob2xkSW5kZXggPCBuZXdJbmRleCkKLQkJCQlvbGRJbmRleCArKzsKLQkJCWVsc2UKLQkJCQlvbGRJbmRleCAtLTsKLQkJfQotCQkKLQkJY3VycmVudEZyYWdtZW50ID0gbmV3RnJhZ21lbnQ7Ci0JCS8vc2FmZUV4ZWN1dGVUYXNrKGN1cnJlbnRGcmFnbWVudCwgQVJSSVZBTCk7Ci0JCWN1cnJlbnRGcmFnbWVudC5lbnRlcigpOwotCX0KLQkKLQlwcml2YXRlIExpc3QgZ2V0QWxsV2l6YXJkRnJhZ21lbnRzKCkgewotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWxpc3QuYWRkKHJvb3RGcmFnbWVudCk7Ci0JCWFkZFN1YldpemFyZEZyYWdtZW50cyhyb290RnJhZ21lbnQsIGxpc3QpOwotCQkKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVdpemFyZEZyYWdtZW50IGZyYWdtZW50ID0gKFdpemFyZEZyYWdtZW50KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoIXRhc2tNb2RlbC5lcXVhbHMoZnJhZ21lbnQuZ2V0VGFza01vZGVsKCkpKQotCQkJCWZyYWdtZW50LnNldFRhc2tNb2RlbCh0YXNrTW9kZWwpOwotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRTdWJXaXphcmRGcmFnbWVudHMoV2l6YXJkRnJhZ21lbnQgZnJhZ21lbnQsIExpc3QgbGlzdCkgewotCQlJdGVyYXRvciBpdGVyYXRvciA9IGZyYWdtZW50LmdldENoaWxkRnJhZ21lbnRzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJV2l6YXJkRnJhZ21lbnQgY2hpbGQgPSAoV2l6YXJkRnJhZ21lbnQpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWxpc3QuYWRkKGNoaWxkKTsKLQkJCWFkZFN1YldpemFyZEZyYWdtZW50cyhjaGlsZCwgbGlzdCk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNhZGRQYWdlcygpCi0JICovCi0JcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7Ci0JCWlmIChhZGRpbmdQYWdlcykKLQkJCXJldHVybjsKLQkJCi0JCXRyeSB7Ci0JCQlhZGRpbmdQYWdlcyA9IHRydWU7Ci0JCQlwYWdlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZ2V0QWxsV2l6YXJkRnJhZ21lbnRzKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlXaXphcmRGcmFnbWVudCBmcmFnbWVudCA9IChXaXphcmRGcmFnbWVudCkgaXRlcmF0b3IubmV4dCgpOwotCQkJCVRhc2tXaXphcmRQYWdlIHBhZ2UgPSBnZXRGcmFnbWVudERhdGEoZnJhZ21lbnQpOwotCQkJCWlmIChmcmFnbWVudC5oYXNDb21wb3NpdGUoKSkgewotCQkJCQlpZiAocGFnZSAhPSBudWxsKQotCQkJCQkJYWRkUGFnZShwYWdlKTsKLQkJCQkJZWxzZSB7Ci0JCQkJCQlUYXNrV2l6YXJkUGFnZSBwYWdlMiA9IG5ldyBUYXNrV2l6YXJkUGFnZShmcmFnbWVudCk7Ci0JCQkJCQlmcmFnbWVudERhdGEucHV0KGZyYWdtZW50LCBwYWdlMik7Ci0JCQkJCQlhZGRQYWdlKHBhZ2UyKTsKLQkJCQkJfQotCQkJCX0JCi0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBhZGRpbmcgZnJhZ21lbnRzIHRvIHdpemFyZCIsIGUpOwotCQl9IGZpbmFsbHkgewotCQkJYWRkaW5nUGFnZXMgPSBmYWxzZTsKLQkJfQotCX0KLQkKLQkvKnByaXZhdGUgc3RhdGljIHZvaWQgdXBkYXRlV2l6YXJkUGFnZXMoKSB7Ci0JCXRyeSB7Ci0JCQljdXJyZW50LnVwZGF0ZVBhZ2VzKCk7Ci0JCQljdXJyZW50LmdldENvbnRhaW5lcigpLnVwZGF0ZUJ1dHRvbnMoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIHVwZGF0aW5nIHdpemFyZCBwYWdlcyIsIGUpOwotCQl9Ci0JfSovCi0JCi0JcHJpdmF0ZSBUYXNrV2l6YXJkUGFnZSBnZXRGcmFnbWVudERhdGEoV2l6YXJkRnJhZ21lbnQgZnJhZ21lbnQpIHsKLQkJdHJ5IHsKLQkJCVRhc2tXaXphcmRQYWdlIHBhZ2UgPSAoVGFza1dpemFyZFBhZ2UpIGZyYWdtZW50RGF0YS5nZXQoZnJhZ21lbnQpOwotCQkJaWYgKHBhZ2UgIT0gbnVsbCkKLQkJCQlyZXR1cm4gcGFnZTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGdldHRpbmcgZnJhZ21lbnQgZGF0YSIsIGUpOwotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlUGFnZXMoKSB7Ci0JCWFkZFBhZ2VzKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQjY2FuRmluaXNoKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5GaW5pc2goKSB7Ci0JCS8vIERlZmF1bHQgaW1wbGVtZW50YXRpb24gaXMgdG8gY2hlY2sgaWYgYWxsIHBhZ2VzIGFyZSBjb21wbGV0ZS4KLQkJZm9yIChpbnQgaT0gMDsgaSA8IHBhZ2VzLnNpemUoKTsgaSsrKSB7Ci0JCQlpZiAoISgoSVdpemFyZFBhZ2UpcGFnZXMuZ2V0KGkpKS5pc1BhZ2VDb21wbGV0ZSgpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNjcmVhdGVQYWdlQ29udHJvbHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhZ2VDb250cm9scyhDb21wb3NpdGUgcGFnZUNvbnRhaW5lcikgewotCQkvLyB0aGUgZGVmYXVsdCBiZWhhdmlvciBpcyB0byBjcmVhdGUgYWxsIHRoZSBwYWdlcyBjb250cm9scwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhZ2VzLnNpemUoKTsgaSsrKXsKLQkJCUlXaXphcmRQYWdlIHBhZ2UgPSAoSVdpemFyZFBhZ2UpIHBhZ2VzLmdldChpKTsKLQkJCXBhZ2UuY3JlYXRlQ29udHJvbChwYWdlQ29udGFpbmVyKTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIG5vdGlmeSBwYWdlcwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhZ2VzLnNpemUoKTsgaSsrKXsKLQkJCSgoSVdpemFyZFBhZ2UpcGFnZXMuZ2V0KGkpKS5kaXNwb3NlKCk7Ci0JCX0KLQotCQkvLyBkaXNwb3NlIG9mIGltYWdlCi0JCWlmIChkZWZhdWx0SW1hZ2UgIT0gbnVsbCkgewotCQkJZGVmYXVsdEltYWdlLmRpc3Bvc2UoKTsKLQkJCWRlZmF1bHRJbWFnZSA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNnZXRDb250YWluZXIoKQotCSAqLwotCXB1YmxpYyBJV2l6YXJkQ29udGFpbmVyIGdldENvbnRhaW5lcigpIHsKLQkJcmV0dXJuIGNvbnRhaW5lcjsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNnZXREZWZhdWx0UGFnZUltYWdlKCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0RGVmYXVsdFBhZ2VJbWFnZSgpIHsKLQkJcmV0dXJuIGRlZmF1bHRJbWFnZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNnZXREaWFsb2dTZXR0aW5ncygpCi0JICovCi0JcHVibGljIElEaWFsb2dTZXR0aW5ncyBnZXREaWFsb2dTZXR0aW5ncygpIHsKLQkJcmV0dXJuIGRpYWxvZ1NldHRpbmdzOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkI2dldE5leHRQYWdlKG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZSkKLQkgKi8KLQlwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0TmV4dFBhZ2UoSVdpemFyZFBhZ2UgcGFnZSkgewotCQlpbnQgaW5kZXggPSBwYWdlcy5pbmRleE9mKHBhZ2UpOwotCQlpZiAoaW5kZXggPT0gcGFnZXMuc2l6ZSgpIC0gMSB8fCBpbmRleCA9PSAtMSkKLQkJCS8vIGxhc3QgcGFnZSBvciBwYWdlIG5vdCBmb3VuZAotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlyZXR1cm4gKElXaXphcmRQYWdlKXBhZ2VzLmdldChpbmRleCArIDEpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkI2dldFBhZ2UoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0UGFnZShTdHJpbmcgbmFtZSkgewotCQlmb3IgKGludCBpPSAwOyBpIDwgcGFnZXMuc2l6ZSgpOyBpKyspIHsKLQkJCUlXaXphcmRQYWdlIHBhZ2UgPSAoSVdpemFyZFBhZ2UpcGFnZXMuZ2V0KGkpOwotCQkJU3RyaW5nIHBhZ2VOYW1lID0gcGFnZS5nZXROYW1lKCk7Ci0JCQlpZiAocGFnZU5hbWUuZXF1YWxzKG5hbWUpKQotCQkJCXJldHVybiBwYWdlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkI2dldFBhZ2VDb3VudCgpCi0JICovCi0JcHVibGljIGludCBnZXRQYWdlQ291bnQoKSB7Ci0JCXJldHVybiBwYWdlcy5zaXplKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQjZ2V0UGFnZXMoKQotCSAqLwotCXB1YmxpYyBJV2l6YXJkUGFnZVtdIGdldFBhZ2VzKCkgewotCQlyZXR1cm4gKElXaXphcmRQYWdlW10pcGFnZXMudG9BcnJheShuZXcgSVdpemFyZFBhZ2VbcGFnZXMuc2l6ZSgpXSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQjZ2V0UHJldmlvdXNQYWdlKG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZSkKLQkgKi8KLQlwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0UHJldmlvdXNQYWdlKElXaXphcmRQYWdlIHBhZ2UpIHsKLQkJaW50IGluZGV4ID0gcGFnZXMuaW5kZXhPZihwYWdlKTsKLQkJaWYgKGluZGV4ID09IDAgfHwgaW5kZXggPT0gLTEpCi0JCQkvLyBmaXJzdCBwYWdlIG9yIHBhZ2Ugbm90IGZvdW5kCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChJV2l6YXJkUGFnZSlwYWdlcy5nZXQoaW5kZXggLSAxKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNnZXRTdGFydGluZ1BhZ2UoKQotCSAqLwotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXRTdGFydGluZ1BhZ2UoKSB7Ci0JCWlmIChwYWdlcy5zaXplKCkgPT0gMCkKLQkJCXJldHVybiBudWxsOwotCQkKLQkJcmV0dXJuIChJV2l6YXJkUGFnZSkgcGFnZXMuZ2V0KDApOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkI2dldFRpdGxlQmFyQ29sb3IoKQotCSAqLwotCXB1YmxpYyBSR0IgZ2V0VGl0bGVCYXJDb2xvcigpIHsKLQkJcmV0dXJuIHRpdGxlQmFyQ29sb3I7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQjZ2V0V2luZG93VGl0bGUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0V2luZG93VGl0bGUoKSB7Ci0JCXJldHVybiB3aW5kb3dUaXRsZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNpc0hlbHBBdmFpbGFibGUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSGVscEF2YWlsYWJsZSgpIHsKLQkJcmV0dXJuIGlzSGVscEF2YWlsYWJsZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNuZWVkc1ByZXZpb3VzQW5kTmV4dEJ1dHRvbnMoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIG5lZWRzUHJldmlvdXNBbmROZXh0QnV0dG9ucygpIHsKLQkJcmV0dXJuIGZvcmNlUHJldmlvdXNBbmROZXh0QnV0dG9ucyB8fCBwYWdlcy5zaXplKCkgPiAxOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkI25lZWRzUHJvZ3Jlc3NNb25pdG9yKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBuZWVkc1Byb2dyZXNzTW9uaXRvcigpIHsKLQkJcmV0dXJuIG5lZWRzUHJvZ3Jlc3NNb25pdG9yOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkI3NldENvbnRhaW5lcihvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZENvbnRhaW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb250YWluZXIoSVdpemFyZENvbnRhaW5lciB3aXphcmRDb250YWluZXIpIHsKLQkJdGhpcy5jb250YWluZXIgPSB3aXphcmRDb250YWluZXI7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldERpYWxvZ1NldHRpbmdzKElEaWFsb2dTZXR0aW5ncyBzZXR0aW5ncykgewotCQlkaWFsb2dTZXR0aW5ncyA9IHNldHRpbmdzOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXROZWVkc1Byb2dyZXNzTW9uaXRvcihib29sZWFuIGIpIHsKLQkJbmVlZHNQcm9ncmVzc01vbml0b3IgPSBiOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRGb3JjZVByZXZpb3VzQW5kTmV4dEJ1dHRvbnMoYm9vbGVhbiBiKSB7Ci0JCWZvcmNlUHJldmlvdXNBbmROZXh0QnV0dG9ucyA9IGI7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFdpbmRvd1RpdGxlKFN0cmluZyB0aXRsZSkgewotCQl3aW5kb3dUaXRsZSA9IHRpdGxlOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHVzZUpvYigpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Sm9iVGl0bGUoKSB7Ci0JCXJldHVybiBnZXRXaW5kb3dUaXRsZSgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvVGFza1dpemFyZFBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9UYXNrV2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjY1OGZmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9UYXNrV2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JTWVzc2FnZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZpbGxMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5UcmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLndpemFyZC5JV2l6YXJkSGFuZGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkud2l6YXJkLldpemFyZEZyYWdtZW50OwotLyoqCi0gKiBBIHRhc2sgd2l6YXJkIHBhZ2UuCi0gKi8KLWNsYXNzIFRhc2tXaXphcmRQYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSBpbXBsZW1lbnRzIElXaXphcmRIYW5kbGUgewotCXByb3RlY3RlZCBXaXphcmRGcmFnbWVudCBmcmFnbWVudDsKLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VtcHR5RXJyb3IgPSBmYWxzZTsKLQotCXB1YmxpYyBUYXNrV2l6YXJkUGFnZShXaXphcmRGcmFnbWVudCBmcmFnbWVudCkgewotCQlzdXBlcihmcmFnbWVudC50b1N0cmluZygpKTsKLQkJdGhpcy5mcmFnbWVudCA9IGZyYWdtZW50OwotCX0KLQkKLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnRDb21wKSB7Ci0JCUNvbXBvc2l0ZSBjb21wID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWNvbXAgPSBmcmFnbWVudC5jcmVhdGVDb21wb3NpdGUocGFyZW50Q29tcCwgdGhpcyk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiQ291bGQgbm90IGNyZWF0ZSB3aXphcmQgcGFnZSBjb21wb3NpdGUiLCBlKTsKLQkJfQotCQlpZiAoY29tcCA9PSBudWxsKSB7Ci0JCQljb21wID0gbmV3IENvbXBvc2l0ZShwYXJlbnRDb21wLCBTV1QuTk9ORSk7Ci0JCQljb21wLnNldExheW91dChuZXcgRmlsbExheW91dChTV1QuVkVSVElDQUwpKTsKLQkJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbXAsIFNXVC5OT05FKTsKLQkJCWxhYmVsLnNldFRleHQoIkludGVybmFsIGVycm9yIik7Ci0JCX0KLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQlkYXRhLndpZHRoSGludCA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKDE1MCk7Ci0JCS8vZGF0YS5oZWlnaHRIaW50ID0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKDM1MCk7Ci0JCWNvbXAuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJc2V0Q29udHJvbChjb21wKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1BhZ2VDb21wbGV0ZSgpIHsKLQkJLy9pZiAoaXNFbXB0eUVycm9yKQotCQkvLwlyZXR1cm4gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlpZiAoIWZyYWdtZW50LmlzQ29tcGxldGUoKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJLy9yZXR1cm4gKGdldE1lc3NhZ2UoKSA9PSBudWxsIHx8IGdldE1lc3NhZ2VUeXBlKCkgIT0gRVJST1IpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5GbGlwVG9OZXh0UGFnZSgpIHsKLQkJaWYgKGdldE5leHRQYWdlKCkgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJLy9pZiAoaXNFbXB0eUVycm9yKQotCQkvLwlyZXR1cm4gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlpZiAoIWZyYWdtZW50LmlzQ29tcGxldGUoKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JCS8vcmV0dXJuIChnZXRNZXNzYWdlKCkgPT0gbnVsbCB8fCBnZXRNZXNzYWdlVHlwZSgpICE9IEVSUk9SKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgewotCQlzdXBlci5zZXRWaXNpYmxlKHZpc2libGUpOwotCQkKLQkJaWYgKHZpc2libGUpIHsKLQkJCVRhc2tXaXphcmQgd2l6YXJkID0gKFRhc2tXaXphcmQpIGdldFdpemFyZCgpOwotCQkJd2l6YXJkLnN3aXRjaFdpemFyZEZyYWdtZW50KGZyYWdtZW50KTsKLQkJCQotCQkJaWYgKGdldENvbnRhaW5lcigpLmdldEN1cnJlbnRQYWdlKCkgIT0gbnVsbCkKLQkJCQlnZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TWVzc2FnZShTdHJpbmcgbWVzc2FnZSwgaW50IHR5cGUpIHsKLQkJaWYgKHR5cGUgPT0gSU1lc3NhZ2VQcm92aWRlci5FUlJPUiAmJiAiIi5lcXVhbHMobWVzc2FnZSkpIHsKLQkJCWlzRW1wdHlFcnJvciA9IHRydWU7Ci0JCQltZXNzYWdlID0gbnVsbDsKLQkJfSBlbHNlCi0JCQlpc0VtcHR5RXJyb3IgPSBmYWxzZTsKLQkJc3VwZXIuc2V0TWVzc2FnZShtZXNzYWdlLCB0eXBlKTsKLQkJV2l6YXJkRnJhZ21lbnQgZnJhZyA9ICgoVGFza1dpemFyZCkgZ2V0V2l6YXJkKCkpLmdldEN1cnJlbnRXaXphcmRGcmFnbWVudCgpOwotCQlpZiAoIWZyYWdtZW50LmVxdWFscyhmcmFnKSkKLQkJCXJldHVybjsKLQkJZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBydW4oYm9vbGVhbiBmb3JrLCBib29sZWFuIGNhbmNlbGFibGUsIElSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJZ2V0V2l6YXJkKCkuZ2V0Q29udGFpbmVyKCkucnVuKGZvcmssIGNhbmNlbGFibGUsIHJ1bm5hYmxlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCWZyYWdtZW50LnVwZGF0ZUNoaWxkRnJhZ21lbnRzKCk7Ci0JCSgoVGFza1dpemFyZCkgZ2V0V2l6YXJkKCkpLnVwZGF0ZVBhZ2VzKCk7Ci0JCWlmIChnZXRDb250YWluZXIoKS5nZXRDdXJyZW50UGFnZSgpICE9IG51bGwpCi0JCQlnZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9XaXphcmRUYXNrVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL1dpemFyZFRhc2tVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3YzEwNDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL1dpemFyZFRhc2tVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5Qcm9qZWN0UHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5TZXJ2ZXJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlcldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuRWNsaXBzZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5UcmFjZTsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBXaXphcmRUYXNrVXRpbCB7Ci0JcHJpdmF0ZSBXaXphcmRUYXNrVXRpbCgpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgc2F2ZVJ1bnRpbWUoVGFza01vZGVsIHRhc2tNb2RlbCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlSdW50aW1lIHJ1bnRpbWUgPSAoSVJ1bnRpbWUpIHRhc2tNb2RlbC5nZXRPYmplY3QoVGFza01vZGVsLlRBU0tfUlVOVElNRSk7Ci0JCWlmIChydW50aW1lICE9IG51bGwgJiYgcnVudGltZSBpbnN0YW5jZW9mIElSdW50aW1lV29ya2luZ0NvcHkpIHsKLQkJCUlSdW50aW1lV29ya2luZ0NvcHkgd29ya2luZ0NvcHkgPSAoSVJ1bnRpbWVXb3JraW5nQ29weSkgcnVudGltZTsKLQkJCWlmICh3b3JraW5nQ29weS5pc0RpcnR5KCkpCi0JCQkJdGFza01vZGVsLnB1dE9iamVjdChUYXNrTW9kZWwuVEFTS19SVU5USU1FLCB3b3JraW5nQ29weS5zYXZlKGZhbHNlLCBtb25pdG9yKSk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnRhc2suSVRhc2sjZG9UYXNrKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2F2ZVNlcnZlcihUYXNrTW9kZWwgdGFza01vZGVsLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVNlcnZlciBzZXJ2ZXIgPSAoSVNlcnZlcikgdGFza01vZGVsLmdldE9iamVjdChUYXNrTW9kZWwuVEFTS19TRVJWRVIpOwotCQlpZiAoc2VydmVyICE9IG51bGwgJiYgc2VydmVyIGluc3RhbmNlb2YgSVNlcnZlcldvcmtpbmdDb3B5KSB7Ci0JCQlJU2VydmVyV29ya2luZ0NvcHkgd29ya2luZ0NvcHkgPSAoSVNlcnZlcldvcmtpbmdDb3B5KSBzZXJ2ZXI7Ci0JCQlpZiAod29ya2luZ0NvcHkuaXNEaXJ0eSgpKSB7Ci0JCQkJSUZpbGUgZmlsZSA9ICgoU2VydmVyKXdvcmtpbmdDb3B5KS5nZXRGaWxlKCk7Ci0JCQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gZmlsZS5nZXRQcm9qZWN0KCk7Ci0JCQkJCQotCQkJCQlpZiAoIWZpbGUuZ2V0UHJvamVjdCgpLmV4aXN0cygpKQotCQkJCQkJRWNsaXBzZVV0aWwuY3JlYXRlTmV3U2VydmVyUHJvamVjdChudWxsLCBwcm9qZWN0LmdldE5hbWUoKSwgbnVsbCwgbW9uaXRvcik7Ci0JCQkJCQotCQkJCQlQcm9qZWN0UHJvcGVydGllcyBwcCA9IFNlcnZlclBsdWdpbi5nZXRQcm9qZWN0UHJvcGVydGllcyhwcm9qZWN0KTsKLQkJCQkJaWYgKCFwcC5pc1NlcnZlclByb2plY3QoKSkKLQkJCQkJCXBwLnNldFNlcnZlclByb2plY3QodHJ1ZSwgbW9uaXRvcik7Ci0JCQkJfQotCQkJCXRhc2tNb2RlbC5wdXRPYmplY3QoVGFza01vZGVsLlRBU0tfU0VSVkVSLCB3b3JraW5nQ29weS5zYXZlKGZhbHNlLCBtb25pdG9yKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHRlbXBTYXZlUnVudGltZShUYXNrTW9kZWwgdGFza01vZGVsLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVJ1bnRpbWUgcnVudGltZSA9IChJUnVudGltZSkgdGFza01vZGVsLmdldE9iamVjdChUYXNrTW9kZWwuVEFTS19SVU5USU1FKTsKLQkJaWYgKHJ1bnRpbWUgIT0gbnVsbCAmJiBydW50aW1lIGluc3RhbmNlb2YgSVJ1bnRpbWVXb3JraW5nQ29weSkgewotCQkJSVJ1bnRpbWVXb3JraW5nQ29weSB3b3JraW5nQ29weSA9IChJUnVudGltZVdvcmtpbmdDb3B5KSBydW50aW1lOwotCQkJaWYgKCF3b3JraW5nQ29weS5pc0RpcnR5KCkpCi0JCQkJcmV0dXJuOwotCQkKLQkJCXJ1bnRpbWUgPSB3b3JraW5nQ29weS5zYXZlKGZhbHNlLCBtb25pdG9yKTsKLQkJCXRhc2tNb2RlbC5wdXRPYmplY3QoVGFza01vZGVsLlRBU0tfUlVOVElNRSwgcnVudGltZS5jcmVhdGVXb3JraW5nQ29weSgpKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgdGVtcFNhdmVTZXJ2ZXIoVGFza01vZGVsIHRhc2tNb2RlbCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlTZXJ2ZXIgc2VydmVyID0gKElTZXJ2ZXIpIHRhc2tNb2RlbC5nZXRPYmplY3QoVGFza01vZGVsLlRBU0tfU0VSVkVSKTsKLQkJaWYgKHNlcnZlciAhPSBudWxsICYmIHNlcnZlciBpbnN0YW5jZW9mIElTZXJ2ZXJXb3JraW5nQ29weSkgewotCQkJSVNlcnZlcldvcmtpbmdDb3B5IHdvcmtpbmdDb3B5ID0gKElTZXJ2ZXJXb3JraW5nQ29weSkgc2VydmVyOwotCQkJaWYgKCF3b3JraW5nQ29weS5pc0RpcnR5KCkpCi0JCQkJcmV0dXJuOwotCQkJCi0JCQlJRmlsZSBmaWxlID0gKChTZXJ2ZXIpd29ya2luZ0NvcHkpLmdldEZpbGUoKTsKLQkJCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gZmlsZS5nZXRQcm9qZWN0KCk7Ci0JCQkJCi0JCQkJaWYgKCFmaWxlLmdldFByb2plY3QoKS5leGlzdHMoKSkKLQkJCQkJRWNsaXBzZVV0aWwuY3JlYXRlTmV3U2VydmVyUHJvamVjdChudWxsLCBwcm9qZWN0LmdldE5hbWUoKSwgbnVsbCwgbW9uaXRvcik7Ci0JCQkJCi0JCQkJUHJvamVjdFByb3BlcnRpZXMgcHAgPSBTZXJ2ZXJQbHVnaW4uZ2V0UHJvamVjdFByb3BlcnRpZXMocHJvamVjdCk7Ci0JCQkJaWYgKCFwcC5pc1NlcnZlclByb2plY3QoKSkKLQkJCQkJcHAuc2V0U2VydmVyUHJvamVjdCh0cnVlLCBtb25pdG9yKTsKLQkJCX0KLQkJCUlSdW50aW1lIHJ1bnRpbWUgPSB3b3JraW5nQ29weS5nZXRSdW50aW1lKCk7Ci0JCQkKLQkJCXNlcnZlciA9IHdvcmtpbmdDb3B5LnNhdmUoZmFsc2UsIG1vbml0b3IpOwotCQkJd29ya2luZ0NvcHkgPSBzZXJ2ZXIuY3JlYXRlV29ya2luZ0NvcHkoKTsKLQkJCQotCQkJd29ya2luZ0NvcHkuc2V0UnVudGltZShydW50aW1lKTsKLQkJCWlmICh3b3JraW5nQ29weS5nZXRTZXJ2ZXJUeXBlKCkuaGFzU2VydmVyQ29uZmlndXJhdGlvbigpKSB7Ci0JCQkJKChTZXJ2ZXJXb3JraW5nQ29weSl3b3JraW5nQ29weSkuaW1wb3J0Q29uZmlndXJhdGlvbihydW50aW1lLCBudWxsKTsKLQkJCX0KLQkJCXRhc2tNb2RlbC5wdXRPYmplY3QoVGFza01vZGVsLlRBU0tfU0VSVkVSLCB3b3JraW5nQ29weSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZE1vZHVsZShJTW9kdWxlIG1vZHVsZSwgVGFza01vZGVsIHRhc2tNb2RlbCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChtb2R1bGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlJU2VydmVyIHNlcnZlciA9IChJU2VydmVyKSB0YXNrTW9kZWwuZ2V0T2JqZWN0KFRhc2tNb2RlbC5UQVNLX1NFUlZFUik7Ci0JCUlNb2R1bGUgcGFyZW50TW9kdWxlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCUlNb2R1bGVbXSBwYXJlbnRzID0gc2VydmVyLmdldFJvb3RNb2R1bGVzKG1vZHVsZSwgbW9uaXRvcik7Ci0JCQlpZiAocGFyZW50cyAhPSBudWxsICYmIHBhcmVudHMubGVuZ3RoID4gMCkgewotCQkJCXBhcmVudE1vZHVsZSA9IHBhcmVudHNbMF07Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiQ291bGQgbm90IGZpbmQgcGFyZW50IG1vZHVsZSIsIGUpOwotCQl9Ci0JCQotCQlpZiAocGFyZW50TW9kdWxlID09IG51bGwpIHsKLQkJCS8vIFVzZSB0aGUgb3JpZ2luYWwgbW9kdWxlIHNpbmNlIG5vIHBhcmVudCBtb2R1bGUgaXMgYXZhaWxhYmxlLgotCQkJcGFyZW50TW9kdWxlID0gbW9kdWxlOwotCQl9Ci0KLQkJSU1vZHVsZVtdIG1vZHVsZXMgPSBzZXJ2ZXIuZ2V0TW9kdWxlcygpOwotCQlpbnQgc2l6ZSA9IG1vZHVsZXMubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJaWYgKHBhcmVudE1vZHVsZS5lcXVhbHMobW9kdWxlc1tpXSkpCi0JCQkJcmV0dXJuOwotCQl9Ci0KLQkJSVNlcnZlcldvcmtpbmdDb3B5IHdvcmtpbmdDb3B5ID0gc2VydmVyLmNyZWF0ZVdvcmtpbmdDb3B5KCk7Ci0JCXdvcmtpbmdDb3B5Lm1vZGlmeU1vZHVsZXMobmV3IElNb2R1bGVbXSB7IHBhcmVudE1vZHVsZSB9LCBuZXcgSU1vZHVsZVswXSwgbW9uaXRvcik7Ci0JCXRhc2tNb2RlbC5wdXRPYmplY3QoVGFza01vZGVsLlRBU0tfU0VSVkVSLCB3b3JraW5nQ29weS5zYXZlKGZhbHNlLCBtb25pdG9yKSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtb2RpZnlNb2R1bGVzKExpc3QgYWRkLCBMaXN0IHJlbW92ZSwgVGFza01vZGVsIHRhc2tNb2RlbCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmICgoYWRkID09IG51bGwgfHwgYWRkLmlzRW1wdHkoKSkgJiYgKHJlbW92ZSA9PSBudWxsIHx8IHJlbW92ZS5pc0VtcHR5KCkpKQotCQkJcmV0dXJuOwotCi0JCUlTZXJ2ZXJXb3JraW5nQ29weSB3b3JraW5nQ29weSA9IChJU2VydmVyV29ya2luZ0NvcHkpIHRhc2tNb2RlbC5nZXRPYmplY3QoVGFza01vZGVsLlRBU0tfU0VSVkVSKTsKLQotCQkvLyBtb2RpZnkgbW9kdWxlcwotCQlJTW9kdWxlW10gcmVtb3ZlMiA9IG5ldyBJTW9kdWxlWzBdOwotCQlpZiAocmVtb3ZlICE9IG51bGwpIHsKLQkJCXJlbW92ZTIgPSBuZXcgSU1vZHVsZVtyZW1vdmUuc2l6ZSgpXTsKLQkJCXJlbW92ZS50b0FycmF5KHJlbW92ZTIpOwotCQl9Ci0JCQotCQlJTW9kdWxlW10gYWRkMiA9IG5ldyBJTW9kdWxlWzBdOwotCQlpZiAoYWRkICE9IG51bGwpIHsKLQkJCWFkZDIgPSBuZXcgSU1vZHVsZVthZGQuc2l6ZSgpXTsKLQkJCWFkZC50b0FycmF5KGFkZDIpOwotCQl9Ci0JCQotCQlJRmlsZSBmaWxlID0gKChTZXJ2ZXIpd29ya2luZ0NvcHkpLmdldEZpbGUoKTsKLQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJSVByb2plY3QgcHJvamVjdCA9IGZpbGUuZ2V0UHJvamVjdCgpOwotCQkJCi0JCQlpZiAoIWZpbGUuZ2V0UHJvamVjdCgpLmV4aXN0cygpKQotCQkJCUVjbGlwc2VVdGlsLmNyZWF0ZU5ld1NlcnZlclByb2plY3QobnVsbCwgcHJvamVjdC5nZXROYW1lKCksIG51bGwsIG1vbml0b3IpOwotCQkJCi0JCQlQcm9qZWN0UHJvcGVydGllcyBwcCA9IFNlcnZlclBsdWdpbi5nZXRQcm9qZWN0UHJvcGVydGllcyhwcm9qZWN0KTsKLQkJCWlmICghcHAuaXNTZXJ2ZXJQcm9qZWN0KCkpCi0JCQkJcHAuc2V0U2VydmVyUHJvamVjdCh0cnVlLCBtb25pdG9yKTsKLQkJfQotCQkKLQkJd29ya2luZ0NvcHkubW9kaWZ5TW9kdWxlcyhhZGQyLCByZW1vdmUyLCBtb25pdG9yKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL2ZyYWdtZW50L01vZGlmeU1vZHVsZXNXaXphcmRGcmFnbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL2ZyYWdtZW50L01vZGlmeU1vZHVsZXNXaXphcmRGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzAxOGE1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9mcmFnbWVudC9Nb2RpZnlNb2R1bGVzV2l6YXJkRnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLmZyYWdtZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuSU1vZHVsZVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlRyYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLldpemFyZFRhc2tVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLnBhZ2UuTW9kaWZ5TW9kdWxlc0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLndpemFyZC5JV2l6YXJkSGFuZGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkud2l6YXJkLldpemFyZEZyYWdtZW50OwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIE1vZGlmeU1vZHVsZXNXaXphcmRGcmFnbWVudCBleHRlbmRzIFdpemFyZEZyYWdtZW50IHsKLQlwcm90ZWN0ZWQgTW9kaWZ5TW9kdWxlc0NvbXBvc2l0ZSBjb21wOwotCQotCXByb3RlY3RlZCBJTW9kdWxlIG1vZHVsZTsKLQotCXB1YmxpYyBNb2RpZnlNb2R1bGVzV2l6YXJkRnJhZ21lbnQoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0JCi0JcHVibGljIE1vZGlmeU1vZHVsZXNXaXphcmRGcmFnbWVudChJTW9kdWxlIG1vZHVsZSkgewotCQl0aGlzLm1vZHVsZSA9IG1vZHVsZTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaGFzQ29tcG9zaXRlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnRhc2suV2l6YXJkVGFzayNnZXRXaXphcmRQYWdlKCkKLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlIGNyZWF0ZUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBJV2l6YXJkSGFuZGxlIGhhbmRsZSkgewotCQljb21wID0gbmV3IE1vZGlmeU1vZHVsZXNDb21wb3NpdGUocGFyZW50LCBoYW5kbGUsIG1vZHVsZSk7Ci0JCXJldHVybiBjb21wOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRUYXNrTW9kZWwoVGFza01vZGVsIHRhc2tNb2RlbCkgewotCQlzdXBlci5zZXRUYXNrTW9kZWwodGFza01vZGVsKTsKLQkJaWYgKGNvbXAgIT0gbnVsbCkKLQkJCWNvbXAuc2V0VGFza01vZGVsKHRhc2tNb2RlbCk7Ci0JfQotCQotCXB1YmxpYyBMaXN0IGdldENoaWxkRnJhZ21lbnRzKCkgewotCQl1cGRhdGVNb2R1bGVzKCk7Ci0JCXJldHVybiBzdXBlci5nZXRDaGlsZEZyYWdtZW50cygpOwotCX0KLQotCXB1YmxpYyB2b2lkIGVudGVyKCkgewotCQl1cGRhdGVNb2R1bGVzKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZU1vZHVsZXMoKSB7Ci0JCWlmIChjb21wICE9IG51bGwpIHsKLQkJCUlTZXJ2ZXJBdHRyaWJ1dGVzIHNlcnZlciA9IChJU2VydmVyQXR0cmlidXRlcykgZ2V0VGFza01vZGVsKCkuZ2V0T2JqZWN0KFRhc2tNb2RlbC5UQVNLX1NFUlZFUik7Ci0JCQljb21wLnNldFNlcnZlcihzZXJ2ZXIpOwotCQkJY29tcC5zZXRUYXNrTW9kZWwoZ2V0VGFza01vZGVsKCkpOwotCQl9IGVsc2UgaWYgKG1vZHVsZSAhPSBudWxsKSB7Ci0JCQlUYXNrTW9kZWwgdGFza01vZGVsID0gZ2V0VGFza01vZGVsKCk7Ci0JCQlpZiAodGFza01vZGVsID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJSVNlcnZlcldvcmtpbmdDb3B5IHNlcnZlciA9IChJU2VydmVyV29ya2luZ0NvcHkpIHRhc2tNb2RlbC5nZXRPYmplY3QoVGFza01vZGVsLlRBU0tfU0VSVkVSKTsKLQkJCWlmIChzZXJ2ZXIgPT0gbnVsbCkgewotCQkJCXRhc2tNb2RlbC5wdXRPYmplY3QoVGFza01vZGVsLlRBU0tfTU9EVUxFUywgbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJCi0JCQlmaW5hbCBMaXN0IG1vZHVsZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlpZiAoc2VydmVyICE9IG51bGwpIHsKLQkJCQkoKFNlcnZlcikgc2VydmVyKS52aXNpdChuZXcgSU1vZHVsZVZpc2l0b3IoKSB7Ci0JCQkJCXB1YmxpYyBib29sZWFuIHZpc2l0KElNb2R1bGVbXSBtb2R1bGUyKSB7Ci0JCQkJCQltb2R1bGVMaXN0LmFkZChtb2R1bGUyKTsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfSwgbnVsbCk7Ci0JCQl9Ci0JCQkKLQkJCS8vIGFkZCBtb2R1bGUKLQkJCUlNb2R1bGUgcGFyZW50ID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJSU1vZHVsZVtdIHBhcmVudHMgPSBzZXJ2ZXIuZ2V0Um9vdE1vZHVsZXMobW9kdWxlLCBudWxsKTsKLQkJCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCi0JCQkJaWYgKHBhcmVudHMgIT0gbnVsbCAmJiBwYXJlbnRzLmxlbmd0aCA+IDApIHsKLQkJCQkJcGFyZW50ID0gcGFyZW50c1swXTsKLQkJCQkJbGlzdC5hZGQocGFyZW50KTsKLQkJCQl9Ci0JCQkJLy8gVE9ETyAtIGdldCBwYXJlbnQgbW9kdWxlcyBjb3JyZWN0Ci0JCQkJaWYgKCFtb2R1bGVMaXN0LmNvbnRhaW5zKG1vZHVsZSkpIHsKLQkJCQkJbW9kdWxlTGlzdC5hZGQobmV3IElNb2R1bGVbXSB7IG1vZHVsZSB9KTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVRyYWNlLnRyYWNlKFRyYWNlLldBUk5JTkcsICJDb3VsZCBub3QgZmluZCBwYXJlbnQgbW9kdWxlIiwgZSk7Ci0JCQl9Ci0JCQkKLQkJCXRhc2tNb2RlbC5wdXRPYmplY3QoVGFza01vZGVsLlRBU0tfTU9EVUxFUywgbW9kdWxlTGlzdCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBwZXJmb3JtRmluaXNoKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoY29tcCAhPSBudWxsKQotCQkJV2l6YXJkVGFza1V0aWwubW9kaWZ5TW9kdWxlcyhjb21wLmdldE1vZHVsZXNUb0FkZCgpLCBjb21wLmdldE1vZHVsZXNUb1JlbW92ZSgpLCBnZXRUYXNrTW9kZWwoKSwgbW9uaXRvcik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9mcmFnbWVudC9OZXdJbnN0YWxsYWJsZVNlcnZlcldpemFyZEZyYWdtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvZnJhZ21lbnQvTmV3SW5zdGFsbGFibGVTZXJ2ZXJXaXphcmRGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzE2Y2UyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9mcmFnbWVudC9OZXdJbnN0YWxsYWJsZVNlcnZlcldpemFyZEZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLmZyYWdtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuSW1hZ2VSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLnBhZ2UuTmV3SW5zdGFsbGFibGVTZXJ2ZXJDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuV2l6YXJkRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuSVdpemFyZEhhbmRsZTsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdJbnN0YWxsYWJsZVNlcnZlcldpemFyZEZyYWdtZW50IGV4dGVuZHMgV2l6YXJkRnJhZ21lbnQgewotCXByb3RlY3RlZCBOZXdJbnN0YWxsYWJsZVNlcnZlckNvbXBvc2l0ZSBjb21wOwotCi0JcHVibGljIE5ld0luc3RhbGxhYmxlU2VydmVyV2l6YXJkRnJhZ21lbnQoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNDb21wb3NpdGUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudGFzay5XaXphcmRUYXNrI2dldFdpemFyZFBhZ2UoKQotCSAqLwotCXB1YmxpYyBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIElXaXphcmRIYW5kbGUgd2l6YXJkKSB7Ci0JCWNvbXAgPSBuZXcgTmV3SW5zdGFsbGFibGVTZXJ2ZXJDb21wb3NpdGUocGFyZW50LCBnZXRUYXNrTW9kZWwoKSwgd2l6YXJkKTsKLQkJCi0JCXdpemFyZC5zZXRUaXRsZShNZXNzYWdlcy53aXpOZXdJbnN0YWxsYWJsZVNlcnZlclRpdGxlKTsKLQkJd2l6YXJkLnNldERlc2NyaXB0aW9uKE1lc3NhZ2VzLndpek5ld0luc3RhbGxhYmxlU2VydmVyRGVzY3JpcHRpb24pOwotCQl3aXphcmQuc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX1dJWkJBTl9ORVdfU0VSVkVSKSk7Ci0JCXJldHVybiBjb21wOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQ29tcGxldGUoKSB7Ci0JCXJldHVybiBnZXRUYXNrTW9kZWwoKS5nZXRPYmplY3QoImluc3RhbGxhYmxlU2VydmVyIikgIT0gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL2ZyYWdtZW50L05ld1J1bnRpbWVXaXphcmRGcmFnbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL2ZyYWdtZW50L05ld1J1bnRpbWVXaXphcmRGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDFkOTZmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9mcmFnbWVudC9OZXdSdW50aW1lV2l6YXJkRnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQuZnJhZ21lbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZVdvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5UYXNrTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5TZXJ2ZXJVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZC5wYWdlLk5ld1J1bnRpbWVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuV2l6YXJkRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuSVdpemFyZEhhbmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdSdW50aW1lV2l6YXJkRnJhZ21lbnQgZXh0ZW5kcyBXaXphcmRGcmFnbWVudCB7Ci0JcHJvdGVjdGVkIE5ld1J1bnRpbWVDb21wb3NpdGUgcGFnZTsKLQkKLQkvLyBmaWx0ZXIgYnkgdHlwZS92ZXJzaW9uCi0JcHJvdGVjdGVkIFN0cmluZyB0eXBlOwotCXByb3RlY3RlZCBTdHJpbmcgdmVyc2lvbjsKLQkKLQkvLyBmaWx0ZXIgYnkgcGFydGlhbCBydW50aW1lIHR5cGUgaWQKLQlwcm90ZWN0ZWQgU3RyaW5nIHJ1bnRpbWVUeXBlSWQ7Ci0JCi0JcHVibGljIE5ld1J1bnRpbWVXaXphcmRGcmFnbWVudCgpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQkKLQlwdWJsaWMgTmV3UnVudGltZVdpemFyZEZyYWdtZW50KFN0cmluZyB0eXBlLCBTdHJpbmcgdmVyc2lvbiwgU3RyaW5nIHJ1bnRpbWVUeXBlSWQpIHsKLQkJdGhpcy50eXBlID0gdHlwZTsKLQkJdGhpcy52ZXJzaW9uID0gdmVyc2lvbjsKLQkJdGhpcy5ydW50aW1lVHlwZUlkID0gcnVudGltZVR5cGVJZDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNDb21wb3NpdGUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudGFzay5XaXphcmRUYXNrI2dldFdpemFyZFBhZ2UoKQotCSAqLwotCXB1YmxpYyBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIElXaXphcmRIYW5kbGUgd2l6YXJkKSB7Ci0JCXBhZ2UgPSBuZXcgTmV3UnVudGltZUNvbXBvc2l0ZShwYXJlbnQsIHdpemFyZCwgZ2V0VGFza01vZGVsKCksIHR5cGUsIHZlcnNpb24sIHJ1bnRpbWVUeXBlSWQpOwotCQlyZXR1cm4gcGFnZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDaGlsZEZyYWdtZW50cyhMaXN0IGxpc3QpIHsKLQkJaWYgKGdldFRhc2tNb2RlbCgpID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCi0JCUlSdW50aW1lV29ya2luZ0NvcHkgcnVudGltZSA9IChJUnVudGltZVdvcmtpbmdDb3B5KSBnZXRUYXNrTW9kZWwoKS5nZXRPYmplY3QoVGFza01vZGVsLlRBU0tfUlVOVElNRSk7Ci0JCWlmIChydW50aW1lID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJV2l6YXJkRnJhZ21lbnQgc3ViID0gU2VydmVyVUlQbHVnaW4uZ2V0V2l6YXJkRnJhZ21lbnQocnVudGltZS5nZXRSdW50aW1lVHlwZSgpLmdldElkKCkpOwotCQlpZiAoc3ViICE9IG51bGwpCi0JCQlsaXN0LmFkZChzdWIpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvZnJhZ21lbnQvTmV3U2VydmVyV2l6YXJkRnJhZ21lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9mcmFnbWVudC9OZXdTZXJ2ZXJXaXphcmRGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzM1MDJlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9mcmFnbWVudC9OZXdTZXJ2ZXJXaXphcmRGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQuZnJhZ21lbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlcldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuU2VydmVyVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQucGFnZS5OZXdTZXJ2ZXJDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuV2l6YXJkRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuSVdpemFyZEhhbmRsZTsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdTZXJ2ZXJXaXphcmRGcmFnbWVudCBleHRlbmRzIFdpemFyZEZyYWdtZW50IHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RFID0gIm1vZGUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBNT0RFX0VYSVNUSU5HID0gMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgTU9ERV9ERVRFQ1QgPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBNT0RFX01BTlVBTD0gMjsKLQotCXByb3RlY3RlZCBOZXdTZXJ2ZXJDb21wb3NpdGUgY29tcDsKLQlwcm90ZWN0ZWQgSU1vZHVsZSBtb2R1bGU7Ci0JcHJvdGVjdGVkIFN0cmluZyBsYXVuY2hNb2RlOwotCQotCXByb3RlY3RlZCBNYXAgZnJhZ21lbnRNYXAgPSBuZXcgSGFzaE1hcCgpOwotCXByb3RlY3RlZCBNYXAgY29uZmlnTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkKLQlwdWJsaWMgTmV3U2VydmVyV2l6YXJkRnJhZ21lbnQoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0JCi0JcHVibGljIE5ld1NlcnZlcldpemFyZEZyYWdtZW50KElNb2R1bGUgbW9kdWxlLCBTdHJpbmcgbGF1bmNoTW9kZSkgewotCQl0aGlzLm1vZHVsZSA9IG1vZHVsZTsKLQkJdGhpcy5sYXVuY2hNb2RlID0gbGF1bmNoTW9kZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNDb21wb3NpdGUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIGVudGVyKCkgewotCQlzdXBlci5lbnRlcigpOwotCQlnZXRUYXNrTW9kZWwoKS5wdXRPYmplY3QoVGFza01vZGVsLlRBU0tfTEFVTkNIX01PREUsIGxhdW5jaE1vZGUpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudGFzay5XaXphcmRUYXNrI2dldFdpemFyZFBhZ2UoKQotCSAqLwotCXB1YmxpYyBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIElXaXphcmRIYW5kbGUgd2l6YXJkKSB7Ci0JCWNvbXAgPSBuZXcgTmV3U2VydmVyQ29tcG9zaXRlKHBhcmVudCwgd2l6YXJkLCBtb2R1bGUsIGxhdW5jaE1vZGUpOwotCQlpZiAoZ2V0VGFza01vZGVsKCkgIT0gbnVsbCkKLQkJCWNvbXAuc2V0VGFza01vZGVsKGdldFRhc2tNb2RlbCgpKTsKLQkJcmV0dXJuIGNvbXA7Ci0JfQotCi0JcHJvdGVjdGVkIFdpemFyZEZyYWdtZW50IGdldFdpemFyZEZyYWdtZW50KFN0cmluZyB0eXBlSWQpIHsKLQkJdHJ5IHsKLQkJCVdpemFyZEZyYWdtZW50IGZyYWdtZW50ID0gKFdpemFyZEZyYWdtZW50KSBmcmFnbWVudE1hcC5nZXQodHlwZUlkKTsKLQkJCWlmIChmcmFnbWVudCAhPSBudWxsKQotCQkJCXJldHVybiBmcmFnbWVudDsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCQotCQlXaXphcmRGcmFnbWVudCBmcmFnbWVudCA9IFNlcnZlclVJUGx1Z2luLmdldFdpemFyZEZyYWdtZW50KHR5cGVJZCk7Ci0JCWlmIChmcmFnbWVudCAhPSBudWxsKQotCQkJZnJhZ21lbnRNYXAucHV0KHR5cGVJZCwgZnJhZ21lbnQpOwotCQlyZXR1cm4gZnJhZ21lbnQ7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0Q2hpbGRGcmFnbWVudHMoKSB7Ci0JCUxpc3QgbGlzdEltcGwgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWNyZWF0ZUNoaWxkRnJhZ21lbnRzKGxpc3RJbXBsKTsKLQkJcmV0dXJuIGxpc3RJbXBsOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNoaWxkRnJhZ21lbnRzKExpc3QgbGlzdCkgewotCQlpZiAoZ2V0VGFza01vZGVsKCkgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCUJ5dGUgYiA9IChCeXRlKSBnZXRUYXNrTW9kZWwoKS5nZXRPYmplY3QoTU9ERSk7Ci0JCWlmIChiICE9IG51bGwgJiYgYi5ieXRlVmFsdWUoKSA9PSBNT0RFX01BTlVBTCkgewotCQkJSVJ1bnRpbWUgcnVudGltZSA9IChJUnVudGltZSkgZ2V0VGFza01vZGVsKCkuZ2V0T2JqZWN0KFRhc2tNb2RlbC5UQVNLX1JVTlRJTUUpOwotCQkJaWYgKHJ1bnRpbWUgIT0gbnVsbCAmJiBydW50aW1lIGluc3RhbmNlb2YgSVJ1bnRpbWVXb3JraW5nQ29weSkgewotCQkJCVdpemFyZEZyYWdtZW50IHN1YiA9IGdldFdpemFyZEZyYWdtZW50KHJ1bnRpbWUuZ2V0UnVudGltZVR5cGUoKS5nZXRJZCgpKTsKLQkJCQlpZiAoc3ViICE9IG51bGwpCi0JCQkJCWxpc3QuYWRkKHN1Yik7Ci0JCQl9Ci0JCQkKLQkJCUlTZXJ2ZXJBdHRyaWJ1dGVzIHNlcnZlciA9IChJU2VydmVyQXR0cmlidXRlcykgZ2V0VGFza01vZGVsKCkuZ2V0T2JqZWN0KFRhc2tNb2RlbC5UQVNLX1NFUlZFUik7Ci0JCQlpZiAoc2VydmVyICE9IG51bGwpIHsKLQkJCQkvLyBjcmVhdGVDb25maWd1cmF0aW9uKHNlcnZlcik7Ci0JCQkJaWYgKHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkuaGFzU2VydmVyQ29uZmlndXJhdGlvbigpICYmIHNlcnZlciBpbnN0YW5jZW9mIFNlcnZlcldvcmtpbmdDb3B5KSB7Ci0JCQkJCVNlcnZlcldvcmtpbmdDb3B5IHN3YyA9IChTZXJ2ZXJXb3JraW5nQ29weSkgc2VydmVyOwotCQkJCQlzd2MuaW1wb3J0Q29uZmlndXJhdGlvbihydW50aW1lLCBudWxsKTsKLQkJCQl9Ci0JCQkJV2l6YXJkRnJhZ21lbnQgc3ViID0gZ2V0V2l6YXJkRnJhZ21lbnQoc2VydmVyLmdldFNlcnZlclR5cGUoKS5nZXRJZCgpKTsKLQkJCQlpZiAoc3ViICE9IG51bGwpCi0JCQkJCWxpc3QuYWRkKHN1Yik7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoYiAhPSBudWxsICYmIGIuYnl0ZVZhbHVlKCkgPT0gTU9ERV9FWElTVElORykgewotCQkJLyppZiAoY29tcCAhPSBudWxsKSB7Ci0JCQkJSVNlcnZlciBzZXJ2ZXIgPSBjb21wLmdldFNlcnZlcigpOwotCQkJCWlmIChzZXJ2ZXIgIT0gbnVsbCkKLQkJCQkJbGlzdC5hZGQobmV3IFRhc2tzV2l6YXJkRnJhZ21lbnQoKSk7Ci0JCQl9Ki8KLQkJfQotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0NvbXBsZXRlKCkgewotCQlpZiAoY29tcCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gY29tcC5nZXRTZXJ2ZXIoKSAhPSBudWxsOyAKLQl9Ci0JCi0JcHVibGljIElTZXJ2ZXJXb3JraW5nQ29weSBnZXRTZXJ2ZXIoKSB7Ci0JCWlmIChjb21wID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGNvbXAuZ2V0U2VydmVyKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNQcmVmZXJyZWRTZXJ2ZXIoKSB7Ci0JCWlmIChjb21wID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBjb21wLmlzUHJlZmVycmVkU2VydmVyKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9mcmFnbWVudC9TZXJ2ZXJDb25maWd1cmF0aW9uV2l6YXJkRnJhZ21lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9mcmFnbWVudC9TZXJ2ZXJDb25maWd1cmF0aW9uV2l6YXJkRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTY4MDNkNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvZnJhZ21lbnQvU2VydmVyQ29uZmlndXJhdGlvbldpemFyZEZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLmZyYWdtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuV2l6YXJkRnJhZ21lbnQ7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgU2VydmVyQ29uZmlndXJhdGlvbldpemFyZEZyYWdtZW50IGV4dGVuZHMgV2l6YXJkRnJhZ21lbnQgewotCXB1YmxpYyBTZXJ2ZXJDb25maWd1cmF0aW9uV2l6YXJkRnJhZ21lbnQoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0JCi0JcHVibGljIHZvaWQgZW50ZXIoKSB7Ci0JCS8vVGFza01vZGVsIG1vZGVsID0gZ2V0VGFza01vZGVsKCk7Ci0JCS8vSVJ1bnRpbWUgcnVudGltZSA9IChJUnVudGltZSkgbW9kZWwuZ2V0T2JqZWN0KFRhc2tNb2RlbC5UQVNLX1JVTlRJTUUpOwotCQkvL0lTZXJ2ZXJXb3JraW5nQ29weSBzZXJ2ZXIgPSAoSVNlcnZlcldvcmtpbmdDb3B5KSBtb2RlbC5nZXRPYmplY3QoVGFza01vZGVsLlRBU0tfU0VSVkVSKTsKLQkJCi0JCS8vSVNlcnZlclR5cGUgdHlwZSA9IHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCk7Ci0JCS8qaWYgKHR5cGUuaGFzU2VydmVyQ29uZmlndXJhdGlvbigpICYmIHNlcnZlci5nZXRTZXJ2ZXJDb25maWd1cmF0aW9uKCkgPT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlJRmlsZSBmaWxlID0gbnVsbDsKLQkJCQlpZiAoU2VydmVyQ29yZS5nZXRTZXJ2ZXJQcmVmZXJlbmNlcygpLmlzQ3JlYXRlUmVzb3VyY2VzSW5Xb3Jrc3BhY2UoKSkKLQkJCQkJZmlsZSA9IFNlcnZlclV0aWwuZ2V0VW51c2VkU2VydmVyQ29uZmlndXJhdGlvbkZpbGUoV2l6YXJkVXRpbC5nZXRTZXJ2ZXJQcm9qZWN0KCksIHR5cGUuZ2V0U2VydmVyQ29uZmlndXJhdGlvblR5cGUoKSk7Ci0JCQkJCi0JCQkJSVNlcnZlckNvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBzZXJ2ZXJDb25maWd1cmF0aW9uID0gdHlwZS5nZXRTZXJ2ZXJDb25maWd1cmF0aW9uVHlwZSgpLmltcG9ydEZyb21SdW50aW1lKG51bGwsIGZpbGUsIHJ1bnRpbWUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCVNlcnZlclV0aWwuc2V0U2VydmVyQ29uZmlndXJhdGlvbkRlZmF1bHROYW1lKHNlcnZlckNvbmZpZ3VyYXRpb24pOwotCQkJCW1vZGVsLnB1dE9iamVjdChUYXNrTW9kZWwuVEFTS19TRVJWRVJfQ09ORklHVVJBVElPTiwgc2VydmVyQ29uZmlndXJhdGlvbik7Ci0JCQkJc2VydmVyLnNldFNlcnZlckNvbmZpZ3VyYXRpb24oc2VydmVyQ29uZmlndXJhdGlvbik7Ci0JCQkJdXBkYXRlQ2hpbGRGcmFnbWVudHMoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IGNyZWF0ZSBjb25maWd1cmF0aW9uIiwgZSk7Ci0JCQl9Ci0JCX0qLwotCX0KLQotCS8qcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ2hpbGRGcmFnbWVudHMoTGlzdCBsaXN0KSB7Ci0JCUlTZXJ2ZXJXb3JraW5nQ29weSBzZXJ2ZXIgPSAoSVNlcnZlcldvcmtpbmdDb3B5KSBnZXRUYXNrTW9kZWwoKS5nZXRPYmplY3QoVGFza01vZGVsLlRBU0tfU0VSVkVSKTsKLQkJSVNlcnZlckNvbmZpZ3VyYXRpb24gc2VydmVyQ29uZmlndXJhdGlvbiA9IG51bGw7Ci0JCWlmIChzZXJ2ZXIgIT0gbnVsbCkKLQkJCXNlcnZlckNvbmZpZ3VyYXRpb24gPSBzZXJ2ZXIuZ2V0U2VydmVyQ29uZmlndXJhdGlvbigpOwotCQlpZiAoc2VydmVyQ29uZmlndXJhdGlvbiAhPSBudWxsKSB7Ci0JCQlXaXphcmRGcmFnbWVudCBzdWIgPSBTZXJ2ZXJVSUNvcmUuZ2V0V2l6YXJkRnJhZ21lbnQoc2VydmVyQ29uZmlndXJhdGlvbi5nZXRTZXJ2ZXJDb25maWd1cmF0aW9uVHlwZSgpLmdldElkKCkpOwotCQkJaWYgKHN1YiAhPSBudWxsKQotCQkJCWxpc3QuYWRkKHN1Yik7Ci0JCX0KLQl9Ki8KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvZnJhZ21lbnQvVGFza3NXaXphcmRGcmFnbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL2ZyYWdtZW50L1Rhc2tzV2l6YXJkRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjlhM2RhYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvZnJhZ21lbnQvVGFza3NXaXphcmRGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQuZnJhZ21lbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLlB1Ymxpc2hPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5lZGl0b3IuSU9yZGVyZWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQucGFnZS5UYXNrc0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLndpemFyZC5JV2l6YXJkSGFuZGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkud2l6YXJkLldpemFyZEZyYWdtZW50OwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFRhc2tzV2l6YXJkRnJhZ21lbnQgZXh0ZW5kcyBXaXphcmRGcmFnbWVudCB7Ci0JcHVibGljIGNsYXNzIFRhc2tJbmZvIGltcGxlbWVudHMgSU9yZGVyZWQgewotCQlwdWJsaWMgaW50IGtpbmQ7Ci0JCXB1YmxpYyBTdHJpbmcgaWQ7Ci0JCXB1YmxpYyBQdWJsaXNoT3BlcmF0aW9uIHRhc2syOwotCQkKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFQgPSAiZGVmYXVsdDoiOwotCQkKLQkJcHVibGljIGJvb2xlYW4gaXNTZWxlY3RlZCgpIHsKLQkJCWlmIChpZCA9PSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCQotCQkJaWYgKHNlbGVjdGVkVGFza01hcC5jb250YWluc0tleShpZCkpCi0JCQkJcmV0dXJuICgoQm9vbGVhbikgc2VsZWN0ZWRUYXNrTWFwLmdldChpZCkpLmJvb2xlYW5WYWx1ZSgpOwotCQkJCi0JCQlpZiAoc2VsZWN0ZWRUYXNrTWFwLmNvbnRhaW5zS2V5KERFRkFVTFQgKyBpZCkpCi0JCQkJcmV0dXJuICgoQm9vbGVhbikgc2VsZWN0ZWRUYXNrTWFwLmdldChERUZBVUxUICsgaWQpKS5ib29sZWFuVmFsdWUoKTsKLQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0U2VsZWN0ZWQoYm9vbGVhbiBzZWwpIHsKLQkJCXNlbGVjdGVkVGFza01hcC5wdXQoREVGQVVMVCArIGdldElkKCksIG5ldyBCb29sZWFuKHNlbCkpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gZ2V0RGVmYXVsdFNlbGVjdGVkKCkgewotCQkJcmV0dXJuICgoQm9vbGVhbikgc2VsZWN0ZWRUYXNrTWFwLmdldChERUZBVUxUICsgaWQpKS5ib29sZWFuVmFsdWUoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldFNlbGVjdGVkKGJvb2xlYW4gc2VsKSB7Ci0JCQlzZWxlY3RlZFRhc2tNYXAucHV0KGdldElkKCksIG5ldyBCb29sZWFuKHNlbCkpOwotCQl9Ci0JCQotCQlwdWJsaWMgaW50IGdldE9yZGVyKCkgewotCQkJcmV0dXJuIHRhc2syLmdldE9yZGVyKCk7Ci0JCX0KLQkJCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0SWQoKSB7Ci0JCQlyZXR1cm4gaWQ7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgVGFza3NDb21wb3NpdGUgY29tcDsKLQotCXByb3RlY3RlZCBMaXN0IHRhc2tzOwotCXByb3RlY3RlZCBib29sZWFuIGhhc09wdGlvbmFsVGFza3M7Ci0JCi0JcHJvdGVjdGVkIE1hcCBzZWxlY3RlZFRhc2tNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQotCXB1YmxpYyBUYXNrc1dpemFyZEZyYWdtZW50KCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCQotCXB1YmxpYyB2b2lkIGVudGVyKCkgewotCQl1cGRhdGVUYXNrcygpOwotCQkKLQkJaWYgKGNvbXAgIT0gbnVsbCkKLQkJCWNvbXAuY3JlYXRlQ29udHJvbCgpOwotCX0KLQkKLQlwdWJsaWMgTGlzdCBnZXRDaGlsZEZyYWdtZW50cygpIHsKLQkJdXBkYXRlVGFza3MoKTsKLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkRnJhZ21lbnRzKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VGFza01vZGVsKFRhc2tNb2RlbCB0YXNrTW9kZWwpIHsKLQkJc3VwZXIuc2V0VGFza01vZGVsKHRhc2tNb2RlbCk7Ci0JCXVwZGF0ZVRhc2tzKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlVGFza3MoKSB7Ci0JCXRhc2tzID0gbnVsbDsKLQkJaWYgKGdldFRhc2tNb2RlbCgpID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJSVNlcnZlckF0dHJpYnV0ZXMgc2VydmVyID0gKElTZXJ2ZXJBdHRyaWJ1dGVzKSBnZXRUYXNrTW9kZWwoKS5nZXRPYmplY3QoVGFza01vZGVsLlRBU0tfU0VSVkVSKTsKLQkJTGlzdCBtb2R1bGVzID0gKExpc3QpIGdldFRhc2tNb2RlbCgpLmdldE9iamVjdChUYXNrTW9kZWwuVEFTS19NT0RVTEVTKTsKLQkJCi0JCWlmIChzZXJ2ZXIgIT0gbnVsbCAmJiBtb2R1bGVzID09IG51bGwpIHsKLQkJCWZpbmFsIExpc3QgbW9kdWxlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCSgoU2VydmVyKSBzZXJ2ZXIpLnZpc2l0KG5ldyBJTW9kdWxlVmlzaXRvcigpIHsKLQkJCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJTW9kdWxlW10gbW9kdWxlMikgewotCQkJCQltb2R1bGVMaXN0LmFkZChtb2R1bGUyKTsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfSwgbnVsbCk7Ci0KLQkJCW1vZHVsZXMgPSBtb2R1bGVMaXN0OwotCQl9Ci0JCQotCQlpZiAoc2VydmVyICE9IG51bGwgJiYgbW9kdWxlcyAhPSBudWxsKSB7Ci0JCQl0YXNrcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWNyZWF0ZVRhc2tzKHNlcnZlciwgbW9kdWxlcyk7Ci0JCX0KLQkJCi0JCWlmIChjb21wICE9IG51bGwpCi0JCQlEaXNwbGF5LmdldERlZmF1bHQoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQljb21wLnNldFRhc2tzKHRhc2tzKTsKLQkJCQl9Ci0JCQl9KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlVGFza3MoSVNlcnZlckF0dHJpYnV0ZXMgc2VydmVyLCBMaXN0IG1vZHVsZXMpIHsKLQkJaWYgKHNlcnZlciA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCUxpc3QgZW5hYmxlZFRhc2tzID0gKChTZXJ2ZXIpc2VydmVyKS5nZXRFbmFibGVkT3B0aW9uYWxQdWJsaXNoT3BlcmF0aW9uSWRzKCk7Ci0JCUxpc3QgZGlzYWJsZWRUYXNrcyA9ICgoU2VydmVyKXNlcnZlcikuZ2V0RGlzYWJsZWRQcmVmZXJyZWRQdWJsaXNoT3BlcmF0aW9uSWRzKCk7Ci0JCVB1Ymxpc2hPcGVyYXRpb25bXSB0YXNrczIgPSAoKFNlcnZlcilzZXJ2ZXIpLmdldEFsbFRhc2tzKG1vZHVsZXMpOwotCQlmb3IgKGludCBqID0gMDsgaiA8IHRhc2tzMi5sZW5ndGg7IGorKykgewotCQkJaW50IGtpbmQgPSB0YXNrczJbal0uZ2V0S2luZCgpOyAKLQkJCVN0cmluZyBpZCA9ICgoU2VydmVyKXNlcnZlcikuZ2V0UHVibGlzaE9wZXJhdGlvbklkKHRhc2tzMltqXSk7Ci0JCQlpZiAoa2luZCA9PSBQdWJsaXNoT3BlcmF0aW9uLk9QVElPTkFMIHx8IGtpbmQgPT0gUHVibGlzaE9wZXJhdGlvbi5QUkVGRVJSRUQpCi0JCQkJaGFzT3B0aW9uYWxUYXNrcyA9IHRydWU7Ci0JCQl0YXNrczJbal0uc2V0VGFza01vZGVsKGdldFRhc2tNb2RlbCgpKTsKLQkJCQotCQkJYm9vbGVhbiBzZWxlY3RlZCA9IHRydWU7Ci0JCQlpZiAoa2luZCA9PSBQdWJsaXNoT3BlcmF0aW9uLk9QVElPTkFMKSB7Ci0JCQkJaWYgKCFlbmFibGVkVGFza3MuY29udGFpbnMoaWQpKQotCQkJCQlzZWxlY3RlZCA9IGZhbHNlOwotCQkJfSBlbHNlIGlmIChraW5kID09IFB1Ymxpc2hPcGVyYXRpb24uUFJFRkVSUkVEKSB7Ci0JCQkJaWYgKGRpc2FibGVkVGFza3MuY29udGFpbnMoaWQpKQotCQkJCQlzZWxlY3RlZCA9IGZhbHNlOwotCQkJfQotCQkJYWRkU2VydmVyVGFzayhzZXJ2ZXIsIHRhc2tzMltqXSwgc2VsZWN0ZWQpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkU2VydmVyVGFzayhJU2VydmVyQXR0cmlidXRlcyBzZXJ2ZXIsIFB1Ymxpc2hPcGVyYXRpb24gdGFzazIsIGJvb2xlYW4gc2VsZWN0ZWQpIHsKLQkJVGFza0luZm8gc3RpID0gbmV3IFRhc2tJbmZvKCk7Ci0JCXN0aS50YXNrMiA9IHRhc2syOwotCQlzdGkua2luZCA9IHRhc2syLmdldEtpbmQoKTsKLQkJc3RpLmlkID0gKChTZXJ2ZXIpc2VydmVyKS5nZXRQdWJsaXNoT3BlcmF0aW9uSWQodGFzazIpOwotCQlzdGkuc2V0RGVmYXVsdFNlbGVjdGVkKHNlbGVjdGVkKTsKLQkJCi0JCXRhc2tzLmFkZChzdGkpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc0NvbXBvc2l0ZSgpIHsKLQkJcmV0dXJuIGhhc1Rhc2tzKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC50YXNrLldpemFyZFRhc2sjZ2V0V2l6YXJkUGFnZSgpCi0JICovCi0JcHVibGljIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgSVdpemFyZEhhbmRsZSB3aXphcmQpIHsKLQkJY29tcCA9IG5ldyBUYXNrc0NvbXBvc2l0ZShwYXJlbnQsIHdpemFyZCk7Ci0JCXJldHVybiBjb21wOwotCX0KLQotCS8qKgotCSAqIEBzZWUgV2l6YXJkRnJhZ21lbnQjcGVyZm9ybUZpbmlzaChJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIHBlcmZvcm1GaW5pc2goSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmICghaGFzT3B0aW9uYWxUYXNrcykKLQkJCXJldHVybjsKLQkJCi0JCWlmICh0YXNrcyA9PSBudWxsIHx8IHRhc2tzLmlzRW1wdHkoKSkKLQkJCXJldHVybjsKLQkJCi0JCVRhc2tNb2RlbCB0YXNrTW9kZWwgPSBnZXRUYXNrTW9kZWwoKTsKLQkJSVNlcnZlciBzZXJ2ZXIgPSAoSVNlcnZlcil0YXNrTW9kZWwuZ2V0T2JqZWN0KFRhc2tNb2RlbC5UQVNLX1NFUlZFUik7Ci0JCWlmIChzZXJ2ZXIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCWJvb2xlYW4gY3JlYXRlZFdDID0gZmFsc2U7Ci0JCVNlcnZlcldvcmtpbmdDb3B5IHdjID0gbnVsbDsKLQkJaWYgKHNlcnZlciBpbnN0YW5jZW9mIFNlcnZlcldvcmtpbmdDb3B5KQotCQkJd2MgPSAoU2VydmVyV29ya2luZ0NvcHkpc2VydmVyOwotCQllbHNlIHsKLQkJCXdjID0gKFNlcnZlcldvcmtpbmdDb3B5KXNlcnZlci5jcmVhdGVXb3JraW5nQ29weSgpOwotCQkJY3JlYXRlZFdDID0gdHJ1ZTsKLQkJfQotCQl3Yy5yZXNldFByZWZlcnJlZFB1Ymxpc2hPcGVyYXRpb25zKCk7Ci0JCXdjLnJlc2V0T3B0aW9uYWxQdWJsaXNoT3BlcmF0aW9ucygpOwotCQkKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSB0YXNrcy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlUYXNrSW5mbyB0YXNrID0gKFRhc2tJbmZvKWl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChQdWJsaXNoT3BlcmF0aW9uLlJFUVVJUkVEID09IHRhc2sua2luZCkKLQkJCQljb250aW51ZTsKLQkJCQotCQkJaWYgKFB1Ymxpc2hPcGVyYXRpb24uUFJFRkVSUkVEID09IHRhc2sua2luZCkgewotCQkJCWlmICghdGFzay5pc1NlbGVjdGVkKCkpCi0JCQkJCXdjLmRpc2FibGVQcmVmZXJyZWRQdWJsaXNoT3BlcmF0aW9ucyh0YXNrLnRhc2syKTsKLQkJCX0gZWxzZSBpZiAoUHVibGlzaE9wZXJhdGlvbi5PUFRJT05BTCA9PSB0YXNrLmtpbmQpIHsKLQkJCQlpZiAodGFzay5pc1NlbGVjdGVkKCkpCi0JCQkJCXdjLmVuYWJsZU9wdGlvbmFsUHVibGlzaE9wZXJhdGlvbnModGFzay50YXNrMik7Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmIChjcmVhdGVkV0MgJiYgd2MuaXNEaXJ0eSgpKQotCQkJd2Muc2F2ZSh0cnVlLCBtb25pdG9yKTsKLQkJbW9uaXRvci5kb25lKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgd2l6YXJkIGhhcyB0YXNrcy4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgd2l6YXJkIGhhcyB0YXNrcywgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqICAgIG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc1Rhc2tzKCkgewotCQlyZXR1cm4gdGFza3MgPT0gbnVsbCB8fCAhdGFza3MuaXNFbXB0eSgpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyB3aXphcmQgaGFzIG9wdGlvbmFsIHRhc2tzLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyB3aXphcmQgaGFzIG9wdGlvbmFsIHRhc2tzLCBhbmQKLQkgKiAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzT3B0aW9uYWxUYXNrcygpIHsKLQkJcmV0dXJuIGhhc09wdGlvbmFsVGFza3M7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9wYWdlL0VsZW1lbnRDcmVhdGlvbkNhY2hlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvcGFnZS9FbGVtZW50Q3JlYXRpb25DYWNoZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODU5NjFlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9wYWdlL0VsZW1lbnRDcmVhdGlvbkNhY2hlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLaAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLnBhZ2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyV29ya2luZ0NvcHk7Ci0vKioKLSAqIEEgaGVscGVyIGNsYXNzIHVzZWQgdG8gY2FjaGUgdGhlIGNyZWF0aW9uIG9mIHNlcnZlciBlbGVtZW50cy4KLSAqLwotcHVibGljIGNsYXNzIEVsZW1lbnRDcmVhdGlvbkNhY2hlIHsKLQlwcm90ZWN0ZWQgTWFwIGVsZW1lbnRDYWNoZTsKLQlwcm90ZWN0ZWQgTWFwIHRhc2tDYWNoZTsKLQotCS8qKgotCSAqIEVsZW1lbnRDcmVhdGlvbkNhY2hlIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEVsZW1lbnRDcmVhdGlvbkNhY2hlKCkgewotCQlzdXBlcigpOwotCQllbGVtZW50Q2FjaGUgPSBuZXcgSGFzaE1hcCgpOwotCQl0YXNrQ2FjaGUgPSBuZXcgSGFzaE1hcCgpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGtleSB0byB1c2UgZm9yIHRoZSBnaXZlbiBmYWN0b3J5LgotCSAqCi0JICogQHBhcmFtIHR5cGUgdGhlIHNlcnZlciB0eXBlCi0JICogQHBhcmFtIGhvc3QgdGhlIHNlcnZlciBob3N0Ci0JICogQHJldHVybiB0aGUga2V5Ci0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRLZXkoSVNlcnZlclR5cGUgdHlwZSwgU3RyaW5nIGhvc3QpIHsKLQkJcmV0dXJuIHR5cGUuZ2V0SWQoKSArICJ8IiArIGhvc3QgKyAifCI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIHNlcnZlci4gCi0JICoKLQkgKiBAcGFyYW0gdHlwZQotCSAqIEBwYXJhbSBob3N0IGEgaG9zdG5hbWUgb3IgSVAKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IKLQkgKiBAcmV0dXJuIGEgc2VydmVyIHdvcmtpbmcgY29weQotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiBhbnl0aGluZyBnb2VzIHdyb25nCi0JICovCi0JcHVibGljIElTZXJ2ZXJXb3JraW5nQ29weSBnZXRTZXJ2ZXIoSVNlcnZlclR5cGUgdHlwZSwgU3RyaW5nIGhvc3QsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0cnkgewotCQkJSVNlcnZlcldvcmtpbmdDb3B5IHNlcnZlciA9IGdldENhY2hlZFNlcnZlcih0eXBlLCBob3N0KTsKLQkJCWlmIChzZXJ2ZXIgIT0gbnVsbCkKLQkJCQlyZXR1cm4gc2VydmVyOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQkKLQkJdHJ5IHsKLQkJCUlGaWxlIGZpbGUgPSBudWxsOwotCQkJLy9pZiAoU2VydmVyUHJlZmVyZW5jZXMuZ2V0SW5zdGFuY2UoKS5pc0NyZWF0ZVJlc291cmNlc0luV29ya3NwYWNlKCkpCi0JCQkvLwlmaWxlID0gU2VydmVyVXRpbC5nZXRVbnVzZWRTZXJ2ZXJGaWxlKFdpemFyZFV0aWwuZ2V0U2VydmVyUHJvamVjdCgpLCB0eXBlKTsKLQkJCQotCQkJSVNlcnZlcldvcmtpbmdDb3B5IHNlcnZlciA9IHR5cGUuY3JlYXRlU2VydmVyKG51bGwsIGZpbGUsIChJUnVudGltZSludWxsLCBtb25pdG9yKTsKLQkJCWVsZW1lbnRDYWNoZS5wdXQoZ2V0S2V5KHR5cGUsIGhvc3QpLCBzZXJ2ZXIpOwotCQkJcmV0dXJuIHNlcnZlcjsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJdGhyb3cgY2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgY2FjaGVkIHNlcnZlciByZXNvdXJjZS4gCi0JICoKLQkgKiBAcGFyYW0gdHlwZSB0aGUgc2VydmVyIHR5cGUKLQkgKiBAcGFyYW0gaG9zdCBhIGhvc3RuYW1lIG9yIElQCi0JICogQHJldHVybiBhIHdvcmtpbmcgY29weQotCSAqLwotCXB1YmxpYyBJU2VydmVyV29ya2luZ0NvcHkgZ2V0Q2FjaGVkU2VydmVyKElTZXJ2ZXJUeXBlIHR5cGUsIFN0cmluZyBob3N0KSB7Ci0JCXRyeSB7Ci0JCQlJU2VydmVyV29ya2luZ0NvcHkgc2VydmVyID0gKElTZXJ2ZXJXb3JraW5nQ29weSkgZWxlbWVudENhY2hlLmdldChnZXRLZXkodHlwZSwgaG9zdCkpOwotCQkJaWYgKHNlcnZlciAhPSBudWxsKQotCQkJCXJldHVybiBzZXJ2ZXI7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvcGFnZS9GaXhlZFRhYmxlTGF5b3V0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvcGFnZS9GaXhlZFRhYmxlTGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwN2JhMjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL3BhZ2UvRml4ZWRUYWJsZUxheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZC5wYWdlOwotCi0vL2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotLy9pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBGaXhlZFRhYmxlTGF5b3V0IGV4dGVuZHMgTGF5b3V0IHsKLQkvL3ByaXZhdGUgTGlzdCBjb2x1bW5zID0gbmV3IEFycmF5TGlzdCgpOwotCQotCS8qcHVibGljIHZvaWQgYWRkQ29sdW1uRGF0YShJbnRlZ2VyIGRhdGEpIHsKLQkJY29sdW1ucy5hZGQoZGF0YSk7Ci0JfSovCi0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYXlvdXQjY29tcHV0ZVNpemUob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLCBpbnQsIGludCwgYm9vbGVhbikKLQkgKi8KLQlwcm90ZWN0ZWQgUG9pbnQgY29tcHV0ZVNpemUoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgaW50IHdIaW50LCBpbnQgaEhpbnQsIGJvb2xlYW4gZmx1c2hDYWNoZSkgewotCQlUYWJsZSB0YWJsZSA9IChUYWJsZSkgY29tcG9zaXRlOwotCQlQb2ludCByZXN1bHQgPSB0YWJsZS5jb21wdXRlU2l6ZSh3SGludCwgaEhpbnQsIGZsdXNoQ2FjaGUpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxheW91dCNsYXlvdXQob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLCBib29sZWFuKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxheW91dChDb21wb3NpdGUgY29tcG9zaXRlLCBib29sZWFuIGZsdXNoQ2FjaGUpIHsKLQkJVGFibGUgdGFibGUgPSAoVGFibGUpIGNvbXBvc2l0ZTsKLQkJVGFibGVDb2x1bW5bXSB0YWJsZUNvbHVtbnMgPSB0YWJsZS5nZXRDb2x1bW5zKCk7Ci0JCWludCB3aWR0aCA9IHRhYmxlLmdldENsaWVudEFyZWEoKS53aWR0aCAtIDEwOwotCQkKLQkJdGFibGVDb2x1bW5zWzBdLnNldFdpZHRoKHdpZHRoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvcGFnZS9Ib3N0bmFtZUNvbXBvc2l0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL3BhZ2UvSG9zdG5hbWVDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA4ZDliYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvcGFnZS9Ib3N0bmFtZUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQucGFnZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuU1dUVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlNlcnZlclVJUGx1Z2luOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLS8qKgotICogQSBjb21wb3NpdGUgdXNlZCB0byBzZWxlY3QgYSBob3N0bmFtZS4KLSAqLwotcHVibGljIGNsYXNzIEhvc3RuYW1lQ29tcG9zaXRlIGV4dGVuZHMgQ29tcG9zaXRlIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9DQUxIT1NUID0gImxvY2FsaG9zdCI7Ci0JcHJvdGVjdGVkIFN0cmluZyBob3N0OwotCXByb3RlY3RlZCBJSG9zdG5hbWVTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcjsKLQkKLQlwcm90ZWN0ZWQgQ29tYm8gY29tYm87Ci0JCi0JcHVibGljIGludGVyZmFjZSBJSG9zdG5hbWVTZWxlY3Rpb25MaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIGhvc3RuYW1lU2VsZWN0ZWQoU3RyaW5nIGhvc3QpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBIb3N0bmFtZUNvbXBvc2l0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50IGEgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBsaXN0ZW5lcjIgYSBob3N0bmFtZSBzZWxlY3Rpb24gbGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgSG9zdG5hbWVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgSUhvc3RuYW1lU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIyKSB7Ci0JCXN1cGVyKHBhcmVudCwgU1dULk5PTkUpOwotCQl0aGlzLmxpc3RlbmVyID0gbGlzdGVuZXIyOwotCQkKLQkJY3JlYXRlQ29udHJvbCgpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFVJIG9mIHRoZSBwYWdlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRyb2woKSB7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gU1dUVXRpbC5jb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyh0aGlzLCA0KTsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IFNXVFV0aWwuY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKHRoaXMsIDQpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQlzZXRMYXlvdXQobGF5b3V0KTsKLQkJLy9Xb3JrYmVuY2hIZWxwLnNldEhlbHAodGhpcywgQ29udGV4dElkcy5TRUxFQ1RfQ0xJRU5UX1dJWkFSRCk7Ci0JCQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbCh0aGlzLCBTV1QuV1JBUCk7Ci0JCWxhYmVsLnNldFRleHQoTWVzc2FnZXMuaG9zdG5hbWUpOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQkJCi0JCUxpc3QgaG9zdHMgPSBTZXJ2ZXJVSVBsdWdpbi5nZXRQcmVmZXJlbmNlcygpLmdldEhvc3RuYW1lcygpOwotCQlTdHJpbmdbXSBzID0gbmV3IFN0cmluZ1tob3N0cy5zaXplKCldOwotCQlob3N0cy50b0FycmF5KHMpOwotCQkKLQkJY29tYm8gPSBuZXcgQ29tYm8odGhpcywgU1dULkRST1BfRE9XTik7Ci0JCWNvbWJvLnNldEl0ZW1zKHMpOwotCQljb21iby5zZXRUZXh0KExPQ0FMSE9TVCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWNvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQljb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlob3N0bmFtZUNoYW5nZWQoY29tYm8uZ2V0VGV4dCgpKTsKLQkJCX0KLQkJfSk7Ci0JCWNvbWJvLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCVBvaW50IHAgPSBjb21iby5nZXRTZWxlY3Rpb24oKTsKLQkJCQlob3N0bmFtZUNoYW5nZWQoY29tYm8uZ2V0VGV4dCgpKTsKLQkJCQljb21iby5zZXRTZWxlY3Rpb24ocCk7Ci0JCQl9Ci0JCX0pOwotCQotCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KHRoaXMpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGhvc3RuYW1lQ2hhbmdlZChTdHJpbmcgbmV3SG9zdCkgewotCQlpZiAobmV3SG9zdCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkKLQkJaWYgKG5ld0hvc3QuZXF1YWxzKGhvc3QpKQotCQkJcmV0dXJuOwotCi0JCWhvc3QgPSBuZXdIb3N0OwotCQlsaXN0ZW5lci5ob3N0bmFtZVNlbGVjdGVkKGhvc3QpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SG9zdG5hbWUoKSB7Ci0JCXJldHVybiBob3N0OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEhvc3RuYW1lKFN0cmluZyBob3N0bmFtZSkgewotCQljb21iby5zZXRUZXh0KGhvc3RuYW1lKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL3BhZ2UvTW9kaWZ5TW9kdWxlc0NvbXBvc2l0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL3BhZ2UvTW9kaWZ5TW9kdWxlc0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTJkZjMzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9wYWdlL01vZGlmeU1vZHVsZXNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLnBhZ2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JTWVzc2FnZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuRG91YmxlQ2xpY2tFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklEb3VibGVDbGlja0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyU29ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLlNlcnZlclVJQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuSVdpemFyZEhhbmRsZTsKLS8qKgotICogQSB3aXphcmQgcGFnZSB1c2VkIHRvIGFkZCBhbmQgcmVtb3ZlIG1vZHVsZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2RpZnlNb2R1bGVzQ29tcG9zaXRlIGV4dGVuZHMgQ29tcG9zaXRlIHsKLQlwcm90ZWN0ZWQgSVdpemFyZEhhbmRsZSB3aXphcmQ7Ci0KLQlwcm90ZWN0ZWQgSVNlcnZlckF0dHJpYnV0ZXMgc2VydmVyOwotCi0JcHJvdGVjdGVkIE1hcCBjaGlsZE1vZHVsZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JcHJvdGVjdGVkIE1hcCBwYXJlbnRNb2R1bGVNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JLy8gb3JpZ2luYWwgbW9kdWxlcyBvbiB0aGUgc2VydmVyCi0JcHJvdGVjdGVkIExpc3Qgb3JpZ2luYWxNb2R1bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JLy8gbW9kdWxlcyBhdmFpbGFibGUgdG8gYmUgYWRkZWQgdG8gdGhlIHNlcnZlcgotCXByb3RlY3RlZCBMaXN0IG1vZHVsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkvLyBjdXJyZW50IG1vZHVsZXMgb24gdGhlIHNlcnZlcgotCXByb3RlY3RlZCBMaXN0IGRlcGxveWVkID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJvdGVjdGVkIFRyZWVWaWV3ZXIgYXZhaWxhYmxlVHJlZVZpZXdlcjsKLQlwcm90ZWN0ZWQgVHJlZVZpZXdlciBkZXBsb3llZFRyZWVWaWV3ZXI7Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIGFkZCwgYWRkQWxsOwotCXByb3RlY3RlZCBCdXR0b24gcmVtb3ZlLCByZW1vdmVBbGw7Ci0KLQlwcm90ZWN0ZWQgVGFza01vZGVsIHRhc2tNb2RlbDsKLQlwcm90ZWN0ZWQgSU1vZHVsZSBuZXdNb2R1bGU7Ci0JcHJvdGVjdGVkIElNb2R1bGUgb3JpZ05ld01vZHVsZTsKLQotCXByb3RlY3RlZCBNYXAgZXJyb3JNYXA7Ci0KLQlhYnN0cmFjdCBjbGFzcyBUcmVlQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVRyZWVDb250ZW50UHJvdmlkZXIgewotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0KLQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQkJCi0JCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkgewotCQkJSU1vZHVsZVtdIHBhcmVudCA9IChJTW9kdWxlW10pIHBhcmVudEVsZW1lbnQ7Ci0JCQlJTW9kdWxlW10gY2hpbGRyZW4gPSAoSU1vZHVsZVtdKSBjaGlsZE1vZHVsZU1hcC5nZXQobmV3IENoaWxkTW9kdWxlTWFwS2V5KHBhcmVudCkpOwotCQkJCi0JCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlpZiAoY2hpbGRyZW4gIT0gbnVsbCkgewotCQkJCWludCBzaXplID0gY2hpbGRyZW4ubGVuZ3RoOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJCUlNb2R1bGUgY2hpbGQgPSBjaGlsZHJlbltpXTsKLQkJCQkJCi0JCQkJCXBhcmVudE1vZHVsZU1hcC5wdXQoY2hpbGQsIHBhcmVudCk7Ci0JCQkJCQotCQkJCQlpbnQgc2l6ZTIgPSBwYXJlbnQubGVuZ3RoOwotCQkJCQlJTW9kdWxlW10gbW9kdWxlMiA9IG5ldyBJTW9kdWxlW3NpemUyICsgMV07Ci0JCQkJCVN5c3RlbS5hcnJheWNvcHkocGFyZW50LCAwLCBtb2R1bGUyLCAwLCBzaXplMik7Ci0JCQkJCW1vZHVsZTJbc2l6ZTJdID0gY2hpbGQ7Ci0JCQkJCWxpc3QuYWRkKG1vZHVsZTIpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBsaXN0LnRvQXJyYXkoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KSB7Ci0JCQlJTW9kdWxlW10gY2hpbGQgPSAoSU1vZHVsZVtdKSBlbGVtZW50OwotCQkJcmV0dXJuIChJTW9kdWxlW10pIHBhcmVudE1vZHVsZU1hcC5nZXQoY2hpbGQpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJCUlNb2R1bGVbXSBwYXJlbnQgPSAoSU1vZHVsZVtdKSBlbGVtZW50OwotCQkJSU1vZHVsZVtdIGNoaWxkcmVuID0gKElNb2R1bGVbXSkgY2hpbGRNb2R1bGVNYXAuZ2V0KG5ldyBDaGlsZE1vZHVsZU1hcEtleShwYXJlbnQpKTsKLQkJCXJldHVybiAoY2hpbGRyZW4gIT0gbnVsbCAmJiBjaGlsZHJlbi5sZW5ndGggPiAwKTsKLQkJfQotCX0KLQotCWNsYXNzIEF2YWlsYWJsZUNvbnRlbnRQcm92aWRlciBleHRlbmRzIFRyZWVDb250ZW50UHJvdmlkZXIgewotCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBtb2R1bGVzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJSU1vZHVsZSBtb2R1bGUgPSAoSU1vZHVsZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCWxpc3QuYWRkKG5ldyBJTW9kdWxlW10geyBtb2R1bGUgfSk7Ci0JCQl9Ci0JCQlyZXR1cm4gbGlzdC50b0FycmF5KCk7Ci0JCX0KLQl9Ci0KLQljbGFzcyBEZXBsb3llZENvbnRlbnRQcm92aWRlciBleHRlbmRzIFRyZWVDb250ZW50UHJvdmlkZXIgewotCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBkZXBsb3llZC5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCUlNb2R1bGUgbW9kdWxlID0gKElNb2R1bGUpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlsaXN0LmFkZChuZXcgSU1vZHVsZVtdIHsgbW9kdWxlIH0pOwotCQkJfQotCQkJcmV0dXJuIGxpc3QudG9BcnJheSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhlIGtleSBlbGVtZW50IGZvciB0aGUgY2hpbGQgbW9kdWxlIG1hcAotCSAqIENoaWxkTWFwTW9kdWxlS2V5Ci0JICovCi0JcHJvdGVjdGVkIGNsYXNzIENoaWxkTW9kdWxlTWFwS2V5IHsKLQkJcHJpdmF0ZSBJTW9kdWxlW10gbW9kdWxlVHJlZTsKLQkJCi0JCXByb3RlY3RlZCBDaGlsZE1vZHVsZU1hcEtleShJTW9kdWxlIGN1ck1vZHVsZSkgewotCQkJaWYgKGN1ck1vZHVsZSAhPSBudWxsKSB7Ci0JCQkJbW9kdWxlVHJlZSA9IG5ldyBJTW9kdWxlW10geyBjdXJNb2R1bGUgfTsKLQkJCX0KLQkJfQotCQkKLQkJcHJvdGVjdGVkIENoaWxkTW9kdWxlTWFwS2V5KElNb2R1bGVbXSBjdXJNb2R1bGVUcmVlKSB7Ci0JCQltb2R1bGVUcmVlID0gY3VyTW9kdWxlVHJlZTsKLQkJfQotCQkKLQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJCWlmIChvYmogPT0gdGhpcykgLy8gc2FtZSBvYmplY3QKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQotCQkJaWYgKCEob2JqIGluc3RhbmNlb2YgQ2hpbGRNb2R1bGVNYXBLZXkpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCQkKLQkJCUlNb2R1bGVbXSBjdXJDb21wYXJlTW9kdWxlID0gKChDaGlsZE1vZHVsZU1hcEtleSkgb2JqKS5tb2R1bGVUcmVlOwotCQkJaWYgKGN1ckNvbXBhcmVNb2R1bGUgPT0gbW9kdWxlVHJlZSkgewotCQkJCS8vIHRoZSBtb2R1bGUgdHJlZSBpcyB0aGUgc2FtZQotCQkJCXJldHVybiB0cnVlOwotCQkJfSBlbHNlIGlmIChtb2R1bGVUcmVlID09IG51bGwgfHwgY3VyQ29tcGFyZU1vZHVsZSA9PSBudWxsIHx8IG1vZHVsZVRyZWUubGVuZ3RoICE9IGN1ckNvbXBhcmVNb2R1bGUubGVuZ3RoKXsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9IGVsc2UgewotCQkJCS8vIGNvbXBhcmUgZWFjaCBtb2R1bGUKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGN1ckNvbXBhcmVNb2R1bGUubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKCFjdXJDb21wYXJlTW9kdWxlW2ldLmVxdWFscyhtb2R1bGVUcmVlW2ldKSkKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQkJLy8gZm9yY2UgdGhlIHNhbWUgaGFzaCBjb2RlIG9uIGFsbCB0aGUgaW5zdGFuY2VzIHRvIG1ha2VzIHN1cmUgdGhlCi0JCQkvLyBlcXVhbHMoT2JqZWN0KSBtZXRob2QgaXMgYmVpbmcgdXNlZCBmb3IgY29tcGFyaW5nIHRoZSBvYmplY3RzCi0JCQlyZXR1cm4gMTIzNDU7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgTW9kaWZ5TW9kdWxlc0NvbXBvc2l0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50IGEgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSB3aXphcmQgYSB3aXphcmQKLQkgKiBAcGFyYW0gbW9kdWxlIHRoZSBtb2R1bGUgdGhhdCBpcyBiZWluZyBhZGRlZAotCSAqLwotCXB1YmxpYyBNb2RpZnlNb2R1bGVzQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIElXaXphcmRIYW5kbGUgd2l6YXJkLCBJTW9kdWxlIG1vZHVsZSkgewotCQlzdXBlcihwYXJlbnQsIFNXVC5OT05FKTsKLQkJdGhpcy53aXphcmQgPSB3aXphcmQ7Ci0JCW9yaWdOZXdNb2R1bGUgPSBtb2R1bGU7Ci0JCQkKLQkJd2l6YXJkLnNldFRpdGxlKE1lc3NhZ2VzLndpek1vZHVsZVRpdGxlKTsKLQkJd2l6YXJkLnNldERlc2NyaXB0aW9uKE1lc3NhZ2VzLndpek1vZHVsZURlc2NyaXB0aW9uKTsKLQkJd2l6YXJkLnNldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19XSVpCQU5fU0VMRUNUX1NFUlZFUikpOwotCQkKLQkJY3JlYXRlQ29udHJvbCgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTZXJ2ZXIoSVNlcnZlckF0dHJpYnV0ZXMgc2VydmVyKSB7Ci0JCWlmIChzZXJ2ZXIgPT0gdGhpcy5zZXJ2ZXIpCi0JCQlyZXR1cm47Ci0KLQkJdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7Ci0JCW9yaWdpbmFsTW9kdWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZGVwbG95ZWQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCW1vZHVsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQotCQljaGlsZE1vZHVsZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQotCQlpZiAoc2VydmVyID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gZ2V0IGN1cnJlbnRseSBkZXBsb3llZCBtb2R1bGVzCi0JCUlNb2R1bGVbXSBjdXJyZW50TW9kdWxlcyA9IHNlcnZlci5nZXRNb2R1bGVzKCk7Ci0JCWlmIChjdXJyZW50TW9kdWxlcyAhPSBudWxsKSB7Ci0JCQlpbnQgc2l6ZSA9IGN1cnJlbnRNb2R1bGVzLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJb3JpZ2luYWxNb2R1bGVzLmFkZChjdXJyZW50TW9kdWxlc1tpXSk7Ci0JCQkJZGVwbG95ZWQuYWRkKGN1cnJlbnRNb2R1bGVzW2ldKTsKLQkJCX0KLQkJfQotCQkKLQkJLy8gYWRkIG5ldyBtb2R1bGUKLQkJbmV3TW9kdWxlID0gbnVsbDsKLQkJZXJyb3JNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlpZiAob3JpZ05ld01vZHVsZSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCUlNb2R1bGVbXSBwYXJlbnRzID0gc2VydmVyLmdldFJvb3RNb2R1bGVzKG9yaWdOZXdNb2R1bGUsIG51bGwpOwotCQkJCWlmIChwYXJlbnRzICE9IG51bGwgJiYgcGFyZW50cy5sZW5ndGggPiAwKQotCQkJCQluZXdNb2R1bGUgPSBwYXJlbnRzWzBdOwotCQkJCWVsc2UKLQkJCQkJbmV3TW9kdWxlID0gb3JpZ05ld01vZHVsZTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCQllcnJvck1hcC5wdXQobmV3TW9kdWxlLCBjZS5nZXRTdGF0dXMoKSk7Ci0JCQkJbmV3TW9kdWxlID0gbnVsbDsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIkNvdWxkIG5vdCBmaW5kIHJvb3QgbW9kdWxlIiwgZSk7Ci0JCQkJbmV3TW9kdWxlID0gbnVsbDsKLQkJCX0KLQkJfQotCQlpZiAobmV3TW9kdWxlICE9IG51bGwgJiYgIWRlcGxveWVkLmNvbnRhaW5zKG5ld01vZHVsZSkpCi0JCQlkZXBsb3llZC5hZGQobmV3TW9kdWxlKTsKLQotCQkvLyBnZXQgcmVtYWluaW5nIG1vZHVsZXMKLQkJSU1vZHVsZVtdIG1vZHVsZXMyID0gU2VydmVyVXRpbC5nZXRNb2R1bGVzKHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkuZ2V0UnVudGltZVR5cGUoKS5nZXRNb2R1bGVUeXBlcygpKTsKLQkJaWYgKG1vZHVsZXMyICE9IG51bGwpIHsKLQkJCWludCBzaXplID0gbW9kdWxlczIubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlJTW9kdWxlIG1vZHVsZSA9IG1vZHVsZXMyW2ldOwotCQkJCWlmICghZGVwbG95ZWQuY29udGFpbnMobW9kdWxlKSkgewotCQkJCQl0cnkgewotCQkJCQkJSU1vZHVsZVtdIHBhcmVudHMgPSBzZXJ2ZXIuZ2V0Um9vdE1vZHVsZXMobW9kdWxlLCBudWxsKTsKLQkJCQkJCWlmIChwYXJlbnRzICE9IG51bGwpIHsKLQkJCQkJCQlpbnQgc2l6ZTIgPSBwYXJlbnRzLmxlbmd0aDsKLQkJCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHNpemUyOyBqKyspIHsKLQkJCQkJCQkJaWYgKHBhcmVudHNbal0uZXF1YWxzKG1vZHVsZSkpIHsKLQkJCQkJCQkJCUlTdGF0dXMgc3RhdHVzID0gc2VydmVyLmNhbk1vZGlmeU1vZHVsZXMobmV3IElNb2R1bGVbXSB7IG1vZHVsZSB9LCBudWxsLCBudWxsKTsKLQkJCQkJCQkJCWlmIChzdGF0dXMgIT0gbnVsbCAmJiAhc3RhdHVzLmlzT0soKSkKLQkJCQkJCQkJCQllcnJvck1hcC5wdXQobW9kdWxlLCBzdGF0dXMpOwotCQkJCQkJCQkJbW9kdWxlcy5hZGQobW9kdWxlKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJCQkJZXJyb3JNYXAucHV0KG1vZHVsZSwgY2UuZ2V0U3RhdHVzKCkpOwotCQkJCQkJbW9kdWxlcy5hZGQobW9kdWxlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIGJ1aWxkIGNoaWxkIG1hcAotCQlJdGVyYXRvciBpdGVyYXRvciA9IGRlcGxveWVkLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCUlNb2R1bGUgbW9kdWxlID0gKElNb2R1bGUpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCXRyeSB7Ci0JCQkJSU1vZHVsZVtdIGNoaWxkcmVuID0gc2VydmVyLmdldENoaWxkTW9kdWxlcyhuZXcgSU1vZHVsZVtdIHsgbW9kdWxlIH0sIG51bGwpOwotCQkJCWlmIChjaGlsZHJlbiAhPSBudWxsICYmIGNoaWxkcmVuLmxlbmd0aCA+IDApCi0JCQkJCWNoaWxkTW9kdWxlTWFwLnB1dChuZXcgQ2hpbGRNb2R1bGVNYXBLZXkobW9kdWxlKSwgY2hpbGRyZW4pOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBpZ25vcmUKLQkJCX0KLQkJfQotCi0JCWl0ZXJhdG9yID0gbW9kdWxlcy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlJTW9kdWxlIG1vZHVsZSA9IChJTW9kdWxlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQl0cnkgewotCQkJCUlNb2R1bGVbXSBjaGlsZHJlbiA9IHNlcnZlci5nZXRDaGlsZE1vZHVsZXMobmV3IElNb2R1bGVbXSB7IG1vZHVsZSB9LCBudWxsKTsKLQkJCQlpZiAoY2hpbGRyZW4gIT0gbnVsbCAmJiBjaGlsZHJlbi5sZW5ndGggPiAwKQotCQkJCQljaGlsZE1vZHVsZU1hcC5wdXQobmV3IENoaWxkTW9kdWxlTWFwS2V5KG1vZHVsZSksIGNoaWxkcmVuKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCX0KLQkJCi0JCWlmIChhdmFpbGFibGVUcmVlVmlld2VyICE9IG51bGwpCi0JCQlEaXNwbGF5LmdldERlZmF1bHQoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQl0cnkgeyAvLyB1cGRhdGUgdHJlZXMgaWYgd2UgY2FuCi0JCQkJCQlhdmFpbGFibGVUcmVlVmlld2VyLnJlZnJlc2goKTsKLQkJCQkJCWRlcGxveWVkVHJlZVZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJCQlzZXRFbmFibGVtZW50KCk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBpZ25vcmUKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl1cGRhdGVUYXNrTW9kZWwoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0VGFza01vZGVsKFRhc2tNb2RlbCBtb2RlbCkgewotCQl0aGlzLnRhc2tNb2RlbCA9IG1vZGVsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFVJIG9mIHRoZSBwYWdlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRyb2woKSB7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gU1dUVXRpbC5jb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyh0aGlzLCA0KTsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IFNXVFV0aWwuY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKHRoaXMsIDQpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0JCXNldExheW91dChsYXlvdXQpOwotCQlzZXRGb250KGdldFBhcmVudCgpLmdldEZvbnQoKSk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodGhpcywgQ29udGV4dElkcy5NT0RJRllfTU9EVUxFU19DT01QT1NJVEUpOwotCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHRoaXMsIFNXVC5OT05FKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMzsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJbGFiZWwuc2V0VGV4dChNZXNzYWdlcy53aXpNb2R1bGVNZXNzYWdlKTsKLQotCQlsYWJlbCA9IG5ldyBMYWJlbCh0aGlzLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoTWVzc2FnZXMud2l6TW9kdWxlQXZhaWxhYmxlTGlzdCk7Ci0JCQotCQlsYWJlbCA9IG5ldyBMYWJlbCh0aGlzLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoIiIpOwotCQkKLQkJbGFiZWwgPSBuZXcgTGFiZWwodGhpcywgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLndpek1vZHVsZURlcGxveWVkTGlzdCk7Ci0KLQkJVHJlZSBhdmFpbGFibGVUcmVlID0gbmV3IFRyZWUodGhpcywgU1dULkJPUkRFUik7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZGF0YS5oZWlnaHRIaW50ID0gMjAwOwotCQlkYXRhLndpZHRoSGludCA9IDE1MDsKLQkJYXZhaWxhYmxlVHJlZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkKLQkJYXZhaWxhYmxlVHJlZVZpZXdlciA9IG5ldyBUcmVlVmlld2VyKGF2YWlsYWJsZVRyZWUpOwotCQlhdmFpbGFibGVUcmVlVmlld2VyLnNldExhYmVsUHJvdmlkZXIoU2VydmVyVUlDb3JlLmdldExhYmVsUHJvdmlkZXIoKSk7Ci0JCWF2YWlsYWJsZVRyZWVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBdmFpbGFibGVDb250ZW50UHJvdmlkZXIoKSk7Ci0JCWF2YWlsYWJsZVRyZWVWaWV3ZXIuc2V0U29ydGVyKG5ldyBWaWV3ZXJTb3J0ZXIoKSk7Ci0JCWF2YWlsYWJsZVRyZWVWaWV3ZXIuc2V0SW5wdXQoInJvb3QiKTsKLQkJCi0JCWF2YWlsYWJsZVRyZWVWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlzZXRFbmFibGVtZW50KCk7Ci0JCQl9Ci0JCX0pOwotCQlhdmFpbGFibGVUcmVlVmlld2VyLmFkZERvdWJsZUNsaWNrTGlzdGVuZXIobmV3IElEb3VibGVDbGlja0xpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgZG91YmxlQ2xpY2soRG91YmxlQ2xpY2tFdmVudCBldmVudCkgewotCQkJCXNldEVuYWJsZW1lbnQoKTsKLQkJCQlpZiAoYWRkLmlzRW5hYmxlZCgpKQotCQkJCQlhZGQoZmFsc2UpOwotCQkJfQotCQl9KTsKLQotCQkvLyBzbG9zaCBidXR0b25zCi0JCUNvbXBvc2l0ZSBjb21wID0gbmV3IENvbXBvc2l0ZSh0aGlzLCBTV1QuTk9ORSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZGF0YS53aWR0aEhpbnQgPSAxMjA7Ci0JCWNvbXAuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSA1OwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMjU7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAyMDsKLQkJY29tcC5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQlhZGQgPSBuZXcgQnV0dG9uKGNvbXAsIFNXVC5QVVNIKTsKLQkJYWRkLnNldFRleHQoTWVzc2FnZXMud2l6TW9kdWxlQWRkKTsKLQkJYWRkLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlhZGQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCWFkZChmYWxzZSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJcmVtb3ZlID0gbmV3IEJ1dHRvbihjb21wLCBTV1QuUFVTSCk7Ci0JCXJlbW92ZS5zZXRUZXh0KE1lc3NhZ2VzLndpek1vZHVsZVJlbW92ZSk7Ci0JCXJlbW92ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJcmVtb3ZlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlyZW1vdmUoZmFsc2UpOwotCQkJfQotCQl9KTsKLQkJCi0JCWxhYmVsID0gbmV3IExhYmVsKGNvbXAsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dCgiIik7Ci0JCQotCQlhZGRBbGwgPSBuZXcgQnV0dG9uKGNvbXAsIFNXVC5QVVNIKTsKLQkJYWRkQWxsLnNldFRleHQoTWVzc2FnZXMud2l6TW9kdWxlQWRkQWxsKTsKLQkJYWRkQWxsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlhZGRBbGwuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCWFkZCh0cnVlKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlyZW1vdmVBbGwgPSBuZXcgQnV0dG9uKGNvbXAsIFNXVC5QVVNIKTsKLQkJcmVtb3ZlQWxsLnNldFRleHQoTWVzc2FnZXMud2l6TW9kdWxlUmVtb3ZlQWxsKTsKLQkJcmVtb3ZlQWxsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlyZW1vdmVBbGwuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXJlbW92ZSh0cnVlKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlUcmVlIGRlcGxveWVkVHJlZSA9IG5ldyBUcmVlKHRoaXMsIFNXVC5CT1JERVIpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWRhdGEud2lkdGhIaW50ID0gMTUwOwotCQlkZXBsb3llZFRyZWUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCi0JCWRlcGxveWVkVHJlZVZpZXdlciA9IG5ldyBUcmVlVmlld2VyKGRlcGxveWVkVHJlZSk7Ci0JCWRlcGxveWVkVHJlZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKFNlcnZlclVJQ29yZS5nZXRMYWJlbFByb3ZpZGVyKCkpOwotCQlkZXBsb3llZFRyZWVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBEZXBsb3llZENvbnRlbnRQcm92aWRlcigpKTsKLQkJZGVwbG95ZWRUcmVlVmlld2VyLnNldFNvcnRlcihuZXcgVmlld2VyU29ydGVyKCkpOwotCQlkZXBsb3llZFRyZWVWaWV3ZXIuc2V0SW5wdXQoInJvb3QiKTsKLQkJCi0JCWRlcGxveWVkVHJlZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCXNldEVuYWJsZW1lbnQoKTsKLQkJCX0KLQkJfSk7Ci0JCWRlcGxveWVkVHJlZVZpZXdlci5hZGREb3VibGVDbGlja0xpc3RlbmVyKG5ldyBJRG91YmxlQ2xpY2tMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGRvdWJsZUNsaWNrKERvdWJsZUNsaWNrRXZlbnQgZXZlbnQpIHsKLQkJCQlzZXRFbmFibGVtZW50KCk7Ci0JCQkJaWYgKHJlbW92ZS5pc0VuYWJsZWQoKSkKLQkJCQkJcmVtb3ZlKGZhbHNlKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlzZXRFbmFibGVtZW50KCk7Ci0JCWF2YWlsYWJsZVRyZWUuc2V0Rm9jdXMoKTsKLQkJCi0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQodGhpcyk7Ci0JfQotCi0JcHJvdGVjdGVkIElNb2R1bGUgZ2V0QXZhaWxhYmxlU2VsZWN0aW9uKCkgewotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGF2YWlsYWJsZVRyZWVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCXJldHVybiBnZXRNb2R1bGUoKElNb2R1bGVbXSkgc2VsLmdldEZpcnN0RWxlbWVudCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSU1vZHVsZSBnZXREZXBsb3llZFNlbGVjdGlvbigpIHsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBkZXBsb3llZFRyZWVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCXJldHVybiBnZXRNb2R1bGUoKElNb2R1bGVbXSkgc2VsLmdldEZpcnN0RWxlbWVudCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIElNb2R1bGUgZ2V0TW9kdWxlKElNb2R1bGVbXSBtb2R1bGVzMikgewotCQlpZiAobW9kdWxlczIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gbW9kdWxlczJbbW9kdWxlczIubGVuZ3RoIC0gMV07Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RW5hYmxlbWVudCgpIHsKLQkJYm9vbGVhbiBlbmFibGVkID0gZmFsc2U7Ci0JCXdpemFyZC5zZXRNZXNzYWdlKG51bGwsIElNZXNzYWdlUHJvdmlkZXIuTk9ORSk7Ci0JCQotCQlJTW9kdWxlIG1vZHVsZSA9IGdldEF2YWlsYWJsZVNlbGVjdGlvbigpOwkJCi0JCWlmIChtb2R1bGUgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlJU3RhdHVzIHN0YXR1cyA9IChJU3RhdHVzKSBlcnJvck1hcC5nZXQobW9kdWxlKTsKLQkJCQlpZiAobW9kdWxlcy5jb250YWlucyhtb2R1bGUpKSB7Ci0JCQkJCWlmIChzdGF0dXMgPT0gbnVsbCkKLQkJCQkJCWVuYWJsZWQgPSB0cnVlOwotCQkJCQllbHNlIGlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKQotCQkJCQkJd2l6YXJkLnNldE1lc3NhZ2Uoc3RhdHVzLmdldE1lc3NhZ2UoKSwgSU1lc3NhZ2VQcm92aWRlci5FUlJPUik7Ci0JCQkJCWVsc2UgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuV0FSTklORykKLQkJCQkJCXdpemFyZC5zZXRNZXNzYWdlKHN0YXR1cy5nZXRNZXNzYWdlKCksIElNZXNzYWdlUHJvdmlkZXIuV0FSTklORyk7Ci0JCQkJCWVsc2UgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuSU5GTykKLQkJCQkJCXdpemFyZC5zZXRNZXNzYWdlKHN0YXR1cy5nZXRNZXNzYWdlKCksIElNZXNzYWdlUHJvdmlkZXIuSU5GT1JNQVRJT04pOwotCQkJCX0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCX0KLQkJYWRkLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCWFkZEFsbC5zZXRFbmFibGVkKG1vZHVsZXMuc2l6ZSgpID4gMCk7Ci0JCQotCQllbmFibGVkID0gZmFsc2U7Ci0JCW1vZHVsZSA9IGdldERlcGxveWVkU2VsZWN0aW9uKCk7Ci0JCWlmIChtb2R1bGUgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlpZiAoZGVwbG95ZWQuY29udGFpbnMobW9kdWxlKSAmJiAhbW9kdWxlLmVxdWFscyhuZXdNb2R1bGUpKQotCQkJCQllbmFibGVkID0gdHJ1ZTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCX0KLQkJcmVtb3ZlLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCWlmIChuZXdNb2R1bGUgPT0gbnVsbCkKLQkJCXJlbW92ZUFsbC5zZXRFbmFibGVkKGRlcGxveWVkLnNpemUoKSA+IDApOwotCQllbHNlCi0JCQlyZW1vdmVBbGwuc2V0RW5hYmxlZChkZXBsb3llZC5zaXplKCkgPiAxKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGQoYm9vbGVhbiBhbGwpIHsKLQkJaWYgKGFsbCkgewotCQkJSU1vZHVsZVtdIG1vZHVsZXMyID0gbmV3IElNb2R1bGVbbW9kdWxlcy5zaXplKCldOwotCQkJbW9kdWxlcy50b0FycmF5KG1vZHVsZXMyKTsKLQkJCW1vdmVBbGwobW9kdWxlczIsIHRydWUpOwotCQl9IGVsc2UKLQkJCW1vdmVBbGwobmV3IElNb2R1bGVbXSB7IGdldEF2YWlsYWJsZVNlbGVjdGlvbigpIH0sIHRydWUpOwotCQl1cGRhdGVUYXNrTW9kZWwoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmUoYm9vbGVhbiBhbGwpIHsKLQkJaWYgKGFsbCkgewotCQkJSU1vZHVsZVtdIG1vZHVsZXMyID0gbmV3IElNb2R1bGVbZGVwbG95ZWQuc2l6ZSgpXTsKLQkJCWRlcGxveWVkLnRvQXJyYXkobW9kdWxlczIpOwotCQkJbW92ZUFsbChtb2R1bGVzMiwgZmFsc2UpOwotCQl9IGVsc2UKLQkJCW1vdmVBbGwobmV3IElNb2R1bGVbXSB7IGdldERlcGxveWVkU2VsZWN0aW9uKCkgfSwgZmFsc2UpOwotCQl1cGRhdGVUYXNrTW9kZWwoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBtb3ZlQWxsKElNb2R1bGVbXSBtb2RzLCBib29sZWFuIGFkZDIpIHsKLQkJaW50IHNpemUgPSBtb2RzLmxlbmd0aDsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJSVN0YXR1cyBzdGF0dXMgPSAoSVN0YXR1cykgZXJyb3JNYXAuZ2V0KG1vZHNbaV0pOwotCQkJCi0JCQlpZiAoc3RhdHVzID09IG51bGwgJiYgIWxpc3QuY29udGFpbnMobW9kc1tpXSkpCi0JCQkJbGlzdC5hZGQobW9kc1tpXSk7Ci0JCX0KLQotCQlJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJSU1vZHVsZSBtb2R1bGUgPSAoSU1vZHVsZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKGFkZDIpIHsKLQkJCQltb2R1bGVzLnJlbW92ZShtb2R1bGUpOwotCQkJCWRlcGxveWVkLmFkZChtb2R1bGUpOwotCQkJfSBlbHNlIGlmICghbW9kdWxlLmVxdWFscyhuZXdNb2R1bGUpKSB7Ci0JCQkJbW9kdWxlcy5hZGQobW9kdWxlKTsKLQkJCQlkZXBsb3llZC5yZW1vdmUobW9kdWxlKTsKLQkJCX0KLQkJfQotCQkKLQkJYXZhaWxhYmxlVHJlZVZpZXdlci5yZWZyZXNoKCk7Ci0JCWRlcGxveWVkVHJlZVZpZXdlci5yZWZyZXNoKCk7Ci0KLQkJc2V0RW5hYmxlbWVudCgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVUYXNrTW9kZWwoKSB7Ci0JCWlmICh0YXNrTW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQl0YXNrTW9kZWwucHV0T2JqZWN0KFRhc2tNb2RlbC5UQVNLX01PRFVMRVMsIGdldE1vZHVsZU1hcCgpKTsKLQkJd2l6YXJkLnVwZGF0ZSgpOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldE1vZHVsZXNUb1JlbW92ZSgpIHsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IG9yaWdpbmFsTW9kdWxlcy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlJTW9kdWxlIG1vZHVsZSA9IChJTW9kdWxlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoIWRlcGxveWVkLmNvbnRhaW5zKG1vZHVsZSkpCi0JCQkJbGlzdC5hZGQobW9kdWxlKTsKLQkJfQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0JCi0JcHVibGljIExpc3QgZ2V0TW9kdWxlc1RvQWRkKCkgewotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZGVwbG95ZWQuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJSU1vZHVsZSBtb2R1bGUgPSAoSU1vZHVsZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKCFvcmlnaW5hbE1vZHVsZXMuY29udGFpbnMobW9kdWxlKSkKLQkJCQlsaXN0LmFkZChtb2R1bGUpOwotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWRkQ2hpbGRNYXAoTGlzdCBtYXAsIElNb2R1bGVbXSBwYXJlbnRzLCBJTW9kdWxlW10gY2hpbGRyZW4pIHsKLQkJaWYgKGNoaWxkcmVuID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQlpbnQgc2l6ZSA9IGNoaWxkcmVuLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCUlNb2R1bGUgbW9kdWxlID0gY2hpbGRyZW5baV07Ci0JCQkKLQkJCWludCBzaXplMiA9IHBhcmVudHMubGVuZ3RoOwotCQkJSU1vZHVsZVtdIG1vZHVsZXMyID0gbmV3IElNb2R1bGVbc2l6ZTIgKyAxXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkocGFyZW50cywgMCwgbW9kdWxlczIsIDAsIHNpemUyKTsKLQkJCW1vZHVsZXMyW3NpemUyXSA9IG1vZHVsZTsKLQkJCW1hcC5hZGQobW9kdWxlczIpOwotCQkJCi0JCQlJTW9kdWxlW10gY2hpbGRyZW4yID0gKElNb2R1bGVbXSkgY2hpbGRNb2R1bGVNYXAuZ2V0KG5ldyBDaGlsZE1vZHVsZU1hcEtleShtb2R1bGUpKTsKLQkJCWlmIChjaGlsZHJlbjIgIT0gbnVsbCkKLQkJCQlhZGRDaGlsZE1hcChtYXAsIG1vZHVsZXMyLCBjaGlsZHJlbjIpOwotCQl9Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0TW9kdWxlTWFwKCkgewotCQlmaW5hbCBMaXN0IG1hcCA9IG5ldyBBcnJheUxpc3QoKTsKLQkKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBkZXBsb3llZC5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlJTW9kdWxlIG1vZHVsZSA9IChJTW9kdWxlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlJTW9kdWxlW10gbW9kdWxlVHJlZSA9IG5ldyBJTW9kdWxlW10geyBtb2R1bGUgfTsKLQkJCW1hcC5hZGQobW9kdWxlVHJlZSk7Ci0JCQlJTW9kdWxlW10gY2hpbGRyZW4gPSAoSU1vZHVsZVtdKSBjaGlsZE1vZHVsZU1hcC5nZXQobmV3IENoaWxkTW9kdWxlTWFwS2V5KG1vZHVsZSkpOwotCQkJaWYgKGNoaWxkcmVuICE9IG51bGwpCi0JCQkJYWRkQ2hpbGRNYXAobWFwLCBtb2R1bGVUcmVlLCBjaGlsZHJlbik7Ci0JCX0KLQkJCi0JCXJldHVybiBtYXA7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9wYWdlL05ld0RldGVjdFNlcnZlckNvbXBvc2l0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL3BhZ2UvTmV3RGV0ZWN0U2VydmVyQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhYWNhNmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL3BhZ2UvTmV3RGV0ZWN0U2VydmVyQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZC5wYWdlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlckF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlNXVFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLS8qKgotICogQSB3aXphcmQgcGFnZSB1c2VkIHRvIGRldGVjdCBhIHNlcnZlci4KLSAqLwotcHVibGljIGNsYXNzIE5ld0RldGVjdFNlcnZlckNvbXBvc2l0ZSBleHRlbmRzIENvbXBvc2l0ZSB7Ci0JcHJvdGVjdGVkIFN0cmluZyBob3N0OwotCQotCXByb3RlY3RlZCBJU2VydmVyV29ya2luZ0NvcHkgc2VydmVyOwotCXByb3RlY3RlZCBJU2VydmVyU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXI7Ci0JCi0JcHJvdGVjdGVkIExpc3Qgc2VydmVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkKLQlwcm90ZWN0ZWQgQnV0dG9uIGRldGVjdDsKLQlwcm90ZWN0ZWQgVGFibGUgdGFibGU7Ci0JcHJvdGVjdGVkIFRhYmxlVmlld2VyIHRhYmxlVmlld2VyOwotCXByb3RlY3RlZCBMYWJlbCBob3N0TGFiZWw7Ci0KLQlwdWJsaWMgaW50ZXJmYWNlIElTZXJ2ZXJTZWxlY3Rpb25MaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIHNlcnZlclNlbGVjdGVkKElTZXJ2ZXJBdHRyaWJ1dGVzIHNlcnZlcik7Ci0JfQotCQotCXB1YmxpYyBjbGFzcyBTZXJ2ZXJDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciB7Ci0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQotCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQkJcmV0dXJuIHNlcnZlcnMudG9BcnJheSgpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQl9Ci0JCi0JcHVibGljIGNsYXNzIFNlcnZlckxhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJVGFibGVMYWJlbFByb3ZpZGVyIHsKLQkJcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcjIpIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQotCQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQkJSVNlcnZlciBzZXJ2ZXIyID0gKElTZXJ2ZXIpIGVsZW1lbnQ7Ci0JCQlpZiAoY29sdW1uSW5kZXggPT0gMCkKLQkJCQlyZXR1cm4gc2VydmVyMi5nZXROYW1lKCk7Ci0JCQllbHNlIGlmIChjb2x1bW5JbmRleCA9PSAwKQotCQkJCXJldHVybiAibi9hIjsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIyKSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgTmV3RGV0ZWN0U2VydmVyQ29tcG9zaXRlLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQgYSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIGxpc3RlbmVyMiBhIHNlcnZlciBzZWxlY3Rpb24gbGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgTmV3RGV0ZWN0U2VydmVyQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIElTZXJ2ZXJTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcjIpIHsKLQkJc3VwZXIocGFyZW50LCBTV1QuTk9ORSk7Ci0JCXRoaXMubGlzdGVuZXIgPSBsaXN0ZW5lcjI7Ci0KLQkJY3JlYXRlQ29udHJvbCgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgTGFiZWwgY3JlYXRlSGVhZGluZ0xhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0LCBpbnQgc3BhbikgewotCQlMYWJlbCBsYWJlbCA9IGNyZWF0ZUxhYmVsKHBhcmVudCwgdGV4dCwgc3BhbiwgdHJ1ZSwgZmFsc2UpOwotCQlsYWJlbC5zZXRGb250KEpGYWNlUmVzb3VyY2VzLmdldEJhbm5lckZvbnQoKSk7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIExhYmVsIGNyZWF0ZUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0LCBpbnQgc3BhbiwgYm9vbGVhbiBhbGlnblRvcCwgYm9vbGVhbiBpbmRlbnQpIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuV1JBUCk7Ci0JCWxhYmVsLnNldFRleHQodGV4dCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSKTsKLQkJaWYgKGFsaWduVG9wKQotCQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkJFR0lOTklORzsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IHNwYW47Ci0JCWlmIChpbmRlbnQpCi0JCQlkYXRhLmhvcml6b250YWxJbmRlbnQgPSAxMDsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFVJIG9mIHRoZSBwYWdlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRyb2woKSB7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gU1dUVXRpbC5jb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyh0aGlzLCA0KTsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IFNXVFV0aWwuY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKHRoaXMsIDQpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlzZXRMYXlvdXQobGF5b3V0KTsKLQkJLy9Xb3JrYmVuY2hIZWxwLnNldEhlbHAodGhpcywgQ29udGV4dElkcy5TRUxFQ1RfQ0xJRU5UX1dJWkFSRCk7Ci0JCi0JCWNyZWF0ZUhlYWRpbmdMYWJlbCh0aGlzLCAiU2VsZWN0IHRoZSBTZXJ2ZXIiLCAyKTsKLQkJCi0JCXRhYmxlID0gbmV3IFRhYmxlKHRoaXMsIFNXVC5CT1JERVIgfCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuU0lOR0xFKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5GSUxMX1ZFUlRJQ0FMKTsKLQkJZGF0YS5oZWlnaHRIaW50ID0gNjA7Ci0JCWRhdGEud2lkdGhIaW50ID0gNTA7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlkYXRhLmhvcml6b250YWxJbmRlbnQgPSAxMDsKLQkJdGFibGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCi0JCVRhYmxlTGF5b3V0IHRhYmxlTGF5b3V0ID0gbmV3IFRhYmxlTGF5b3V0KCk7Ci0JCXRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0KLQkJdGFibGVMYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uV2VpZ2h0RGF0YSg1MCwgMTAwLCB0cnVlKSk7Ci0JCVRhYmxlQ29sdW1uIGNvbCA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQljb2wuc2V0VGV4dCgiU2VydmVyIik7Ci0JCQotCQl0YWJsZUxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKDQwLCA4MCwgdHJ1ZSkpOwotCQlUYWJsZUNvbHVtbiBjb2wyID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWNvbDIuc2V0VGV4dCgiU3RhdHVzIik7Ci0JCQotCQl0YWJsZS5zZXRMYXlvdXQodGFibGVMYXlvdXQpOwotCQkKLQkJdGFibGVWaWV3ZXIgPSBuZXcgVGFibGVWaWV3ZXIodGFibGUpOwotCQl0YWJsZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IFNlcnZlckNvbnRlbnRQcm92aWRlcigpKTsKLQkJdGFibGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgU2VydmVyTGFiZWxQcm92aWRlcigpKTsKLQkJdGFibGVWaWV3ZXIuc2V0Q29sdW1uUHJvcGVydGllcyhuZXcgU3RyaW5nW10geyJuYW1lIiwgInN0YXR1cyJ9KTsKLQkJdGFibGVWaWV3ZXIuc2V0SW5wdXQoInJvb3QiKTsKLQkJCi0JCVN0cmluZyBkYXRlID0gIjxub3c+IjsKLQkJaG9zdExhYmVsID0gY3JlYXRlTGFiZWwodGhpcywgIkxhc3QgZGV0ZWN0ZWQgc2VydmVycyBvbiAiICsgaG9zdCArICIgYXQgIiArIGRhdGUgKyAiOiIsIDEsIGZhbHNlLCB0cnVlKTsKLQkJCi0JCWRldGVjdCA9IFNXVFV0aWwuY3JlYXRlQnV0dG9uKHRoaXMsICJSZWZyZXNoIik7Ci0JCWRldGVjdC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJZGF0YSA9IChHcmlkRGF0YSkgZGV0ZWN0LmdldExheW91dERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQ7Ci0KLQkJLy8gbGlzdGVuZXJzCi0JCWRldGVjdC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkvLyBkbyBub3RoaW5nCi0JCQl9Ci0JCX0pOwotCi0JCXRhYmxlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudC5nZXRTZWxlY3Rpb24oKTsKLQkJCQlPYmplY3Qgb2JqID0gc2VsLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCUlTZXJ2ZXJXb3JraW5nQ29weSBuZXdTZXJ2ZXIgPSBudWxsOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBJU2VydmVyV29ya2luZ0NvcHkpCi0JCQkJCW5ld1NlcnZlciA9IChJU2VydmVyV29ya2luZ0NvcHkpIG9iajsKLQkJCQkKLQkJCQlpZiAoKG5ld1NlcnZlciA9PSBudWxsICYmIHNlcnZlciAhPSBudWxsKSB8fCAobmV3U2VydmVyICE9IG51bGwgJiYgIW5ld1NlcnZlci5lcXVhbHMoc2VydmVyKSkpIHsKLQkJCQkJc2VydmVyID0gbmV3U2VydmVyOwotCQkJCQlsaXN0ZW5lci5zZXJ2ZXJTZWxlY3RlZChzZXJ2ZXIpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCQotCQlzZXRIb3N0KG51bGwpOwotCQotCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KHRoaXMpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SG9zdCgpIHsKLQkJcmV0dXJuIGhvc3Q7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SG9zdChTdHJpbmcgaG9zdCkgewotCQl0aGlzLmhvc3QgPSBob3N0OwotCQlzZXJ2ZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQl0YWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0JCWlmIChob3N0ICE9IG51bGwpIHsKLQkJCWhvc3RMYWJlbC5zZXRUZXh0KCJEZXRlY3RlZCBzZXJ2ZXJzIG9uICIgKyBob3N0ICsgIjoiKTsKLQkJCWRldGVjdC5zZXRFbmFibGVkKHRydWUpOwotCQkJdGFibGUuc2V0RW5hYmxlZCh0cnVlKTsKLQkJfSBlbHNlIHsKLQkJCWhvc3RMYWJlbC5zZXRUZXh0KCJObyBob3N0IHNlbGVjdGVkIik7Ci0JCQlkZXRlY3Quc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl0YWJsZS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJfQotCX0KLQotCXB1YmxpYyBJU2VydmVyV29ya2luZ0NvcHkgZ2V0U2VydmVyKCkgewotCQlyZXR1cm4gc2VydmVyOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvcGFnZS9OZXdJbnN0YWxsYWJsZVNlcnZlckNvbXBvc2l0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL3BhZ2UvTmV3SW5zdGFsbGFibGVTZXJ2ZXJDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTkyMWIyMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvcGFnZS9OZXdJbnN0YWxsYWJsZVNlcnZlckNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZC5wYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuVGFza01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5JSW5zdGFsbGFibGVTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5TV1RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlld2Vycy5JbnN0YWxsYWJsZVNlcnZlckNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLndpemFyZC5JV2l6YXJkSGFuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0vKioKLSAqIEEgY29tcG9zaXRlIHVzZWQgdG8gc2VsZWN0IGEgc2VydmVyIHRvIGluc3RhbGwuCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdJbnN0YWxsYWJsZVNlcnZlckNvbXBvc2l0ZSBleHRlbmRzIENvbXBvc2l0ZSB7Ci0JcHJpdmF0ZSBUYXNrTW9kZWwgdGFza01vZGVsOwotCXByaXZhdGUgSVdpemFyZEhhbmRsZSB3aXphcmQ7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgTmV3SW5zdGFsbGFibGVTZXJ2ZXJDb21wb3NpdGUuCi0JICogCi0JICogQHBhcmFtIHBhcmVudCBhIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gdGFza01vZGVsIGEgdGFzayBtb2RlbAotCSAqIEBwYXJhbSB3aXphcmQgdGhlIHdpemFyZCB0aGlzIGNvbXBvc2l0ZSBpcyBjb250YWluZWQgaW4KLQkgKi8KLQlwdWJsaWMgTmV3SW5zdGFsbGFibGVTZXJ2ZXJDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgVGFza01vZGVsIHRhc2tNb2RlbCwgSVdpemFyZEhhbmRsZSB3aXphcmQpIHsKLQkJc3VwZXIocGFyZW50LCBTV1QuTk9ORSk7Ci0JCXRoaXMudGFza01vZGVsID0gdGFza01vZGVsOwotCQl0aGlzLndpemFyZCA9IHdpemFyZDsKLQkJCi0JCWNyZWF0ZUNvbnRyb2woKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBVSSBvZiB0aGUgcGFnZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250cm9sKCkgewotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IFNXVFV0aWwuY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHModGhpcywgNCk7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSBTV1RVdGlsLmNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscyh0aGlzLCA0KTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMzsKLQkJc2V0TGF5b3V0KGxheW91dCk7Ci0JCS8vV29ya2JlbmNoSGVscC5zZXRIZWxwKHRoaXMsIENvbnRleHRJZHMuU0VMRUNUX0NMSUVOVF9XSVpBUkQpOwotCQkKLQkJSW5zdGFsbGFibGVTZXJ2ZXJDb21wb3NpdGUgY29tcCA9IG5ldyBJbnN0YWxsYWJsZVNlcnZlckNvbXBvc2l0ZSh0aGlzLCBTV1QuTk9ORSwgbmV3IEluc3RhbGxhYmxlU2VydmVyQ29tcG9zaXRlLkluc3RhbGxhYmxlU2VydmVyU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpbnN0YWxsYWJsZVNlcnZlclNlbGVjdGVkKElJbnN0YWxsYWJsZVNlcnZlciBzZXJ2ZXIpIHsKLQkJCQloYW5kbGVTZWxlY3Rpb24oc2VydmVyKTsKLQkJCX0KLQkJfSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZGF0YS5oZWlnaHRIaW50ID0gMjAwOwotCQljb21wLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KHRoaXMpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVNlbGVjdGlvbihJSW5zdGFsbGFibGVTZXJ2ZXIgc2VydmVyKSB7Ci0JCXRhc2tNb2RlbC5wdXRPYmplY3QoImluc3RhbGxhYmxlU2VydmVyIiwgc2VydmVyKTsKLQkJd2l6YXJkLnVwZGF0ZSgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvcGFnZS9OZXdNYW51YWxTZXJ2ZXJDb21wb3NpdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9wYWdlL05ld01hbnVhbFNlcnZlckNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNGU0MDU2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9wYWdlL05ld01hbnVhbFNlcnZlckNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQucGFnZTsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSU1lc3NhZ2VQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuUHJlZmVyZW5jZXNVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuSVdvcmtiZW5jaEhlbHBTeXN0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlcldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsLlNvY2tldFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlld2Vycy5TZXJ2ZXJUeXBlQ29tcG9zaXRlOwotLyoqCi0gKiBXaXphcmQgcGFnZSB1c2VkIHRvIGNyZWF0ZSBhIHNlcnZlciBhbmQgY29uZmlndXJhdGlvbiBhdCB0aGUgc2FtZSB0aW1lLgotICovCi1wdWJsaWMgY2xhc3MgTmV3TWFudWFsU2VydmVyQ29tcG9zaXRlIGV4dGVuZHMgQ29tcG9zaXRlIHsKLQlwdWJsaWMgaW50ZXJmYWNlIFNlcnZlclNlbGVjdGlvbkxpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgc2VydmVyU2VsZWN0ZWQoSVNlcnZlckF0dHJpYnV0ZXMgc2VydmVyKTsKLQkJcHVibGljIHZvaWQgcnVudGltZVNlbGVjdGVkKElSdW50aW1lIHJ1bnRpbWUpOwotCX0KLQotCXB1YmxpYyBpbnRlcmZhY2UgSVdpemFyZEhhbmRsZTIgewotCQlwdWJsaWMgdm9pZCBydW4oYm9vbGVhbiBmb3JrLCBib29sZWFuIGNhbmNlbGFibGUsIElSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCQlwdWJsaWMgdm9pZCB1cGRhdGUoKTsKLQkJcHVibGljIHZvaWQgc2V0TWVzc2FnZShTdHJpbmcgbmV3TWVzc2FnZSwgaW50IG5ld1R5cGUpOwotCX0KLQlwcm90ZWN0ZWQgSVdpemFyZEhhbmRsZTIgd2l6YXJkOwotCi0JcHJvdGVjdGVkIFNlcnZlclR5cGVDb21wb3NpdGUgc2VydmVyVHlwZUNvbXBvc2l0ZTsKLQotCXByb3RlY3RlZCBMYWJlbCBydW50aW1lTGFiZWw7Ci0JcHJvdGVjdGVkIENvbWJvIHJ1bnRpbWVDb21ibzsKLQlwcm90ZWN0ZWQgQnV0dG9uIHJ1bnRpbWVCdXR0b247Ci0JcHJvdGVjdGVkIElSdW50aW1lW10gcnVudGltZXM7Ci0JcHJvdGVjdGVkIElSdW50aW1lIG5ld1J1bnRpbWU7Ci0KLQlwcm90ZWN0ZWQgSVJ1bnRpbWUgcnVudGltZTsKLQlwcm90ZWN0ZWQgSVNlcnZlcldvcmtpbmdDb3B5IHNlcnZlcjsKLQlwcm90ZWN0ZWQgU2VydmVyU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXI7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGhvc3Q7Ci0KLQlwcm90ZWN0ZWQgSU1vZHVsZVR5cGUgbW9kdWxlVHlwZTsKLQotCXByb3RlY3RlZCBFbGVtZW50Q3JlYXRpb25DYWNoZSBjYWNoZSA9IG5ldyBFbGVtZW50Q3JlYXRpb25DYWNoZSgpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBzZXJ2ZXIgYW5kIHNlcnZlciBjb25maWd1cmF0aW9uLiAgSWYgdGhlIGluaXRpYWwKLQkgKiByZXNvdXJjZSBzZWxlY3Rpb24gY29udGFpbnMgZXhhY3RseSBvbmUgY29udGFpbmVyIHJlc291cmNlIHRoZW4gaXQgd2lsbCBiZQotCSAqIHVzZWQgYXMgdGhlIGRlZmF1bHQgY29udGFpbmVyIHJlc291cmNlLgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBhIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gd2l6YXJkIGEgd2l6YXJkIGhhbmRsZQotCSAqIEBwYXJhbSBtb2R1bGVUeXBlIGEgbW9kdWxlIHR5cGUKLQkgKiBAcGFyYW0gbGlzdGVuZXIgYSBzZXJ2ZXIgc2VsZWN0aW9uIGxpc3RlbmVyCi0JICovCi0JcHVibGljIE5ld01hbnVhbFNlcnZlckNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBJV2l6YXJkSGFuZGxlMiB3aXphcmQsIElNb2R1bGVUeXBlIG1vZHVsZVR5cGUsIFNlcnZlclNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN1cGVyKHBhcmVudCwgU1dULk5PTkUpOwotCQl0aGlzLndpemFyZCA9IHdpemFyZDsKLQkJdGhpcy5saXN0ZW5lciA9IGxpc3RlbmVyOwotCQkKLQkJdGhpcy5tb2R1bGVUeXBlID0gbW9kdWxlVHlwZTsKLQotCQljcmVhdGVDb250cm9sKCk7Ci0JCXdpemFyZC5zZXRNZXNzYWdlKCIiLCBJTWVzc2FnZVByb3ZpZGVyLkVSUk9SKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhpcyBwYWdlJ3MgaW5pdGlhbCB2aXN1YWwgY29tcG9uZW50cy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250cm9sKCkgewotCQkvLyB0b3AgbGV2ZWwgZ3JvdXAKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IFNXVFV0aWwuY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHModGhpcywgNCk7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSBTV1RVdGlsLmNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscyh0aGlzLCA0KTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCXNldExheW91dChsYXlvdXQpOwotCi0JCXRoaXMuc2V0Rm9udChnZXRQYXJlbnQoKS5nZXRGb250KCkpOwotCQlJV29ya2JlbmNoSGVscFN5c3RlbSB3aHMgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKTsKLQkJd2hzLnNldEhlbHAodGhpcywgQ29udGV4dElkcy5ORVdfU0VSVkVSX1dJWkFSRCk7Ci0JCQotCQlzZXJ2ZXJUeXBlQ29tcG9zaXRlID0gbmV3IFNlcnZlclR5cGVDb21wb3NpdGUodGhpcywgU1dULk5PTkUsIG1vZHVsZVR5cGUsIG5ldyBTZXJ2ZXJUeXBlQ29tcG9zaXRlLlNlcnZlclR5cGVTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlcnZlclR5cGVTZWxlY3RlZChJU2VydmVyVHlwZSB0eXBlMikgewotCQkJCWhhbmRsZVR5cGVTZWxlY3Rpb24odHlwZTIpOwotCQkJCS8vV2l6YXJkVXRpbC5kZWZhdWx0U2VsZWN0KHBhcmVudCwgQ3JlYXRlU2VydmVyV2l6YXJkUGFnZS50aGlzKTsKLQkJCX0KLQkJfSk7Ci0JCXNlcnZlclR5cGVDb21wb3NpdGUuc2V0SW5jbHVkZUluY29tcGF0aWJsZVZlcnNpb25zKHRydWUpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkZJTExfVkVSVElDQUwpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMzsKLQkJc2VydmVyVHlwZUNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQl3aHMuc2V0SGVscChzZXJ2ZXJUeXBlQ29tcG9zaXRlLCBDb250ZXh0SWRzLk5FV19TRVJWRVJfVFlQRSk7Ci0JCQotCQlydW50aW1lTGFiZWwgPSBuZXcgTGFiZWwodGhpcywgU1dULk5PTkUpOwotCQlydW50aW1lTGFiZWwuc2V0VGV4dChNZXNzYWdlcy53aXpOZXdTZXJ2ZXJSdW50aW1lKTsKLQkJCi0JCXJ1bnRpbWVDb21ibyA9IG5ldyBDb21ibyh0aGlzLCBTV1QuUkVBRF9PTkxZKTsKLQkJcnVudGltZUNvbWJvLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlydW50aW1lQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXRyeSB7Ci0JCQkJCXJ1bnRpbWUgPSBydW50aW1lc1tydW50aW1lQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKV07Ci0JCQkJCWlmIChzZXJ2ZXIgIT0gbnVsbCkgewotCQkJCQkJc2VydmVyLnNldFJ1bnRpbWUocnVudGltZSk7Ci0JCQkJCQlsaXN0ZW5lci5ydW50aW1lU2VsZWN0ZWQocnVudGltZSk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkJLy8gaWdub3JlCi0JCQkJfQotCQkJfQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQl3aWRnZXRTZWxlY3RlZChlKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlydW50aW1lQnV0dG9uID0gU1dUVXRpbC5jcmVhdGVCdXR0b24odGhpcywgTWVzc2FnZXMuaW5zdGFsbGVkUnVudGltZXMpOwotCQlydW50aW1lQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EKSk7Ci0JCXJ1bnRpbWVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaWYgKHNob3dQcmVmZXJlbmNlUGFnZSgpKSB7Ci0JCQkJCUlTZXJ2ZXJUeXBlIHNlcnZlclR5cGUgPSBzZXJ2ZXJUeXBlQ29tcG9zaXRlLmdldFNlbGVjdGVkU2VydmVyVHlwZSgpOwotCQkJCQl1cGRhdGVSdW50aW1lcyhzZXJ2ZXJUeXBlKTsKLQkJCQkJdXBkYXRlUnVudGltZUNvbWJvKHNlcnZlclR5cGUpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQodGhpcyk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvd1ByZWZlcmVuY2VQYWdlKCkgewotCQlTdHJpbmcgaWQgPSAib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5wcmVmZXJlbmNlUGFnZSI7Ci0JCVN0cmluZyBpZDIgPSAib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5ydW50aW1lLnByZWZlcmVuY2VQYWdlIjsKLQkJZmluYWwgUHJlZmVyZW5jZURpYWxvZyBkaWFsb2cgPSBQcmVmZXJlbmNlc1V0aWwuY3JlYXRlUHJlZmVyZW5jZURpYWxvZ09uKGdldFNoZWxsKCksIGlkMiwgbmV3IFN0cmluZ1tdIHsgaWQsIGlkMiB9LCBudWxsKTsKLQkJcmV0dXJuIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSyk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SG9zdChTdHJpbmcgaG9zdCkgewotCQl0aGlzLmhvc3QgPSBob3N0OwotCQlpZiAoc2VydmVyVHlwZUNvbXBvc2l0ZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoaG9zdCA9PSBudWxsKSB7Ci0JCQlzZXJ2ZXJUeXBlQ29tcG9zaXRlLnNldEhvc3QodHJ1ZSk7Ci0JCX0gZWxzZSBpZiAoU29ja2V0VXRpbC5pc0xvY2FsaG9zdChob3N0KSkKLQkJCXNlcnZlclR5cGVDb21wb3NpdGUuc2V0SG9zdCh0cnVlKTsKLQkJZWxzZQotCQkJc2VydmVyVHlwZUNvbXBvc2l0ZS5zZXRIb3N0KGZhbHNlKTsKLQkJaGFuZGxlVHlwZVNlbGVjdGlvbihzZXJ2ZXJUeXBlQ29tcG9zaXRlLmdldFNlbGVjdGVkU2VydmVyVHlwZSgpKTsKLQkJaWYgKHNlcnZlciAhPSBudWxsKSB7Ci0JCQlzZXJ2ZXIuc2V0SG9zdChob3N0KTsKLQkJCVNlcnZlclV0aWwuc2V0U2VydmVyRGVmYXVsdE5hbWUoc2VydmVyKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGN1cnJlbnQgZWRpdGFibGUgZWxlbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsb2FkU2VydmVySW1wbChmaW5hbCBJU2VydmVyVHlwZSBzZXJ2ZXJUeXBlKSB7Ci0JCXNlcnZlciA9IG51bGw7Ci0JCQotCQlpZiAoc2VydmVyVHlwZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkKLQkJc2VydmVyID0gY2FjaGUuZ2V0Q2FjaGVkU2VydmVyKHNlcnZlclR5cGUsIGhvc3QpOwotCQlpZiAoc2VydmVyICE9IG51bGwpIHsKLQkJCXNlcnZlci5zZXRIb3N0KGhvc3QpOwotCQkJU2VydmVyVXRpbC5zZXRTZXJ2ZXJEZWZhdWx0TmFtZShzZXJ2ZXIpOwotCQkJcnVudGltZSA9IHNlcnZlci5nZXRSdW50aW1lKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWZpbmFsIENvcmVFeGNlcHRpb25bXSBjZSA9IG5ldyBDb3JlRXhjZXB0aW9uWzFdOwotCQkKLQkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQl0cnkgewotCQkJCQltb25pdG9yID0gUHJvZ3Jlc3NVdGlsLmdldE1vbml0b3JGb3IobW9uaXRvcik7Ci0JCQkJCWludCB0aWNrcyA9IDIwMDsKLQkJCQkJbW9uaXRvci5iZWdpblRhc2soTkxTLmJpbmQoTWVzc2FnZXMubG9hZGluZ1Rhc2ssIHNlcnZlclR5cGUuZ2V0TmFtZSgpKSwgdGlja3MpOwotCQotCQkJCQlzZXJ2ZXIgPSBjYWNoZS5nZXRTZXJ2ZXIoc2VydmVyVHlwZSwgaG9zdCwgUHJvZ3Jlc3NVdGlsLmdldFN1Yk1vbml0b3JGb3IobW9uaXRvciwgMjAwKSk7Ci0JCQkJCWlmIChzZXJ2ZXIgIT0gbnVsbCkgewotCQkJCQkJc2VydmVyLnNldEhvc3QoaG9zdCk7Ci0JCQkJCQlTZXJ2ZXJVdGlsLnNldFNlcnZlckRlZmF1bHROYW1lKHNlcnZlcik7Ci0JCQkJCQotCQkJCQkJaWYgKHNlcnZlclR5cGUuaGFzUnVudGltZSgpICYmIHNlcnZlci5nZXRSdW50aW1lKCkgPT0gbnVsbCkgewotCQkJCQkJCXJ1bnRpbWUgPSBudWxsOwotCQkJCQkJCXVwZGF0ZVJ1bnRpbWVzKHNlcnZlclR5cGUpOwotCQkJCQkJCXJ1bnRpbWUgPSBnZXREZWZhdWx0UnVudGltZSgpOwotCQkJCQkJCXNlcnZlci5zZXRSdW50aW1lKHJ1bnRpbWUpOwotCQkJCQkJCQotCQkJCQkJCWlmIChzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpLmhhc1NlcnZlckNvbmZpZ3VyYXRpb24oKSkgewotCQkJCQkJCQkoKFNlcnZlcldvcmtpbmdDb3B5KXNlcnZlcikuaW1wb3J0Q29uZmlndXJhdGlvbihydW50aW1lLCBudWxsKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNleCkgewotCQkJCQljZVswXSA9IGNleDsKLQkJCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBjcmVhdGluZyBlbGVtZW50IiwgdCk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9IGZpbmFsbHkgewotCQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCXRyeSB7Ci0JCQl3aXphcmQucnVuKHRydWUsIGZhbHNlLCBydW5uYWJsZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciB3aXRoIHJ1bm5hYmxlIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQotCQlpZiAoY2VbMF0gIT0gbnVsbCkKLQkJCXdpemFyZC5zZXRNZXNzYWdlKGNlWzBdLmdldExvY2FsaXplZE1lc3NhZ2UoKSwgSU1lc3NhZ2VQcm92aWRlci5FUlJPUik7Ci0JCWVsc2UgaWYgKHNlcnZlciA9PSBudWxsKQotCQkJd2l6YXJkLnNldE1lc3NhZ2UoTWVzc2FnZXMud2l6RXJyb3JTZXJ2ZXJDcmVhdGlvbkVycm9yLCBJTWVzc2FnZVByb3ZpZGVyLkVSUk9SKTsKLQl9Ci0KLQkvKioKLQkgKiBQaWNrIHRoZSBmaXJzdCBub24tc3R1YiBydW50aW1lIGZpcnN0LiBPdGhlcndpc2UsIGp1c3QgcGljayB0aGUgZmlyc3QgcnVudGltZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IHJ1bnRpbWUKLQkgKi8KLQlwcm90ZWN0ZWQgSVJ1bnRpbWUgZ2V0RGVmYXVsdFJ1bnRpbWUoKSB7Ci0JCWlmIChydW50aW1lcyA9PSBudWxsIHx8IHJ1bnRpbWVzLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlpZiAocnVudGltZXMgIT0gbnVsbCkgewotCQkJaW50IHNpemUgPSBydW50aW1lcy5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCWlmICghcnVudGltZXNbaV0uaXNTdHViKCkpCi0JCQkJCXJldHVybiBydW50aW1lc1tpXTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcnVudGltZXNbMF07Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlUnVudGltZXMoSVNlcnZlclR5cGUgc2VydmVyVHlwZSkgewotCQlpZiAoc2VydmVyVHlwZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkKLQkJSVJ1bnRpbWVUeXBlIHJ1bnRpbWVUeXBlID0gc2VydmVyVHlwZS5nZXRSdW50aW1lVHlwZSgpOwotCQlydW50aW1lcyA9IFNlcnZlclVJUGx1Z2luLmdldFJ1bnRpbWVzKHJ1bnRpbWVUeXBlKTsKLQkJbmV3UnVudGltZSA9IG51bGw7Ci0JCQotCQlpZiAoc2VydmVyICE9IG51bGwgJiYgU29ja2V0VXRpbC5pc0xvY2FsaG9zdChzZXJ2ZXIuZ2V0SG9zdCgpKSAmJiBydW50aW1lcyAhPSBudWxsKSB7Ci0JCQlMaXN0IHJ1bnRpbWVzMiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWludCBzaXplID0gcnVudGltZXMubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlJUnVudGltZSBydW50aW1lMiA9IHJ1bnRpbWVzW2ldOwotCQkJCWlmICghcnVudGltZTIuaXNTdHViKCkpCi0JCQkJCXJ1bnRpbWVzMi5hZGQocnVudGltZTIpOwotCQkJfQotCQkJcnVudGltZXMgPSBuZXcgSVJ1bnRpbWVbcnVudGltZXMyLnNpemUoKV07Ci0JCQlydW50aW1lczIudG9BcnJheShydW50aW1lcyk7Ci0JCQlpZiAocnVudGltZXMyLnNpemUoKSA+IDApCi0JCQkJcmV0dXJuOwotCQl9Ci0JCQotCQkvLyBjcmVhdGUgYSBuZXcgcnVudGltZQotCQl0cnkgewotCQkJSVJ1bnRpbWVXb3JraW5nQ29weSBydW50aW1lV0MgPSBydW50aW1lVHlwZS5jcmVhdGVSdW50aW1lKG51bGwsIG51bGwpOwotCQkJU2VydmVyVXRpbC5zZXRSdW50aW1lRGVmYXVsdE5hbWUocnVudGltZVdDKTsKLQkJCXJ1bnRpbWVzID0gbmV3IElSdW50aW1lWzFdOwotCQkJcnVudGltZXNbMF0gPSBydW50aW1lV0M7Ci0JCQluZXdSdW50aW1lID0gcnVudGltZVdDOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGRuJ3QgY3JlYXRlIHJ1bnRpbWUiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlUnVudGltZUNvbWJvKElTZXJ2ZXJUeXBlIHNlcnZlclR5cGUpIHsKLQkJaWYgKHNlcnZlclR5cGUgPT0gbnVsbCB8fCAhc2VydmVyVHlwZS5oYXNSdW50aW1lKCkpIHsKLQkJCWlmIChydW50aW1lTGFiZWwgIT0gbnVsbCkgewotCQkJCXJ1bnRpbWVMYWJlbC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQlydW50aW1lQ29tYm8uc2V0SXRlbXMobmV3IFN0cmluZ1swXSk7Ci0JCQkJcnVudGltZUNvbWJvLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCXJ1bnRpbWVMYWJlbC5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCQlydW50aW1lQ29tYm8uc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQkJcnVudGltZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQlydW50aW1lQnV0dG9uLnNldFZpc2libGUoZmFsc2UpOwotCQkJfQotCQkJcnVudGltZXMgPSBuZXcgSVJ1bnRpbWVbMF07Ci0JCQlydW50aW1lID0gbnVsbDsKLQkJCWlmIChzZXJ2ZXIgIT0gbnVsbCkKLQkJCQlzZXJ2ZXIuc2V0UnVudGltZShudWxsKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJdXBkYXRlUnVudGltZXMoc2VydmVyVHlwZSk7Ci0JCQotCQlpbnQgc2l6ZSA9IHJ1bnRpbWVzLmxlbmd0aDsKLQkJU3RyaW5nW10gaXRlbXMgPSBuZXcgU3RyaW5nW3NpemVdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJaWYgKHJ1bnRpbWVzW2ldLmVxdWFscyhuZXdSdW50aW1lKSkKLQkJCQlpdGVtc1tpXSA9IE1lc3NhZ2VzLndpek5ld1NlcnZlclJ1bnRpbWVDcmVhdGU7Ci0JCQllbHNlCi0JCQkJaXRlbXNbaV0gPSBydW50aW1lc1tpXS5nZXROYW1lKCk7Ci0JCX0KLQkJCi0JCWlmIChydW50aW1lID09IG51bGwpIHsKLQkJCXJ1bnRpbWUgPSBnZXREZWZhdWx0UnVudGltZSgpOwotCQkJc2VydmVyLnNldFJ1bnRpbWUocnVudGltZSk7Ci0JCX0KLQkJaWYgKHJ1bnRpbWVDb21ibyAhPSBudWxsKSB7Ci0JCQlydW50aW1lQ29tYm8uc2V0SXRlbXMoaXRlbXMpOwotCQkJaWYgKHJ1bnRpbWVzLmxlbmd0aCA+IDApIHsKLQkJCQlpbnQgc2VsID0gLTE7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQkJaWYgKHJ1bnRpbWVzW2ldLmVxdWFscyhydW50aW1lKSkKLQkJCQkJCXNlbCA9IGk7Ci0JCQkJfQotCQkJCWlmIChzZWwgPCAwKSB7Ci0JCQkJCXNlbCA9IDA7Ci0JCQkJCXNlcnZlci5zZXRSdW50aW1lKHJ1bnRpbWVzWzBdKTsKLQkJCQl9Ci0JCQkJCi0JCQkJcnVudGltZUNvbWJvLnNlbGVjdChzZWwpOwotCQkJfQotCQkJCi0JCQlJUnVudGltZVR5cGUgcnVudGltZVR5cGUgPSBzZXJ2ZXJUeXBlLmdldFJ1bnRpbWVUeXBlKCk7Ci0JCQlib29sZWFuIHNob3dSdW50aW1lID0gU2VydmVyVUlQbHVnaW4uZ2V0UnVudGltZXMocnVudGltZVR5cGUpLmxlbmd0aCA+PTE7Ci0JCQlydW50aW1lQ29tYm8uc2V0RW5hYmxlZChzaG93UnVudGltZSk7Ci0JCQlydW50aW1lTGFiZWwuc2V0RW5hYmxlZChzaG93UnVudGltZSk7Ci0JCQlydW50aW1lQnV0dG9uLnNldEVuYWJsZWQoc2hvd1J1bnRpbWUpOwotCQkJcnVudGltZUxhYmVsLnNldFZpc2libGUoc2hvd1J1bnRpbWUpOwotCQkJcnVudGltZUNvbWJvLnNldFZpc2libGUoc2hvd1J1bnRpbWUpOwotCQkJcnVudGltZUJ1dHRvbi5zZXRWaXNpYmxlKHNob3dSdW50aW1lKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEhhbmRsZSB0aGUgc2VydmVyIHR5cGUgc2VsZWN0aW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVR5cGVTZWxlY3Rpb24oSVNlcnZlclR5cGUgc2VydmVyVHlwZSkgewotCQlib29sZWFuIHdyb25nID0gZmFsc2U7Ci0JCWlmIChzZXJ2ZXJUeXBlICE9IG51bGwgJiYgbW9kdWxlVHlwZSAhPSBudWxsKSB7Ci0JCQlJUnVudGltZVR5cGUgcnVudGltZVR5cGUgPSBzZXJ2ZXJUeXBlLmdldFJ1bnRpbWVUeXBlKCk7Ci0JCQlpZiAoIVNlcnZlclV0aWwuaXNTdXBwb3J0ZWRNb2R1bGUocnVudGltZVR5cGUuZ2V0TW9kdWxlVHlwZXMoKSwgbW9kdWxlVHlwZSkpIHsKLQkJCQlzZXJ2ZXJUeXBlID0gbnVsbDsKLQkJCQl3cm9uZyA9IHRydWU7Ci0JCQkJLy93aXphcmQuc2V0TWVzc2FnZSgiTm90IHRoZSByaWdodCBzcGVjIGxldmVsMiIsIElNZXNzYWdlUHJvdmlkZXIuRVJST1IpOwotCQkJfQotCQl9Ci0JCQotCQlpZiAod3JvbmcpIHsKLQkJCXNlcnZlciA9IG51bGw7Ci0JCQlydW50aW1lID0gbnVsbDsKLQkJCXdpemFyZC5zZXRNZXNzYWdlKE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yVmVyc2lvbkxldmVsLCBuZXcgT2JqZWN0W10geyBtb2R1bGVUeXBlLmdldE5hbWUoKSwgbW9kdWxlVHlwZS5nZXRWZXJzaW9uKCkgfSksIElNZXNzYWdlUHJvdmlkZXIuRVJST1IpOwotCQl9IGVsc2UgaWYgKHNlcnZlclR5cGUgPT0gbnVsbCkgewotCQkJc2VydmVyID0gbnVsbDsKLQkJCXJ1bnRpbWUgPSBudWxsOwotCQkJd2l6YXJkLnNldE1lc3NhZ2UoIiIsIElNZXNzYWdlUHJvdmlkZXIuRVJST1IpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSB7Ci0JCQl3aXphcmQuc2V0TWVzc2FnZShudWxsLCBJTWVzc2FnZVByb3ZpZGVyLk5PTkUpOwotCQkJbG9hZFNlcnZlckltcGwoc2VydmVyVHlwZSk7Ci0JCX0KLQkJdXBkYXRlUnVudGltZUNvbWJvKHNlcnZlclR5cGUpOwotCQlsaXN0ZW5lci5zZXJ2ZXJTZWxlY3RlZChzZXJ2ZXIpOwotCQl3aXphcmQudXBkYXRlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKLQkJc3VwZXIuc2V0VmlzaWJsZSh2aXNpYmxlKTsKLQkKLQkJaWYgKHZpc2libGUpIHsKLQkJCS8qaWYgKGRlZmF1bHRTZXJ2ZXJGYWN0b3J5ICE9IG51bGwpIHsKLQkJCQl0cmVlLnNldFNlbGVjdGlvbihuZXcgVHJlZUl0ZW1bXSB7IGRlZmF1bHRTZXJ2ZXJGYWN0b3J5IH0pOwotCQkJCXRyZWUuc2hvd0l0ZW0odHJlZS5nZXRJdGVtcygpWzBdKTsKLQkJCX0qLwotCQkJLy8gZm9yY2UgdGhlIGZvY3VzIHRvIGluaXRpYWxseSB2YWxpZGF0ZSB0aGUgZmllbGRzCi0JCQloYW5kbGVUeXBlU2VsZWN0aW9uKG51bGwpOwotCQl9Ci0JCQotCQlDb250cm9sW10gYyA9IGdldENoaWxkcmVuKCk7Ci0JCWlmIChjICE9IG51bGwpIHsKLQkJCWludCBzaXplID0gYy5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLQkJCQlpZiAoY1tpXSAhPSBudWxsICYmIGNbaV0gaW5zdGFuY2VvZiBTZXJ2ZXJUeXBlQ29tcG9zaXRlKQotCQkJCQljW2ldLnNldFZpc2libGUodmlzaWJsZSk7Ci0JCX0KLQkJaWYgKHZpc2libGUpCi0JCQloYW5kbGVUeXBlU2VsZWN0aW9uKHNlcnZlclR5cGVDb21wb3NpdGUuZ2V0U2VsZWN0ZWRTZXJ2ZXJUeXBlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCXNlcnZlclR5cGVDb21wb3NpdGUucmVmcmVzaCgpOwotCX0KLQotCXB1YmxpYyBJUnVudGltZSBnZXRSdW50aW1lKCkgewotCQlyZXR1cm4gcnVudGltZTsKLQl9Ci0KLQlwdWJsaWMgSVNlcnZlcldvcmtpbmdDb3B5IGdldFNlcnZlcigpIHsKLQkJcmV0dXJuIHNlcnZlcjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL3BhZ2UvTmV3UnVudGltZUNvbXBvc2l0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL3BhZ2UvTmV3UnVudGltZUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmIzM2MzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9wYWdlL05ld1J1bnRpbWVDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLnBhZ2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuSW1hZ2VSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuU1dUVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXdlcnMuUnVudGltZVR5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuSVdpemFyZEhhbmRsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWU7Ci0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgTmV3UnVudGltZUNvbXBvc2l0ZSBleHRlbmRzIENvbXBvc2l0ZSB7Ci0JcHJvdGVjdGVkIFRyZWUgdHJlZTsKLQlwcm90ZWN0ZWQgVHJlZVZpZXdlciB0cmVlVmlld2VyOwotCi0JcHJvdGVjdGVkIElSdW50aW1lV29ya2luZ0NvcHkgcnVudGltZTsKLQlwcm90ZWN0ZWQgTWFwIHJ1bnRpbWVNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQotCXByb3RlY3RlZCBUYXNrTW9kZWwgdGFza01vZGVsOwotCXByb3RlY3RlZCBJV2l6YXJkSGFuZGxlIHdpemFyZDsKLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIHR5cGU7Ci0JcHJvdGVjdGVkIFN0cmluZyB2ZXJzaW9uOwotCXByb3RlY3RlZCBTdHJpbmcgcnVudGltZVR5cGVJZDsKLQotCXB1YmxpYyBOZXdSdW50aW1lQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIElXaXphcmRIYW5kbGUgd2l6YXJkLCBUYXNrTW9kZWwgdG0sIFN0cmluZyB0eXBlLCBTdHJpbmcgdmVyc2lvbiwgU3RyaW5nIHJ1bnRpbWVUeXBlSWQpIHsKLQkJc3VwZXIocGFyZW50LCBTV1QuTk9ORSk7Ci0JCQotCQl0aGlzLndpemFyZCA9IHdpemFyZDsKLQkJdGhpcy50YXNrTW9kZWwgPSB0bTsKLQkJdGhpcy50eXBlID0gdHlwZTsKLQkJdGhpcy52ZXJzaW9uID0gdmVyc2lvbjsKLQkJdGhpcy5ydW50aW1lVHlwZUlkID0gcnVudGltZVR5cGVJZDsKLQkJCi0JCWNyZWF0ZUNvbnRyb2woKTsKLQkJCi0JCXdpemFyZC5zZXRUaXRsZShNZXNzYWdlcy53aXpOZXdSdW50aW1lVGl0bGUpOwotCQl3aXphcmQuc2V0RGVzY3JpcHRpb24oTWVzc2FnZXMud2l6TmV3UnVudGltZURlc2NyaXB0aW9uKTsKLQkJd2l6YXJkLnNldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19XSVpCQU5fTkVXX1JVTlRJTUUpKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI2NyZWF0ZUNvbnRyb2wob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woKSB7Ci0JCS8vaW5pdGlhbGl6ZURpYWxvZ1VuaXRzKHBhcmVudCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gU1dUVXRpbC5jb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyh0aGlzLCA0KTsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IFNXVFV0aWwuY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKHRoaXMsIDQpOwotCQlzZXRMYXlvdXQobGF5b3V0KTsKLQkJCi0JCWZpbmFsIFJ1bnRpbWVUeXBlQ29tcG9zaXRlIGNvbXAgPSBuZXcgUnVudGltZVR5cGVDb21wb3NpdGUodGhpcywgU1dULk5PTkUsIHRydWUsIG5ldyBSdW50aW1lVHlwZUNvbXBvc2l0ZS5SdW50aW1lVHlwZVNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcnVudGltZVR5cGVTZWxlY3RlZChJUnVudGltZVR5cGUgcnVudGltZVR5cGUpIHsKLQkJCQloYW5kbGVTZWxlY3Rpb24ocnVudGltZVR5cGUpOwotCQkJfQotCQl9LCB0eXBlLCB2ZXJzaW9uLCBydW50aW1lVHlwZUlkKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlkYXRhLmhlaWdodEhpbnQgPSAyNTA7Ci0JCWNvbXAuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVTZWxlY3Rpb24oSVJ1bnRpbWVUeXBlIHJ1bnRpbWVUeXBlKSB7Ci0JCWlmIChydW50aW1lVHlwZSA9PSBudWxsKQotCQkJcnVudGltZSA9IG51bGw7Ci0JCWVsc2UgewotCQkJdHJ5IHsKLQkJCQlydW50aW1lID0gbnVsbDsKLQkJCQlydW50aW1lID0gKElSdW50aW1lV29ya2luZ0NvcHkpIHJ1bnRpbWVNYXAuZ2V0KHJ1bnRpbWVUeXBlKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCQlpZiAocnVudGltZSA9PSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJcnVudGltZSA9IHJ1bnRpbWVUeXBlLmNyZWF0ZVJ1bnRpbWUobnVsbCwgbnVsbCk7Ci0JCQkJCVNlcnZlclV0aWwuc2V0UnVudGltZURlZmF1bHROYW1lKHJ1bnRpbWUpOwotCQkJCQlpZiAocnVudGltZSAhPSBudWxsKQotCQkJCQkJcnVudGltZU1hcC5wdXQocnVudGltZVR5cGUsIHJ1bnRpbWUpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIGlnbm9yZQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXRhc2tNb2RlbC5wdXRPYmplY3QoVGFza01vZGVsLlRBU0tfUlVOVElNRSwgcnVudGltZSk7Ci0JCXdpemFyZC51cGRhdGUoKTsKLQl9Ci0KLQlwdWJsaWMgSVJ1bnRpbWVXb3JraW5nQ29weSBnZXRSdW50aW1lKCkgewotCQlyZXR1cm4gcnVudGltZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKLQkJc3VwZXIuc2V0VmlzaWJsZSh2aXNpYmxlKTsKLQkJCi0JCUNvbnRyb2xbXSBjID0gZ2V0Q2hpbGRyZW4oKTsKLQkJaWYgKGMgIT0gbnVsbCkgewotCQkJaW50IHNpemUgPSBjLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotCQkJCWlmIChjW2ldICE9IG51bGwpCi0JCQkJCWNbaV0uc2V0VmlzaWJsZSh2aXNpYmxlKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvcGFnZS9OZXdTZXJ2ZXJDb21wb3NpdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9wYWdlL05ld1NlcnZlckNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDhiOTVjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9wYWdlL05ld1NlcnZlckNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQucGFnZTsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklNZXNzYWdlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0YWNrTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlckF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlRhc2tNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC52aWV3ZXJzLlNlcnZlckNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZC5mcmFnbWVudC5OZXdTZXJ2ZXJXaXphcmRGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLndpemFyZC5JV2l6YXJkSGFuZGxlOwotLyoqCi0gKiBBIHdpemFyZCBwYWdlIHVzZWQgdG8gc2VsZWN0IGEgc2VydmVyLgotICovCi1wdWJsaWMgY2xhc3MgTmV3U2VydmVyQ29tcG9zaXRlIGV4dGVuZHMgQ29tcG9zaXRlIHsKLQlwcm90ZWN0ZWQgSVdpemFyZEhhbmRsZSB3aXphcmQ7Ci0JcHJvdGVjdGVkIFRhc2tNb2RlbCB0YXNrTW9kZWw7Ci0JcHJvdGVjdGVkIElNb2R1bGUgbW9kdWxlOwotCXByb3RlY3RlZCBTdHJpbmcgbGF1bmNoTW9kZTsKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJ5dGUgTU9ERV9FWElTVElORyA9IDA7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBieXRlIE1PREVfREVURUNUID0gMTsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJ5dGUgTU9ERV9NQU5VQUw9IDI7Ci0JcHJvdGVjdGVkIGJ5dGUgbW9kZTsKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgZGV0ZWN0Q29tcDI7Ci0JcHJvdGVjdGVkIE5ld0RldGVjdFNlcnZlckNvbXBvc2l0ZSBkZXRlY3RDb21wOwotCXByb3RlY3RlZCBIb3N0bmFtZUNvbXBvc2l0ZSBkZXRlY3RIb3N0Q29tcDsKLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIG1hbnVhbENvbXAyOwotCXByb3RlY3RlZCBOZXdNYW51YWxTZXJ2ZXJDb21wb3NpdGUgbWFudWFsQ29tcDsKLQlwcm90ZWN0ZWQgSG9zdG5hbWVDb21wb3NpdGUgbWFudWFsSG9zdENvbXA7Ci0JcHJvdGVjdGVkIFNlcnZlckNvbXBvc2l0ZSBleGlzdGluZ0NvbXA7Ci0JCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBzdGFjazsKLQlwcm90ZWN0ZWQgU3RhY2tMYXlvdXQgc3RhY2tMYXlvdXQ7IAotCQotCXByb3RlY3RlZCBTdHJpbmcgbGFzdEhvc3RuYW1lOwotCQotCXByb3RlY3RlZCBCdXR0b24gcHJlZjsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVmZXJyZWQ7Ci0JCi0JcHJvdGVjdGVkIElTZXJ2ZXJXb3JraW5nQ29weSBleGlzdGluZ1dDOwotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IE5ld1NlcnZlckNvbXBvc2l0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50IGEgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSB3aXphcmQgYSB3aXphcmQgaGFuZGxlCi0JICogQHBhcmFtIG1vZHVsZSBhIG1vZHVsZQotCSAqIEBwYXJhbSBsYXVuY2hNb2RlIGEgbGF1bmNoIG1vZGUKLQkgKi8KLQlwdWJsaWMgTmV3U2VydmVyQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIElXaXphcmRIYW5kbGUgd2l6YXJkLCBJTW9kdWxlIG1vZHVsZSwgU3RyaW5nIGxhdW5jaE1vZGUpIHsKLQkJc3VwZXIocGFyZW50LCBTV1QuTk9ORSk7Ci0JCXRoaXMud2l6YXJkID0gd2l6YXJkOwotCQl0aGlzLm1vZHVsZSA9IG1vZHVsZTsKLQkJdGhpcy5sYXVuY2hNb2RlID0gbGF1bmNoTW9kZTsKLQkKLQkJd2l6YXJkLnNldFRpdGxlKE1lc3NhZ2VzLndpek5ld1NlcnZlclRpdGxlKTsKLQkJd2l6YXJkLnNldERlc2NyaXB0aW9uKE1lc3NhZ2VzLndpek5ld1NlcnZlckRlc2NyaXB0aW9uKTsKLQkJd2l6YXJkLnNldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19XSVpCQU5fTkVXX1NFUlZFUikpOwotCQkKLQkJY3JlYXRlQ29udHJvbCgpOwotCX0KLQotCXB1YmxpYyBOZXdTZXJ2ZXJDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgSVdpemFyZEhhbmRsZSB3aXphcmQpIHsKLQkJdGhpcyhwYXJlbnQsIHdpemFyZCwgbnVsbCwgbnVsbCk7Ci0JfQotCi0JcHJvdGVjdGVkIExhYmVsIGNyZWF0ZUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0LCBpbnQgc3BhbikgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5XUkFQKTsKLQkJbGFiZWwuc2V0VGV4dCh0ZXh0KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gc3BhbjsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCXByb3RlY3RlZCBMYWJlbCBjcmVhdGVMYWJlbChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCkgewotCQlyZXR1cm4gY3JlYXRlTGFiZWwocGFyZW50LCB0ZXh0LCAxKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIGNyZWF0ZVJhZGlvQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0LCBpbnQgc3BhbikgewotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5SQURJTyk7Ci0JCWJ1dHRvbi5zZXRUZXh0KHRleHQpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSBzcGFuOwotCQlkYXRhLmhvcml6b250YWxJbmRlbnQgPSAxMDsKLQkJYnV0dG9uLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXJldHVybiBidXR0b247Ci0JfQotCQotCXByb3RlY3RlZCBUZXh0IGNyZWF0ZVRleHQoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQyLCBpbnQgc3BhbikgewotCQlUZXh0IHRleHQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5OT05FKTsKLQkJdGV4dC5zZXRUZXh0KHRleHQyKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gc3BhbjsKLQkJdGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBVSSBvZiB0aGUgcGFnZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250cm9sKCkgewotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IFNXVFV0aWwuY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHModGhpcywgNCk7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSBTV1RVdGlsLmNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscyh0aGlzLCA0KTsKLQkJc2V0TGF5b3V0KGxheW91dCk7Ci0JCS8vV29ya2JlbmNoSGVscC5zZXRIZWxwKHRoaXMsIENvbnRleHRJZHMuU0VMRUNUX0NMSUVOVF9XSVpBUkQpOwotCQotCQlpZiAobW9kdWxlICE9IG51bGwpCi0JCQljcmVhdGVMYWJlbCh0aGlzLCBNZXNzYWdlcy53aXpOZXdTZXJ2ZXJTZWxlY3QsIDEpOwotCQkJCi0JCUJ1dHRvbiBleGlzdGluZyA9IG51bGw7Ci0JCWlmIChtb2R1bGUgIT0gbnVsbCkgewotCQkJZmluYWwgQnV0dG9uIHByZWRlZmluZWQgPSBjcmVhdGVSYWRpb0J1dHRvbih0aGlzLCBNZXNzYWdlcy53aXpOZXdTZXJ2ZXJFeGlzdGluZywgMSk7Ci0JCQlwcmVkZWZpbmVkLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJaWYgKHByZWRlZmluZWQuZ2V0U2VsZWN0aW9uKCkpCi0JCQkJCQl0b2dnbGVNb2RlKE1PREVfRVhJU1RJTkcpOwotCQkJCX0KLQkJCX0pOwotCQkJZXhpc3RpbmcgPSBwcmVkZWZpbmVkOwotCQl9Ci0JCQotCQkvKmZpbmFsIEJ1dHRvbiBhdXRvID0gY3JlYXRlUmFkaW9CdXR0b24odGhpcywgTWVzc2FnZXMud2l6TmV3U2VydmVyRGV0ZWN0IiksIDEpOwotCQlhdXRvLnNldEVuYWJsZWQoZmFsc2UpOwotCQlhdXRvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWlmIChhdXRvLmdldFNlbGVjdGlvbigpKQotCQkJCQl0b2dnbGVNb2RlKE1PREVfREVURUNUKTsKLQkJCX0KLQkJfSk7Ki8KLQkKLQkJQnV0dG9uIG1hbnVhbCA9IG51bGw7Ci0JCWlmIChtb2R1bGUgIT0gbnVsbCkgewotCQkJZmluYWwgQnV0dG9uIG1hbnVhbEJ1dHRvbiA9IGNyZWF0ZVJhZGlvQnV0dG9uKHRoaXMsIE1lc3NhZ2VzLndpek5ld1NlcnZlck1hbnVhbCwgMSk7Ci0JCQltYW51YWxCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlpZiAobWFudWFsQnV0dG9uLmdldFNlbGVjdGlvbigpKQotCQkJCQkJdG9nZ2xlTW9kZShNT0RFX01BTlVBTCk7Ci0JCQkJfQotCQkJfSk7Ci0JCQltYW51YWwgPSBtYW51YWxCdXR0b247Ci0JCX0KLQkJCi0JCXN0YWNrID0gbmV3IENvbXBvc2l0ZSh0aGlzLCBTV1QuTk9ORSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJc3RhY2suc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJc3RhY2tMYXlvdXQgPSBuZXcgU3RhY2tMYXlvdXQoKTsKLQkJc3RhY2tMYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJc3RhY2tMYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlzdGFjay5zZXRMYXlvdXQoc3RhY2tMYXlvdXQpOwotCQkKLQkJaWYgKG1vZHVsZSAhPSBudWxsKQotCQkJY3JlYXRlRXhpc3RpbmdDb21wb3NpdGUoc3RhY2spOwotCQljcmVhdGVBdXRvQ29tcG9zaXRlKHN0YWNrKTsKLQkJY3JlYXRlTWFudWFsQ29tcG9zaXRlKHN0YWNrKTsKLQkKLQkJaWYgKGV4aXN0aW5nQ29tcCAhPSBudWxsKSB7Ci0JCQlpZiAoaXNFeGlzdGluZ1NlcnZlcigpKSB7Ci0JCQkJbW9kZSA9IE1PREVfRVhJU1RJTkc7Ci0JCQkJc3RhY2tMYXlvdXQudG9wQ29udHJvbCA9IGV4aXN0aW5nQ29tcDsKLQkJCQlleGlzdGluZy5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQl9IGVsc2UgewotCQkJCW1vZGUgPSBNT0RFX01BTlVBTDsKLQkJCQlzdGFja0xheW91dC50b3BDb250cm9sID0gbWFudWFsQ29tcDI7Ci0JCQkJbWFudWFsQ29tcC5zZXRWaXNpYmxlKHRydWUpOwotCQkJCWlmIChtYW51YWwgIT0gbnVsbCkKLQkJCQkJbWFudWFsLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCQlleGlzdGluZy5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQlleGlzdGluZ0NvbXAuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQltb2RlID0gTU9ERV9NQU5VQUw7Ci0JCQlzdGFja0xheW91dC50b3BDb250cm9sID0gbWFudWFsQ29tcDI7Ci0JCQltYW51YWxDb21wLnNldFZpc2libGUodHJ1ZSk7Ci0JCQlpZiAobWFudWFsICE9IG51bGwpCi0JCQkJbWFudWFsLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJfQotCQkKLQkJaWYgKG1vZHVsZSAhPSBudWxsKSB7Ci0JCQkvLyBwcmVmZXJyZWQgc2VydmVyIGJ1dHRvbgotCQkJcHJlZiA9IG5ldyBCdXR0b24odGhpcywgU1dULkNIRUNLIHwgU1dULldSQVApOwotCQkJcHJlZi5zZXRUZXh0KE1lc3NhZ2VzLndpelNlbGVjdFNlcnZlclByZWZlcnJlZCk7Ci0JCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0VORCk7Ci0JCQkvL3ByZWYuc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJLy9wcmVmZXJyZWQgPSB0cnVlOwotCQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDE7Ci0JCQlwcmVmLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQlwcmVmLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJcHJlZmVycmVkID0gcHJlZi5nZXRTZWxlY3Rpb24oKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocHJlZiwgQ29udGV4dElkcy5TRUxFQ1RfU0VSVkVSX1BSRUZFUkVOQ0UpOwotCQl9Ci0JCQotCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KHRoaXMpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHRvZ2dsZU1vZGUoYnl0ZSBuZXdNb2RlKSB7Ci0JCWlmICghaXNWaXNpYmxlKCkpCi0JCQlyZXR1cm47Ci0JCQotCQlpZiAobmV3TW9kZSA9PSBtb2RlKQotCQkJcmV0dXJuOwotCQkKLQkJbW9kZSA9IG5ld01vZGU7Ci0JCXdpemFyZC5zZXRNZXNzYWdlKG51bGwsIElNZXNzYWdlUHJvdmlkZXIuTk9ORSk7Ci0JCQotCQlpZiAobW9kZSA9PSBNT0RFX0VYSVNUSU5HKSB7Ci0JCQlzdGFja0xheW91dC50b3BDb250cm9sID0gZXhpc3RpbmdDb21wOwotCQkJZXhpc3RpbmdDb21wLnNldFNlbGVjdGlvbihleGlzdGluZ0NvbXAuZ2V0U2VsZWN0ZWRTZXJ2ZXIoKSk7Ci0JCX0gZWxzZSBpZiAobW9kZSA9PSBNT0RFX0RFVEVDVCkgewotCQkJc3RhY2tMYXlvdXQudG9wQ29udHJvbCA9IGRldGVjdENvbXAyOwotCQkJZGV0ZWN0Q29tcC5zZXRWaXNpYmxlKHRydWUpOwotCQl9IGVsc2UgewotCQkJc3RhY2tMYXlvdXQudG9wQ29udHJvbCA9IG1hbnVhbENvbXAyOwotCQkJbWFudWFsQ29tcC5zZXRWaXNpYmxlKHRydWUpOwotCQl9Ci0JCXN0YWNrLmxheW91dCgpOwotCQlpZiAodGFza01vZGVsICE9IG51bGwpIHsKLQkJCXRhc2tNb2RlbC5wdXRPYmplY3QoTmV3U2VydmVyV2l6YXJkRnJhZ21lbnQuTU9ERSwgbmV3IEJ5dGUobW9kZSkpOwotCQkJdXBkYXRlVGFza01vZGVsKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgSG9zdG5hbWVDb21wb3NpdGUgY3JlYXRlSG9zdENvbXBvc2l0ZShDb21wb3NpdGUgY29tcCkgewotCQlIb3N0bmFtZUNvbXBvc2l0ZSBob3N0Q29tcCA9IG5ldyBIb3N0bmFtZUNvbXBvc2l0ZShjb21wLCBuZXcgSG9zdG5hbWVDb21wb3NpdGUuSUhvc3RuYW1lU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBob3N0bmFtZVNlbGVjdGVkKFN0cmluZyBob3N0KSB7Ci0JCQkJbGFzdEhvc3RuYW1lID0gaG9zdDsKLQkJCQlpZiAoZGV0ZWN0Q29tcCAhPSBudWxsKQotCQkJCQlkZXRlY3RDb21wLnNldEhvc3QoaG9zdCk7Ci0JCQkJaWYgKG1hbnVhbENvbXAgIT0gbnVsbCkKLQkJCQkJbWFudWFsQ29tcC5zZXRIb3N0KGhvc3QpOwotCQkJfQotCQl9KTsKLQkJCi0JCWlmIChsYXN0SG9zdG5hbWUgIT0gbnVsbCkKLQkJCWhvc3RDb21wLnNldEhvc3RuYW1lKGxhc3RIb3N0bmFtZSk7Ci0JCQotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlob3N0Q29tcC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlyZXR1cm4gaG9zdENvbXA7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF1dG9Db21wb3NpdGUoQ29tcG9zaXRlIGNvbXApIHsKLQkJZGV0ZWN0Q29tcDIgPSBuZXcgQ29tcG9zaXRlKGNvbXAsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSBTV1RVdGlsLmNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKHRoaXMsIDQpOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gU1dUVXRpbC5jb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHModGhpcywgNCk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0JCWRldGVjdENvbXAyLnNldExheW91dChsYXlvdXQpOwotCQkKLQkJZGV0ZWN0SG9zdENvbXAgPSBjcmVhdGVIb3N0Q29tcG9zaXRlKGRldGVjdENvbXAyKTsKLQkJCi0JCWRldGVjdENvbXAgPSBuZXcgTmV3RGV0ZWN0U2VydmVyQ29tcG9zaXRlKGRldGVjdENvbXAyLCBuZXcgTmV3RGV0ZWN0U2VydmVyQ29tcG9zaXRlLklTZXJ2ZXJTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlcnZlclNlbGVjdGVkKElTZXJ2ZXJBdHRyaWJ1dGVzIHNlcnZlcikgewotCQkJCS8vIGRvIG5vdGhpbmcKLQkJCX0KLQkJfSk7Ci0KLQkJaWYgKGxhc3RIb3N0bmFtZSAhPSBudWxsKQotCQkJZGV0ZWN0Q29tcC5zZXRIb3N0KGxhc3RIb3N0bmFtZSk7Ci0JCWVsc2UKLQkJCWRldGVjdENvbXAuc2V0SG9zdCgibG9jYWxob3N0Iik7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlkYXRhLmhlaWdodEhpbnQgPSAxNTA7Ci0JCWRldGVjdENvbXAuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFeGlzdGluZ0NvbXBvc2l0ZShDb21wb3NpdGUgY29tcCkgewotCQlleGlzdGluZ0NvbXAgPSBuZXcgU2VydmVyQ29tcG9zaXRlKGNvbXAsIFNXVC5OT05FLCBuZXcgU2VydmVyQ29tcG9zaXRlLlNlcnZlclNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VydmVyU2VsZWN0ZWQoSVNlcnZlciBzZXJ2ZXIpIHsKLQkJCQl3aXphcmQuc2V0TWVzc2FnZShudWxsLCBJTWVzc2FnZVByb3ZpZGVyLk5PTkUpOwotCQkJCQotCQkJCS8vIGNoZWNrIGZvciBjb21wYXRpYmlsaXR5Ci0JCQkJaWYgKHNlcnZlciAhPSBudWxsICYmIG1vZHVsZSAhPSBudWxsKSB7Ci0JCQkJCUlTZXJ2ZXJUeXBlIHNlcnZlclR5cGUgPSBzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpOwotCQkJCQlJTW9kdWxlVHlwZSBtdCA9IG1vZHVsZS5nZXRNb2R1bGVUeXBlKCk7Ci0JCQkJCWlmICghU2VydmVyVXRpbC5pc1N1cHBvcnRlZE1vZHVsZShzZXJ2ZXJUeXBlLmdldFJ1bnRpbWVUeXBlKCkuZ2V0TW9kdWxlVHlwZXMoKSwgbXQpKSB7Ci0JCQkJCQlTdHJpbmcgdHlwZSA9IG10LmdldE5hbWUoKTsKLQkJCQkJCXdpemFyZC5zZXRNZXNzYWdlKE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yVmVyc2lvbkxldmVsLCBuZXcgT2JqZWN0W10geyB0eXBlLCBtdC5nZXRWZXJzaW9uKCkgfSksIElNZXNzYWdlUHJvdmlkZXIuRVJST1IpOwotCQkJCQkJc2VydmVyID0gbnVsbDsKLQkJCQkJfQotCQkJCQlpZiAod2l6YXJkLmdldE1lc3NhZ2UoKSA9PSBudWxsKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCXNlcnZlci5nZXRSb290TW9kdWxlcyhtb2R1bGUsIG51bGwpOwotCQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJCQkJCUlTdGF0dXMgc3RhdHVzID0gY2UuZ2V0U3RhdHVzKCk7Ci0JCQkJCQkJaWYgKHN0YXR1cyAhPSBudWxsKSB7Ci0JCQkJCQkJCWlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKQotCQkJCQkJCQkJd2l6YXJkLnNldE1lc3NhZ2Uoc3RhdHVzLmdldE1lc3NhZ2UoKSwgSU1lc3NhZ2VQcm92aWRlci5FUlJPUik7Ci0JCQkJCQkJCWVsc2UgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuV0FSTklORykKLQkJCQkJCQkJCXdpemFyZC5zZXRNZXNzYWdlKHN0YXR1cy5nZXRNZXNzYWdlKCksIElNZXNzYWdlUHJvdmlkZXIuV0FSTklORyk7Ci0JCQkJCQkJCWVsc2UgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuSU5GTykKLQkJCQkJCQkJCQkJd2l6YXJkLnNldE1lc3NhZ2Uoc3RhdHVzLmdldE1lc3NhZ2UoKSwgSU1lc3NhZ2VQcm92aWRlci5JTkZPUk1BVElPTik7Ci0JCQkJCQkJfQotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlUcmFjZS50cmFjZShUcmFjZS5XQVJOSU5HLCAiQ291bGQgbm90IGZpbmQgcm9vdCBtb2R1bGUiLCBlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQlpZiAoZXhpc3RpbmdXQyAhPSBudWxsKSB7Ci0JCQkJCWlmIChzZXJ2ZXIgIT0gbnVsbCAmJiBzZXJ2ZXIuZXF1YWxzKGV4aXN0aW5nV0MuZ2V0T3JpZ2luYWwoKSkpCi0JCQkJCQlyZXR1cm47Ci0JCQkJCWV4aXN0aW5nV0MgPSBudWxsOwotCQkJCX0KLQkJCQlpZiAoc2VydmVyICE9IG51bGwpCi0JCQkJCWV4aXN0aW5nV0MgPSBzZXJ2ZXIuY3JlYXRlV29ya2luZ0NvcHkoKTsKLQkJCQl1cGRhdGVUYXNrTW9kZWwoKTsKLQkJCX0KLQkJfSwgbW9kdWxlLCBsYXVuY2hNb2RlKTsKLQkJZXhpc3RpbmdDb21wLnNldEluY2x1ZGVJbmNvbXBhdGlibGVWZXJzaW9ucyh0cnVlKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCWRhdGEuaGVpZ2h0SGludCA9IDE1MDsKLQkJZXhpc3RpbmdDb21wLnNldExheW91dERhdGEoZGF0YSk7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGlzRXhpc3RpbmdTZXJ2ZXIoKSB7Ci0JCWlmIChtb2R1bGUgPT0gbnVsbCB8fCBsYXVuY2hNb2RlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQlJU2VydmVyW10gc2VydmVycyA9IFNlcnZlckNvcmUuZ2V0U2VydmVycygpOwotCQlpZiAoc2VydmVycyAhPSBudWxsKSB7Ci0JCQlpbnQgc2l6ZSA9IHNlcnZlcnMubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlJTW9kdWxlVHlwZSBtdCA9IG1vZHVsZS5nZXRNb2R1bGVUeXBlKCk7Ci0JCQkJaWYgKFNlcnZlclVJUGx1Z2luLmlzQ29tcGF0aWJsZVdpdGhMYXVuY2hNb2RlKHNlcnZlcnNbaV0sIGxhdW5jaE1vZGUpICYmCi0JCQkJCVNlcnZlclV0aWwuaXNTdXBwb3J0ZWRNb2R1bGUoc2VydmVyc1tpXS5nZXRTZXJ2ZXJUeXBlKCkuZ2V0UnVudGltZVR5cGUoKS5nZXRNb2R1bGVUeXBlcygpLCBtdCkpCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlTWFudWFsQ29tcG9zaXRlKENvbXBvc2l0ZSBjb21wKSB7Ci0JCW1hbnVhbENvbXAyID0gbmV3IENvbXBvc2l0ZShjb21wLCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gU1dUVXRpbC5jb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyh0aGlzLCA0KTsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IFNXVFV0aWwuY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKHRoaXMsIDQpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotCQltYW51YWxDb21wMi5zZXRMYXlvdXQobGF5b3V0KTsKLQkJbWFudWFsQ29tcDIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCQotCQltYW51YWxIb3N0Q29tcCA9IGNyZWF0ZUhvc3RDb21wb3NpdGUobWFudWFsQ29tcDIpOwotCQlJTW9kdWxlVHlwZSBtdCA9IG51bGw7Ci0JCWlmIChtb2R1bGUgIT0gbnVsbCkKLQkJCW10ID0gbW9kdWxlLmdldE1vZHVsZVR5cGUoKTsKLQkJCi0JCW1hbnVhbENvbXAgPSBuZXcgTmV3TWFudWFsU2VydmVyQ29tcG9zaXRlKG1hbnVhbENvbXAyLCBuZXcgTmV3TWFudWFsU2VydmVyQ29tcG9zaXRlLklXaXphcmRIYW5kbGUyKCkgewotCQkJcHVibGljIHZvaWQgcnVuKGJvb2xlYW4gZm9yaywgYm9vbGVhbiBjYW5jZWxhYmxlLCBJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCQkJd2l6YXJkLnJ1bihmb3JrLCBjYW5jZWxhYmxlLCBydW5uYWJsZSk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCQkJd2l6YXJkLnVwZGF0ZSgpOwotCQkJfQotCQkJcHVibGljIHZvaWQgc2V0TWVzc2FnZShTdHJpbmcgbmV3TWVzc2FnZSwgaW50IG5ld1R5cGUpIHsKLQkJCQl3aXphcmQuc2V0TWVzc2FnZShuZXdNZXNzYWdlLCBuZXdUeXBlKTsKLQkJCX0KLQkJfSwgbXQsIG5ldyBOZXdNYW51YWxTZXJ2ZXJDb21wb3NpdGUuU2VydmVyU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZXJ2ZXJTZWxlY3RlZChJU2VydmVyQXR0cmlidXRlcyBzZXJ2ZXIpIHsKLQkJCQl1cGRhdGVUYXNrTW9kZWwoKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHJ1bnRpbWVTZWxlY3RlZChJUnVudGltZSBydW50aW1lKSB7Ci0JCQkJdXBkYXRlVGFza01vZGVsKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJaWYgKGxhc3RIb3N0bmFtZSAhPSBudWxsKQotCQkJbWFudWFsQ29tcC5zZXRIb3N0KGxhc3RIb3N0bmFtZSk7Ci0JCWVsc2UKLQkJCW1hbnVhbENvbXAuc2V0SG9zdCgibG9jYWxob3N0Iik7Ci0KLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMzsKLQkJZGF0YS5oZWlnaHRIaW50ID0gMzAwOwotCQltYW51YWxDb21wLnNldExheW91dERhdGEoZGF0YSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlVGFza01vZGVsKCkgewotCQlpZiAodGFza01vZGVsICE9IG51bGwpIHsKLQkJCUlTZXJ2ZXJXb3JraW5nQ29weSBzZXJ2ZXIgPSBnZXRTZXJ2ZXIoKTsKLQkJCWlmIChzZXJ2ZXIgIT0gbnVsbCkgewotCQkJCXRhc2tNb2RlbC5wdXRPYmplY3QoVGFza01vZGVsLlRBU0tfU0VSVkVSLCBzZXJ2ZXIpOwotCQkJCXRhc2tNb2RlbC5wdXRPYmplY3QoVGFza01vZGVsLlRBU0tfUlVOVElNRSwgc2VydmVyLmdldFJ1bnRpbWUoKSk7Ci0JCQl9IGVsc2UgewotCQkJCXRhc2tNb2RlbC5wdXRPYmplY3QoVGFza01vZGVsLlRBU0tfU0VSVkVSLCBudWxsKTsKLQkJCQl0YXNrTW9kZWwucHV0T2JqZWN0KFRhc2tNb2RlbC5UQVNLX1JVTlRJTUUsIG51bGwpOwotCQkJfQotCQl9Ci0JCXdpemFyZC51cGRhdGUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUYXNrTW9kZWwoVGFza01vZGVsIG1vZGVsKSB7Ci0JCXRhc2tNb2RlbCA9IG1vZGVsOwotCQl0YXNrTW9kZWwucHV0T2JqZWN0KE5ld1NlcnZlcldpemFyZEZyYWdtZW50Lk1PREUsIG5ldyBCeXRlKG1vZGUpKTsKLQkJdXBkYXRlVGFza01vZGVsKCk7Ci0JfQotCi0JcHVibGljIElTZXJ2ZXJXb3JraW5nQ29weSBnZXRTZXJ2ZXIoKSB7Ci0JCWlmIChtb2RlID09IE1PREVfRVhJU1RJTkcpCi0JCQlyZXR1cm4gZXhpc3RpbmdXQzsgLy9leGlzdGluZ0NvbXAuZ2V0U2VsZWN0ZWRTZXJ2ZXIoKTsKLQkJZWxzZSBpZiAobW9kZSA9PSBNT0RFX0RFVEVDVCkKLQkJCXJldHVybiBkZXRlY3RDb21wLmdldFNlcnZlcigpOwotCQllbHNlCi0JCQlyZXR1cm4gbWFudWFsQ29tcC5nZXRTZXJ2ZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSVJ1bnRpbWUgZ2V0UnVudGltZSgpIHsKLQkJaWYgKG1vZGUgPT0gTU9ERV9FWElTVElORykgewotCQkJSVNlcnZlciBzZXJ2ZXIgPSBleGlzdGluZ0NvbXAuZ2V0U2VsZWN0ZWRTZXJ2ZXIoKTsKLQkJCWlmIChzZXJ2ZXIgIT0gbnVsbCkKLQkJCQlyZXR1cm4gc2VydmVyLmdldFJ1bnRpbWUoKTsKLQkJCXJldHVybiBudWxsOwotCQl9IGVsc2UgaWYgKG1vZGUgPT0gTU9ERV9ERVRFQ1QpCi0JCQlyZXR1cm4gbnVsbDsKLQkJZWxzZQotCQkJcmV0dXJuIG1hbnVhbENvbXAuZ2V0UnVudGltZSgpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBzZXJ2ZXIgc2hvdWxkIGJlY29tZSB0aGUgcHJlZmVycmVkIHNlcnZlci4KLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1ByZWZlcnJlZFNlcnZlcigpIHsKLQkJcmV0dXJuIHByZWZlcnJlZDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKLQkJc3VwZXIuc2V0VmlzaWJsZSh2aXNpYmxlKTsKLQkJCi0JCUNvbnRyb2xbXSBjID0gZ2V0Q2hpbGRyZW4oKTsKLQkJaWYgKGMgIT0gbnVsbCkgewotCQkJaW50IHNpemUgPSBjLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotCQkJCWlmIChjW2ldICE9IG51bGwpCi0JCQkJCWNbaV0uc2V0VmlzaWJsZSh2aXNpYmxlKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvcGFnZS9TZWxlY3RDbGllbnRDb21wb3NpdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9wYWdlL1NlbGVjdENsaWVudENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODNmYmZiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9wYWdlL1NlbGVjdENsaWVudENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotoCogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQucGFnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSU1lc3NhZ2VQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuSUNsaWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLlNlcnZlclVJQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuSVdpemFyZEhhbmRsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGVscC5JV29ya2JlbmNoSGVscFN5c3RlbTsKLS8qKgotICogQSB3aXphcmQgcGFnZSB1c2VkIHRvIHNlbGVjdCBhIHNlcnZlciBjbGllbnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWxlY3RDbGllbnRDb21wb3NpdGUgZXh0ZW5kcyBDb21wb3NpdGUgewotCXByb3RlY3RlZCBJV2l6YXJkSGFuZGxlIHdpemFyZDsKLQotCS8vIHRoZSBsaXN0IG9mIGVsZW1lbnRzIHRvIHNlbGVjdCBmcm9tCi0JcHJvdGVjdGVkIElDbGllbnRbXSBjbGllbnRzOwotCi0JLy8gdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBlbGVtZW50Ci0JcHJvdGVjdGVkIElDbGllbnQgc2VsZWN0ZWRDbGllbnQ7Ci0KLQkvLyB0aGUgdGFibGUgY29udGFpbmluZyB0aGUgZWxlbWVudHMKLQlwcm90ZWN0ZWQgVGFibGUgZWxlbWVudFRhYmxlOwotCi0JLy8gdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBzZWxlY3RlZCBjbGllbnQKLQlwcm90ZWN0ZWQgTGFiZWwgZGVzY3JpcHRpb247Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgU2VsZWN0Q2xpZW50Q29tcG9zaXRlLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQgYSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIHdpemFyZCBhIHdpemFyZCBoYW5kbGUKLQkgKiBAcGFyYW0gY2xpZW50cyBhbiBhcnJheSBvZiBjbGllbnRzCi0JICovCi0JcHVibGljIFNlbGVjdENsaWVudENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBJV2l6YXJkSGFuZGxlIHdpemFyZCwgSUNsaWVudFtdIGNsaWVudHMpIHsKLQkJc3VwZXIocGFyZW50LCBTV1QuTk9ORSk7Ci0JCXRoaXMud2l6YXJkID0gd2l6YXJkOwotCQl0aGlzLmNsaWVudHMgPSBjbGllbnRzOwotCQotCQl3aXphcmQuc2V0VGl0bGUoTWVzc2FnZXMud2l6U2VsZWN0Q2xpZW50VGl0bGUpOwotCQl3aXphcmQuc2V0RGVzY3JpcHRpb24oTWVzc2FnZXMud2l6U2VsZWN0Q2xpZW50RGVzY3JpcHRpb24pOwotCQl3aXphcmQuc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX1dJWkJBTl9TRUxFQ1RfU0VSVkVSX0NMSUVOVCkpOwotCQkKLQkJY3JlYXRlQ29udHJvbCgpOwotCX0KLQotCS8qKgotCSAqIENsZWFycyB0aGUgc2VsZWN0ZWQgY2xpZW50LgotCSAqLwotCXB1YmxpYyB2b2lkIGNsZWFyU2VsZWN0ZWRDbGllbnQoKSB7Ci0JCXNlbGVjdGVkQ2xpZW50ID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBVSSBvZiB0aGUgcGFnZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250cm9sKCkgewotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IFNXVFV0aWwuY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHModGhpcywgNCk7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSBTV1RVdGlsLmNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscyh0aGlzLCA0KTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCXNldExheW91dChsYXlvdXQpOwotCi0JCUlXb3JrYmVuY2hIZWxwU3lzdGVtIHdocyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpOwotCQl3aHMuc2V0SGVscCh0aGlzLCBDb250ZXh0SWRzLlNFTEVDVF9DTElFTlRfV0laQVJEKTsKLQkKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwodGhpcywgU1dULldSQVApOwotCQlsYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLndpelNlbGVjdENsaWVudE1lc3NhZ2UpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyk7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCi0JCWVsZW1lbnRUYWJsZSA9IG5ldyBUYWJsZSh0aGlzLCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcgfCBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLmhlaWdodEhpbnQgPSA4MDsKLQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMjA7Ci0JCWVsZW1lbnRUYWJsZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQllbGVtZW50VGFibGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWhhbmRsZVNlbGVjdGlvbigpOwotCQkJfQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQloYW5kbGVTZWxlY3Rpb24oKTsKLQkJCQkvL1RPRE86IFdpemFyZFV0aWwuZGVmYXVsdFNlbGVjdChnZXRXaXphcmQoKSwgU2VsZWN0Q2xpZW50V2l6YXJkUGFnZS50aGlzKTsKLQkJCX0KLQkJfSk7Ci0JCXdocy5zZXRIZWxwKGVsZW1lbnRUYWJsZSwgQ29udGV4dElkcy5TRUxFQ1RfQ0xJRU5UKTsKLQkKLQkJaWYgKGNsaWVudHMgIT0gbnVsbCkgewotCQkJaW50IHNpemUgPSBjbGllbnRzLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKGVsZW1lbnRUYWJsZSwgU1dULk5PTkUpOwotCQkJCWl0ZW0uc2V0VGV4dCgwLCBTZXJ2ZXJVSUNvcmUuZ2V0TGFiZWxQcm92aWRlcigpLmdldFRleHQoY2xpZW50c1tpXSkpOwotCQkJCWl0ZW0uc2V0SW1hZ2UoMCwgU2VydmVyVUlDb3JlLmdldExhYmVsUHJvdmlkZXIoKS5nZXRJbWFnZShjbGllbnRzW2ldKSk7Ci0JCQkJaXRlbS5zZXREYXRhKGNsaWVudHNbaV0pOwotCQkJfQotCQl9Ci0JCi0JCWRlc2NyaXB0aW9uID0gbmV3IExhYmVsKHRoaXMsIFNXVC5XUkFQKTsKLQkJZGVzY3JpcHRpb24uc2V0VGV4dCgiIik7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKTsKLQkJZGF0YS5oZWlnaHRIaW50ID0gNzA7Ci0JCWRlc2NyaXB0aW9uLnNldExheW91dERhdGEoZGF0YSk7Ci0JCi0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzZWxlY3RlZCBjbGllbnQuCi0JICoKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JQ2xpZW50Ci0JICovCi0JcHVibGljIElDbGllbnQgZ2V0U2VsZWN0ZWRDbGllbnQoKSB7Ci0JCXJldHVybiBzZWxlY3RlZENsaWVudDsKLQl9Ci0KLQkvKioKLQkgKiBIYW5kbGUgdGhlIHNlbGVjdGlvbiBvZiBhIGNsaWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVTZWxlY3Rpb24oKSB7Ci0JCWludCBpbmRleCA9IGVsZW1lbnRUYWJsZS5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQlpZiAoaW5kZXggPCAwKQotCQkJc2VsZWN0ZWRDbGllbnQgPSBudWxsOwotCQllbHNlCi0JCQlzZWxlY3RlZENsaWVudCA9IGNsaWVudHNbaW5kZXhdOwotCQkKLQkJaWYgKHNlbGVjdGVkQ2xpZW50ICE9IG51bGwpCi0JCQl3aXphcmQuc2V0TWVzc2FnZShudWxsLCBJTWVzc2FnZVByb3ZpZGVyLk5PTkUpOwotCQllbHNlCi0JCQl3aXphcmQuc2V0TWVzc2FnZSgiIiwgSU1lc3NhZ2VQcm92aWRlci5FUlJPUik7Ci0JCi0JCVN0cmluZyBkZXNjID0gbnVsbDsKLQkJaWYgKHNlbGVjdGVkQ2xpZW50ICE9IG51bGwpCi0JCQlkZXNjID0gc2VsZWN0ZWRDbGllbnQuZ2V0RGVzY3JpcHRpb24oKTsKLQkJaWYgKGRlc2MgPT0gbnVsbCkKLQkJCWRlc2MgPSAiIjsKLQkJZGVzY3JpcHRpb24uc2V0VGV4dChkZXNjKTsKLQkKLQkJd2l6YXJkLnVwZGF0ZSgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvcGFnZS9UYXNrc0NvbXBvc2l0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL3BhZ2UvVGFza3NDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQyOTJlYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvcGFnZS9UYXNrc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQucGFnZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLlB1Ymxpc2hPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5Db250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuSW1hZ2VSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuU1dUVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZC5mcmFnbWVudC5UYXNrc1dpemFyZEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkud2l6YXJkLklXaXphcmRIYW5kbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0vKioKLSAqIEEgd2l6YXJkIHBhZ2UgdXNlZCB0byBzZWxlY3Qgc2VydmVyIGFuZCBtb2R1bGUgdGFza3MuCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrc0NvbXBvc2l0ZSBleHRlbmRzIENvbXBvc2l0ZSB7Ci0JcHJvdGVjdGVkIElXaXphcmRIYW5kbGUgd2l6YXJkOwotCQotCXByb3RlY3RlZCBDb21wb3NpdGUgY29tcDsKLQotCS8vIHRoZSBsaXN0IG9mIGVsZW1lbnRzIHRvIHNlbGVjdCBmcm9tCi0JcHJvdGVjdGVkIExpc3QgdGFza3M7Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gY3JlYXRlZDsKLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBUYXNrc0NvbXBvc2l0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50IGEgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSB3aXphcmQgYSB3aXphcmQgaGFuZGxlCi0JICovCi0JcHVibGljIFRhc2tzQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIElXaXphcmRIYW5kbGUgd2l6YXJkKSB7Ci0JCXN1cGVyKHBhcmVudCwgU1dULk5PTkUpOwotCQl0aGlzLndpemFyZCA9IHdpemFyZDsKLQkKLQkJd2l6YXJkLnNldFRpdGxlKE1lc3NhZ2VzLndpelRhc2tUaXRsZSk7Ci0JCXdpemFyZC5zZXREZXNjcmlwdGlvbihNZXNzYWdlcy53aXpUYXNrRGVzY3JpcHRpb24pOwotCQl3aXphcmQuc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX1dJWkJBTl9TRUxFQ1RfU0VSVkVSKSk7Ci0JCQotCQkvL2NyZWF0ZUNvbnRyb2woKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUYXNrcyhMaXN0IHRhc2tzKSB7Ci0JCXRoaXMudGFza3MgPSB0YXNrczsKLQkJCi0JCUNvbnRyb2xbXSBjaGlsZHJlbiA9IGdldENoaWxkcmVuKCk7Ci0JCWlmIChjaGlsZHJlbiAhPSBudWxsKSB7Ci0JCQlpbnQgc2l6ZSA9IGNoaWxkcmVuLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJY2hpbGRyZW5baV0uZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JCQotCQkvL2NyZWF0ZUNvbnRyb2woKTsKLQkJLy9sYXlvdXQodHJ1ZSk7Ci0JCWNyZWF0ZWQgPSBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBVSSBvZiB0aGUgcGFnZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKCkgewotCQlpZiAoY3JlYXRlZCkKLQkJCXJldHVybjsKLQkJVGFza3NMYXlvdXQgbGF5b3V0ID0gbmV3IFRhc2tzTGF5b3V0KFNXVFV0aWwuY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKHRoaXMsIDQpKTsKLQkJc2V0TGF5b3V0KGxheW91dCk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodGhpcywgQ29udGV4dElkcy5TRUxFQ1RfVEFTS19XSVpBUkQpOwotCQkKLQkJaW50IHNpemUgPSAwOwotCQlpZiAodGFza3MgIT0gbnVsbCkKLQkJCXNpemUgPSB0YXNrcy5zaXplKCk7Ci0JCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlPYmplY3Qgb2JqID0gdGFza3MuZ2V0KGkpOwotCQkJZmluYWwgVGFza3NXaXphcmRGcmFnbWVudC5UYXNrSW5mbyBzdGkgPSAoVGFza3NXaXphcmRGcmFnbWVudC5UYXNrSW5mbykgb2JqOwotCQkJZmluYWwgQnV0dG9uIGNoZWNrYm94ID0gbmV3IEJ1dHRvbih0aGlzLCBTV1QuQ0hFQ0sgfCBTV1QuV1JBUCk7Ci0JCQlTdHJpbmcgbGFiZWwgPSBzdGkudGFzazIuZ2V0TGFiZWwoKTsKLQkJCWlmIChsYWJlbCAhPSBudWxsKQotCQkJCWNoZWNrYm94LnNldFRleHQobGFiZWwpOwotCQkJZWxzZQotCQkJCWNoZWNrYm94LnNldFRleHQoTWVzc2FnZXMuZWxlbWVudFVua25vd25OYW1lKTsKLQkJCWNoZWNrYm94LnNldEZvY3VzKCk7Ci0JCQotCQkJY2hlY2tib3guYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJCXN0aS5zZXRTZWxlY3RlZChjaGVja2JveC5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJfQotCQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCQlzdGkuc2V0U2VsZWN0ZWQoY2hlY2tib3guZ2V0U2VsZWN0aW9uKCkpOwotCQkJCX0KLQkJCX0pOwotCQkJCi0JCQlMYWJlbCBkZXNjcmlwdGlvbiA9IG5ldyBMYWJlbCh0aGlzLCBTV1QuV1JBUCk7Ci0JCQlTdHJpbmcgZGVzYyA9IHN0aS50YXNrMi5nZXREZXNjcmlwdGlvbigpOwotCQkJaWYgKGRlc2MgIT0gbnVsbCkKLQkJCQlkZXNjcmlwdGlvbi5zZXRUZXh0KGRlc2MpOwotCQkJZWxzZQotCQkJCWRlc2NyaXB0aW9uLnNldFRleHQoTWVzc2FnZXMuZWxlbWVudFVua25vd25OYW1lKTsKLQkJCQotCQkJaWYgKHN0aS5raW5kID09IFB1Ymxpc2hPcGVyYXRpb24uUkVRVUlSRUQpIHsKLQkJCQljaGVja2JveC5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQkJY2hlY2tib3guc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJZGVzY3JpcHRpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9IGVsc2UKLQkJCQljaGVja2JveC5zZXRTZWxlY3Rpb24oc3RpLmdldERlZmF1bHRTZWxlY3RlZCgpKTsKLQkJfQotCQkKLQkJaWYgKHNpemUgPT0gMCkgewotCQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwodGhpcywgU1dULk5PTkUpOwotCQkJbGFiZWwuc2V0VGV4dChNZXNzYWdlcy53aXpUYXNrTm9uZSk7Ci0JCX0KLQkJCi0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQodGhpcyk7Ci0JCWxheW91dCh0cnVlLCB0cnVlKTsKLQkJY3JlYXRlZCA9IHRydWU7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9wYWdlL1Rhc2tzTGF5b3V0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvcGFnZS9UYXNrc0xheW91dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2JmYmQ1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9wYWdlL1Rhc2tzTGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLnBhZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxheW91dDsKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrc0xheW91dCBleHRlbmRzIExheW91dCB7Ci0JcHJpdmF0ZSBpbnQgdmVydGljYWxTcGFjaW5nOwotCi0JcHVibGljIFRhc2tzTGF5b3V0KGludCB2ZXJ0aWNhbFNwYWNpbmcpIHsKLQkJdGhpcy52ZXJ0aWNhbFNwYWNpbmcgPSB2ZXJ0aWNhbFNwYWNpbmc7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGF5b3V0I2NvbXB1dGVTaXplKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwgaW50LCBpbnQsIGJvb2xlYW4pCi0JICovCi0JcHJvdGVjdGVkIFBvaW50IGNvbXB1dGVTaXplKENvbXBvc2l0ZSBjb21wb3NpdGUsIGludCB3SGludCwgaW50IGhIaW50LCBib29sZWFuIGZsdXNoQ2FjaGUpIHsKLQkJcmV0dXJuIG5ldyBQb2ludCh3SGludCwgaEhpbnQpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxheW91dCNsYXlvdXQob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLCBib29sZWFuKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxheW91dChDb21wb3NpdGUgY29tcG9zaXRlLCBib29sZWFuIGZsdXNoQ2FjaGUpIHsKLQkJQ29udHJvbFtdIGNoaWxkcmVuID0gY29tcG9zaXRlLmdldENoaWxkcmVuKCk7Ci0JCVJlY3RhbmdsZSByID0gY29tcG9zaXRlLmdldENsaWVudEFyZWEoKTsKLQkJCi0JCWludCB5ID0gci55OwotCQlpZiAoY2hpbGRyZW4gIT0gbnVsbCkgewotCQkJaW50IHNpemUgPSBjaGlsZHJlbi5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCWlmIChpICUgMiA9PSAwKSB7Ci0JCQkJCWludCBoID0gY2hpbGRyZW5baV0uY29tcHV0ZVNpemUoci53aWR0aCwgU1dULkRFRkFVTFQpLnk7Ci0JCQkJCWNoaWxkcmVuW2ldLnNldEJvdW5kcyhyLngsIHksIHIud2lkdGgsIGgpOwotCQkJCQl5ICs9IGggKyB2ZXJ0aWNhbFNwYWNpbmc7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaW50IGggPSBNYXRoLm1heCg1MCwgY2hpbGRyZW5baV0uY29tcHV0ZVNpemUoci53aWR0aCAtIDIwLCBTV1QuREVGQVVMVCkueSk7Ci0JCQkJCWNoaWxkcmVuW2ldLnNldEJvdW5kcyhyLnggKyAyMCwgeSwgci53aWR0aCAtIDIwLCBoKTsKLQkJCQkJeSArPSBoICsgdmVydGljYWxTcGFjaW5nOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvcGFnZS9XaXphcmRVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvcGFnZS9XaXphcmRVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzYTgxOWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvaW50ZXJuYWwvd2l6YXJkL3BhZ2UvV2l6YXJkVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC53aXphcmQucGFnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5TZXJ2ZXJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlNlcnZlclVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLkNsb3NhYmxlV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0vKioKLSAqIEEgaGVscGVyIGNsYXNzIGZvciB3aXphcmRzLgotICovCi1wdWJsaWMgY2xhc3MgV2l6YXJkVXRpbCB7Ci0JLyoqCi0JICogVXNlIHN0YXRpYyBtZXRob2RzLgotCSAqLwotCXByaXZhdGUgV2l6YXJkVXRpbCgpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBvciBleGlzdGluZyBzZXJ2ZXIgcHJvamVjdC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzZXJ2ZXIgcHJvamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb2plY3QgZ2V0U2VydmVyUHJvamVjdCgpIHsKLQkJSVByb2plY3RbXSBwcm9qZWN0cyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKTsKLQkJaWYgKHByb2plY3RzICE9IG51bGwpIHsKLQkJCWludCBzaXplID0gcHJvamVjdHMubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlpZiAoU2VydmVyUGx1Z2luLmdldFByb2plY3RQcm9wZXJ0aWVzKHByb2plY3RzW2ldKS5pc1NlcnZlclByb2plY3QoKSkKLQkJCQkJcmV0dXJuIHByb2plY3RzW2ldOwotCQkJfQotCQl9Ci0JCQotCQlTdHJpbmcgcyA9IGZpbmRVbnVzZWRTZXJ2ZXJQcm9qZWN0TmFtZSgpOwotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KHMpOwotCX0KLQkKLQkvKioKLQkgKiBGaW5kcyBhbiB1bnVzZWQgcHJvamVjdCBuYW1lIHRvIHVzZSBhcyBhIHNlcnZlciBwcm9qZWN0LgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGZpbmRVbnVzZWRTZXJ2ZXJQcm9qZWN0TmFtZSgpIHsKLQkJSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCVN0cmluZyBuYW1lID0gTkxTLmJpbmQoTWVzc2FnZXMuZGVmYXVsdFNlcnZlclByb2plY3ROYW1lLCAiIik7Ci0JCWludCBjb3VudCA9IDE7Ci0JCXdoaWxlIChyb290LmdldFByb2plY3QobmFtZSkuZXhpc3RzKCkpIHsKLQkJCW5hbWUgPSBOTFMuYmluZChNZXNzYWdlcy5kZWZhdWx0U2VydmVyUHJvamVjdE5hbWUsICsrY291bnQgKyAiIik7Ci0JCX0KLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjb250YWluZXIgd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgaWYgb25lIGV4aXN0cy4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXJOYW1lIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElDb250YWluZXIgZmluZENvbnRhaW5lcihTdHJpbmcgY29udGFpbmVyTmFtZSkgewotCQlpZiAoY29udGFpbmVyTmFtZSA9PSBudWxsIHx8IGNvbnRhaW5lck5hbWUuZXF1YWxzKCIiKSkKLQkJCXJldHVybiBudWxsOwotCQotCQlJV29ya3NwYWNlUm9vdCByb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJdHJ5IHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSByb290LmdldFByb2plY3QoY29udGFpbmVyTmFtZSk7Ci0JCQlpZiAocHJvamVjdCAhPSBudWxsICYmIHByb2plY3QuZXhpc3RzKCkpCi0JCQkJcmV0dXJuIHByb2plY3Q7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQotCQl0cnkgewotCQkJSUZvbGRlciBmb2xkZXIgPSByb290LmdldEZvbGRlcihuZXcgUGF0aChjb250YWluZXJOYW1lKSk7Ci0JCQlpZiAoZm9sZGVyICE9IG51bGwgJiYgZm9sZGVyLmV4aXN0cygpKQotCQkJCXJldHVybiBmb2xkZXI7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBUcmllcyB0byBmaW5kIGEgc2VydmVyIHByb2plY3QgZm9sZGVyIGluIHRoZSBoZWlyYXJjaHkKLQkgKiBvZiB0aGUgZ2l2ZW4gcmVzb3VyY2UuIElmIGl0IGZpbmRzIG9uZSwgaXQgcmV0dXJucyB0aGUKLQkgKiBmb2xkZXIgdGhhdCB0aGUgcmVzb3VyY2UgaXMgb3IgaXMgaW4uCi0JICoKLQkgKiBAcGFyYW0gcmVzb3VyY2Ugb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBJQ29udGFpbmVyIGZpbmRTZXJ2ZXJQcm9qZWN0Q29udGFpbmVyKElSZXNvdXJjZSByZXNvdXJjZSkgewotCQlJQ29udGFpbmVyIGNvbnRhaW5lciA9IG51bGw7Ci0JCXdoaWxlIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlpZiAoY29udGFpbmVyID09IG51bGwgJiYgcmVzb3VyY2UgaW5zdGFuY2VvZiBJQ29udGFpbmVyKQotCQkJCWNvbnRhaW5lciA9IChJQ29udGFpbmVyKSByZXNvdXJjZTsKLQkKLQkJCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElGaWxlKSB7Ci0JCQkJSUZpbGUgZmlsZSA9IChJRmlsZSkgcmVzb3VyY2U7Ci0JCQkJaWYgKFNlcnZlclVJUGx1Z2luLmZpbmRTZXJ2ZXIoZmlsZSkgIT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkKLQkJCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElQcm9qZWN0KSB7Ci0JCQkJaWYgKHJlc291cmNlLmdldFByb2plY3QoKS5pc09wZW4oKSkKLQkJCQkJcmV0dXJuIGNvbnRhaW5lcjsKLQkJCX0KLQkJCXJlc291cmNlID0gcmVzb3VyY2UuZ2V0UGFyZW50KCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBmdWxsIHBhdGhuYW1lIG9mIGEgY29udGFpbmVyLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5Db250YWluZXIKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDb250YWluZXJUZXh0KElDb250YWluZXIgY29udGFpbmVyKSB7Ci0JCVN0cmluZyBuYW1lID0gY29udGFpbmVyLmdldE5hbWUoKTsKLQkJd2hpbGUgKGNvbnRhaW5lciAhPSBudWxsICYmICEoY29udGFpbmVyIGluc3RhbmNlb2YgSVByb2plY3QpKSB7Ci0JCQljb250YWluZXIgPSBjb250YWluZXIuZ2V0UGFyZW50KCk7Ci0JCQluYW1lID0gY29udGFpbmVyLmdldE5hbWUoKSArICIvIiArIG5hbWU7Ci0JCX0KLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2VsZWN0ZWQgY29udGFpbmVyIGZyb20gdGhpcyBzZWxlY3Rpb24uCi0JICoKLQkgKiBAcGFyYW0gc2VsZWN0aW9uIHRoZSBzZWxlY3Rpb24KLQkgKiBAcmV0dXJuIHRoZSBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElDb250YWluZXIgZ2V0U2VsZWN0aW9uQ29udGFpbmVyKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlpZiAoc2VsZWN0aW9uID09IG51bGwgfHwgc2VsZWN0aW9uLmlzRW1wdHkoKSkKLQkJCXJldHVybiBudWxsOwotCQotCQlPYmplY3Qgb2JqID0gc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQlpZiAob2JqIGluc3RhbmNlb2YgSVJlc291cmNlKQotCQkJcmV0dXJuIGZpbmRTZXJ2ZXJQcm9qZWN0Q29udGFpbmVyKChJUmVzb3VyY2UpIG9iaik7Ci0JCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBjb250YWluZXIgaXMgYSB2YWxpZCBzZXJ2ZXIgcHJvamVjdAotCSAqIGZvbGRlciBhbmQgaXMgbm90ICJ3aXRoaW4iIGEgc2VydmVyIGluc3RhbmNlIG9yIGNvbmZpZ3VyYXRpb24uCi0JICoKLQkgKiBAcGFyYW0gbmFtZSBhIGNvbnRhaW5lciBuYW1lCi0JICogQHJldHVybiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgY29udGFpbmVyIGlzIGZpbmUsIGFuZCBhbiBlcnJvciBtZXNzYWdlCi0JICogICAgb3RoZXJ3aXNlIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZhbGlkYXRlQ29udGFpbmVyKFN0cmluZyBuYW1lKSB7Ci0JCUlDb250YWluZXIgY29udGFpbmVyID0gV2l6YXJkVXRpbC5maW5kQ29udGFpbmVyKG5hbWUpOwotCQlpZiAoY29udGFpbmVyID09IG51bGwgfHwgIWNvbnRhaW5lci5leGlzdHMoKSkgewotCQkJSVN0YXR1cyBzdGF0dXMgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkudmFsaWRhdGVOYW1lKG5hbWUsIElSZXNvdXJjZS5QUk9KRUNUKTsKLQkJCWlmIChzdGF0dXMuaXNPSygpKQotCQkJCXJldHVybiBudWxsOyAvLyB3ZSBjYW4gY3JlYXRlIG9uZSBsYXRlcgotCQkJcmV0dXJuIHN0YXR1cy5nZXRNZXNzYWdlKCk7Ci0JCX0KLQkJCi0JCVN0cmluZyBlcnJvciA9IE1lc3NhZ2VzLndpekVycm9ySW52YWxpZEZvbGRlcjsKLQkJdHJ5IHsKLQkJCS8vIGZpbmQgcHJvamVjdCBvZiB0aGlzIGNvbnRhaW5lcgotCQkJSVByb2plY3QgcHJvamVjdCA9IG51bGw7Ci0JCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgSVByb2plY3QpIHsKLQkJCQlwcm9qZWN0ID0gKElQcm9qZWN0KSBjb250YWluZXI7Ci0JCQl9IGVsc2UgewotCQkJCS8vIGxvb2sgdXAgaGllcmFyY2h5IGZvciBwcm9qZWN0Ci0JCQkJSUNvbnRhaW5lciB0ZW1wID0gY29udGFpbmVyLmdldFBhcmVudCgpOwotCQkJCXdoaWxlIChwcm9qZWN0ID09IG51bGwgJiYgdGVtcCAhPSBudWxsICYmICEodGVtcCBpbnN0YW5jZW9mIElQcm9qZWN0KSkgewotCQkJCQl0ZW1wID0gdGVtcC5nZXRQYXJlbnQoKTsKLQkJCQl9Ci0JCQkJaWYgKHRlbXAgIT0gbnVsbCAmJiB0ZW1wIGluc3RhbmNlb2YgSVByb2plY3QpCi0JCQkJCXByb2plY3QgPSAoSVByb2plY3QpIHRlbXA7Ci0JCQl9Ci0JCi0JCQkvLyB2YWxpZGF0ZSB0aGUgcHJvamVjdAotCQkJaWYgKHByb2plY3QgIT0gbnVsbCAmJiAhcHJvamVjdC5pc09wZW4oKSkKLQkJCQlyZXR1cm4gTWVzc2FnZXMud2l6RXJyb3JDbG9zZWRQcm9qZWN0OwotCi0JCQlpZiAocHJvamVjdCA9PSBudWxsIHx8ICFwcm9qZWN0LmV4aXN0cygpIHx8ICFwcm9qZWN0LmlzT3BlbigpKQotCQkJCXJldHVybiBlcnJvcjsKLQkKLQkJCS8vIG1ha2Ugc3VyZSB3ZSdyZSBub3QgZW1iZWRkaW5nIGluIGFub3RoZXIgc2VydmVyIGVsZW1lbnQKLQkJCUlSZXNvdXJjZSB0ZW1wID0gY29udGFpbmVyOwotCQkJd2hpbGUgKHRlbXAgIT0gbnVsbCAmJiAhKHRlbXAgaW5zdGFuY2VvZiBJUHJvamVjdCkpIHsKLQkJCQlpZiAodGVtcCBpbnN0YW5jZW9mIElGaWxlKSB7Ci0JCQkJCUlGaWxlIGZpbGUgPSAoSUZpbGUpIHRlbXA7Ci0JCQkJCWlmIChTZXJ2ZXJVSVBsdWdpbi5maW5kU2VydmVyKGZpbGUpICE9IG51bGwpCi0JCQkJCQlyZXR1cm4gZXJyb3I7Ci0JCQkJfQotCQkJCXRlbXAgPSB0ZW1wLmdldFBhcmVudCgpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGVycm9yOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdXNlciBzYWlkIG9rYXkgdG8gY3JlYXRpbmcgYSBuZXcgc2VydmVyCi0JICogcHJvamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gc2hlbGwgYSBzaGVsbAotCSAqIEBwYXJhbSBwcm9qZWN0TmFtZSBhIHByb2plY3QgbmFtZQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHVzZXIgd2FudHMgdG8gY3JlYXRlIGEgc2VydmVyIHByb2plY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcHJvbXB0Rm9yU2VydmVyUHJvamVjdENyZWF0aW9uKFNoZWxsIHNoZWxsLCBTdHJpbmcgcHJvamVjdE5hbWUpIHsKLQkJU3RyaW5nIG1zZyA9IE5MUy5iaW5kKE1lc3NhZ2VzLmNyZWF0ZVNlcnZlclByb2plY3REaWFsb2dNZXNzYWdlLCBwcm9qZWN0TmFtZSk7Ci0JCXJldHVybiBNZXNzYWdlRGlhbG9nLm9wZW5RdWVzdGlvbihzaGVsbCwgTWVzc2FnZXMuY3JlYXRlU2VydmVyUHJvamVjdERpYWxvZ1RpdGxlLCBtc2cpOwotCX0KLQkKLQkvKioKLQkgKiBIYW5kbGVzIGRlZmF1bHQgc2VsZWN0aW9uIHdpdGhpbiBhIHdpemFyZCBieSBnb2luZyB0byB0aGUgbmV4dAotCSAqIHBhZ2UsIG9yIGZpbmlzaGluZyB0aGUgd2l6YXJkIGlmIHBvc3NpYmxlLgotCSAqIAotCSAqIEBwYXJhbSB3aXphcmQgYSB3aXphcmQKLQkgKiBAcGFyYW0gcGFnZSBhIHdpemFyZCBwYWdlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGRlZmF1bHRTZWxlY3QoSVdpemFyZCB3aXphcmQsIElXaXphcmRQYWdlIHBhZ2UpIHsKLQkJaWYgKHBhZ2UuY2FuRmxpcFRvTmV4dFBhZ2UoKSAmJiBwYWdlLmdldE5leHRQYWdlKCkgIT0gbnVsbCkKLQkJCXdpemFyZC5nZXRDb250YWluZXIoKS5zaG93UGFnZShwYWdlLmdldE5leHRQYWdlKCkpOwotCQllbHNlIGlmICh3aXphcmQuY2FuRmluaXNoKCkgJiYgd2l6YXJkLmdldENvbnRhaW5lcigpIGluc3RhbmNlb2YgQ2xvc2FibGVXaXphcmREaWFsb2cpIHsKLQkJCUNsb3NhYmxlV2l6YXJkRGlhbG9nIGRpYWxvZyA9IChDbG9zYWJsZVdpemFyZERpYWxvZykgd2l6YXJkLmdldENvbnRhaW5lcigpOwotCQkJZGlhbG9nLmZpbmlzaFByZXNzZWQoKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9pbnRlcm5hbC93aXphcmQvcGFnZS9Xb3Jrc3BhY2VSdW5uYWJsZUFkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9wYWdlL1dvcmtzcGFjZVJ1bm5hYmxlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODA1MTlkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL2ludGVybmFsL3dpemFyZC9wYWdlL1dvcmtzcGFjZVJ1bm5hYmxlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLndpemFyZC5wYWdlOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLS8qKgotICogSVJ1bm5hYmxlV2l0aFByb2dyZXNzQWRhcHRlciB0byBhbGxvdyBpdCB0byBydW4gYW4gSVdvcmtzcGFjZVJ1bm5hYmxlLgotICovCi1wdWJsaWMgY2xhc3MgV29ya3NwYWNlUnVubmFibGVBZGFwdGVyIGltcGxlbWVudHMgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHsKLQlwcml2YXRlIElXb3Jrc3BhY2VSdW5uYWJsZSB3b3Jrc3BhY2VSdW5uYWJsZTsKLQkKLQlwdWJsaWMgV29ya3NwYWNlUnVubmFibGVBZGFwdGVyKElXb3Jrc3BhY2VSdW5uYWJsZSBydW5uYWJsZSkgewotCQl3b3Jrc3BhY2VSdW5uYWJsZSA9IHJ1bm5hYmxlOwotCX0KLQotCS8qCi0JICogQHNlZSBJUnVubmFibGVXaXRoUHJvZ3Jlc3MjcnVuKElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQl0cnkgewotCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJ1bih3b3Jrc3BhY2VSdW5uYWJsZSwgbW9uaXRvcik7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvcGFja2FnZS5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmFiYWVhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTxodG1sPgotPGhlYWQ+Ci08TUVUQSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vLi4vLi4vLi4vLi4vL2FwaXN0eWxlcy5jc3MiIHR5cGU9InRleHQvY3NzIj4KLTx0aXRsZT5XVFAgQVBJIG92ZXJ2aWV3PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotPHA+VGhlIHNlcnZlciB0b29scyBVSS48L3A+Ci08dGFibGUgd2lkdGg9IjUwMCI+Ci08dHI+Ci08dGQ+Ci08cD5TZXJ2ZXJVSUNvcmUgaXMgdGhlIG1haW4gZW50cnktcG9pbnQgZm9yIHRoZSBBUEkuIEZyb20gaGVyZSwgY2xpZW50cwotY2FuIGdldCB0aGUgd2l6YXJkIHBhZ2VzIGZvciBhIHBhcnRpY3VsYXIgc2VydmVyIHR5cGUsIGdldCBhIGxhYmVsCi1wcm92aWRlciBmb3IgYWxsIHNlcnZlciB0eXBlcywgb3IgbGF1bmNoIFJ1biBvbiBTZXJ2ZXIgZGlyZWN0bHkuPC9wPgotPC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPHRhYmxlIHdpZHRoPSI1MDAiPgotPHRyPgotPHRkPgotPHA+U2VydmVyVUlVdGlsIHByb3ZpZGVzIHV0aWxpdHkgbWV0aG9kcy4gQ3VycmVudGx5LCB0aGlzIGlzIGxpbWl0ZWQgdG8KLWxhdW5jaGluZyB0aGUgc2VydmVyIHJ1bnRpbWUgd2l6YXJkIGFuZCBlZGl0aW5nIGFuIGV4aXN0aW5nIHNlcnZlcgotcnVudGltZS48L3A+Ci08L3RkPgotPC90cj4KLTwvdGFibGU+Ci08dGFibGUgd2lkdGg9IjUwMCI+Ci08dHI+Ci08dGQ+Ci08cD5TZXJ2ZXJMYXVuY2hDb25maWd1cmF0aW9uVGFiIGlzIGEgZ2VuZXJpYyBzZXJ2ZXIgdG9vbHMgdGFiIHRoYXQgY2FuCi1iZSB1c2VkIGluIGxhdW5jaCBjb25maWd1cmF0aW9uIHRhYiBncm91cHMgZm9yIGEgc2VydmVyIGxhdW5jaC4gSXQgc2hvd3MKLWluZm9ybWF0aW9uIGFib3V0IHRoZSBzZXJ2ZXIgdG8gdGhlIHVzZXIuPC9wPgotPC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvcGFja2FnZS54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9wYWNrYWdlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODczZTI2NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS9wYWNrYWdlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08aHRtbD4KLTxoZWFkPgotCTwhLS0gIEVzY2FwZSB0byB0aGUgcm9vdCBvZiB5b3VyIHNvdXJjZSBmb2xkZXIgIC0tPgotCTxtZXRhCi0JCW5hbWU9InJvb3QiCi0JCWNvbnRlbnQ9Ii4uLy4uLy4uLy4uLy4uLy4uLyIgLz4KLQk8dGl0bGU+V1RQIEFQSSBvdmVydmlldzwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5PgotCi08YWJzdHJhY3Q+VGhlIHNlcnZlciB0b29scyBVSS48L2Fic3RyYWN0PgotCi08cD5TZXJ2ZXJVSUNvcmUgaXMgdGhlIG1haW4gZW50cnktcG9pbnQgZm9yIHRoZSBBUEkuIEZyb20gaGVyZSwgY2xpZW50cwotY2FuIGdldCB0aGUgd2l6YXJkIHBhZ2VzIGZvciBhIHBhcnRpY3VsYXIgc2VydmVyIHR5cGUsIGdldCBhIGxhYmVsCi1wcm92aWRlciBmb3IgYWxsIHNlcnZlciB0eXBlcywgb3IgbGF1bmNoIFJ1biBvbiBTZXJ2ZXIgZGlyZWN0bHkuPC9wPgotCi08cD5TZXJ2ZXJVSVV0aWwgcHJvdmlkZXMgdXRpbGl0eSBtZXRob2RzLiBDdXJyZW50bHksIHRoaXMgaXMgbGltaXRlZCB0bwotbGF1bmNoaW5nIHRoZSBzZXJ2ZXIgcnVudGltZSB3aXphcmQgYW5kIGVkaXRpbmcgYW4gZXhpc3Rpbmcgc2VydmVyCi1ydW50aW1lLjwvcD4KLQotPHA+U2VydmVyTGF1bmNoQ29uZmlndXJhdGlvblRhYiBpcyBhIGdlbmVyaWMgc2VydmVyIHRvb2xzIHRhYiB0aGF0IGNhbgotYmUgdXNlZCBpbiBsYXVuY2ggY29uZmlndXJhdGlvbiB0YWIgZ3JvdXBzIGZvciBhIHNlcnZlciBsYXVuY2guIEl0IHNob3dzCi1pbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VydmVyIHRvIHRoZSB1c2VyLjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL3dpemFyZC9JV2l6YXJkSGFuZGxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS93aXphcmQvSVdpemFyZEhhbmRsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NWM5NzUyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL3dpemFyZC9JV2l6YXJkSGFuZGxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkud2l6YXJkOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSU1lc3NhZ2VQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLS8qKgotICogQSB3aXphcmQgaGFuZGxlLgotICogCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVdpemFyZEhhbmRsZSBleHRlbmRzIElNZXNzYWdlUHJvdmlkZXIgewotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIHdpemFyZCBlcnJvciBtZXNzYWdlcyBhbmQgYnV0dG9ucy4KLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHRpdGxlIG9mIHRoaXMgd2l6YXJkIHBhZ2UuCi0JICogIAotCSAqIEBwYXJhbSB0aXRsZSB0aGUgdGl0bGUgb2YgdGhlIHdpemFyZCBwYWdlCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGl0bGUoU3RyaW5nIHRpdGxlKTsKLQotCS8qKgotCSAqIFRoZSBwYWdlJ3MgZGVzY3JpcHRpb24uCi0JICogCi0JICogQHBhcmFtIGRlc2MgdGhlIHBhZ2UncyBkZXNjcmlwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjKTsKLQotCS8qKgotCSAqIFRoZSBwYWdlJ3MgaW1hZ2UgZGVzY3JpcHRvci4KLQkgKiAKLQkgKiBAcGFyYW0gaW1hZ2UgdGhlIHBhZ2UncyBpbWFnZSBkZXNjcmlwdG9yCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlRGVzY3JpcHRvciBpbWFnZSk7Ci0KLQkvKioKLQkgKiBTZXQgYW4gZXJyb3Igb3Igd2FybmluZyBtZXNzYWdlLgotCSAqIAotCSAqIEBwYXJhbSBuZXdNZXNzYWdlIHRoZSBuZXcgbWVzc2FnZQotCSAqIEBwYXJhbSBuZXdUeXBlIHRoZSBuZXcgdHlwZSwgZnJvbSBJU3RhdHVzCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWVzc2FnZShTdHJpbmcgbmV3TWVzc2FnZSwgaW50IG5ld1R5cGUpOwotCi0JLyoqCi0JICogRXhlY3V0ZSBhIHJ1bm5hYmxlIHdpdGhpbiB0aGUgY29udGV4dCBvZiB0aGUgd2l6YXJkLiBUaGlzIHdpbGwgdHlwaWNhbGx5Ci0JICogZGlzYWJsZSB0aGUgd2l6YXJkIHdoaWxlIHRoZSBydW5uYWJsZSBpcyBydW5uaW5nLCBhbmQgcHJvdmlkZSBhIHByb2dyZXNzCi0JICogbW9uaXRvciBmb3IgdGhlIHVzZXIuICAKLQkgKiAKLQkgKiBAcGFyYW0gZm9yayB0cnVlIGlmIGEgc2VwYXJhdGUgdGhyZWFkIHNob3VsZCBiZSB1c2VkCi0JICogQHBhcmFtIGNhbmNlbGFibGUgdHJ1ZSBpZiBpdCBzaG91bGQgYmUgY2FuY2VsYWJsZQotCSAqIEBwYXJhbSBydW5uYWJsZSB0aGUgcnVubmFibGUKLQkgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHRocm93biBpZiBpdCBpcyBpbnRlcnJ1cHRlZAotCSAqIEB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB0aHJvd24gaWYgdGhlcmUgaXMgYW4gZXJyb3IKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oYm9vbGVhbiBmb3JrLCBib29sZWFuIGNhbmNlbGFibGUsIElSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL3dpemFyZC9XaXphcmRGcmFnbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvd2l6YXJkL1dpemFyZEZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2ZTRkN2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvd2l6YXJkL1dpemFyZEZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLndpemFyZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuVGFza01vZGVsOwotLyoqCi0gKiBBIHdpemFyZCBmcmFnbWVudCBpcyBhIG5vZGUgd2l0aGluIGEgd2l6YXJkIHRoYXQgcHJvdmlkZXMgYSBjb21wbGV0ZWx5Ci0gKiBleHRlbmRhYmxlIHdpemFyZCBmbG93IGJ5IHN1cHBvcnRpbmcgYSBmbGV4aWJsZSB0cmVlIHN0cnVjdHVyZSBmb3IgdGhlCi0gKiBwYWdlcy4gQXMgdGhlIHVzZXIgd2Fsa3MgcGFnZXMgdGhyb3VnaCB0aGUgd2l6YXJkLCB0aGV5IGFyZSBhY3R1YWxseQotICogdHJhdmVyc2luZyB0aGUgbm9kZXMgb2YgYSB0cmVlLCBhbmQgZWFjaCBub2RlIGNhbiBhZGQgb3IgcmVtb3ZlIGNoaWxkcmVuCi0gKiBhdCBhbnkgdGltZS4KLSAqIAotICogRWFjaCBub2RlIG1heSBiZSBub24tVUkgKHVzZWZ1bCBmb3IgaW5qZWN0aW5nIGJlaGF2aW91ciBpbnRvIHRoZSB0cmVlKQotICogb3IgY29udGFpbiBhIHNpbmdsZSB3aXphcmQgcGFnZSAoQHNlZSBoYXNDb21wb3NpdGUoKSBhbmQKLSAqIGNyZWF0ZUNvbXBvc2l0ZShDb21wb3NpdGUsIElXaXphcmRIYW5kbGUpKS4gVGhlIG5vZGUgbWF5IGFsc28gaGF2ZQotICogY2hpbGRyZW4gKEBzZWUgZ2V0Q2hpbGRGcmFnbWVudHMoKSwgd2hpY2ggc2hvdWxkIGJlIHVwZGF0ZWQgb3IgcmVmcmVzaGVkCi0gKiB3aGVuZXZlciB0aGUgdXBkYXRlQ2hpbGRGcmFnbWVudHMoKSBtZXRob2QgaXMgY2FsbGVkIGJ5IGFub3RoZXIgbm9kZSB0bwotICogbGV0IHRoaXMgbm9kZSBrbm93IHRoYXQgaXQncyBzdGF0ZSBtYXkgaGF2ZSBjaGFuZ2VkLgotICogCi0gKiBUaGlzIGltcGxlbWVudGF0aW9uIHVzZXMgYSBjcmVhdGVDaGlsZEZyYWdtZW50cygpIG1ldGhvZCB0byBhbGxvdyB0aGUKLSAqIGZyYWdtZW50IHRvIGFkZCBpdCdzIGNoaWxkcmVuIGludG8gdGhlIHRyZWUuIE5vdGUgdGhhdCB0aGlzIG1ldGhvZCBtYXkKLSAqIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBhcyB0aGUgdHJlZSBpcyB1cGRhdGVkIGFuZCBpdCBtdXN0IHJldHVybiB0aGUKLSAqIHNhbWUgaW5zdGFuY2Ugb2YgYW55IGNoaWxkcmVuIHRoYXQgaGF2ZSBwcmV2aW91c2x5IGJlZW4gcmV0dXJuZWQuCi0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFdpemFyZEZyYWdtZW50IHsKLQlwcml2YXRlIFRhc2tNb2RlbCB0YXNrTW9kZWw7Ci0JcHJpdmF0ZSBib29sZWFuIGlzQ29tcGxldGUgPSB0cnVlOwotCXByaXZhdGUgTGlzdCBsaXN0SW1wbDsKLQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBmcmFnbWVudCBoYXMgYW4gYXNzb2NpYXRlZCBVSSwKLQkgKiBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGZyYWdtZW50IGhhcyBhIGNvbXBvc2l0ZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NvbXBvc2l0ZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGNvbXBvc2l0ZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBmcmFnbWVudC4KLQkgKiBUaGlzIG1ldGhvZCBpcyBvbmx5IGNhbGxlZCB3aGVuIGhhc0NvbXBvc2l0ZSgpIHJldHVybnMgdHJ1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50IGEgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBoYW5kbGUgYSB3aXphcmQgaGFuZGxlCi0JICogQHJldHVybiB0aGUgY3JlYXRlZCBjb21wb3NpdGUKLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlIGNyZWF0ZUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBJV2l6YXJkSGFuZGxlIGhhbmRsZSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB3aXphcmQgdGFzayBtb2RlbC4gVGhlIHRhc2sgbW9kZWwgaXMgc2hhcmVkIGJ5IGFsbCBmcmFnbWVudHMKLQkgKiBpbiB0aGUgd2l6YXJkIGFuZCBpcyB1c2VkIHRvIHNoYXJlIGRhdGEuCi0JICogCi0JICogQHBhcmFtIHRhc2tNb2RlbCB0aGUgdGFzayBtb2RlbAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRhc2tNb2RlbChUYXNrTW9kZWwgdGFza01vZGVsKSB7Ci0JCXRoaXMudGFza01vZGVsID0gdGFza01vZGVsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHdpemFyZCB0YXNrIG1vZGVsLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHRhc2sgbW9kZWwKLQkgKi8KLQlwdWJsaWMgVGFza01vZGVsIGdldFRhc2tNb2RlbCgpIHsKLQkJcmV0dXJuIHRhc2tNb2RlbDsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB0aGUgd2l6YXJkIHRoYXQgdGhpcyBmcmFnbWVudCBiZWxvbmdzIHRvIGhhcyB0cmF2ZXJzZWQKLQkgKiBpbnRvIHRoaXMgd2l6YXJkIGZyYWdtZW50LiBJdCBpcyBjYWxsZWQgdG8gZ2l2ZSB0aGUgZnJhZ21lbnQgdGhlCi0JICogb3Bwb3J0dW5pdHkgdG8gaW5pdGlhbGl6ZSBhbnkgdmFsdWVzIHNob3duIGluIHRoZSBjb21wb3NpdGUgb3IKLQkgKiB1cGRhdGUgdGhlIHRhc2sgbW9kZWwuCi0JICogPHA+Ci0JICogV2hlbiBmaW5pc2ggaXMgcHJlc3NlZCwgdGhlIGN1cnJlbnQgZnJhZ21lbnQgaXMgZXhpdCgpZWQsIGFuZCB0aGVuCi0JICogcGVyZm9ybUZpbmlzaCgpIGlzIGNhbGxlZCBvbiBhbGwgb2YgdGhlIGZyYWdtZW50cyBpbiB0aGUgdHJlZS4KLQkgKiBlbnRlcigpIGFuZCBleGl0KCkgYXJlIG5vdCBjYWxsZWQgb24gdGhlIHJlbWFpbmluZyBmcmFnbWVudHMuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyB2b2lkIGVudGVyKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogQ2FsbGVkIHdoZW4gdGhlIHdpemFyZCB0aGF0IHRoaXMgZnJhZ21lbnQgYmVsb25ncyB0byBoYXMgdHJhdmVyc2VkCi0JICogb3V0IG9mIHRoaXMgd2l6YXJkIGZyYWdtZW50LiBJdCBpcyBjYWxsZWQgdG8gZ2l2ZSB0aGUgZnJhZ21lbnQgdGhlCi0JICogb3Bwb3J0dW5pdHkgdG8gc2F2ZSBhbnkgdmFsdWVzIGVudGVyZWQgaW50byB0aGUgY29tcG9zaXRlIG9yCi0JICogdXBkYXRlIHRoZSB0YXNrIG1vZGVsLgotCSAqIDxwPgotCSAqIFdoZW4gZmluaXNoIGlzIHByZXNzZWQsIHRoZSBjdXJyZW50IGZyYWdtZW50IGlzIGV4aXQoKWVkLCBhbmQgdGhlbgotCSAqIHBlcmZvcm1GaW5pc2goKSBpcyBjYWxsZWQgb24gYWxsIG9mIHRoZSBmcmFnbWVudHMgaW4gdGhlIHRyZWUuCi0JICogZW50ZXIoKSBhbmQgZXhpdCgpIGFyZSBub3QgY2FsbGVkIG9uIHRoZSByZW1haW5pbmcgZnJhZ21lbnRzLiAKLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHZvaWQgZXhpdCgpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHRoZSB3aXphcmQgdGhhdCB0aGlzIGZyYWdtZW50IGJlbG9uZ3MgdG8gaXMgZmluaXNoZWQuCi0JICogQWZ0ZXIgZXhpdCgpaW5nIHRoZSBjdXJyZW50IHBhZ2UsIGFsbCBmcmFnbWVudCdzIHBlcmZvcm1GaW5pc2goKQotCSAqIG1ldGhvZHMgYXJlIGNhbGxlZCBpbiBvcmRlci4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBpcyBub3QgY2FsbGVkIG9uIHRoZSBVSSB0aHJlYWQgYW5kIG11c3Qgbm90IGFjY2VzcyB0aGUKLQkgKiBjb21wb3NpdGUuIE5vdCBvbmx5IG1pZ2h0IHRoZSB1c2VyIG5ldmVyIGhhdmUgYWNjZXNzZWQgdGhlIGZyYWdtZW50J3MKLQkgKiBjb21wb3NpdGUsIGJ1dCB0aGlzIG1ldGhvZCBtYXkgYmUgY2FsbGVkIGFzeW5jaHJvbm91c2x5IG9uIGEgam9iCi0JICogb25jZSB0aGUgd2l6YXJkIGhhcyBjbG9zZWQuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gaWYgc29tZXRoaW5nIGdvZXMgd3JvbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBwZXJmb3JtRmluaXNoKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogQ2FsbGVkIHdoZW4gdGhlIHdpemFyZCB0aGF0IHRoaXMgZnJhZ21lbnQgYmVsb25ncyB0byBpcyBjYW5jZWxlZC4KLQkgKiBBZnRlciBleGl0KClpbmcgdGhlIGN1cnJlbnQgcGFnZSwgYWxsIGZyYWdtZW50J3MgcGVyZm9ybUNhbmNlbCgpCi0JICogbWV0aG9kcyBhcmUgY2FsbGVkIGluIG9yZGVyLgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGlzIG5vdCBjYWxsZWQgb24gdGhlIFVJIHRocmVhZCBhbmQgbXVzdCBub3QgYWNjZXNzIHRoZQotCSAqIGNvbXBvc2l0ZS4gTm90IG9ubHkgbWlnaHQgdGhlIHVzZXIgbmV2ZXIgaGF2ZSBhY2Nlc3NlZCB0aGUgZnJhZ21lbnQncwotCSAqIGNvbXBvc2l0ZSwgYnV0IHRoaXMgbWV0aG9kIG1heSBiZSBjYWxsZWQgYXN5bmNocm9ub3VzbHkgb24gYSBqb2IKLQkgKiBvbmNlIHRoZSB3aXphcmQgaGFzIGNsb3NlZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiBzb21ldGhpbmcgZ29lcyB3cm9uZwotCSAqLwotCXB1YmxpYyB2b2lkIHBlcmZvcm1DYW5jZWwoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjaGlsZCBmcmFnbWVudHMuIENoaWxkIGZyYWdtZW50cyBjb21lIGRpcmVjdGx5IGFmdGVyIHRoaXMgZnJhZ21lbnQKLQkgKiBpbiB0aGUgd2l6YXJkIGZsb3cuCi0JICogCi0JICogQHJldHVybiBhIGxpc3Qgb2YgY2hpbGQgZnJhZ21lbnRzCi0JICovCi0JcHVibGljIExpc3QgZ2V0Q2hpbGRGcmFnbWVudHMoKSB7Ci0JCWlmIChsaXN0SW1wbCA9PSBudWxsKSB7Ci0JCQlsaXN0SW1wbCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWNyZWF0ZUNoaWxkRnJhZ21lbnRzKGxpc3RJbXBsKTsKLQkJfQotCQlyZXR1cm4gbGlzdEltcGw7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIHRvIGdpdmUgdGhlIGZyYWdtZW50IGEgY2hhbmNlIHRvIHVwZGF0ZSBpdCdzIGNoaWxkIGZyYWdtZW50cyBpbgotCSAqIHJlc3BvbnNlIHRvIG90aGVyIGNoYW5nZXMgd2l0aGluIHRoZSB3aXphcmQgb3IgdGFzayBtb2RlbC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVDaGlsZEZyYWdtZW50cygpIHsKLQkJbGlzdEltcGwgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgaW1wbGVtZW50YXRpb24gb2YgZ2V0Q2hpbGRGcmFnbWVudHMoKSB0bwotCSAqIGFsbG93IHRoaXMgZnJhZ21lbnQgdG8gYWRkIGl0J3MgY2hpbGRyZW4uIFRoaXMgbWV0aG9kIG11c3QgY2FjaGUgYW5kCi0JICogcmV0dXJuIHRoZSBzYW1lIGluc3RhbmNlIG9mIGFueSBjaGlsZCBmcmFnbWVudCBjcmVhdGVkLiBJZiBuZXcKLQkgKiBpbnN0YW5jZXMgYXJlIGNyZWF0ZWQgZWFjaCB0aW1lIHRoZSB3aXphcmQgaXMgdXBkYXRlZCwgdGhlIGVuYWJsZW1lbnQKLQkgKiBzdGF0ZSBhbmQgdGhlIGZsb3cgb2YgdGhlIHdpemFyZCB3aWxsIGJlIGluY29ycmVjdC4gCi0JICogCi0JICogQHBhcmFtIGxpc3QgYSBsaXN0IHRvIGFkZCB0aGUgY2hpbGQgZnJhZ21lbnRzIHRvCi0JICovCQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNoaWxkRnJhZ21lbnRzKExpc3QgbGlzdCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoaXMgZnJhZ21lbnQgaXMgY29tcGxldGUgKGNhbiBmaW5pc2gpLiBJZiBpdCBpcwotCSAqIGNvbXBsZXRlIHRoZSB1c2VyIHdpbGwgYmUgYWxsb3dlZCB0byBnbyB0byB0aGUgbmV4dCBmcmFnbWVudCBvcgotCSAqIGZpbmlzaCB0aGUgd2l6YXJkLiBJZiB0aGUgZnJhZ21lbnQgaXMgbm90IGNvbXBsZXRlLCB0aGUgTmV4dCBidXR0b24KLQkgKiB3aWxsIGJlIGRpc2FibGVkLiBJZiB0aGUgZnJhZ21lbnQgaXMgY29tcGxldGUgYnV0IGFub3RoZXIgZnJhZ21lbnQKLQkgKiBpcyBub3QgY29tcGxldGUsIHRoZSBGaW5pc2ggYnV0dG9uIHdpbGwgbm90IGJlIGVuYWJsZWQuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZnJhZ21lbnQgaXMgY29tcGxldGUsIGFuZAotCSAqICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NvbXBsZXRlKCkgewotCQlyZXR1cm4gaXNDb21wbGV0ZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGlzQ29tcGxldGUgc3RhdGUuCi0JICogCi0JICogQHBhcmFtIGNvbXBsZXRlIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBmcmFnbWVudCBpcyBjb21wbGV0ZSwgYW5kCi0JICogICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldENvbXBsZXRlKGJvb2xlYW4gY29tcGxldGUpIHsKLQkJdGhpcy5pc0NvbXBsZXRlID0gY29tcGxldGU7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL3dpemFyZC9wYWNrYWdlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS93aXphcmQvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTY1N2I3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS9zZXJ2ZXJ1aS9vcmcvZWNsaXBzZS93c3Qvc2VydmVyL3VpL3dpemFyZC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08aHRtbD4KLTxoZWFkPgotPE1FVEEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uLy4uLy4uLy4uLy4uLy9hcGlzdHlsZXMuY3NzIiB0eXBlPSJ0ZXh0L2NzcyI+Ci08dGl0bGU+V1RQIEFQSSBvdmVydmlldzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPldpemFyZCBhbmQgdGFzayBzdXBwb3J0IGZvciB0aGUgc2VydmVyIHRvb2xzIFVJLjwvcD4KLTx0YWJsZSB3aWR0aD0iNTAwIj4KLTx0cj4KLTx0ZD4KLTxwPldpemFyZEZyYWdtZW50IGlzIGV4dGVuZGVkIHRvIHByb3ZpZGUgYSBzdWJ0cmVlIG9mIHdpemFyZCBwYWdlcyBvciB0YXNrcwotdGhhdCBjYW4gYmUgaW5zZXJ0ZWQgaW50byBhIGxhcmdlciB3aXphcmQgZmxvdy4gVGFza1dpemFyZCBpcyB0aGUgc3RhbmRhcmQKLXdpemFyZCB0aGF0IGtub3dzIGhvdyB0byBoYW5kbGUgV2l6YXJkRnJhZ21lbnRzIGFuZCBkaXNwbGF5IHRoZW0gaW4gb3JkZXIKLXdpdGhpbiBhIHNpbmdsZSB3aXphcmQuIEl0IHVzZXMgdGhlIFRhc2tXaXphcmRQYWdlcyB0byBkaXNwbGF5IHRoZSB3aXphcmQKLWZyYWdtZW50J3MgY29tcG9zaXRlcyB3aXRoaW4gdGhlIHdpemFyZC48L3A+Ci08L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS93aXphcmQvcGFja2FnZS54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkvc2VydmVydWkvb3JnL2VjbGlwc2Uvd3N0L3NlcnZlci91aS93aXphcmQvcGFja2FnZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwNDMzMzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpL3NlcnZlcnVpL29yZy9lY2xpcHNlL3dzdC9zZXJ2ZXIvdWkvd2l6YXJkL3BhY2thZ2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxodG1sPgotPGhlYWQ+Ci0JPCEtLSAgRXNjYXBlIHRvIHRoZSByb290IG9mIHlvdXIgc291cmNlIGZvbGRlciAgLS0+Ci0JPG1ldGEKLQkJbmFtZT0icm9vdCIKLQkJY29udGVudD0iLi4vLi4vLi4vLi4vLi4vLi4vIiAvPgotCTx0aXRsZT5XVFAgQVBJIG92ZXJ2aWV3PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHk+Ci0KLTxhYnN0cmFjdD5XaXphcmQgYW5kIHRhc2sgc3VwcG9ydCBmb3IgdGhlIHNlcnZlciB0b29scyBVSS48L2Fic3RyYWN0PgotCi08cD5XaXphcmRGcmFnbWVudCBpcyBleHRlbmRlZCB0byBwcm92aWRlIGEgc3VidHJlZSBvZiB3aXphcmQgcGFnZXMgb3IgdGFza3MKLXRoYXQgY2FuIGJlIGluc2VydGVkIGludG8gYSBsYXJnZXIgd2l6YXJkIGZsb3cuIFRhc2tXaXphcmQgaXMgdGhlIHN0YW5kYXJkCi13aXphcmQgdGhhdCBrbm93cyBob3cgdG8gaGFuZGxlIFdpemFyZEZyYWdtZW50cyBhbmQgZGlzcGxheSB0aGVtIGluIG9yZGVyCi13aXRoaW4gYSBzaW5nbGUgd2l6YXJkLiBJdCB1c2VzIHRoZSBUYXNrV2l6YXJkUGFnZXMgdG8gZGlzcGxheSB0aGUgd2l6YXJkCi1mcmFnbWVudCdzIGNvbXBvc2l0ZXMgd2l0aGluIHRoZSB3aXphcmQuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQo=